From 65b9f9dcce17589d7320ed118b73d52bf43c9be7 Mon Sep 17 00:00:00 2001 From: jfastnacht Date: Wed, 18 Nov 2015 15:05:05 +0100 Subject: [PATCH 1/6] Added basic Slim Framework support based on silex-PHP --- bin/all-petstore.sh | 1 + bin/slim-petstore-server.sh | 31 +++ .../languages/SlimFrameworkServerCodegen.java | 195 ++++++++++++++++++ .../services/io.swagger.codegen.CodegenConfig | 1 + .../src/main/resources/slim/.htaccess | 5 + .../src/main/resources/slim/README.mustache | 10 + .../src/main/resources/slim/composer.json | 5 + .../src/main/resources/slim/index.mustache | 22 ++ .../SlimFrameworkServerOptionsProvider.java | 30 +++ .../slim/SlimFrameworkServerOptionsTest.java | 32 +++ .../online/OnlineGeneratorOptionsTest.java | 12 +- .../petstore/slim/SwaggerServer/.htaccess | 5 + .../petstore/slim/SwaggerServer/README.md | 10 + .../petstore/slim/SwaggerServer/composer.json | 5 + .../petstore/slim/SwaggerServer/index.php | 182 ++++++++++++++++ 15 files changed, 541 insertions(+), 5 deletions(-) create mode 100644 bin/slim-petstore-server.sh create mode 100644 modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/SlimFrameworkServerCodegen.java create mode 100644 modules/swagger-codegen/src/main/resources/slim/.htaccess create mode 100644 modules/swagger-codegen/src/main/resources/slim/README.mustache create mode 100644 modules/swagger-codegen/src/main/resources/slim/composer.json create mode 100644 modules/swagger-codegen/src/main/resources/slim/index.mustache create mode 100644 modules/swagger-codegen/src/test/java/io/swagger/codegen/options/SlimFrameworkServerOptionsProvider.java create mode 100644 modules/swagger-codegen/src/test/java/io/swagger/codegen/slim/SlimFrameworkServerOptionsTest.java create mode 100644 samples/server/petstore/slim/SwaggerServer/.htaccess create mode 100644 samples/server/petstore/slim/SwaggerServer/README.md create mode 100644 samples/server/petstore/slim/SwaggerServer/composer.json create mode 100644 samples/server/petstore/slim/SwaggerServer/index.php diff --git a/bin/all-petstore.sh b/bin/all-petstore.sh index dc2b4116070..9a3400e020d 100755 --- a/bin/all-petstore.sh +++ b/bin/all-petstore.sh @@ -40,6 +40,7 @@ cd $APP_DIR ./bin/scala-petstore.sh ./bin/scalatra-petstore-server.sh ./bin/silex-petstore-server.sh +./bin/slim-petstore-server.sh ./bin/spring-mvc-petstore-server.sh ./bin/swift-petstore.sh ./bin/tizen-petstore.sh diff --git a/bin/slim-petstore-server.sh b/bin/slim-petstore-server.sh new file mode 100644 index 00000000000..654fc1d0e01 --- /dev/null +++ b/bin/slim-petstore-server.sh @@ -0,0 +1,31 @@ +#!/bin/sh + +SCRIPT="$0" + +while [ -h "$SCRIPT" ] ; do + ls=`ls -ld "$SCRIPT"` + link=`expr "$ls" : '.*-> \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + SCRIPT="$link" + else + SCRIPT=`dirname "$SCRIPT"`/"$link" + fi +done + +if [ ! -d "${APP_DIR}" ]; then + APP_DIR=`dirname "$SCRIPT"`/.. + APP_DIR=`cd "${APP_DIR}"; pwd` +fi + +executable="./modules/swagger-codegen-cli/target/swagger-codegen-cli.jar" + +if [ ! -f "$executable" ] +then + mvn clean package +fi + +# if you've executed sbt assembly previously it will use that instead. +export JAVA_OPTS="${JAVA_OPTS} -XX:MaxPermSize=256M -Xmx1024M -DloggerPath=conf/log4j.properties" +ags="$@ generate -t modules/swagger-codegen/src/main/resources/slim -i modules/swagger-codegen/src/test/resources/2_0/petstore.json -l slim -o samples/server/petstore/slim" + +java $JAVA_OPTS -jar $executable $ags diff --git a/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/SlimFrameworkServerCodegen.java b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/SlimFrameworkServerCodegen.java new file mode 100644 index 00000000000..1b8680cab6e --- /dev/null +++ b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/SlimFrameworkServerCodegen.java @@ -0,0 +1,195 @@ +package io.swagger.codegen.languages; + +import io.swagger.codegen.CodegenConfig; +import io.swagger.codegen.CodegenConstants; +import io.swagger.codegen.CodegenType; +import io.swagger.codegen.DefaultCodegen; +import io.swagger.codegen.SupportingFile; +import io.swagger.models.properties.ArrayProperty; +import io.swagger.models.properties.MapProperty; +import io.swagger.models.properties.Property; + +import java.io.File; +import java.util.Arrays; +import java.util.HashMap; +import java.util.HashSet; + +public class SlimFrameworkServerCodegen extends DefaultCodegen implements CodegenConfig { + protected String invokerPackage; + protected String groupId = "io.swagger"; + protected String artifactId = "swagger-server"; + protected String artifactVersion = "1.0.0"; + + public SlimFrameworkServerCodegen() { + super(); + + invokerPackage = camelize("SwaggerServer"); + + String packagePath = "SwaggerServer"; + + modelPackage = packagePath + "/lib/models"; + apiPackage = packagePath + "/lib"; + outputFolder = "generated-code/slim"; + + // no model, api files + modelTemplateFiles.clear(); + apiTemplateFiles.clear(); + + embeddedTemplateDir = templateDir = "slim"; + + reservedWords = new HashSet( + Arrays.asList( + "__halt_compiler", "abstract", "and", "array", "as", "break", "callable", "case", "catch", "class", "clone", "const", "continue", "declare", "default", "die", "do", "echo", "else", "elseif", "empty", "enddeclare", "endfor", "endforeach", "endif", "endswitch", "endwhile", "eval", "exit", "extends", "final", "for", "foreach", "function", "global", "goto", "if", "implements", "include", "include_once", "instanceof", "insteadof", "interface", "isset", "list", "namespace", "new", "or", "print", "private", "protected", "public", "require", "require_once", "return", "static", "switch", "throw", "trait", "try", "unset", "use", "var", "while", "xor") + ); + + additionalProperties.put(CodegenConstants.INVOKER_PACKAGE, invokerPackage); + additionalProperties.put(CodegenConstants.GROUP_ID, groupId); + additionalProperties.put(CodegenConstants.ARTIFACT_ID, artifactId); + additionalProperties.put(CodegenConstants.ARTIFACT_VERSION, artifactVersion); + + // ref: http://php.net/manual/en/language.types.intro.php + languageSpecificPrimitives = new HashSet( + Arrays.asList( + "boolean", + "int", + "integer", + "double", + "float", + "string", + "object", + "DateTime", + "mixed", + "number") + ); + + instantiationTypes.put("array", "array"); + instantiationTypes.put("map", "map"); + + // ref: https://github.com/swagger-api/swagger-spec/blob/master/versions/2.0.md#data-types + typeMapping = new HashMap(); + typeMapping.put("integer", "int"); + typeMapping.put("long", "int"); + typeMapping.put("float", "float"); + typeMapping.put("double", "double"); + typeMapping.put("string", "string"); + typeMapping.put("byte", "int"); + typeMapping.put("boolean", "boolean"); + typeMapping.put("date", "DateTime"); + typeMapping.put("datetime", "DateTime"); + typeMapping.put("file", "string"); + typeMapping.put("map", "map"); + typeMapping.put("array", "array"); + typeMapping.put("list", "array"); + typeMapping.put("object", "object"); + + supportingFiles.add(new SupportingFile("README.mustache", packagePath.replace('/', File.separatorChar), "README.md")); + supportingFiles.add(new SupportingFile("composer.json", packagePath.replace('/', File.separatorChar), "composer.json")); + supportingFiles.add(new SupportingFile("index.mustache", packagePath.replace('/', File.separatorChar), "index.php")); + supportingFiles.add(new SupportingFile(".htaccess", packagePath.replace('/', File.separatorChar), ".htaccess")); + } + + public CodegenType getTag() { + return CodegenType.SERVER; + } + + public String getName() { + return "slim"; + } + + public String getHelp() { + return "Generates a Slim Framework server library."; + } + + @Override + public String escapeReservedWord(String name) { + return "_" + name; + } + + @Override + public String apiFileFolder() { + return (outputFolder + "/" + apiPackage()).replace('/', File.separatorChar); + } + + public String modelFileFolder() { + return (outputFolder + "/" + modelPackage()).replace('/', File.separatorChar); + } + + @Override + public String getTypeDeclaration(Property p) { + if (p instanceof ArrayProperty) { + ArrayProperty ap = (ArrayProperty) p; + Property inner = ap.getItems(); + return getSwaggerType(p) + "[" + getTypeDeclaration(inner) + "]"; + } else if (p instanceof MapProperty) { + MapProperty mp = (MapProperty) p; + Property inner = mp.getAdditionalProperties(); + return getSwaggerType(p) + "[string," + getTypeDeclaration(inner) + "]"; + } + return super.getTypeDeclaration(p); + } + + @Override + public String getSwaggerType(Property p) { + String swaggerType = super.getSwaggerType(p); + String type = null; + if (typeMapping.containsKey(swaggerType)) { + type = typeMapping.get(swaggerType); + if (languageSpecificPrimitives.contains(type)) { + return type; + } else if (instantiationTypes.containsKey(type)) { + return type; + } + } else { + type = swaggerType; + } + if (type == null) { + return null; + } + return toModelName(type); + } + + public String toDefaultValue(Property p) { + return "null"; + } + + + @Override + public String toVarName(String name) { + // return the name in underscore style + // PhoneNumber => phone_number + name = underscore(name); + + // parameter name starting with number won't compile + // need to escape it by appending _ at the beginning + if (name.matches("^\\d.*")) { + name = "_" + name; + } + + return name; + } + + @Override + public String toParamName(String name) { + // should be the same as variable name + return toVarName(name); + } + + @Override + public String toModelName(String name) { + // model name cannot use reserved keyword + if (reservedWords.contains(name)) { + escapeReservedWord(name); // e.g. return => _return + } + + // camelize the model name + // phone_number => PhoneNumber + return camelize(name); + } + + @Override + public String toModelFilename(String name) { + // should be the same as the model name + return toModelName(name); + } + +} diff --git a/modules/swagger-codegen/src/main/resources/META-INF/services/io.swagger.codegen.CodegenConfig b/modules/swagger-codegen/src/main/resources/META-INF/services/io.swagger.codegen.CodegenConfig index 4cf785abbd8..192440ee40f 100644 --- a/modules/swagger-codegen/src/main/resources/META-INF/services/io.swagger.codegen.CodegenConfig +++ b/modules/swagger-codegen/src/main/resources/META-INF/services/io.swagger.codegen.CodegenConfig @@ -17,6 +17,7 @@ io.swagger.codegen.languages.ScalaClientCodegen io.swagger.codegen.languages.ScalatraServerCodegen io.swagger.codegen.languages.SilexServerCodegen io.swagger.codegen.languages.SinatraServerCodegen +io.swagger.codegen.languages.SlimFrameworkServerCodegen io.swagger.codegen.languages.SpringMVCServerCodegen io.swagger.codegen.languages.StaticDocCodegen io.swagger.codegen.languages.StaticHtmlGenerator diff --git a/modules/swagger-codegen/src/main/resources/slim/.htaccess b/modules/swagger-codegen/src/main/resources/slim/.htaccess new file mode 100644 index 00000000000..e47b5fb8a0c --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/slim/.htaccess @@ -0,0 +1,5 @@ + + RewriteEngine On + RewriteCond %{REQUEST_FILENAME} !-f + RewriteRule ^(.*)$ index.php?_url=/$1 [QSA,L] + \ No newline at end of file diff --git a/modules/swagger-codegen/src/main/resources/slim/README.mustache b/modules/swagger-codegen/src/main/resources/slim/README.mustache new file mode 100644 index 00000000000..3b19f46bd38 --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/slim/README.mustache @@ -0,0 +1,10 @@ +# Swagger generated server + +## Overview +This server was generated by the [swagger-codegen](https://github.com/swagger-api/swagger-codegen) project. By using the +[swagger-spec](https://github.com/swagger-api/swagger-core/wiki) from a remote server, you can easily generate a server stub. This +is an example of building a PHP server. + +This example uses the [Slim Framework](http://www.slimframework.com/). To see how to make this your own, please take a look at the template here: + +[TEMPLATES](https://github.com/swagger-api/swagger-codegen/tree/master/modules/swagger-codegen/src/main/resources/slim/) diff --git a/modules/swagger-codegen/src/main/resources/slim/composer.json b/modules/swagger-codegen/src/main/resources/slim/composer.json new file mode 100644 index 00000000000..a33f327440d --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/slim/composer.json @@ -0,0 +1,5 @@ +{ + "require": { + "slim/slim": "3.*" + } +} \ No newline at end of file diff --git a/modules/swagger-codegen/src/main/resources/slim/index.mustache b/modules/swagger-codegen/src/main/resources/slim/index.mustache new file mode 100644 index 00000000000..ab91368063f --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/slim/index.mustache @@ -0,0 +1,22 @@ +{{httpMethod}}('{{path}}', function(Application $app, Request $request{{#pathParams}}, ${{paramName}}{{/pathParams}}) { + {{#queryParams}}${{paramName}} = $request->get('{{paramName}}');{{newline}} {{/queryParams}} + {{#formParams}}${{paramName}} = $request->get('{{paramName}}');{{newline}} {{/formParams}} + return new Response('How about implementing {{nickname}} as a {{httpMethod}} method ?'); + }); + + {{/operation}} + {{/operations}} + {{/apis}} +{{/apiInfo}} + +$app->run(); diff --git a/modules/swagger-codegen/src/test/java/io/swagger/codegen/options/SlimFrameworkServerOptionsProvider.java b/modules/swagger-codegen/src/test/java/io/swagger/codegen/options/SlimFrameworkServerOptionsProvider.java new file mode 100644 index 00000000000..d7676725750 --- /dev/null +++ b/modules/swagger-codegen/src/test/java/io/swagger/codegen/options/SlimFrameworkServerOptionsProvider.java @@ -0,0 +1,30 @@ +package io.swagger.codegen.options; + +import io.swagger.codegen.CodegenConstants; + +import com.google.common.collect.ImmutableMap; + +import java.util.Map; + +public class SlimFrameworkServerOptionsProvider implements OptionsProvider { + public static final String SORT_PARAMS_VALUE = "false"; + public static final String ENSURE_UNIQUE_PARAMS_VALUE = "true"; + + @Override + public String getLanguage() { + return "slim"; + } + + @Override + public Map createOptions() { + ImmutableMap.Builder builder = new ImmutableMap.Builder(); + return builder.put(CodegenConstants.SORT_PARAMS_BY_REQUIRED_FLAG, SORT_PARAMS_VALUE) + .put(CodegenConstants.ENSURE_UNIQUE_PARAMS, ENSURE_UNIQUE_PARAMS_VALUE) + .build(); + } + + @Override + public boolean isServer() { + return true; + } +} diff --git a/modules/swagger-codegen/src/test/java/io/swagger/codegen/slim/SlimFrameworkServerOptionsTest.java b/modules/swagger-codegen/src/test/java/io/swagger/codegen/slim/SlimFrameworkServerOptionsTest.java new file mode 100644 index 00000000000..51c668bd931 --- /dev/null +++ b/modules/swagger-codegen/src/test/java/io/swagger/codegen/slim/SlimFrameworkServerOptionsTest.java @@ -0,0 +1,32 @@ +package io.swagger.codegen.slim; + +import io.swagger.codegen.AbstractOptionsTest; +import io.swagger.codegen.CodegenConfig; +import io.swagger.codegen.languages.SlimFrameworkServerCodegen; +import io.swagger.codegen.options.SlimFrameworkServerOptionsProvider; + +import mockit.Expectations; +import mockit.Tested; + +public class SlimFrameworkServerOptionsTest extends AbstractOptionsTest { + + @Tested + private SlimFrameworkServerCodegen clientCodegen; + + public SlimFrameworkServerOptionsTest() { + super(new SlimFrameworkServerOptionsProvider()); + } + + @Override + protected CodegenConfig getCodegenConfig() { + return clientCodegen; + } + + @Override + protected void setExpectations() { + new Expectations(clientCodegen) {{ + clientCodegen.setSortParamsByRequiredFlag(Boolean.valueOf(SlimFrameworkServerOptionsProvider.SORT_PARAMS_VALUE)); + times = 1; + }}; + } +} diff --git a/modules/swagger-generator/src/test/java/io/swagger/generator/online/OnlineGeneratorOptionsTest.java b/modules/swagger-generator/src/test/java/io/swagger/generator/online/OnlineGeneratorOptionsTest.java index fc015f433ea..0d2574673d6 100644 --- a/modules/swagger-generator/src/test/java/io/swagger/generator/online/OnlineGeneratorOptionsTest.java +++ b/modules/swagger-generator/src/test/java/io/swagger/generator/online/OnlineGeneratorOptionsTest.java @@ -28,6 +28,7 @@ import io.swagger.codegen.options.ScalaClientOptionsProvider; import io.swagger.codegen.options.ScalatraServerOptionsProvider; import io.swagger.codegen.options.SilexServerOptionsProvider; import io.swagger.codegen.options.SinatraServerOptionsProvider; +import io.swagger.codegen.options.SlimFrameworkServerOptionsProvider; import io.swagger.codegen.options.SpringMVCServerOptionsProvider; import io.swagger.codegen.options.StaticDocOptionsProvider; import io.swagger.codegen.options.StaticHtmlOptionsProvider; @@ -77,11 +78,12 @@ public class OnlineGeneratorOptionsTest { {new PythonClientOptionsProvider()}, {new Qt5CPPOptionsProvider()}, {new RubyClientOptionsProvider()}, {new ScalaClientOptionsProvider()}, {new ScalatraServerOptionsProvider()}, {new SilexServerOptionsProvider()}, - {new SinatraServerOptionsProvider()}, {new SpringMVCServerOptionsProvider()}, - {new StaticDocOptionsProvider()}, {new StaticHtmlOptionsProvider()}, - {new SwaggerOptionsProvider()}, {new SwaggerYamlOptionsProvider()}, - {new SwiftOptionsProvider()}, {new TizenClientOptionsProvider()}, - {new TypeScriptAngularClientOptionsProvider()}, {new TypeScriptNodeClientOptionsProvider()} + {new SinatraServerOptionsProvider()}, {new SlimFrameworkServerOptionsProvider()}, + {new SpringMVCServerOptionsProvider()}, {new StaticDocOptionsProvider()}, + {new StaticHtmlOptionsProvider()}, {new SwaggerOptionsProvider()}, + {new SwaggerYamlOptionsProvider()}, {new SwiftOptionsProvider()}, + {new TizenClientOptionsProvider()}, {new TypeScriptAngularClientOptionsProvider()}, + {new TypeScriptNodeClientOptionsProvider()} }; } diff --git a/samples/server/petstore/slim/SwaggerServer/.htaccess b/samples/server/petstore/slim/SwaggerServer/.htaccess new file mode 100644 index 00000000000..e47b5fb8a0c --- /dev/null +++ b/samples/server/petstore/slim/SwaggerServer/.htaccess @@ -0,0 +1,5 @@ + + RewriteEngine On + RewriteCond %{REQUEST_FILENAME} !-f + RewriteRule ^(.*)$ index.php?_url=/$1 [QSA,L] + \ No newline at end of file diff --git a/samples/server/petstore/slim/SwaggerServer/README.md b/samples/server/petstore/slim/SwaggerServer/README.md new file mode 100644 index 00000000000..3b19f46bd38 --- /dev/null +++ b/samples/server/petstore/slim/SwaggerServer/README.md @@ -0,0 +1,10 @@ +# Swagger generated server + +## Overview +This server was generated by the [swagger-codegen](https://github.com/swagger-api/swagger-codegen) project. By using the +[swagger-spec](https://github.com/swagger-api/swagger-core/wiki) from a remote server, you can easily generate a server stub. This +is an example of building a PHP server. + +This example uses the [Slim Framework](http://www.slimframework.com/). To see how to make this your own, please take a look at the template here: + +[TEMPLATES](https://github.com/swagger-api/swagger-codegen/tree/master/modules/swagger-codegen/src/main/resources/slim/) diff --git a/samples/server/petstore/slim/SwaggerServer/composer.json b/samples/server/petstore/slim/SwaggerServer/composer.json new file mode 100644 index 00000000000..a33f327440d --- /dev/null +++ b/samples/server/petstore/slim/SwaggerServer/composer.json @@ -0,0 +1,5 @@ +{ + "require": { + "slim/slim": "3.*" + } +} \ No newline at end of file diff --git a/samples/server/petstore/slim/SwaggerServer/index.php b/samples/server/petstore/slim/SwaggerServer/index.php new file mode 100644 index 00000000000..c2b4741bb0c --- /dev/null +++ b/samples/server/petstore/slim/SwaggerServer/index.php @@ -0,0 +1,182 @@ +POST('/user', function(Application $app, Request $request) { + + + return new Response('How about implementing createUser as a POST method ?'); + }); + + + +$app->POST('/user/createWithArray', function(Application $app, Request $request) { + + + return new Response('How about implementing createUsersWithArrayInput as a POST method ?'); + }); + + + +$app->POST('/user/createWithList', function(Application $app, Request $request) { + + + return new Response('How about implementing createUsersWithListInput as a POST method ?'); + }); + + + +$app->GET('/user/login', function(Application $app, Request $request) { + $username = $request->get('username'); $password = $request->get('password'); + + return new Response('How about implementing loginUser as a GET method ?'); + }); + + + +$app->GET('/user/logout', function(Application $app, Request $request) { + + + return new Response('How about implementing logoutUser as a GET method ?'); + }); + + + +$app->GET('/user/{username}', function(Application $app, Request $request, $username) { + + + return new Response('How about implementing getUserByName as a GET method ?'); + }); + + + +$app->PUT('/user/{username}', function(Application $app, Request $request, $username) { + + + return new Response('How about implementing updateUser as a PUT method ?'); + }); + + + +$app->DELETE('/user/{username}', function(Application $app, Request $request, $username) { + + + return new Response('How about implementing deleteUser as a DELETE method ?'); + }); + + + + + + + +$app->GET('/store/inventory', function(Application $app, Request $request) { + + + return new Response('How about implementing getInventory as a GET method ?'); + }); + + + +$app->POST('/store/order', function(Application $app, Request $request) { + + + return new Response('How about implementing placeOrder as a POST method ?'); + }); + + + +$app->GET('/store/order/{orderId}', function(Application $app, Request $request, $order_id) { + + + return new Response('How about implementing getOrderById as a GET method ?'); + }); + + + +$app->DELETE('/store/order/{orderId}', function(Application $app, Request $request, $order_id) { + + + return new Response('How about implementing deleteOrder as a DELETE method ?'); + }); + + + + + + + +$app->PUT('/pet', function(Application $app, Request $request) { + + + return new Response('How about implementing updatePet as a PUT method ?'); + }); + + + +$app->POST('/pet', function(Application $app, Request $request) { + + + return new Response('How about implementing addPet as a POST method ?'); + }); + + + +$app->GET('/pet/findByStatus', function(Application $app, Request $request) { + $status = $request->get('status'); + + return new Response('How about implementing findPetsByStatus as a GET method ?'); + }); + + + +$app->GET('/pet/findByTags', function(Application $app, Request $request) { + $tags = $request->get('tags'); + + return new Response('How about implementing findPetsByTags as a GET method ?'); + }); + + + +$app->GET('/pet/{petId}', function(Application $app, Request $request, $pet_id) { + + + return new Response('How about implementing getPetById as a GET method ?'); + }); + + + +$app->POST('/pet/{petId}', function(Application $app, Request $request, $pet_id) { + + $name = $request->get('name'); $status = $request->get('status'); + return new Response('How about implementing updatePetWithForm as a POST method ?'); + }); + + + +$app->DELETE('/pet/{petId}', function(Application $app, Request $request, $pet_id) { + + + return new Response('How about implementing deletePet as a DELETE method ?'); + }); + + + +$app->POST('/pet/{petId}/uploadImage', function(Application $app, Request $request, $pet_id) { + + $additional_metadata = $request->get('additional_metadata'); $file = $request->get('file'); + return new Response('How about implementing uploadFile as a POST method ?'); + }); + + + + + + +$app->run(); From a81d8c56e3ff948e88ace18f0509746c7d53442d Mon Sep 17 00:00:00 2001 From: jfastnacht Date: Mon, 23 Nov 2015 15:34:36 +0100 Subject: [PATCH 2/6] Adjusted index.mustache to fit Slim Framework v3 Added composer support for Slim Framework v3 RC Updated samples --- .../src/main/resources/slim/composer.json | 1 + .../src/main/resources/slim/index.mustache | 30 ++- .../petstore/slim/SwaggerServer/composer.json | 1 + .../petstore/slim/SwaggerServer/index.php | 232 ++++++++++++------ 4 files changed, 172 insertions(+), 92 deletions(-) diff --git a/modules/swagger-codegen/src/main/resources/slim/composer.json b/modules/swagger-codegen/src/main/resources/slim/composer.json index a33f327440d..c55c8181765 100644 --- a/modules/swagger-codegen/src/main/resources/slim/composer.json +++ b/modules/swagger-codegen/src/main/resources/slim/composer.json @@ -1,4 +1,5 @@ { + "minimum-stability": "RC", "require": { "slim/slim": "3.*" } diff --git a/modules/swagger-codegen/src/main/resources/slim/index.mustache b/modules/swagger-codegen/src/main/resources/slim/index.mustache index ab91368063f..2f4a630909f 100644 --- a/modules/swagger-codegen/src/main/resources/slim/index.mustache +++ b/modules/swagger-codegen/src/main/resources/slim/index.mustache @@ -1,22 +1,26 @@ {{httpMethod}}('{{path}}', function(Application $app, Request $request{{#pathParams}}, ${{paramName}}{{/pathParams}}) { - {{#queryParams}}${{paramName}} = $request->get('{{paramName}}');{{newline}} {{/queryParams}} - {{#formParams}}${{paramName}} = $request->get('{{paramName}}');{{newline}} {{/formParams}} - return new Response('How about implementing {{nickname}} as a {{httpMethod}} method ?'); +{{#apis}}{{#operations}}{{#operation}} +/** + * {{httpMethod}} {{baseName}} + * {{summary}} + */ +$app->{{httpMethod}}('{{path}}', function($request, $response, $args) { + {{#hasQueryParams}}$queryParams = $request->getQueryParams(); + {{#queryParams}}${{paramName}} = $queryParams['{{paramName}}'];{{newline}} {{/queryParams}}{{/hasQueryParams}} + {{#hasFormParams}}{{#formParams}}${{paramName}} = $args['{{paramName}}'];{{newline}} {{/formParams}}{{/hasFormParams}} + $response->write('How about implementing {{nickname}} as a {{httpMethod}} method ?'); + return $response; }); - {{/operation}} - {{/operations}} - {{/apis}} -{{/apiInfo}} +{{/operation}}{{/operations}}{{/apis}}{{/apiInfo}} $app->run(); diff --git a/samples/server/petstore/slim/SwaggerServer/composer.json b/samples/server/petstore/slim/SwaggerServer/composer.json index a33f327440d..c55c8181765 100644 --- a/samples/server/petstore/slim/SwaggerServer/composer.json +++ b/samples/server/petstore/slim/SwaggerServer/composer.json @@ -1,4 +1,5 @@ { + "minimum-stability": "RC", "require": { "slim/slim": "3.*" } diff --git a/samples/server/petstore/slim/SwaggerServer/index.php b/samples/server/petstore/slim/SwaggerServer/index.php index c2b4741bb0c..49bd15930e2 100644 --- a/samples/server/petstore/slim/SwaggerServer/index.php +++ b/samples/server/petstore/slim/SwaggerServer/index.php @@ -1,182 +1,256 @@ POST('/user', function(Application $app, Request $request) { +/** + * POST User + * Create user + */ +$app->POST('/user', function($request, $response, $args) { - return new Response('How about implementing createUser as a POST method ?'); + $response->write('How about implementing createUser as a POST method ?'); + return $response; }); - -$app->POST('/user/createWithArray', function(Application $app, Request $request) { +/** + * POST User + * Creates list of users with given input array + */ +$app->POST('/user/createWithArray', function($request, $response, $args) { - return new Response('How about implementing createUsersWithArrayInput as a POST method ?'); + $response->write('How about implementing createUsersWithArrayInput as a POST method ?'); + return $response; }); - -$app->POST('/user/createWithList', function(Application $app, Request $request) { +/** + * POST User + * Creates list of users with given input array + */ +$app->POST('/user/createWithList', function($request, $response, $args) { - return new Response('How about implementing createUsersWithListInput as a POST method ?'); + $response->write('How about implementing createUsersWithListInput as a POST method ?'); + return $response; }); - -$app->GET('/user/login', function(Application $app, Request $request) { - $username = $request->get('username'); $password = $request->get('password'); +/** + * GET User + * Logs user into the system + */ +$app->GET('/user/login', function($request, $response, $args) { + $queryParams = $request->getQueryParams(); + $username = $queryParams['username']; $password = $queryParams['password']; - return new Response('How about implementing loginUser as a GET method ?'); + $response->write('How about implementing loginUser as a GET method ?'); + return $response; }); - -$app->GET('/user/logout', function(Application $app, Request $request) { +/** + * GET User + * Logs out current logged in user session + */ +$app->GET('/user/logout', function($request, $response, $args) { - return new Response('How about implementing logoutUser as a GET method ?'); + $response->write('How about implementing logoutUser as a GET method ?'); + return $response; }); - -$app->GET('/user/{username}', function(Application $app, Request $request, $username) { +/** + * GET User + * Get user by user name + */ +$app->GET('/user/{username}', function($request, $response, $args) { - return new Response('How about implementing getUserByName as a GET method ?'); + $response->write('How about implementing getUserByName as a GET method ?'); + return $response; }); - -$app->PUT('/user/{username}', function(Application $app, Request $request, $username) { +/** + * PUT User + * Updated user + */ +$app->PUT('/user/{username}', function($request, $response, $args) { - return new Response('How about implementing updateUser as a PUT method ?'); + $response->write('How about implementing updateUser as a PUT method ?'); + return $response; }); - -$app->DELETE('/user/{username}', function(Application $app, Request $request, $username) { +/** + * DELETE User + * Delete user + */ +$app->DELETE('/user/{username}', function($request, $response, $args) { - return new Response('How about implementing deleteUser as a DELETE method ?'); + $response->write('How about implementing deleteUser as a DELETE method ?'); + return $response; }); - - - - - -$app->GET('/store/inventory', function(Application $app, Request $request) { +/** + * GET Store + * Returns pet inventories by status + */ +$app->GET('/store/inventory', function($request, $response, $args) { - return new Response('How about implementing getInventory as a GET method ?'); + $response->write('How about implementing getInventory as a GET method ?'); + return $response; }); - -$app->POST('/store/order', function(Application $app, Request $request) { +/** + * POST Store + * Place an order for a pet + */ +$app->POST('/store/order', function($request, $response, $args) { - return new Response('How about implementing placeOrder as a POST method ?'); + $response->write('How about implementing placeOrder as a POST method ?'); + return $response; }); - -$app->GET('/store/order/{orderId}', function(Application $app, Request $request, $order_id) { +/** + * GET Store + * Find purchase order by ID + */ +$app->GET('/store/order/{orderId}', function($request, $response, $args) { - return new Response('How about implementing getOrderById as a GET method ?'); + $response->write('How about implementing getOrderById as a GET method ?'); + return $response; }); - -$app->DELETE('/store/order/{orderId}', function(Application $app, Request $request, $order_id) { +/** + * DELETE Store + * Delete purchase order by ID + */ +$app->DELETE('/store/order/{orderId}', function($request, $response, $args) { - return new Response('How about implementing deleteOrder as a DELETE method ?'); + $response->write('How about implementing deleteOrder as a DELETE method ?'); + return $response; }); - - - - - -$app->PUT('/pet', function(Application $app, Request $request) { +/** + * PUT Pet + * Update an existing pet + */ +$app->PUT('/pet', function($request, $response, $args) { - return new Response('How about implementing updatePet as a PUT method ?'); + $response->write('How about implementing updatePet as a PUT method ?'); + return $response; }); - -$app->POST('/pet', function(Application $app, Request $request) { +/** + * POST Pet + * Add a new pet to the store + */ +$app->POST('/pet', function($request, $response, $args) { - return new Response('How about implementing addPet as a POST method ?'); + $response->write('How about implementing addPet as a POST method ?'); + return $response; }); - -$app->GET('/pet/findByStatus', function(Application $app, Request $request) { - $status = $request->get('status'); +/** + * GET Pet + * Finds Pets by status + */ +$app->GET('/pet/findByStatus', function($request, $response, $args) { + $queryParams = $request->getQueryParams(); + $status = $queryParams['status']; - return new Response('How about implementing findPetsByStatus as a GET method ?'); + $response->write('How about implementing findPetsByStatus as a GET method ?'); + return $response; }); - -$app->GET('/pet/findByTags', function(Application $app, Request $request) { - $tags = $request->get('tags'); +/** + * GET Pet + * Finds Pets by tags + */ +$app->GET('/pet/findByTags', function($request, $response, $args) { + $queryParams = $request->getQueryParams(); + $tags = $queryParams['tags']; - return new Response('How about implementing findPetsByTags as a GET method ?'); + $response->write('How about implementing findPetsByTags as a GET method ?'); + return $response; }); - -$app->GET('/pet/{petId}', function(Application $app, Request $request, $pet_id) { +/** + * GET Pet + * Find pet by ID + */ +$app->GET('/pet/{petId}', function($request, $response, $args) { - return new Response('How about implementing getPetById as a GET method ?'); + $response->write('How about implementing getPetById as a GET method ?'); + return $response; }); - -$app->POST('/pet/{petId}', function(Application $app, Request $request, $pet_id) { +/** + * POST Pet + * Updates a pet in the store with form data + */ +$app->POST('/pet/{petId}', function($request, $response, $args) { - $name = $request->get('name'); $status = $request->get('status'); - return new Response('How about implementing updatePetWithForm as a POST method ?'); + $name = $args['name']; $status = $args['status']; + $response->write('How about implementing updatePetWithForm as a POST method ?'); + return $response; }); - -$app->DELETE('/pet/{petId}', function(Application $app, Request $request, $pet_id) { +/** + * DELETE Pet + * Deletes a pet + */ +$app->DELETE('/pet/{petId}', function($request, $response, $args) { - return new Response('How about implementing deletePet as a DELETE method ?'); + $response->write('How about implementing deletePet as a DELETE method ?'); + return $response; }); - -$app->POST('/pet/{petId}/uploadImage', function(Application $app, Request $request, $pet_id) { +/** + * POST Pet + * uploads an image + */ +$app->POST('/pet/{petId}/uploadImage', function($request, $response, $args) { - $additional_metadata = $request->get('additional_metadata'); $file = $request->get('file'); - return new Response('How about implementing uploadFile as a POST method ?'); + $additional_metadata = $args['additional_metadata']; $file = $args['file']; + $response->write('How about implementing uploadFile as a POST method ?'); + return $response; }); - - - $app->run(); From 70efc066b5505d95b2d2f5cabccc949e26d0de75 Mon Sep 17 00:00:00 2001 From: jfastnacht Date: Mon, 23 Nov 2015 16:43:13 +0100 Subject: [PATCH 3/6] Added notes, output formats, header params and body params --- .../src/main/resources/slim/index.mustache | 12 +- .../petstore/slim/SwaggerServer/index.php | 170 +++++++++++++----- 2 files changed, 133 insertions(+), 49 deletions(-) diff --git a/modules/swagger-codegen/src/main/resources/slim/index.mustache b/modules/swagger-codegen/src/main/resources/slim/index.mustache index 2f4a630909f..4e17aa6e523 100644 --- a/modules/swagger-codegen/src/main/resources/slim/index.mustache +++ b/modules/swagger-codegen/src/main/resources/slim/index.mustache @@ -10,13 +10,17 @@ $app = new Slim\App(); {{#apis}}{{#operations}}{{#operation}} /** - * {{httpMethod}} {{baseName}} - * {{summary}} + * {{httpMethod}} {{nickname}} + * Summary: {{summary}} + * Notes: {{notes}} +{{#hasProduces}} * Output-Formats: [{{#produces}}{{mediaType}}{{#hasMore}}, {{/hasMore}}{{/produces}}]{{/hasProduces}} */ $app->{{httpMethod}}('{{path}}', function($request, $response, $args) { + {{#hasHeaderParams}}$headers = $request->getHeaders();{{/hasHeaderParams}} {{#hasQueryParams}}$queryParams = $request->getQueryParams(); - {{#queryParams}}${{paramName}} = $queryParams['{{paramName}}'];{{newline}} {{/queryParams}}{{/hasQueryParams}} - {{#hasFormParams}}{{#formParams}}${{paramName}} = $args['{{paramName}}'];{{newline}} {{/formParams}}{{/hasFormParams}} + {{#queryParams}}$qp_{{paramName}} = $queryParams['{{paramName}}'];{{newline}} {{/queryParams}}{{/hasQueryParams}} + {{#hasFormParams}}{{#formParams}}$fp_{{paramName}} = $args['{{paramName}}'];{{newline}} {{/formParams}}{{/hasFormParams}} + {{#hasBodyParam}}$body = $request->getParsedBody();{{/hasBodyParam}} $response->write('How about implementing {{nickname}} as a {{httpMethod}} method ?'); return $response; }); diff --git a/samples/server/petstore/slim/SwaggerServer/index.php b/samples/server/petstore/slim/SwaggerServer/index.php index 49bd15930e2..f92530d90c1 100644 --- a/samples/server/petstore/slim/SwaggerServer/index.php +++ b/samples/server/petstore/slim/SwaggerServer/index.php @@ -10,48 +10,64 @@ $app = new Slim\App(); /** - * POST User - * Create user + * POST createUser + * Summary: Create user + * Notes: This can only be done by the logged in user. + * Output-Formats: [application/xml, application/json] */ $app->POST('/user', function($request, $response, $args) { + + $body = $request->getParsedBody(); $response->write('How about implementing createUser as a POST method ?'); return $response; }); /** - * POST User - * Creates list of users with given input array + * POST createUsersWithArrayInput + * Summary: Creates list of users with given input array + * Notes: + * Output-Formats: [application/xml, application/json] */ $app->POST('/user/createWithArray', function($request, $response, $args) { + + $body = $request->getParsedBody(); $response->write('How about implementing createUsersWithArrayInput as a POST method ?'); return $response; }); /** - * POST User - * Creates list of users with given input array + * POST createUsersWithListInput + * Summary: Creates list of users with given input array + * Notes: + * Output-Formats: [application/xml, application/json] */ $app->POST('/user/createWithList', function($request, $response, $args) { + + $body = $request->getParsedBody(); $response->write('How about implementing createUsersWithListInput as a POST method ?'); return $response; }); /** - * GET User - * Logs user into the system + * GET loginUser + * Summary: Logs user into the system + * Notes: + * Output-Formats: [application/xml, application/json] */ $app->GET('/user/login', function($request, $response, $args) { + $queryParams = $request->getQueryParams(); - $username = $queryParams['username']; $password = $queryParams['password']; + $qp_username = $queryParams['username']; $qp_password = $queryParams['password']; + $response->write('How about implementing loginUser as a GET method ?'); return $response; @@ -59,132 +75,176 @@ $app->GET('/user/login', function($request, $response, $args) { /** - * GET User - * Logs out current logged in user session + * GET logoutUser + * Summary: Logs out current logged in user session + * Notes: + * Output-Formats: [application/xml, application/json] */ $app->GET('/user/logout', function($request, $response, $args) { + + $response->write('How about implementing logoutUser as a GET method ?'); return $response; }); /** - * GET User - * Get user by user name + * GET getUserByName + * Summary: Get user by user name + * Notes: + * Output-Formats: [application/xml, application/json] */ $app->GET('/user/{username}', function($request, $response, $args) { + + $response->write('How about implementing getUserByName as a GET method ?'); return $response; }); /** - * PUT User - * Updated user + * PUT updateUser + * Summary: Updated user + * Notes: This can only be done by the logged in user. + * Output-Formats: [application/xml, application/json] */ $app->PUT('/user/{username}', function($request, $response, $args) { + + $body = $request->getParsedBody(); $response->write('How about implementing updateUser as a PUT method ?'); return $response; }); /** - * DELETE User - * Delete user + * DELETE deleteUser + * Summary: Delete user + * Notes: This can only be done by the logged in user. + * Output-Formats: [application/xml, application/json] */ $app->DELETE('/user/{username}', function($request, $response, $args) { + + $response->write('How about implementing deleteUser as a DELETE method ?'); return $response; }); /** - * GET Store - * Returns pet inventories by status + * GET getInventory + * Summary: Returns pet inventories by status + * Notes: Returns a map of status codes to quantities + * Output-Formats: [application/json] */ $app->GET('/store/inventory', function($request, $response, $args) { + + $response->write('How about implementing getInventory as a GET method ?'); return $response; }); /** - * POST Store - * Place an order for a pet + * POST placeOrder + * Summary: Place an order for a pet + * Notes: + * Output-Formats: [application/xml, application/json] */ $app->POST('/store/order', function($request, $response, $args) { + + $body = $request->getParsedBody(); $response->write('How about implementing placeOrder as a POST method ?'); return $response; }); /** - * GET Store - * Find purchase order by ID + * GET getOrderById + * Summary: Find purchase order by ID + * Notes: For valid response try integer IDs with value <= 5 or > 10. Other values will generated exceptions + * Output-Formats: [application/xml, application/json] */ $app->GET('/store/order/{orderId}', function($request, $response, $args) { + + $response->write('How about implementing getOrderById as a GET method ?'); return $response; }); /** - * DELETE Store - * Delete purchase order by ID + * DELETE deleteOrder + * Summary: Delete purchase order by ID + * Notes: For valid response try integer IDs with value < 1000. Anything above 1000 or nonintegers will generate API errors + * Output-Formats: [application/xml, application/json] */ $app->DELETE('/store/order/{orderId}', function($request, $response, $args) { + + $response->write('How about implementing deleteOrder as a DELETE method ?'); return $response; }); /** - * PUT Pet - * Update an existing pet + * PUT updatePet + * Summary: Update an existing pet + * Notes: + * Output-Formats: [application/xml, application/json] */ $app->PUT('/pet', function($request, $response, $args) { + + $body = $request->getParsedBody(); $response->write('How about implementing updatePet as a PUT method ?'); return $response; }); /** - * POST Pet - * Add a new pet to the store + * POST addPet + * Summary: Add a new pet to the store + * Notes: + * Output-Formats: [application/xml, application/json] */ $app->POST('/pet', function($request, $response, $args) { + + $body = $request->getParsedBody(); $response->write('How about implementing addPet as a POST method ?'); return $response; }); /** - * GET Pet - * Finds Pets by status + * GET findPetsByStatus + * Summary: Finds Pets by status + * Notes: Multiple status values can be provided with comma seperated strings + * Output-Formats: [application/xml, application/json] */ $app->GET('/pet/findByStatus', function($request, $response, $args) { + $queryParams = $request->getQueryParams(); - $status = $queryParams['status']; + $qp_status = $queryParams['status']; + $response->write('How about implementing findPetsByStatus as a GET method ?'); return $response; @@ -192,12 +252,16 @@ $app->GET('/pet/findByStatus', function($request, $response, $args) { /** - * GET Pet - * Finds Pets by tags + * GET findPetsByTags + * Summary: Finds Pets by tags + * Notes: Muliple tags can be provided with comma seperated strings. Use tag1, tag2, tag3 for testing. + * Output-Formats: [application/xml, application/json] */ $app->GET('/pet/findByTags', function($request, $response, $args) { + $queryParams = $request->getQueryParams(); - $tags = $queryParams['tags']; + $qp_tags = $queryParams['tags']; + $response->write('How about implementing findPetsByTags as a GET method ?'); return $response; @@ -205,34 +269,46 @@ $app->GET('/pet/findByTags', function($request, $response, $args) { /** - * GET Pet - * Find pet by ID + * GET getPetById + * Summary: Find pet by ID + * Notes: Returns a single pet + * Output-Formats: [application/xml, application/json] */ $app->GET('/pet/{petId}', function($request, $response, $args) { + + $response->write('How about implementing getPetById as a GET method ?'); return $response; }); /** - * POST Pet - * Updates a pet in the store with form data + * POST updatePetWithForm + * Summary: Updates a pet in the store with form data + * Notes: + * Output-Formats: [application/xml, application/json] */ $app->POST('/pet/{petId}', function($request, $response, $args) { - $name = $args['name']; $status = $args['status']; + + $fp_name = $args['name']; $fp_status = $args['status']; + $response->write('How about implementing updatePetWithForm as a POST method ?'); return $response; }); /** - * DELETE Pet - * Deletes a pet + * DELETE deletePet + * Summary: Deletes a pet + * Notes: + * Output-Formats: [application/xml, application/json] */ $app->DELETE('/pet/{petId}', function($request, $response, $args) { + $headers = $request->getHeaders(); + $response->write('How about implementing deletePet as a DELETE method ?'); @@ -241,12 +317,16 @@ $app->DELETE('/pet/{petId}', function($request, $response, $args) { /** - * POST Pet - * uploads an image + * POST uploadFile + * Summary: uploads an image + * Notes: + * Output-Formats: [application/json] */ $app->POST('/pet/{petId}/uploadImage', function($request, $response, $args) { - $additional_metadata = $args['additional_metadata']; $file = $args['file']; + + $fp_additional_metadata = $args['additional_metadata']; $fp_file = $args['file']; + $response->write('How about implementing uploadFile as a POST method ?'); return $response; }); From d38933f927e8914f60d2f791a4a58a2ec1fe3314 Mon Sep 17 00:00:00 2001 From: jfastnacht Date: Mon, 23 Nov 2015 17:49:19 +0100 Subject: [PATCH 4/6] Added model.mustache for basic class definitions. Added sample class files. --- .../languages/SlimFrameworkServerCodegen.java | 10 +++---- .../src/main/resources/slim/model.mustache | 15 ++++++++++ .../SwaggerServer/lib/models/ApiResponse.php | 18 ++++++++++++ .../SwaggerServer/lib/models/Category.php | 16 +++++++++++ .../slim/SwaggerServer/lib/models/Order.php | 24 ++++++++++++++++ .../slim/SwaggerServer/lib/models/Pet.php | 24 ++++++++++++++++ .../slim/SwaggerServer/lib/models/Tag.php | 16 +++++++++++ .../slim/SwaggerServer/lib/models/User.php | 28 +++++++++++++++++++ 8 files changed, 146 insertions(+), 5 deletions(-) create mode 100644 modules/swagger-codegen/src/main/resources/slim/model.mustache create mode 100644 samples/server/petstore/slim/SwaggerServer/lib/models/ApiResponse.php create mode 100644 samples/server/petstore/slim/SwaggerServer/lib/models/Category.php create mode 100644 samples/server/petstore/slim/SwaggerServer/lib/models/Order.php create mode 100644 samples/server/petstore/slim/SwaggerServer/lib/models/Pet.php create mode 100644 samples/server/petstore/slim/SwaggerServer/lib/models/Tag.php create mode 100644 samples/server/petstore/slim/SwaggerServer/lib/models/User.php diff --git a/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/SlimFrameworkServerCodegen.java b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/SlimFrameworkServerCodegen.java index 1b8680cab6e..847f1a5fdcd 100644 --- a/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/SlimFrameworkServerCodegen.java +++ b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/SlimFrameworkServerCodegen.java @@ -27,12 +27,12 @@ public class SlimFrameworkServerCodegen extends DefaultCodegen implements Codege String packagePath = "SwaggerServer"; - modelPackage = packagePath + "/lib/models"; - apiPackage = packagePath + "/lib"; - outputFolder = "generated-code/slim"; + modelPackage = packagePath + "\\lib\\Models"; + apiPackage = packagePath + "\\lib"; + outputFolder = "generated-code" + File.separator + "slim"; + modelTemplateFiles.put("model.mustache", ".php"); - // no model, api files - modelTemplateFiles.clear(); + // no api files apiTemplateFiles.clear(); embeddedTemplateDir = templateDir = "slim"; diff --git a/modules/swagger-codegen/src/main/resources/slim/model.mustache b/modules/swagger-codegen/src/main/resources/slim/model.mustache new file mode 100644 index 00000000000..48f586793ee --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/slim/model.mustache @@ -0,0 +1,15 @@ + Date: Fri, 27 Nov 2015 15:25:40 +0100 Subject: [PATCH 5/6] Adjusted codegen to fit pull request comments in https://github.com/swagger-api/swagger-codegen/pull/1619 --- .../languages/SlimFrameworkServerCodegen.java | 42 +++++++++++++++---- 1 file changed, 34 insertions(+), 8 deletions(-) diff --git a/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/SlimFrameworkServerCodegen.java b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/SlimFrameworkServerCodegen.java index 847f1a5fdcd..ef318cb6bdd 100644 --- a/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/SlimFrameworkServerCodegen.java +++ b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/SlimFrameworkServerCodegen.java @@ -8,6 +8,7 @@ import io.swagger.codegen.SupportingFile; import io.swagger.models.properties.ArrayProperty; import io.swagger.models.properties.MapProperty; import io.swagger.models.properties.Property; +import io.swagger.models.properties.RefProperty; import java.io.File; import java.util.Arrays; @@ -19,6 +20,7 @@ public class SlimFrameworkServerCodegen extends DefaultCodegen implements Codege protected String groupId = "io.swagger"; protected String artifactId = "swagger-server"; protected String artifactVersion = "1.0.0"; + private String variableNamingConvention = "camelCase"; public SlimFrameworkServerCodegen() { super(); @@ -73,10 +75,10 @@ public class SlimFrameworkServerCodegen extends DefaultCodegen implements Codege typeMapping.put("double", "double"); typeMapping.put("string", "string"); typeMapping.put("byte", "int"); - typeMapping.put("boolean", "boolean"); - typeMapping.put("date", "DateTime"); - typeMapping.put("datetime", "DateTime"); - typeMapping.put("file", "string"); + typeMapping.put("boolean", "bool"); + typeMapping.put("date", "\\DateTime"); + typeMapping.put("datetime", "\\DateTime"); + typeMapping.put("file", "\\SplFileObject"); typeMapping.put("map", "map"); typeMapping.put("array", "array"); typeMapping.put("list", "array"); @@ -119,11 +121,15 @@ public class SlimFrameworkServerCodegen extends DefaultCodegen implements Codege if (p instanceof ArrayProperty) { ArrayProperty ap = (ArrayProperty) p; Property inner = ap.getItems(); - return getSwaggerType(p) + "[" + getTypeDeclaration(inner) + "]"; + return getTypeDeclaration(inner) + "[]"; } else if (p instanceof MapProperty) { MapProperty mp = (MapProperty) p; Property inner = mp.getAdditionalProperties(); return getSwaggerType(p) + "[string," + getTypeDeclaration(inner) + "]"; + } else if (p instanceof RefProperty) { + String type = super.getTypeDeclaration(p); + return (!languageSpecificPrimitives.contains(type)) + ? "\\" + modelPackage + "\\" + type : type; } return super.getTypeDeclaration(p); } @@ -148,16 +154,36 @@ public class SlimFrameworkServerCodegen extends DefaultCodegen implements Codege return toModelName(type); } + @Override + public String getTypeDeclaration(String name) { + if (!languageSpecificPrimitives.contains(name)) { + return "\\" + modelPackage + "\\" + name; + } + return super.getTypeDeclaration(name); + } + public String toDefaultValue(Property p) { return "null"; } + public void setParameterNamingConvention(String variableNamingConvention) { + this.variableNamingConvention = variableNamingConvention; + } @Override public String toVarName(String name) { - // return the name in underscore style - // PhoneNumber => phone_number - name = underscore(name); + // sanitize name + name = sanitizeName(name); + + if ("camelCase".equals(variableNamingConvention)) { + // return the name in camelCase style + // phone_number => phoneNumber + name = camelize(name, true); + } else { // default to snake case + // return the name in underscore style + // PhoneNumber => phone_number + name = underscore(name); + } // parameter name starting with number won't compile // need to escape it by appending _ at the beginning From 41936ab5c94127b81c8d98713b479b1128239b84 Mon Sep 17 00:00:00 2001 From: jfastnacht Date: Fri, 27 Nov 2015 15:37:25 +0100 Subject: [PATCH 6/6] Adjusted index.mustache to fit camelCase variable naming. Updated index.php sample. --- .../src/main/resources/slim/index.mustache | 4 ++-- samples/server/petstore/slim/SwaggerServer/index.php | 10 +++++----- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/modules/swagger-codegen/src/main/resources/slim/index.mustache b/modules/swagger-codegen/src/main/resources/slim/index.mustache index 4e17aa6e523..4fdd77681c3 100644 --- a/modules/swagger-codegen/src/main/resources/slim/index.mustache +++ b/modules/swagger-codegen/src/main/resources/slim/index.mustache @@ -18,8 +18,8 @@ $app = new Slim\App(); $app->{{httpMethod}}('{{path}}', function($request, $response, $args) { {{#hasHeaderParams}}$headers = $request->getHeaders();{{/hasHeaderParams}} {{#hasQueryParams}}$queryParams = $request->getQueryParams(); - {{#queryParams}}$qp_{{paramName}} = $queryParams['{{paramName}}'];{{newline}} {{/queryParams}}{{/hasQueryParams}} - {{#hasFormParams}}{{#formParams}}$fp_{{paramName}} = $args['{{paramName}}'];{{newline}} {{/formParams}}{{/hasFormParams}} + {{#queryParams}}${{paramName}} = $queryParams['{{paramName}}'];{{newline}} {{/queryParams}}{{/hasQueryParams}} + {{#hasFormParams}}{{#formParams}}${{paramName}} = $args['{{paramName}}'];{{newline}} {{/formParams}}{{/hasFormParams}} {{#hasBodyParam}}$body = $request->getParsedBody();{{/hasBodyParam}} $response->write('How about implementing {{nickname}} as a {{httpMethod}} method ?'); return $response; diff --git a/samples/server/petstore/slim/SwaggerServer/index.php b/samples/server/petstore/slim/SwaggerServer/index.php index f92530d90c1..1db11f806fb 100644 --- a/samples/server/petstore/slim/SwaggerServer/index.php +++ b/samples/server/petstore/slim/SwaggerServer/index.php @@ -66,7 +66,7 @@ $app->POST('/user/createWithList', function($request, $response, $args) { $app->GET('/user/login', function($request, $response, $args) { $queryParams = $request->getQueryParams(); - $qp_username = $queryParams['username']; $qp_password = $queryParams['password']; + $username = $queryParams['username']; $password = $queryParams['password']; $response->write('How about implementing loginUser as a GET method ?'); @@ -243,7 +243,7 @@ $app->POST('/pet', function($request, $response, $args) { $app->GET('/pet/findByStatus', function($request, $response, $args) { $queryParams = $request->getQueryParams(); - $qp_status = $queryParams['status']; + $status = $queryParams['status']; $response->write('How about implementing findPetsByStatus as a GET method ?'); @@ -260,7 +260,7 @@ $app->GET('/pet/findByStatus', function($request, $response, $args) { $app->GET('/pet/findByTags', function($request, $response, $args) { $queryParams = $request->getQueryParams(); - $qp_tags = $queryParams['tags']; + $tags = $queryParams['tags']; $response->write('How about implementing findPetsByTags as a GET method ?'); @@ -293,7 +293,7 @@ $app->GET('/pet/{petId}', function($request, $response, $args) { $app->POST('/pet/{petId}', function($request, $response, $args) { - $fp_name = $args['name']; $fp_status = $args['status']; + $name = $args['name']; $status = $args['status']; $response->write('How about implementing updatePetWithForm as a POST method ?'); return $response; @@ -325,7 +325,7 @@ $app->DELETE('/pet/{petId}', function($request, $response, $args) { $app->POST('/pet/{petId}/uploadImage', function($request, $response, $args) { - $fp_additional_metadata = $args['additional_metadata']; $fp_file = $args['file']; + $additionalMetadata = $args['additionalMetadata']; $file = $args['file']; $response->write('How about implementing uploadFile as a POST method ?'); return $response;