From 372a08763d5b77c6d52c4fbd3e4beb2f2a75f529 Mon Sep 17 00:00:00 2001 From: Andrew Norman Date: Thu, 9 Nov 2017 20:12:40 -0800 Subject: [PATCH 1/8] adding "Read Timeout" getters and setters for the Jersey and OkHttp (#6853) * adding "Read Timeout" getters and setters for the Jersey and OkHttp based ApiClients adding "Write Timeout" getters and setters for the OkHttp based ApiClient adding tests for the OkHttpClient covering the new getters and setters * generated files from the bin scripts --- .../Java/libraries/jersey2/ApiClient.mustache | 21 +++++++++ .../libraries/okhttp-gson/ApiClient.mustache | 47 ++++++++++++++++++- .../java/io/swagger/client/ApiClient.java | 47 ++++++++++++++++++- .../java/io/swagger/client/api/FakeApi.java | 10 ++-- .../java/io/swagger/client/ApiClient.java | 47 ++++++++++++++++++- .../java/io/swagger/client/ApiClientTest.java | 26 ++++++++++ 6 files changed, 188 insertions(+), 10 deletions(-) diff --git a/modules/swagger-codegen/src/main/resources/Java/libraries/jersey2/ApiClient.mustache b/modules/swagger-codegen/src/main/resources/Java/libraries/jersey2/ApiClient.mustache index 4175739c37a7..e4072aa5ad90 100644 --- a/modules/swagger-codegen/src/main/resources/Java/libraries/jersey2/ApiClient.mustache +++ b/modules/swagger-codegen/src/main/resources/Java/libraries/jersey2/ApiClient.mustache @@ -306,6 +306,27 @@ public class ApiClient { return this; } + /** + * read timeout (in milliseconds). + * @return Read timeout + */ + public int getReadTimeout() { + return readTimeout; + } + + /** + * Set the read timeout (in milliseconds). + * A value of 0 means no timeout, otherwise values must be between 1 and + * {@link Integer#MAX_VALUE}. + * @param readTimeout Read timeout in milliseconds + * @return API client + */ + public ApiClient setReadTimeout(int readTimeout) { + this.readTimeout = readTimeout; + httpClient.property(ClientProperties.READ_TIMEOUT, readTimeout); + return this; + } + /** * Get the date format used to parse/format date parameters. * @return Date format diff --git a/modules/swagger-codegen/src/main/resources/Java/libraries/okhttp-gson/ApiClient.mustache b/modules/swagger-codegen/src/main/resources/Java/libraries/okhttp-gson/ApiClient.mustache index c61eadb1b1de..0ae00335726a 100644 --- a/modules/swagger-codegen/src/main/resources/Java/libraries/okhttp-gson/ApiClient.mustache +++ b/modules/swagger-codegen/src/main/resources/Java/libraries/okhttp-gson/ApiClient.mustache @@ -426,7 +426,7 @@ public class ApiClient { } /** - * Set the tempoaray folder path (for downloading files) + * Set the temporary folder path (for downloading files) * * @param tempFolderPath Temporary folder path * @return ApiClient @@ -448,6 +448,7 @@ public class ApiClient { /** * Sets the connect timeout (in milliseconds). * A value of 0 means no timeout, otherwise values must be between 1 and + * {@link Integer#MAX_VALUE}. * * @param connectionTimeout connection timeout in milliseconds * @return Api client @@ -457,6 +458,50 @@ public class ApiClient { return this; } + /** + * Get read timeout (in milliseconds). + * + * @return Timeout in milliseconds + */ + public int getReadTimeout() { + return httpClient.getReadTimeout(); + } + + /** + * Sets the read timeout (in milliseconds). + * A value of 0 means no timeout, otherwise values must be between 1 and + * {@link Integer#MAX_VALUE}. + * + * @param readTimeout read timeout in milliseconds + * @return Api client + */ + public ApiClient setReadTimeout(int readTimeout) { + httpClient.setReadTimeout(readTimeout, TimeUnit.MILLISECONDS); + return this; + } + + /** + * Get write timeout (in milliseconds). + * + * @return Timeout in milliseconds + */ + public int getWriteTimeout() { + return httpClient.getWriteTimeout(); + } + + /** + * Sets the write timeout (in milliseconds). + * A value of 0 means no timeout, otherwise values must be between 1 and + * {@link Integer#MAX_VALUE}. + * + * @param writeTimeout connection timeout in milliseconds + * @return Api client + */ + public ApiClient setWriteTimeout(int writeTimeout) { + httpClient.setWriteTimeout(writeTimeout, TimeUnit.MILLISECONDS); + return this; + } + /** * Format the given parameter object into string. * diff --git a/samples/client/petstore-security-test/java/okhttp-gson/src/main/java/io/swagger/client/ApiClient.java b/samples/client/petstore-security-test/java/okhttp-gson/src/main/java/io/swagger/client/ApiClient.java index 861d7a3f01a1..7e15b474c449 100644 --- a/samples/client/petstore-security-test/java/okhttp-gson/src/main/java/io/swagger/client/ApiClient.java +++ b/samples/client/petstore-security-test/java/okhttp-gson/src/main/java/io/swagger/client/ApiClient.java @@ -406,7 +406,7 @@ public class ApiClient { } /** - * Set the tempoaray folder path (for downloading files) + * Set the temporary folder path (for downloading files) * * @param tempFolderPath Temporary folder path * @return ApiClient @@ -428,6 +428,7 @@ public class ApiClient { /** * Sets the connect timeout (in milliseconds). * A value of 0 means no timeout, otherwise values must be between 1 and + * {@link Integer#MAX_VALUE}. * * @param connectionTimeout connection timeout in milliseconds * @return Api client @@ -437,6 +438,50 @@ public class ApiClient { return this; } + /** + * Get read timeout (in milliseconds). + * + * @return Timeout in milliseconds + */ + public int getReadTimeout() { + return httpClient.getReadTimeout(); + } + + /** + * Sets the read timeout (in milliseconds). + * A value of 0 means no timeout, otherwise values must be between 1 and + * {@link Integer#MAX_VALUE}. + * + * @param readTimeout read timeout in milliseconds + * @return Api client + */ + public ApiClient setReadTimeout(int readTimeout) { + httpClient.setReadTimeout(readTimeout, TimeUnit.MILLISECONDS); + return this; + } + + /** + * Get write timeout (in milliseconds). + * + * @return Timeout in milliseconds + */ + public int getWriteTimeout() { + return httpClient.getWriteTimeout(); + } + + /** + * Sets the write timeout (in milliseconds). + * A value of 0 means no timeout, otherwise values must be between 1 and + * {@link Integer#MAX_VALUE}. + * + * @param writeTimeout connection timeout in milliseconds + * @return Api client + */ + public ApiClient setWriteTimeout(int writeTimeout) { + httpClient.setWriteTimeout(writeTimeout, TimeUnit.MILLISECONDS); + return this; + } + /** * Format the given parameter object into string. * diff --git a/samples/client/petstore-security-test/java/okhttp-gson/src/main/java/io/swagger/client/api/FakeApi.java b/samples/client/petstore-security-test/java/okhttp-gson/src/main/java/io/swagger/client/api/FakeApi.java index d822adb86899..99f88febbd46 100644 --- a/samples/client/petstore-security-test/java/okhttp-gson/src/main/java/io/swagger/client/api/FakeApi.java +++ b/samples/client/petstore-security-test/java/okhttp-gson/src/main/java/io/swagger/client/api/FakeApi.java @@ -63,7 +63,7 @@ public class FakeApi { */ public com.squareup.okhttp.Call testCodeInjectEndRnNRCall(String testCodeInjectEndRnNR, final ProgressResponseBody.ProgressListener progressListener, final ProgressRequestBody.ProgressRequestListener progressRequestListener) throws ApiException { Object localVarPostBody = null; - + // create path and map variables String localVarPath = "/fake"; @@ -103,18 +103,14 @@ public class FakeApi { String[] localVarAuthNames = new String[] { }; return apiClient.buildCall(localVarPath, "PUT", localVarQueryParams, localVarCollectionQueryParams, localVarPostBody, localVarHeaderParams, localVarFormParams, localVarAuthNames, progressRequestListener); } - + @SuppressWarnings("rawtypes") private com.squareup.okhttp.Call testCodeInjectEndRnNRValidateBeforeCall(String testCodeInjectEndRnNR, final ProgressResponseBody.ProgressListener progressListener, final ProgressRequestBody.ProgressRequestListener progressRequestListener) throws ApiException { - + com.squareup.okhttp.Call call = testCodeInjectEndRnNRCall(testCodeInjectEndRnNR, progressListener, progressRequestListener); return call; - - - - } /** diff --git a/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/ApiClient.java b/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/ApiClient.java index 7b9c79c79eb1..a82ca5516795 100644 --- a/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/ApiClient.java +++ b/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/ApiClient.java @@ -408,7 +408,7 @@ public class ApiClient { } /** - * Set the tempoaray folder path (for downloading files) + * Set the temporary folder path (for downloading files) * * @param tempFolderPath Temporary folder path * @return ApiClient @@ -430,6 +430,7 @@ public class ApiClient { /** * Sets the connect timeout (in milliseconds). * A value of 0 means no timeout, otherwise values must be between 1 and + * {@link Integer#MAX_VALUE}. * * @param connectionTimeout connection timeout in milliseconds * @return Api client @@ -439,6 +440,50 @@ public class ApiClient { return this; } + /** + * Get read timeout (in milliseconds). + * + * @return Timeout in milliseconds + */ + public int getReadTimeout() { + return httpClient.getReadTimeout(); + } + + /** + * Sets the read timeout (in milliseconds). + * A value of 0 means no timeout, otherwise values must be between 1 and + * {@link Integer#MAX_VALUE}. + * + * @param readTimeout read timeout in milliseconds + * @return Api client + */ + public ApiClient setReadTimeout(int readTimeout) { + httpClient.setReadTimeout(readTimeout, TimeUnit.MILLISECONDS); + return this; + } + + /** + * Get write timeout (in milliseconds). + * + * @return Timeout in milliseconds + */ + public int getWriteTimeout() { + return httpClient.getWriteTimeout(); + } + + /** + * Sets the write timeout (in milliseconds). + * A value of 0 means no timeout, otherwise values must be between 1 and + * {@link Integer#MAX_VALUE}. + * + * @param writeTimeout connection timeout in milliseconds + * @return Api client + */ + public ApiClient setWriteTimeout(int writeTimeout) { + httpClient.setWriteTimeout(writeTimeout, TimeUnit.MILLISECONDS); + return this; + } + /** * Format the given parameter object into string. * diff --git a/samples/client/petstore/java/okhttp-gson/src/test/java/io/swagger/client/ApiClientTest.java b/samples/client/petstore/java/okhttp-gson/src/test/java/io/swagger/client/ApiClientTest.java index c103edf2f1e9..e793075224be 100644 --- a/samples/client/petstore/java/okhttp-gson/src/test/java/io/swagger/client/ApiClientTest.java +++ b/samples/client/petstore/java/okhttp-gson/src/test/java/io/swagger/client/ApiClientTest.java @@ -165,7 +165,33 @@ public class ApiClientTest { apiClient.setConnectTimeout(10000); } + + @Test + public void testGetAndSetReadTimeout() { + // read timeout defaults to 10 seconds + assertEquals(10000, apiClient.getReadTimeout()); + assertEquals(10000, apiClient.getHttpClient().getReadTimeout()); + apiClient.setReadTimeout(0); + assertEquals(0, apiClient.getReadTimeout()); + assertEquals(0, apiClient.getHttpClient().getReadTimeout()); + + apiClient.setReadTimeout(10000); + } + + @Test + public void testGetAndSetWriteTimeout() { + // write timeout defaults to 10 seconds + assertEquals(10000, apiClient.getWriteTimeout()); + assertEquals(10000, apiClient.getHttpClient().getWriteTimeout()); + + apiClient.setWriteTimeout(0); + assertEquals(0, apiClient.getWriteTimeout()); + assertEquals(0, apiClient.getHttpClient().getWriteTimeout()); + + apiClient.setWriteTimeout(10000); + } + @Test public void testParameterToPairWhenNameIsInvalid() throws Exception { List pairs_a = apiClient.parameterToPair(null, new Integer(1)); From b404dafa02c61975794d521d40547bb99e8947a9 Mon Sep 17 00:00:00 2001 From: Gustavo Paz <32820138+gustavoapaz@users.noreply.github.com> Date: Fri, 10 Nov 2017 02:32:05 -0500 Subject: [PATCH 2/8] Issue 6694 2.3.0 (#6845) * The get method template is modified to return the value of the enum instead of the enum itself. * Update of the Petstore CXF server sample * Update of the Petstore CXF client sample * Update of the Petstore CXF server annotated base path sample * Update of the Petstore CXF server non spring application sample --- .../resources/JavaJaxRS/cxf/pojo.mustache | 13 ++++++++++-- .../src/gen/java/io/swagger/model/Order.java | 7 +++++-- .../src/gen/java/io/swagger/model/Pet.java | 7 +++++-- .../src/gen/java/io/swagger/model/Order.java | 7 +++++-- .../src/gen/java/io/swagger/model/Pet.java | 7 +++++-- .../src/gen/java/io/swagger/model/Order.java | 7 +++++-- .../src/gen/java/io/swagger/model/Pet.java | 7 +++++-- .../src/gen/java/io/swagger/api/FakeApi.java | 14 +++++++++++++ .../gen/java/io/swagger/model/EnumArrays.java | 7 +++++-- .../gen/java/io/swagger/model/EnumTest.java | 21 +++++++++++++------ .../src/gen/java/io/swagger/model/Order.java | 7 +++++-- .../src/gen/java/io/swagger/model/Pet.java | 7 +++++-- .../swagger/api/impl/FakeApiServiceImpl.java | 12 +++++++++++ 13 files changed, 97 insertions(+), 26 deletions(-) diff --git a/modules/swagger-codegen/src/main/resources/JavaJaxRS/cxf/pojo.mustache b/modules/swagger-codegen/src/main/resources/JavaJaxRS/cxf/pojo.mustache index eb53f2248cf3..e59e0b9064a9 100644 --- a/modules/swagger-codegen/src/main/resources/JavaJaxRS/cxf/pojo.mustache +++ b/modules/swagger-codegen/src/main/resources/JavaJaxRS/cxf/pojo.mustache @@ -59,9 +59,18 @@ public class {{classname}} {{#parent}}extends {{{parent}}}{{/parent}} { {{#vendorExtensions.extraAnnotation}} {{{vendorExtensions.extraAnnotation}}} {{/vendorExtensions.extraAnnotation}} -{{#useBeanValidation}}{{>beanValidation}}{{/useBeanValidation}} public {{{datatypeWithEnum}}} {{getter}}() { +{{#useBeanValidation}}{{>beanValidation}}{{/useBeanValidation}} {{#isEnum}}{{^isListContainer}}{{^isMapContainer}}public {{datatype}} {{getter}}() { + if ({{name}} == null) { + return null; + } + return {{name}}.value(); + }{{/isMapContainer}}{{/isListContainer}}{{/isEnum}}{{#isEnum}}{{#isListContainer}}public {{{datatypeWithEnum}}} {{getter}}() { return {{name}}; - } + }{{/isListContainer}}{{/isEnum}}{{#isEnum}}{{#isMapContainer}}public {{{datatypeWithEnum}}} {{getter}}() { + return {{name}}; + }{{/isMapContainer}}{{/isEnum}}{{^isEnum}}public {{{datatypeWithEnum}}} {{getter}}() { + return {{name}}; + }{{/isEnum}} {{^isReadOnly}} public void {{setter}}({{{datatypeWithEnum}}} {{name}}) { diff --git a/samples/client/petstore/jaxrs-cxf-client/src/gen/java/io/swagger/model/Order.java b/samples/client/petstore/jaxrs-cxf-client/src/gen/java/io/swagger/model/Order.java index 4b438955a291..dac33686761c 100644 --- a/samples/client/petstore/jaxrs-cxf-client/src/gen/java/io/swagger/model/Order.java +++ b/samples/client/petstore/jaxrs-cxf-client/src/gen/java/io/swagger/model/Order.java @@ -146,8 +146,11 @@ public enum StatusEnum { * @return status **/ @JsonProperty("status") - public StatusEnum getStatus() { - return status; + public String getStatus() { + if (status == null) { + return null; + } + return status.value(); } public void setStatus(StatusEnum status) { diff --git a/samples/client/petstore/jaxrs-cxf-client/src/gen/java/io/swagger/model/Pet.java b/samples/client/petstore/jaxrs-cxf-client/src/gen/java/io/swagger/model/Pet.java index 826a0b31bcaf..3c8ab5da478a 100644 --- a/samples/client/petstore/jaxrs-cxf-client/src/gen/java/io/swagger/model/Pet.java +++ b/samples/client/petstore/jaxrs-cxf-client/src/gen/java/io/swagger/model/Pet.java @@ -179,8 +179,11 @@ public enum StatusEnum { * @return status **/ @JsonProperty("status") - public StatusEnum getStatus() { - return status; + public String getStatus() { + if (status == null) { + return null; + } + return status.value(); } public void setStatus(StatusEnum status) { diff --git a/samples/server/petstore/jaxrs-cxf-annotated-base-path/src/gen/java/io/swagger/model/Order.java b/samples/server/petstore/jaxrs-cxf-annotated-base-path/src/gen/java/io/swagger/model/Order.java index 4b438955a291..dac33686761c 100644 --- a/samples/server/petstore/jaxrs-cxf-annotated-base-path/src/gen/java/io/swagger/model/Order.java +++ b/samples/server/petstore/jaxrs-cxf-annotated-base-path/src/gen/java/io/swagger/model/Order.java @@ -146,8 +146,11 @@ public enum StatusEnum { * @return status **/ @JsonProperty("status") - public StatusEnum getStatus() { - return status; + public String getStatus() { + if (status == null) { + return null; + } + return status.value(); } public void setStatus(StatusEnum status) { diff --git a/samples/server/petstore/jaxrs-cxf-annotated-base-path/src/gen/java/io/swagger/model/Pet.java b/samples/server/petstore/jaxrs-cxf-annotated-base-path/src/gen/java/io/swagger/model/Pet.java index 826a0b31bcaf..3c8ab5da478a 100644 --- a/samples/server/petstore/jaxrs-cxf-annotated-base-path/src/gen/java/io/swagger/model/Pet.java +++ b/samples/server/petstore/jaxrs-cxf-annotated-base-path/src/gen/java/io/swagger/model/Pet.java @@ -179,8 +179,11 @@ public enum StatusEnum { * @return status **/ @JsonProperty("status") - public StatusEnum getStatus() { - return status; + public String getStatus() { + if (status == null) { + return null; + } + return status.value(); } public void setStatus(StatusEnum status) { diff --git a/samples/server/petstore/jaxrs-cxf-non-spring-app/src/gen/java/io/swagger/model/Order.java b/samples/server/petstore/jaxrs-cxf-non-spring-app/src/gen/java/io/swagger/model/Order.java index 4b438955a291..dac33686761c 100644 --- a/samples/server/petstore/jaxrs-cxf-non-spring-app/src/gen/java/io/swagger/model/Order.java +++ b/samples/server/petstore/jaxrs-cxf-non-spring-app/src/gen/java/io/swagger/model/Order.java @@ -146,8 +146,11 @@ public enum StatusEnum { * @return status **/ @JsonProperty("status") - public StatusEnum getStatus() { - return status; + public String getStatus() { + if (status == null) { + return null; + } + return status.value(); } public void setStatus(StatusEnum status) { diff --git a/samples/server/petstore/jaxrs-cxf-non-spring-app/src/gen/java/io/swagger/model/Pet.java b/samples/server/petstore/jaxrs-cxf-non-spring-app/src/gen/java/io/swagger/model/Pet.java index 826a0b31bcaf..3c8ab5da478a 100644 --- a/samples/server/petstore/jaxrs-cxf-non-spring-app/src/gen/java/io/swagger/model/Pet.java +++ b/samples/server/petstore/jaxrs-cxf-non-spring-app/src/gen/java/io/swagger/model/Pet.java @@ -179,8 +179,11 @@ public enum StatusEnum { * @return status **/ @JsonProperty("status") - public StatusEnum getStatus() { - return status; + public String getStatus() { + if (status == null) { + return null; + } + return status.value(); } public void setStatus(StatusEnum status) { diff --git a/samples/server/petstore/jaxrs-cxf/src/gen/java/io/swagger/api/FakeApi.java b/samples/server/petstore/jaxrs-cxf/src/gen/java/io/swagger/api/FakeApi.java index 190aceb4a5ea..96c3a2b16e00 100644 --- a/samples/server/petstore/jaxrs-cxf/src/gen/java/io/swagger/api/FakeApi.java +++ b/samples/server/petstore/jaxrs-cxf/src/gen/java/io/swagger/api/FakeApi.java @@ -108,6 +108,20 @@ public interface FakeApi { @ApiResponse(code = 404, message = "Not found") }) public void testEnumParameters(@Multipart(value = "enum_form_string_array", required = false) List enumFormStringArray, @Multipart(value = "enum_form_string", required = false) String enumFormString, @HeaderParam("enum_header_string_array") List enumHeaderStringArray, @HeaderParam("enum_header_string") String enumHeaderString, @QueryParam("enum_query_string_array") List enumQueryStringArray, @QueryParam("enum_query_string") @DefaultValue("-efg") String enumQueryString, @QueryParam("enum_query_integer") Integer enumQueryInteger, @Multipart(value = "enum_query_double", required = false) Double enumQueryDouble); + /** + * test inline additionalProperties + * + * + * + */ + @POST + @Path("/fake/inline-additionalProperties") + @Consumes({ "application/json" }) + @ApiOperation(value = "test inline additionalProperties", tags={ "fake", }) + @ApiResponses(value = { + @ApiResponse(code = 200, message = "successful operation") }) + public void testInlineAdditionalProperties(@Valid Object param); + /** * test json serialization of form data * diff --git a/samples/server/petstore/jaxrs-cxf/src/gen/java/io/swagger/model/EnumArrays.java b/samples/server/petstore/jaxrs-cxf/src/gen/java/io/swagger/model/EnumArrays.java index 3af69f2f844f..68193c7ada4f 100644 --- a/samples/server/petstore/jaxrs-cxf/src/gen/java/io/swagger/model/EnumArrays.java +++ b/samples/server/petstore/jaxrs-cxf/src/gen/java/io/swagger/model/EnumArrays.java @@ -92,8 +92,11 @@ public enum ArrayEnumEnum { * @return justSymbol **/ @JsonProperty("just_symbol") - public JustSymbolEnum getJustSymbol() { - return justSymbol; + public String getJustSymbol() { + if (justSymbol == null) { + return null; + } + return justSymbol.value(); } public void setJustSymbol(JustSymbolEnum justSymbol) { diff --git a/samples/server/petstore/jaxrs-cxf/src/gen/java/io/swagger/model/EnumTest.java b/samples/server/petstore/jaxrs-cxf/src/gen/java/io/swagger/model/EnumTest.java index d573a77a98be..e4db3ed4395a 100644 --- a/samples/server/petstore/jaxrs-cxf/src/gen/java/io/swagger/model/EnumTest.java +++ b/samples/server/petstore/jaxrs-cxf/src/gen/java/io/swagger/model/EnumTest.java @@ -128,8 +128,11 @@ public enum EnumNumberEnum { * @return enumString **/ @JsonProperty("enum_string") - public EnumStringEnum getEnumString() { - return enumString; + public String getEnumString() { + if (enumString == null) { + return null; + } + return enumString.value(); } public void setEnumString(EnumStringEnum enumString) { @@ -146,8 +149,11 @@ public enum EnumNumberEnum { * @return enumInteger **/ @JsonProperty("enum_integer") - public EnumIntegerEnum getEnumInteger() { - return enumInteger; + public Integer getEnumInteger() { + if (enumInteger == null) { + return null; + } + return enumInteger.value(); } public void setEnumInteger(EnumIntegerEnum enumInteger) { @@ -164,8 +170,11 @@ public enum EnumNumberEnum { * @return enumNumber **/ @JsonProperty("enum_number") - public EnumNumberEnum getEnumNumber() { - return enumNumber; + public Double getEnumNumber() { + if (enumNumber == null) { + return null; + } + return enumNumber.value(); } public void setEnumNumber(EnumNumberEnum enumNumber) { diff --git a/samples/server/petstore/jaxrs-cxf/src/gen/java/io/swagger/model/Order.java b/samples/server/petstore/jaxrs-cxf/src/gen/java/io/swagger/model/Order.java index 985634c955d0..4b5fbdf96406 100644 --- a/samples/server/petstore/jaxrs-cxf/src/gen/java/io/swagger/model/Order.java +++ b/samples/server/petstore/jaxrs-cxf/src/gen/java/io/swagger/model/Order.java @@ -141,8 +141,11 @@ public enum StatusEnum { * @return status **/ @JsonProperty("status") - public StatusEnum getStatus() { - return status; + public String getStatus() { + if (status == null) { + return null; + } + return status.value(); } public void setStatus(StatusEnum status) { diff --git a/samples/server/petstore/jaxrs-cxf/src/gen/java/io/swagger/model/Pet.java b/samples/server/petstore/jaxrs-cxf/src/gen/java/io/swagger/model/Pet.java index 28db37fa0b90..8cb32bc3e9c0 100644 --- a/samples/server/petstore/jaxrs-cxf/src/gen/java/io/swagger/model/Pet.java +++ b/samples/server/petstore/jaxrs-cxf/src/gen/java/io/swagger/model/Pet.java @@ -174,8 +174,11 @@ public enum StatusEnum { * @return status **/ @JsonProperty("status") - public StatusEnum getStatus() { - return status; + public String getStatus() { + if (status == null) { + return null; + } + return status.value(); } public void setStatus(StatusEnum status) { diff --git a/samples/server/petstore/jaxrs-cxf/src/main/java/io/swagger/api/impl/FakeApiServiceImpl.java b/samples/server/petstore/jaxrs-cxf/src/main/java/io/swagger/api/impl/FakeApiServiceImpl.java index 5e47422edf4f..9f0c36bd52de 100644 --- a/samples/server/petstore/jaxrs-cxf/src/main/java/io/swagger/api/impl/FakeApiServiceImpl.java +++ b/samples/server/petstore/jaxrs-cxf/src/main/java/io/swagger/api/impl/FakeApiServiceImpl.java @@ -85,6 +85,18 @@ public class FakeApiServiceImpl implements FakeApi { // TODO: Implement... + } + + /** + * test inline additionalProperties + * + * + * + */ + public void testInlineAdditionalProperties(Object param) { + // TODO: Implement... + + } /** From f921f4f4da40ea74da5581e0fe65039244bb433f Mon Sep 17 00:00:00 2001 From: Greg Marzouka Date: Fri, 10 Nov 2017 02:57:40 -0500 Subject: [PATCH 3/8] [Scala] Default case class Option types to None for non-required fields (#6790) * [Scala] Default case class Option types to None * Update Petstore sample --- .../src/main/resources/scala/model.mustache | 2 +- .../client/petstore-security-test/scala/pom.xml | 2 +- .../scala/io/swagger/client/api/FakeApi.scala | 16 ++++++---------- .../io/swagger/client/model/ModelReturn.scala | 2 +- .../io/swagger/client/model/ApiResponse.scala | 6 +++--- .../scala/io/swagger/client/model/Category.scala | 4 ++-- .../scala/io/swagger/client/model/Order.scala | 12 ++++++------ .../main/scala/io/swagger/client/model/Pet.scala | 8 ++++---- .../main/scala/io/swagger/client/model/Tag.scala | 4 ++-- .../scala/io/swagger/client/model/User.scala | 16 ++++++++-------- 10 files changed, 34 insertions(+), 38 deletions(-) diff --git a/modules/swagger-codegen/src/main/resources/scala/model.mustache b/modules/swagger-codegen/src/main/resources/scala/model.mustache index 12b635bfb3e7..f44fc1e5a781 100644 --- a/modules/swagger-codegen/src/main/resources/scala/model.mustache +++ b/modules/swagger-codegen/src/main/resources/scala/model.mustache @@ -12,7 +12,7 @@ case class {{classname}} ( {{#description}} /* {{{description}}} */ {{/description}} - {{{name}}}: {{^required}}Option[{{/required}}{{datatype}}{{^required}}]{{/required}}{{#hasMore}},{{/hasMore}} + {{{name}}}: {{^required}}Option[{{/required}}{{datatype}}{{^required}}] = None{{/required}}{{#hasMore}},{{/hasMore}} {{/vars}} ) diff --git a/samples/client/petstore-security-test/scala/pom.xml b/samples/client/petstore-security-test/scala/pom.xml index eceb1e6fdc4b..b23683abc175 100644 --- a/samples/client/petstore-security-test/scala/pom.xml +++ b/samples/client/petstore-security-test/scala/pom.xml @@ -211,7 +211,7 @@ com.wordnik.swagger - swagger-async-httpclient_2.11 + swagger-async-httpclient_2.10 ${swagger-async-httpclient-version} diff --git a/samples/client/petstore-security-test/scala/src/main/scala/io/swagger/client/api/FakeApi.scala b/samples/client/petstore-security-test/scala/src/main/scala/io/swagger/client/api/FakeApi.scala index 05a73b296094..fc6d1d282b62 100644 --- a/samples/client/petstore-security-test/scala/src/main/scala/io/swagger/client/api/FakeApi.scala +++ b/samples/client/petstore-security-test/scala/src/main/scala/io/swagger/client/api/FakeApi.scala @@ -40,10 +40,8 @@ import scala.concurrent._ import scala.concurrent.duration._ import scala.util.{Failure, Success, Try} -class FakeApi( - val defBasePath: String = "https://petstore.swagger.io *_/ ' \" =end -- \\r\\n \\n \\r/v2 *_/ ' \" =end -- \\r\\n \\n \\r", - defApiInvoker: ApiInvoker = ApiInvoker -) { +class FakeApi(val defBasePath: String = "https://petstore.swagger.io *_/ ' \" =end -- \\r\\n \\n \\r/v2 *_/ ' \" =end -- \\r\\n \\n \\r", + defApiInvoker: ApiInvoker = ApiInvoker) { implicit val formats = new org.json4s.DefaultFormats { override def dateFormatter = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS+0000") @@ -55,13 +53,10 @@ class FakeApi( implicit val stringWriter = RequestWriters.StringWriter implicit val jsonWriter = JsonFormatsWriter - var basePath: String = defBasePath - var apiInvoker: ApiInvoker = defApiInvoker - - def addHeader(key: String, value: String): mutable.HashMap[String, String] = { - apiInvoker.defaultHeaders += key -> value - } + var basePath = defBasePath + var apiInvoker = defApiInvoker + def addHeader(key: String, value: String) = apiInvoker.defaultHeaders += key -> value val config = SwaggerConfig.forUrl(new URI(defBasePath)) val client = new RestClient(config) val helper = new FakeApiAsyncHelper(client, config) @@ -90,6 +85,7 @@ class FakeApi( helper.testCodeInject * ' " =end rn n r(testCodeInjectEndRnNR) } + } class FakeApiAsyncHelper(client: TransportClient, config: SwaggerConfig) extends ApiClient(client, config) { diff --git a/samples/client/petstore-security-test/scala/src/main/scala/io/swagger/client/model/ModelReturn.scala b/samples/client/petstore-security-test/scala/src/main/scala/io/swagger/client/model/ModelReturn.scala index 8f297a86b7ac..b2ce925e1212 100644 --- a/samples/client/petstore-security-test/scala/src/main/scala/io/swagger/client/model/ModelReturn.scala +++ b/samples/client/petstore-security-test/scala/src/main/scala/io/swagger/client/model/ModelReturn.scala @@ -15,6 +15,6 @@ package io.swagger.client.model case class ModelReturn ( /* property description *_/ ' \" =end -- \\r\\n \\n \\r */ - _return: Option[Integer] + _return: Option[Integer] = None ) diff --git a/samples/client/petstore/scala/src/main/scala/io/swagger/client/model/ApiResponse.scala b/samples/client/petstore/scala/src/main/scala/io/swagger/client/model/ApiResponse.scala index a2badb49ae17..220a5e48d9e3 100644 --- a/samples/client/petstore/scala/src/main/scala/io/swagger/client/model/ApiResponse.scala +++ b/samples/client/petstore/scala/src/main/scala/io/swagger/client/model/ApiResponse.scala @@ -14,8 +14,8 @@ package io.swagger.client.model case class ApiResponse ( - code: Option[Integer], - _type: Option[String], - message: Option[String] + code: Option[Integer] = None, + _type: Option[String] = None, + message: Option[String] = None ) diff --git a/samples/client/petstore/scala/src/main/scala/io/swagger/client/model/Category.scala b/samples/client/petstore/scala/src/main/scala/io/swagger/client/model/Category.scala index e39d097b918c..657b90de8a75 100644 --- a/samples/client/petstore/scala/src/main/scala/io/swagger/client/model/Category.scala +++ b/samples/client/petstore/scala/src/main/scala/io/swagger/client/model/Category.scala @@ -14,7 +14,7 @@ package io.swagger.client.model case class Category ( - id: Option[Long], - name: Option[String] + id: Option[Long] = None, + name: Option[String] = None ) diff --git a/samples/client/petstore/scala/src/main/scala/io/swagger/client/model/Order.scala b/samples/client/petstore/scala/src/main/scala/io/swagger/client/model/Order.scala index 84691796eaf5..fae3fddacb1b 100644 --- a/samples/client/petstore/scala/src/main/scala/io/swagger/client/model/Order.scala +++ b/samples/client/petstore/scala/src/main/scala/io/swagger/client/model/Order.scala @@ -15,12 +15,12 @@ package io.swagger.client.model import java.util.Date case class Order ( - id: Option[Long], - petId: Option[Long], - quantity: Option[Integer], - shipDate: Option[Date], + id: Option[Long] = None, + petId: Option[Long] = None, + quantity: Option[Integer] = None, + shipDate: Option[Date] = None, /* Order Status */ - status: Option[String], - complete: Option[Boolean] + status: Option[String] = None, + complete: Option[Boolean] = None ) diff --git a/samples/client/petstore/scala/src/main/scala/io/swagger/client/model/Pet.scala b/samples/client/petstore/scala/src/main/scala/io/swagger/client/model/Pet.scala index baabc18c99f5..88c868637e96 100644 --- a/samples/client/petstore/scala/src/main/scala/io/swagger/client/model/Pet.scala +++ b/samples/client/petstore/scala/src/main/scala/io/swagger/client/model/Pet.scala @@ -14,12 +14,12 @@ package io.swagger.client.model case class Pet ( - id: Option[Long], - category: Option[Category], + id: Option[Long] = None, + category: Option[Category] = None, name: String, photoUrls: List[String], - tags: Option[List[Tag]], + tags: Option[List[Tag]] = None, /* pet status in the store */ - status: Option[String] + status: Option[String] = None ) diff --git a/samples/client/petstore/scala/src/main/scala/io/swagger/client/model/Tag.scala b/samples/client/petstore/scala/src/main/scala/io/swagger/client/model/Tag.scala index 5ae718fd7e87..ee39797b41c7 100644 --- a/samples/client/petstore/scala/src/main/scala/io/swagger/client/model/Tag.scala +++ b/samples/client/petstore/scala/src/main/scala/io/swagger/client/model/Tag.scala @@ -14,7 +14,7 @@ package io.swagger.client.model case class Tag ( - id: Option[Long], - name: Option[String] + id: Option[Long] = None, + name: Option[String] = None ) diff --git a/samples/client/petstore/scala/src/main/scala/io/swagger/client/model/User.scala b/samples/client/petstore/scala/src/main/scala/io/swagger/client/model/User.scala index c5bdb3866388..46183e945470 100644 --- a/samples/client/petstore/scala/src/main/scala/io/swagger/client/model/User.scala +++ b/samples/client/petstore/scala/src/main/scala/io/swagger/client/model/User.scala @@ -14,14 +14,14 @@ package io.swagger.client.model case class User ( - id: Option[Long], - username: Option[String], - firstName: Option[String], - lastName: Option[String], - email: Option[String], - password: Option[String], - phone: Option[String], + id: Option[Long] = None, + username: Option[String] = None, + firstName: Option[String] = None, + lastName: Option[String] = None, + email: Option[String] = None, + password: Option[String] = None, + phone: Option[String] = None, /* User Status */ - userStatus: Option[Integer] + userStatus: Option[Integer] = None ) From d76e37277afd1486798e8889422763eb186c4ce6 Mon Sep 17 00:00:00 2001 From: William Cheng Date: Sat, 11 Nov 2017 14:51:35 +0800 Subject: [PATCH 4/8] add link to ebook --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 4454c1a49ff3..0c2f43e466a7 100644 --- a/README.md +++ b/README.md @@ -909,6 +909,7 @@ Presentations/Videos/Tutorials/Books - 2017/09/30 - [Swaggerのテンプレートを魔改造した話 #渋谷java](https://www.slideshare.net/int128/swagger-80309224) by [Hidetake Iwata](https://github.com/int128) ([NTT DATA Corporation](http://www.nttdata.com/global/en/)) - 2017/10/04 - [Enterprise-friendly Java client for Microsoft Machine Learning Server](https://blogs.msdn.microsoft.com/mlserver/2017/10/04/enterprise-friendly-java-client-for-microsoft-machine-learning-server/) by [Pratik Palnitkar](https://www.linkedin.com/in/pratikpalnitkar/) ([Microsoft](https://www.microsoft.com/)) - 2017/10/08 - [Generating a REST Ada client with OpenAPI and Swagger Codegen](https://blog.vacs.fr/vacs/blogs/post.html?post=2017/10/08/Generating-a-REST-Ada-client-with-OpenAPI-and-Swagger-Codegen) by [Stephane Carrez](https://github.com/stcarrez) +- 2017/11/08 - [A Beginner's Guide to Code Generation for REST APIs](https://gum.co/swagger_codegen_beginner)(eBook) by [William Cheng](https://twitter.com/wing328) # Swagger Codegen Core Team From fd220147ae549d40eb08bc046b7e5813a21538ab Mon Sep 17 00:00:00 2001 From: William Cheng Date: Sun, 12 Nov 2017 21:50:11 +0800 Subject: [PATCH 5/8] Switch Travis image from MacOS to Linux (#6937) * remove jdk7 check * comment out some installation * update npm * comment out ts angular tests * restore ts angular2 test * restore bash test * add back new config, clean up commented items --- .travis.yml | 106 +++++++++++++++++++++------------------------------- pom.xml | 19 +--------- 2 files changed, 44 insertions(+), 81 deletions(-) diff --git a/.travis.yml b/.travis.yml index 47b483c7030d..f396f23ccd46 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,33 +1,32 @@ sudo: required -language: objective-c -osx_image: xcode8.2 +language: java +jdk: + - oraclejdk8 + cache: directories: - $HOME/.m2 - $HOME/.ivy2 - $HOME/.gradle/caches/ - $HOME/.gradle/wrapper/ - - $HOME/.stack - $HOME/samples/client/petstore/php/SwaggerClient-php/vendor - $HOME/samples/client/petstore/ruby/venodr/bundle - $HOME/samples/client/petstore/python/.venv/ - # - $HOME/samples/client/petstore/typescript-node/npm/node_modules - # - $HOME/samples/client/petstore/typescript-node/npm/typings/ - # - $HOME/samples/client/petstore/typescript-fetch/tests/default/node_modules - # - $HOME/samples/client/petstore/typescript-fetch/tests/default/typings - # - $HOME/samples/client/petstore/typescript-fetch/builds/default/node_modules - # - $HOME/samples/client/petstore/typescript-fetch/builds/default/typings - # - $HOME/samples/client/petstore/typescript-fetch/builds/es6-target/node_modules - # - $HOME/samples/client/petstore/typescript-fetch/builds/es6-target/typings - # - $HOME/samples/client/petstore/typescript-fetch/builds/with-npm-version/node_modules - # - $HOME/samples/client/petstore/typescript-fetch/npm/with-npm-version/typings - # - $HOME/samples/client/petstore/typescript-angularjs/node_modules - # - $HOME/samples/client/petstore/typescript-angularjs/typings - - $HOME/.cocoapods/repos/master - timeout: 1000 -# note: docker is not yet supported in iOS build -#services: -# - docker + - $HOME/samples/client/petstore/typescript-node/npm/node_modules + - $HOME/samples/client/petstore/typescript-node/npm/typings/ + - $HOME/samples/client/petstore/typescript-fetch/tests/default/node_modules + - $HOME/samples/client/petstore/typescript-fetch/tests/default/typings + - $HOME/samples/client/petstore/typescript-fetch/builds/default/node_modules + - $HOME/samples/client/petstore/typescript-fetch/builds/default/typings + - $HOME/samples/client/petstore/typescript-fetch/builds/es6-target/node_modules + - $HOME/samples/client/petstore/typescript-fetch/builds/es6-target/typings + - $HOME/samples/client/petstore/typescript-fetch/builds/with-npm-version/node_modules + - $HOME/samples/client/petstore/typescript-fetch/npm/with-npm-version/typings + - $HOME/samples/client/petstore/typescript-angular/node_modules + - $HOME/samples/client/petstore/typescript-angular/typings + +services: + - docker # comment out the host table change to use the public petstore server addons: @@ -35,60 +34,38 @@ addons: - petstore.swagger.io before_install: - - export SW=`pwd` - - rvm list - - rvm use 2.2.5 - - gem environment - - gem install bundler -N --no-ri --no-rdoc - - gem install cocoapods -v 1.2.1 -N --no-ri --no-rdoc - - gem install xcpretty -N --no-ri --no-rdoc - - pod --version - # comment out below to avoid errors - #- pod repo update - - pod setup --silent > /dev/null + # required when sudo: required for the Ruby petstore tests + - gem install bundler - npm install -g typescript + - npm install -g npm - npm config set registry http://registry.npmjs.org/ - - brew install sbt - - brew install leiningen - - brew install bats - - brew install curl - - brew install python3 - - pip install virtualenv - - mkdir -p ~/.local/bin - - export PATH=$HOME/.local/bin:$PATH - - travis_retry curl --insecure -L https://www.stackage.org/stack/osx-x86_64 | tar xz --strip-components=1 --include '*/stack' -C ~/.local/bin - # start local petstore server - - git clone -b docker --single-branch https://github.com/wing328/swagger-samples - - cd swagger-samples/java/java-jersey-jaxrs - - sudo mvn jetty:run & - - cd $SW - # NOTE: iOS build not support docker at the moment + - sudo pip install virtualenv # to run petstore server locally via docker - #- docker pull swaggerapi/petstore - #- docker run -d -e SWAGGER_HOST=http://petstore.swagger.io -e SWAGGER_BASE_PATH=/v2 -p 80:8080 swaggerapi/petstore - #- docker ps -a + - docker pull swaggerapi/petstore + - docker run -d -e SWAGGER_HOST=http://petstore.swagger.io -e SWAGGER_BASE_PATH=/v2 -p 80:8080 swaggerapi/petstore + - docker ps -a + # Add bats test framework and cURL for Bash script integration tests + - sudo add-apt-repository ppa:duggan/bats --yes + - sudo apt-get update -qq + - sudo apt-get install -qq bats + - sudo apt-get install -qq curl + # comment out below as installation failed in travis # Add rebar3 build tool and recent Erlang/OTP for Erlang petstore server tests. # - Travis CI does not support rebar3 [yet](https://github.com/travis-ci/travis-ci/issues/6506#issuecomment-275189490). # - Rely on `kerl` for [pre-compiled versions available](https://docs.travis-ci.com/user/languages/erlang#Choosing-OTP-releases-to-test-against). Rely on installation path chosen by [`travis-erlang-builder`](https://github.com/travis-ci/travis-erlang-builder/blob/e6d016b1a91ca7ecac5a5a46395bde917ea13d36/bin/compile#L18). + # - . ~/otp/18.2.1/activate && erl -version + #- curl -f -L -o ./rebar3 https://s3.amazonaws.com/rebar3/rebar3 && chmod +x ./rebar3 && ./rebar3 version && export PATH="${TRAVIS_BUILD_DIR}:$PATH" # show host table to confirm petstore.swagger.io is mapped to localhost - cat /etc/hosts # show java version - java -version - # show brew version - - brew --version - # show xcpretty version - - xcpretty -v - # show go version - - go version - # show stack version - - stack --version install: # Add Godeps dependencies to GOPATH and PATH - - eval "$(curl -sL https://raw.githubusercontent.com/travis-ci/gimme/master/gimme | GIMME_GO_VERSION=1.4 bash)" - - export GOPATH="${TRAVIS_BUILD_DIR}/Godeps/_workspace" - - export PATH="${TRAVIS_BUILD_DIR}/Godeps/_workspace/bin:$PATH" + - eval "$(curl -sL https://raw.githubusercontent.com/travis-ci/gimme/master/gimme | GIMME_GO_VERSION=1.4 bash)" + - export GOPATH="${TRAVIS_BUILD_DIR}/Godeps/_workspace" + - export PATH="${TRAVIS_BUILD_DIR}/Godeps/_workspace/bin:$PATH" script: # fail fast @@ -100,14 +77,12 @@ script: # fail if generators contain tab '\t' - /bin/bash ./bin/utils/detect_tab_in_java_class.sh # run integration tests defined in maven pom.xml - - travis_wait mvn -q --batch-mode verify -Psamples -### docker-related tasks have been moved to CircleCI + - mvn -q --batch-mode verify -Psamples + # Below has been moved to CircleCI # docker: build generator image and push to Docker Hub #- if [ $DOCKER_HUB_USERNAME ]; then docker login --email=$DOCKER_HUB_EMAIL --username=$DOCKER_HUB_USERNAME --password=$DOCKER_HUB_PASSWORD && docker build -t $DOCKER_GENERATOR_IMAGE_NAME ./modules/swagger-generator && if [ ! -z "$TRAVIS_TAG" ]; then docker tag $DOCKER_GENERATOR_IMAGE_NAME:latest $DOCKER_GENERATOR_IMAGE_NAME:$TRAVIS_TAG; fi && if [ ! -z "$TRAVIS_TAG" ] || [ "$TRAVIS_BRANCH" = "master" ]; then docker push $DOCKER_GENERATOR_IMAGE_NAME; fi; fi ## docker: build cli image and push to Docker Hub #- if [ $DOCKER_HUB_USERNAME ]; then docker login --email=$DOCKER_HUB_EMAIL --username=$DOCKER_HUB_USERNAME --password=$DOCKER_HUB_PASSWORD && docker build -t $DOCKER_CODEGEN_CLI_IMAGE_NAME ./modules/swagger-codegen-cli && if [ ! -z "$TRAVIS_TAG" ]; then docker tag $DOCKER_CODEGEN_CLI_IMAGE_NAME:latest $DOCKER_CODEGEN_CLI_IMAGE_NAME:$TRAVIS_TAG; fi && if [ ! -z "$TRAVIS_TAG" ] || [ "$TRAVIS_BRANCH" = "master" ]; then docker push $DOCKER_CODEGEN_CLI_IMAGE_NAME; fi; fi -#env: -# - DOCKER_GENERATOR_IMAGE_NAME=swaggerapi/swagger-generator DOCKER_CODEGEN_CLI_IMAGE_NAME=swaggerapi/swagger-codegen-cli after_success: # push a snapshot version to maven repo @@ -115,3 +90,6 @@ after_success: mvn clean deploy --settings .travis/settings.xml; echo "Finished mvn clean deploy for $TRAVIS_BRANCH"; fi; + +env: + - DOCKER_GENERATOR_IMAGE_NAME=swaggerapi/swagger-generator DOCKER_CODEGEN_CLI_IMAGE_NAME=swaggerapi/swagger-codegen-cli diff --git a/pom.xml b/pom.xml index 4b831f1d5ec6..a3c47a48c5f9 100644 --- a/pom.xml +++ b/pom.xml @@ -837,18 +837,13 @@ - - samples/server/petstore/scalatra - samples/client/petstore/ruby samples/client/petstore/scala samples/client/petstore/akka-scala samples/client/petstore/javascript samples/client/petstore/python - - samples/client/petstore/typescript-fetch/builds/default samples/client/petstore/typescript-fetch/builds/es6-target samples/client/petstore/typescript-fetch/builds/with-npm-version @@ -858,20 +853,10 @@ samples/client/petstore/typescript-angularjs--> - samples/client/petstore/typescript-angular-v2/npm + samples/client/petstore/typescript-angular-v4/npm samples/client/petstore/typescript-angular-v4.3/npm - - + From b9651e57754a2616620dde058c086ac59423518b Mon Sep 17 00:00:00 2001 From: Tristan Sloughter Date: Sun, 12 Nov 2017 06:02:05 -0800 Subject: [PATCH 6/8] WIP: initial commit for Erlang client generator (#6502) * WIP: initial commit for Erlang client generator * add models types and function type specs * fix type specs when models are the type and support QS lists * make method lowercase in postprocessoperations * add model encode function * add erlang client sample * add windows client sample script * proper return type spec and handle return error messages --- bin/erlang-petstore-client.sh | 31 ++ bin/windows/erlang-petstore-client.bat | 10 + .../languages/ErlangClientCodegen.java | 393 ++++++++++++++++++ .../services/io.swagger.codegen.CodegenConfig | 1 + .../resources/erlang-client/README.mustache | 5 + .../main/resources/erlang-client/api.mustache | 48 +++ .../resources/erlang-client/app.src.mustache | 17 + .../resources/erlang-client/model.mustache | 21 + .../erlang-client/rebar.config.mustache | 3 + .../erlang-client/.swagger-codegen-ignore | 23 + .../erlang-client/.swagger-codegen/VERSION | 1 + .../client/petstore/erlang-client/README.md | 5 + .../petstore/erlang-client/rebar.config | 3 + .../erlang-client/src/swagger.app.src | 17 + .../src/swagger_api_response.erl | 20 + .../erlang-client/src/swagger_category.erl | 17 + .../erlang-client/src/swagger_order.erl | 29 ++ .../erlang-client/src/swagger_pet.erl | 29 ++ .../erlang-client/src/swagger_pet_api.erl | 165 ++++++++ .../erlang-client/src/swagger_store_api.erl | 88 ++++ .../erlang-client/src/swagger_tag.erl | 17 + .../erlang-client/src/swagger_user.erl | 35 ++ .../erlang-client/src/swagger_user_api.erl | 165 ++++++++ 23 files changed, 1143 insertions(+) create mode 100755 bin/erlang-petstore-client.sh create mode 100755 bin/windows/erlang-petstore-client.bat create mode 100644 modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/ErlangClientCodegen.java create mode 100644 modules/swagger-codegen/src/main/resources/erlang-client/README.mustache create mode 100644 modules/swagger-codegen/src/main/resources/erlang-client/api.mustache create mode 100644 modules/swagger-codegen/src/main/resources/erlang-client/app.src.mustache create mode 100644 modules/swagger-codegen/src/main/resources/erlang-client/model.mustache create mode 100644 modules/swagger-codegen/src/main/resources/erlang-client/rebar.config.mustache create mode 100644 samples/client/petstore/erlang-client/.swagger-codegen-ignore create mode 100644 samples/client/petstore/erlang-client/.swagger-codegen/VERSION create mode 100644 samples/client/petstore/erlang-client/README.md create mode 100644 samples/client/petstore/erlang-client/rebar.config create mode 100644 samples/client/petstore/erlang-client/src/swagger.app.src create mode 100644 samples/client/petstore/erlang-client/src/swagger_api_response.erl create mode 100644 samples/client/petstore/erlang-client/src/swagger_category.erl create mode 100644 samples/client/petstore/erlang-client/src/swagger_order.erl create mode 100644 samples/client/petstore/erlang-client/src/swagger_pet.erl create mode 100644 samples/client/petstore/erlang-client/src/swagger_pet_api.erl create mode 100644 samples/client/petstore/erlang-client/src/swagger_store_api.erl create mode 100644 samples/client/petstore/erlang-client/src/swagger_tag.erl create mode 100644 samples/client/petstore/erlang-client/src/swagger_user.erl create mode 100644 samples/client/petstore/erlang-client/src/swagger_user_api.erl diff --git a/bin/erlang-petstore-client.sh b/bin/erlang-petstore-client.sh new file mode 100755 index 000000000000..686ecd256293 --- /dev/null +++ b/bin/erlang-petstore-client.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/erlang-client -i modules/swagger-codegen/src/test/resources/2_0/petstore.yaml -l erlang-client -o samples/client/petstore/erlang-client" + +java $JAVA_OPTS -jar $executable $ags diff --git a/bin/windows/erlang-petstore-client.bat b/bin/windows/erlang-petstore-client.bat new file mode 100755 index 000000000000..228c0c7ca466 --- /dev/null +++ b/bin/windows/erlang-petstore-client.bat @@ -0,0 +1,10 @@ +set executable=.\modules\swagger-codegen-cli\target\swagger-codegen-cli.jar + +If Not Exist %executable% ( + mvn clean package +) + +REM set JAVA_OPTS=%JAVA_OPTS% -Xmx1024M +set ags=generate -t modules\swagger-codegen\src\main\resources\erlang-client -i modules\swagger-codegen\src\test\resources\2_0\petstore.yaml -l erlang-client -o samples\client\petstore\erlang-client + +java %JAVA_OPTS% -jar %executable% %ags% diff --git a/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/ErlangClientCodegen.java b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/ErlangClientCodegen.java new file mode 100644 index 000000000000..2ce23aa0ecf4 --- /dev/null +++ b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/ErlangClientCodegen.java @@ -0,0 +1,393 @@ +package io.swagger.codegen.languages; + +import io.swagger.codegen.*; +import com.samskivert.mustache.Mustache; +import com.samskivert.mustache.Template; +import io.swagger.models.properties.ArrayProperty; +import io.swagger.models.properties.MapProperty; +import io.swagger.models.properties.Property; +import io.swagger.models.parameters.Parameter; + +import java.io.File; +import java.util.*; +import java.io.Writer; +import java.io.IOException; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +import org.apache.commons.lang3.StringUtils; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class ErlangClientCodegen extends DefaultCodegen implements CodegenConfig { + static Logger LOGGER = LoggerFactory.getLogger(ErlangClientCodegen.class); + + protected String packageName = "swagger"; + protected String packageVersion = "1.0.0"; + protected String sourceFolder = "src"; + + public CodegenType getTag() { + return CodegenType.CLIENT; + } + + public String getName() { + return "erlang-client"; + } + + public String getHelp() { + return "Generates an Erlang client library (beta)."; + } + + public ErlangClientCodegen() { + super(); + outputFolder = "generated-code/erlang"; + modelTemplateFiles.put("model.mustache", ".erl"); + apiTemplateFiles.put("api.mustache", ".erl"); + + embeddedTemplateDir = templateDir = "erlang-client"; + + setReservedWordsLowerCase( + Arrays.asList( + "after","and","andalso","band","begin","bnot","bor","bsl","bsr","bxor","case", + "catch","cond","div","end","fun","if","let","not","of","or","orelse","receive", + "rem","try","when","xor" + ) + ); + + instantiationTypes.clear(); + + typeMapping.clear(); + typeMapping.put("enum", "binary()"); + typeMapping.put("date", "calendar:date()"); + typeMapping.put("datetime", "calendar:datetime()"); + typeMapping.put("date-time", "calendar:datetime()"); + typeMapping.put("boolean", "boolean()"); + typeMapping.put("string", "binary()"); + typeMapping.put("integer", "integer()"); + typeMapping.put("int", "integer()"); + typeMapping.put("float", "integer()"); + typeMapping.put("long", "integer()"); + typeMapping.put("double", "float()"); + typeMapping.put("array", "list()"); + typeMapping.put("map", "maps:map()"); + typeMapping.put("number", "integer()"); + typeMapping.put("bigdecimal", "float()"); + typeMapping.put("List", "list()"); + typeMapping.put("object", "maps:map()"); + typeMapping.put("file", "binary()"); + typeMapping.put("binary", "binary()"); + typeMapping.put("bytearray", "binary()"); + typeMapping.put("byte", "binary()"); + typeMapping.put("uuid", "binary()"); + typeMapping.put("password", "binary()"); + + cliOptions.clear(); + cliOptions.add(new CliOption(CodegenConstants.PACKAGE_NAME, "Erlang application name (convention: lowercase).") + .defaultValue(this.packageName)); + cliOptions.add(new CliOption(CodegenConstants.PACKAGE_NAME, "Erlang application version") + .defaultValue(this.packageVersion)); + + + } + + @Override + public String getTypeDeclaration(String name) { + return name + ":" + name + "()"; + } + + @Override + public String getTypeDeclaration(Property p) { + String swaggerType = getSwaggerType(p); + if (typeMapping.containsKey(swaggerType)) { + return typeMapping.get(swaggerType); + } + return swaggerType; + } + + @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 + type = getTypeDeclaration(toModelName(snakeCase(swaggerType))); + return type; + } + + @Override + public void processOpts() { + super.processOpts(); + + if (additionalProperties.containsKey(CodegenConstants.PACKAGE_NAME)) { + setPackageName((String) additionalProperties.get(CodegenConstants.PACKAGE_NAME)); + } + else { + setPackageName("swagger"); + } + + if (additionalProperties.containsKey(CodegenConstants.PACKAGE_VERSION)) { + setPackageVersion((String) additionalProperties.get(CodegenConstants.PACKAGE_VERSION)); + } + else { + setPackageVersion("1.0.0"); + } + + additionalProperties.put(CodegenConstants.PACKAGE_NAME, packageName); + additionalProperties.put(CodegenConstants.PACKAGE_VERSION, packageVersion); + + additionalProperties.put("length", new Mustache.Lambda() { + @Override + public void execute(Template.Fragment fragment, Writer writer) throws IOException { + writer.write(length(fragment.context())); + } + }); + + additionalProperties.put("qsEncode", new Mustache.Lambda() { + @Override + public void execute(Template.Fragment fragment, Writer writer) throws IOException { + writer.write(qsEncode(fragment.context())); + } + }); + + modelPackage = packageName; + apiPackage = packageName; + + supportingFiles.add(new SupportingFile("rebar.config.mustache","", "rebar.config")); + supportingFiles.add(new SupportingFile("app.src.mustache", "", "src" + File.separator + this.packageName + ".app.src")); + supportingFiles.add(new SupportingFile("README.mustache", "", "README.md")); + } + + public String qsEncode(Object o) { + String r = new String(); + CodegenParameter q = (CodegenParameter) o; + if (q.isListContainer) { + r += "[{<<\"" + q.baseName + "\">>, X} || X <- " + q.paramName + "]"; + } else { + r += "{<<\"" + q.baseName + "\">>, " + q.paramName + "}"; + } + return r; + } + + @Override + public String escapeReservedWord(String name) + { + // Can't start with an underscore, as our fields need to start with an + // UppercaseLetter so that Go treats them as public/visible. + + // Options? + // - MyName + // - AName + // - TheName + // - XName + // - X_Name + // ... or maybe a suffix? + // - Name_ ... think this will work. + if(this.reservedWordsMappings().containsKey(name)) { + return this.reservedWordsMappings().get(name); + } + return camelize(name) + '_'; + } + + @Override + public String apiFileFolder() { + return outputFolder + File.separator + sourceFolder + File.separator; + } + + @Override + public String modelFileFolder() { + return outputFolder + File.separator + sourceFolder + File.separator; + } + + @Override + public String toVarName(String name) { + // replace - with _ e.g. created-at => created_at + name = sanitizeName(name.replaceAll("-", "_")); + // for reserved word or word starting with number, append _ + if (isReservedWord(name)) + name = escapeReservedWord(name); + + return name; + } + + @Override + public String toParamName(String name) { + return camelize(toVarName(name)); + } + + @Override + public String toModelName(String name) { + return this.packageName + "_" + underscore(name.replaceAll("-", "_")); + } + + @Override + public String toApiName(String name) { + return this.packageName + "_" + underscore(name.replaceAll("-", "_")); + } + + @Override + public String toModelFilename(String name) { + return this.packageName + "_" + underscore(name); + } + + @Override + public String toApiFilename(String name) { + // replace - with _ e.g. created-at => created_at + name = name.replaceAll("-", "_"); // FIXME: a parameter should not be assigned. Also declare the methods parameters as 'final'. + + // e.g. PetApi.erl => pet_api.erl + return this.packageName + "_" + underscore(name) + "_api"; + } + + @Override + public String toOperationId(String operationId) { + // method name cannot use reserved keyword, e.g. return + if (isReservedWord(operationId)) { + LOGGER.warn(operationId + " (reserved word) cannot be used as method name. Renamed to " + underscore(sanitizeName("call_" + operationId))); + operationId = "call_" + operationId; + } + + return underscore(operationId); + } + + @Override + public Map postProcessOperations(Map objs) { + Map operations = (Map) objs.get("operations"); + List os = (List) operations.get("operation"); + List newOs = new ArrayList(); + Pattern pattern = Pattern.compile("(.*)\\{([^\\}]+)\\}(.*)"); + for (CodegenOperation o : os) { + // force http method to lower case + o.httpMethod = o.httpMethod.toLowerCase(); + + if (o.isListContainer) { + o.returnType = "[" + o.returnBaseType + "]"; + } + + ArrayList pathTemplateNames = new ArrayList(); + Matcher matcher = pattern.matcher(o.path); + StringBuffer buffer = new StringBuffer(); + while (matcher.find()) { + String pathTemplateName = matcher.group(2); + matcher.appendReplacement(buffer, "$1" + "\", " + camelize(pathTemplateName) + ", \"" + "$3"); + pathTemplateNames.add(pathTemplateName); + } + ExtendedCodegenOperation eco = new ExtendedCodegenOperation(o); + if (buffer.toString().isEmpty()) { + eco.setReplacedPathName(o.path); + } else { + eco.setReplacedPathName(buffer.toString()); + } + eco.setPathTemplateNames(pathTemplateNames); + newOs.add(eco); + } + operations.put("operation", newOs); + return objs; + } + + public void setPackageName(String packageName) { + this.packageName = packageName; + } + + public void setPackageVersion(String packageVersion) { + this.packageVersion = packageVersion; + } + + String length(Object o) { + return Integer.toString((((ExtendedCodegenOperation) o).allParams).size()); + } + + @Override + public String escapeQuotationMark(String input) { + // remove " to avoid code injection + return input.replace("\"", ""); + } + + @Override + public String escapeUnsafeCharacters(String input) { + return input.replace("*/", "*_/").replace("/*", "/_*"); + } + + class ExtendedCodegenOperation extends CodegenOperation { + private List pathTemplateNames = new ArrayList(); + private String replacedPathName; + + public ExtendedCodegenOperation(CodegenOperation o) { + super(); + + // Copy all fields of CodegenOperation + this.responseHeaders.addAll(o.responseHeaders); + this.hasAuthMethods = o.hasAuthMethods; + this.hasConsumes = o.hasConsumes; + this.hasProduces = o.hasProduces; + this.hasParams = o.hasParams; + this.hasOptionalParams = o.hasOptionalParams; + this.returnTypeIsPrimitive = o.returnTypeIsPrimitive; + this.returnSimpleType = o.returnSimpleType; + this.subresourceOperation = o.subresourceOperation; + this.isMapContainer = o.isMapContainer; + this.isListContainer = o.isListContainer; + this.isMultipart = o.isMultipart; + this.hasMore = o.hasMore; + this.isResponseBinary = o.isResponseBinary; + this.hasReference = o.hasReference; + this.isRestfulIndex = o.isRestfulIndex; + this.isRestfulShow = o.isRestfulShow; + this.isRestfulCreate = o.isRestfulCreate; + this.isRestfulUpdate = o.isRestfulUpdate; + this.isRestfulDestroy = o.isRestfulDestroy; + this.isRestful = o.isRestful; + this.path = o.path; + this.operationId = o.operationId; + this.returnType = o.returnType; + this.httpMethod = o.httpMethod; + this.returnBaseType = o.returnBaseType; + this.returnContainer = o.returnContainer; + this.summary = o.summary; + this.unescapedNotes = o.unescapedNotes; + this.notes = o.notes; + this.baseName = o.baseName; + this.defaultResponse = o.defaultResponse; + this.discriminator = o.discriminator; + this.consumes = o.consumes; + this.produces = o.produces; + this.bodyParam = o.bodyParam; + this.allParams = o.allParams; + this.bodyParams = o.bodyParams; + this.pathParams = o.pathParams; + this.queryParams = o.queryParams; + this.headerParams = o.headerParams; + this.formParams = o.formParams; + this.authMethods = o.authMethods; + this.tags = o.tags; + this.responses = o.responses; + this.imports = o.imports; + this.examples = o.examples; + this.externalDocs = o.externalDocs; + this.vendorExtensions = o.vendorExtensions; + this.nickname = o.nickname; + this.operationIdLowerCase = o.operationIdLowerCase; + this.operationIdCamelCase = o.operationIdCamelCase; + } + + public List getPathTemplateNames() { + return pathTemplateNames; + } + + public void setPathTemplateNames(List pathTemplateNames) { + this.pathTemplateNames = pathTemplateNames; + } + + public String getReplacedPathName() { + return replacedPathName; + } + + public void setReplacedPathName(String replacedPathName) { + this.replacedPathName = replacedPathName; + } + } +} 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 54e82bf73506..804ad41368fa 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 @@ -13,6 +13,7 @@ io.swagger.codegen.languages.CsharpDotNet2ClientCodegen io.swagger.codegen.languages.DartClientCodegen io.swagger.codegen.languages.ElixirClientCodegen io.swagger.codegen.languages.EiffelClientCodegen +io.swagger.codegen.languages.ErlangClientCodegen io.swagger.codegen.languages.ErlangServerCodegen io.swagger.codegen.languages.FinchServerCodegen io.swagger.codegen.languages.FlashClientCodegen diff --git a/modules/swagger-codegen/src/main/resources/erlang-client/README.mustache b/modules/swagger-codegen/src/main/resources/erlang-client/README.mustache new file mode 100644 index 000000000000..f3eab0b55283 --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/erlang-client/README.mustache @@ -0,0 +1,5 @@ +# Swagger client server library for Erlang + +## Overview + +An Erlang client stub generated by [Swagger Codegen](https://github.com/swagger-api/swagger-codegen) given an OpenAPI/Swagger spec. diff --git a/modules/swagger-codegen/src/main/resources/erlang-client/api.mustache b/modules/swagger-codegen/src/main/resources/erlang-client/api.mustache new file mode 100644 index 000000000000..a14ee9919120 --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/erlang-client/api.mustache @@ -0,0 +1,48 @@ +-module({{classname}}_api). + +-export([{{#operations}}{{#operation}}{{^-first}}, + {{/-first}}{{operationId}}/{{#length}}{{allParams}}{{/length}}{{/operation}}{{/operations}}]). + +-define(BASE_URL, <<"{{{basePath}}}">>). + +{{#operations}} + {{#operation}} +%% @doc {{summary}} +{{^notes.isEmpty}} +%% {{notes}} +{{/notes.isEmpty}} +-spec {{operationId}}({{#allParams}}{{^-first}}, {{/-first}}{{dataType}}{{/allParams}}) -> {{#returnType}}{ok, list(), {{returnType}}} | {error, string()}{{/returnType}}{{^returnType}}ok | {error, integer()}{{/returnType}}. +{{operationId}}({{#allParams}}{{^-first}}, {{/-first}}{{paramName}}{{/allParams}}) -> + Method = {{httpMethod}}, + Path = ["{{{replacedPathName}}}"], + QS = {{#queryParams.isEmpty}}[]{{/queryParams.isEmpty}}{{^queryParams.isEmpty}}lists:flatten([{{#queryParams}}{{^-first}}, {{/-first}}{{#qsEncode}}{{this}}{{/qsEncode}}{{/queryParams}}]){{/queryParams.isEmpty}}, + Headers = [{{^headerParams.isEmpty}}{{#headerParams}}{{^-first}}, {{/-first}}{<<"{{baseName}}">>, {{paramName}}}{{/headerParams}}{{/headerParams.isEmpty}}], + Body1 = {{^formParams.isEmpty}}{form, [{{#formParams}}{{^-first}}, {{/-first}}{<<"{{baseName}}">>, {{paramName}}}{{/formParams}}]}{{/formParams.isEmpty}}{{#formParams.isEmpty}}{{#bodyParams.isEmpty}}[]{{/bodyParams.isEmpty}}{{^bodyParams.isEmpty}}{{#bodyParams}}{{paramName}}{{/bodyParams}}{{/bodyParams.isEmpty}}{{/formParams.isEmpty}}, + Opts = [], + Url = hackney_url:make_url(?BASE_URL, Path, QS), + + case hackney:request(Method, Url, Headers, Body1, Opts) of +{{#returnType}} + {{#responses}} +{{#isDefault}} + {ok, {{code}}, RespHeaders, ClientRef} -> + {ok, Body} = hackney:body(ClientRef), + {ok, RespHeaders, jsx:decode(Body, [returns_maps, {labels, attempt_atom}])}{{#hasMore}}; {{/hasMore}} +{{/isDefault}} +{{^isDefault}} + {ok, {{code}}, _RespHeaders, _ClientRef} -> + {error, "{{message}}"}{{#hasMore}}; {{/hasMore}} +{{/isDefault}} + {{/responses}} +{{/returnType}} +{{^returnType}} + {ok, 200, _RespHeaders, _ClientRef} -> + ok; + {ok, Status, _RespHeaders, _ClientRef} -> + {error, Status} +{{/returnType}} + end. + + {{/operation}} + +{{/operations}} diff --git a/modules/swagger-codegen/src/main/resources/erlang-client/app.src.mustache b/modules/swagger-codegen/src/main/resources/erlang-client/app.src.mustache new file mode 100644 index 000000000000..8cf0543467a7 --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/erlang-client/app.src.mustache @@ -0,0 +1,17 @@ +{application, {{packageName}}, + [{description, {{#appDescription}}"{{appDescription}}"{{/appDescription}}{{^appDescription}}"Swagger client library"{{/appDescription}}}, + {vsn, "{{apiVersion}}"}, + {registered, []}, + {applications, + [kernel, + stdlib, + ssl, + hackney + ]}, + {env, []}, + {modules, []}, + + {maintainers, []}, + {licenses, [{{#licenseInfo}}"{{licenseInfo}}"{{/licenseInfo}}]}, + {links, [{{#infoUrl}}"{{infoUrl}}"{{/infoUrl}}]} +]}. diff --git a/modules/swagger-codegen/src/main/resources/erlang-client/model.mustache b/modules/swagger-codegen/src/main/resources/erlang-client/model.mustache new file mode 100644 index 000000000000..da0e8672ca01 --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/erlang-client/model.mustache @@ -0,0 +1,21 @@ +{{#models}} +{{#model}} +-module({{classname}}). + +-export_type([{{classname}}/0, + encode/1, + decode/1]). + +-type {{classname}}() :: + #{ {{#vars}}'{{name}}' {{#required}}:={{/required}}{{^required}}=>{{/required}} {{{datatype}}}{{#hasMore}}, + {{/hasMore}}{{/vars}} + }. + +encode(#{ {{#vars}}'{{name}}' := {{{nameInCamelCase}}}{{#hasMore}}, + {{/hasMore}}{{/vars}} + }) -> + #{ {{#vars}}'{{baseName}}' => {{{nameInCamelCase}}}{{#hasMore}}, + {{/hasMore}}{{/vars}} + } +{{/model}} +{{/models}} diff --git a/modules/swagger-codegen/src/main/resources/erlang-client/rebar.config.mustache b/modules/swagger-codegen/src/main/resources/erlang-client/rebar.config.mustache new file mode 100644 index 000000000000..abe84a1a9f33 --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/erlang-client/rebar.config.mustache @@ -0,0 +1,3 @@ +{erl_opts, [debug_info, warnings_as_errors, warn_untyped_record]}. + +{deps, [jsx, hackney]}. diff --git a/samples/client/petstore/erlang-client/.swagger-codegen-ignore b/samples/client/petstore/erlang-client/.swagger-codegen-ignore new file mode 100644 index 000000000000..c5fa491b4c55 --- /dev/null +++ b/samples/client/petstore/erlang-client/.swagger-codegen-ignore @@ -0,0 +1,23 @@ +# Swagger Codegen Ignore +# Generated by swagger-codegen https://github.com/swagger-api/swagger-codegen + +# Use this file to prevent files from being overwritten by the generator. +# The patterns follow closely to .gitignore or .dockerignore. + +# As an example, the C# client generator defines ApiClient.cs. +# You can make changes and tell Swagger Codgen to ignore just this file by uncommenting the following line: +#ApiClient.cs + +# You can match any string of characters against a directory, file or extension with a single asterisk (*): +#foo/*/qux +# The above matches foo/bar/qux and foo/baz/qux, but not foo/bar/baz/qux + +# You can recursively match patterns against a directory, file or extension with a double asterisk (**): +#foo/**/qux +# This matches foo/bar/qux, foo/baz/qux, and foo/bar/baz/qux + +# You can also negate patterns with an exclamation (!). +# For example, you can ignore all files in a docs folder with the file extension .md: +#docs/*.md +# Then explicitly reverse the ignore rule for a single file: +#!docs/README.md diff --git a/samples/client/petstore/erlang-client/.swagger-codegen/VERSION b/samples/client/petstore/erlang-client/.swagger-codegen/VERSION new file mode 100644 index 000000000000..f9f7450d1359 --- /dev/null +++ b/samples/client/petstore/erlang-client/.swagger-codegen/VERSION @@ -0,0 +1 @@ +2.3.0-SNAPSHOT \ No newline at end of file diff --git a/samples/client/petstore/erlang-client/README.md b/samples/client/petstore/erlang-client/README.md new file mode 100644 index 000000000000..f3eab0b55283 --- /dev/null +++ b/samples/client/petstore/erlang-client/README.md @@ -0,0 +1,5 @@ +# Swagger client server library for Erlang + +## Overview + +An Erlang client stub generated by [Swagger Codegen](https://github.com/swagger-api/swagger-codegen) given an OpenAPI/Swagger spec. diff --git a/samples/client/petstore/erlang-client/rebar.config b/samples/client/petstore/erlang-client/rebar.config new file mode 100644 index 000000000000..abe84a1a9f33 --- /dev/null +++ b/samples/client/petstore/erlang-client/rebar.config @@ -0,0 +1,3 @@ +{erl_opts, [debug_info, warnings_as_errors, warn_untyped_record]}. + +{deps, [jsx, hackney]}. diff --git a/samples/client/petstore/erlang-client/src/swagger.app.src b/samples/client/petstore/erlang-client/src/swagger.app.src new file mode 100644 index 000000000000..6547fbd34e81 --- /dev/null +++ b/samples/client/petstore/erlang-client/src/swagger.app.src @@ -0,0 +1,17 @@ +{application, swagger, + [{description, "This is a sample server Petstore server. You can find out more about Swagger at [http://swagger.io](http://swagger.io) or on [irc.freenode.net, #swagger](http://swagger.io/irc/). For this sample, you can use the api key `special-key` to test the authorization filters."}, + {vsn, ""}, + {registered, []}, + {applications, + [kernel, + stdlib, + ssl, + hackney + ]}, + {env, []}, + {modules, []}, + + {maintainers, []}, + {licenses, ["Apache 2.0"]}, + {links, []} +]}. diff --git a/samples/client/petstore/erlang-client/src/swagger_api_response.erl b/samples/client/petstore/erlang-client/src/swagger_api_response.erl new file mode 100644 index 000000000000..33826528dc42 --- /dev/null +++ b/samples/client/petstore/erlang-client/src/swagger_api_response.erl @@ -0,0 +1,20 @@ +-module(swagger_api_response). + +-export_type([swagger_api_response/0, + encode/1, + decode/1]). + +-type swagger_api_response() :: + #{ 'code' => integer(), + 'type' => binary(), + 'message' => binary() + }. + +encode(#{ 'code' := Code, + 'type' := Type, + 'message' := Message + }) -> + #{ 'code' => Code, + 'type' => Type, + 'message' => Message + } diff --git a/samples/client/petstore/erlang-client/src/swagger_category.erl b/samples/client/petstore/erlang-client/src/swagger_category.erl new file mode 100644 index 000000000000..0bd89b550875 --- /dev/null +++ b/samples/client/petstore/erlang-client/src/swagger_category.erl @@ -0,0 +1,17 @@ +-module(swagger_category). + +-export_type([swagger_category/0, + encode/1, + decode/1]). + +-type swagger_category() :: + #{ 'id' => integer(), + 'name' => binary() + }. + +encode(#{ 'id' := Id, + 'name' := Name + }) -> + #{ 'id' => Id, + 'name' => Name + } diff --git a/samples/client/petstore/erlang-client/src/swagger_order.erl b/samples/client/petstore/erlang-client/src/swagger_order.erl new file mode 100644 index 000000000000..06a9a1a270a5 --- /dev/null +++ b/samples/client/petstore/erlang-client/src/swagger_order.erl @@ -0,0 +1,29 @@ +-module(swagger_order). + +-export_type([swagger_order/0, + encode/1, + decode/1]). + +-type swagger_order() :: + #{ 'id' => integer(), + 'petId' => integer(), + 'quantity' => integer(), + 'shipDate' => swagger_date_time:swagger_date_time(), + 'status' => binary(), + 'complete' => boolean() + }. + +encode(#{ 'id' := Id, + 'petId' := PetId, + 'quantity' := Quantity, + 'shipDate' := ShipDate, + 'status' := Status, + 'complete' := Complete + }) -> + #{ 'id' => Id, + 'petId' => PetId, + 'quantity' => Quantity, + 'shipDate' => ShipDate, + 'status' => Status, + 'complete' => Complete + } diff --git a/samples/client/petstore/erlang-client/src/swagger_pet.erl b/samples/client/petstore/erlang-client/src/swagger_pet.erl new file mode 100644 index 000000000000..c9484fa0feae --- /dev/null +++ b/samples/client/petstore/erlang-client/src/swagger_pet.erl @@ -0,0 +1,29 @@ +-module(swagger_pet). + +-export_type([swagger_pet/0, + encode/1, + decode/1]). + +-type swagger_pet() :: + #{ 'id' => integer(), + 'category' => swagger_category:swagger_category(), + 'name' := binary(), + 'photoUrls' := list(), + 'tags' => list(), + 'status' => binary() + }. + +encode(#{ 'id' := Id, + 'category' := Category, + 'name' := Name, + 'photoUrls' := PhotoUrls, + 'tags' := Tags, + 'status' := Status + }) -> + #{ 'id' => Id, + 'category' => Category, + 'name' => Name, + 'photoUrls' => PhotoUrls, + 'tags' => Tags, + 'status' => Status + } diff --git a/samples/client/petstore/erlang-client/src/swagger_pet_api.erl b/samples/client/petstore/erlang-client/src/swagger_pet_api.erl new file mode 100644 index 000000000000..7eaef8fed813 --- /dev/null +++ b/samples/client/petstore/erlang-client/src/swagger_pet_api.erl @@ -0,0 +1,165 @@ +-module(swagger_pet_api). + +-export([add_pet/1, + delete_pet/2, + find_pets_by_status/1, + find_pets_by_tags/1, + get_pet_by_id/1, + update_pet/1, + update_pet_with_form/3, + upload_file/3]). + +-define(BASE_URL, <<"http://petstore.swagger.io/v2">>). + +%% @doc Add a new pet to the store +-spec add_pet(swagger_pet:swagger_pet()) -> ok | {error, integer()}. +add_pet(Body) -> + Method = post, + Path = ["/pet"], + QS = [], + Headers = [], + Body1 = Body, + Opts = [], + Url = hackney_url:make_url(?BASE_URL, Path, QS), + + case hackney:request(Method, Url, Headers, Body1, Opts) of + {ok, 200, _RespHeaders, _ClientRef} -> + ok; + {ok, Status, _RespHeaders, _ClientRef} -> + {error, Status} + end. + +%% @doc Deletes a pet +-spec delete_pet(integer(), binary()) -> ok | {error, integer()}. +delete_pet(PetId, ApiKey) -> + Method = delete, + Path = ["/pet/", PetId, ""], + QS = [], + Headers = [{<<"api_key">>, ApiKey}], + Body1 = [], + Opts = [], + Url = hackney_url:make_url(?BASE_URL, Path, QS), + + case hackney:request(Method, Url, Headers, Body1, Opts) of + {ok, 200, _RespHeaders, _ClientRef} -> + ok; + {ok, Status, _RespHeaders, _ClientRef} -> + {error, Status} + end. + +%% @doc Finds Pets by status +%% Multiple status values can be provided with comma separated strings +-spec find_pets_by_status(list()) -> {ok, list(), [swagger_pet:swagger_pet()]} | {error, string()}. +find_pets_by_status(Status) -> + Method = get, + Path = ["/pet/findByStatus"], + QS = lists:flatten([[{<<"status">>, X} || X <- Status]]), + Headers = [], + Body1 = [], + Opts = [], + Url = hackney_url:make_url(?BASE_URL, Path, QS), + + case hackney:request(Method, Url, Headers, Body1, Opts) of + {ok, 200, RespHeaders, ClientRef} -> + {ok, Body} = hackney:body(ClientRef), + {ok, RespHeaders, jsx:decode(Body, [returns_maps, {labels, attempt_atom}])}; + {ok, 400, _RespHeaders, _ClientRef} -> + {error, "Invalid status value"} + end. + +%% @doc Finds Pets by tags +%% Multiple tags can be provided with comma separated strings. Use tag1, tag2, tag3 for testing. +-spec find_pets_by_tags(list()) -> {ok, list(), [swagger_pet:swagger_pet()]} | {error, string()}. +find_pets_by_tags(Tags) -> + Method = get, + Path = ["/pet/findByTags"], + QS = lists:flatten([[{<<"tags">>, X} || X <- Tags]]), + Headers = [], + Body1 = [], + Opts = [], + Url = hackney_url:make_url(?BASE_URL, Path, QS), + + case hackney:request(Method, Url, Headers, Body1, Opts) of + {ok, 200, RespHeaders, ClientRef} -> + {ok, Body} = hackney:body(ClientRef), + {ok, RespHeaders, jsx:decode(Body, [returns_maps, {labels, attempt_atom}])}; + {ok, 400, _RespHeaders, _ClientRef} -> + {error, "Invalid tag value"} + end. + +%% @doc Find pet by ID +%% Returns a single pet +-spec get_pet_by_id(integer()) -> {ok, list(), swagger_pet:swagger_pet()} | {error, string()}. +get_pet_by_id(PetId) -> + Method = get, + Path = ["/pet/", PetId, ""], + QS = [], + Headers = [], + Body1 = [], + Opts = [], + Url = hackney_url:make_url(?BASE_URL, Path, QS), + + case hackney:request(Method, Url, Headers, Body1, Opts) of + {ok, 200, RespHeaders, ClientRef} -> + {ok, Body} = hackney:body(ClientRef), + {ok, RespHeaders, jsx:decode(Body, [returns_maps, {labels, attempt_atom}])}; + {ok, 400, _RespHeaders, _ClientRef} -> + {error, "Invalid ID supplied"}; + {ok, 404, _RespHeaders, _ClientRef} -> + {error, "Pet not found"} + end. + +%% @doc Update an existing pet +-spec update_pet(swagger_pet:swagger_pet()) -> ok | {error, integer()}. +update_pet(Body) -> + Method = put, + Path = ["/pet"], + QS = [], + Headers = [], + Body1 = Body, + Opts = [], + Url = hackney_url:make_url(?BASE_URL, Path, QS), + + case hackney:request(Method, Url, Headers, Body1, Opts) of + {ok, 200, _RespHeaders, _ClientRef} -> + ok; + {ok, Status, _RespHeaders, _ClientRef} -> + {error, Status} + end. + +%% @doc Updates a pet in the store with form data +-spec update_pet_with_form(integer(), binary(), binary()) -> ok | {error, integer()}. +update_pet_with_form(PetId, Name, Status) -> + Method = post, + Path = ["/pet/", PetId, ""], + QS = [], + Headers = [], + Body1 = {form, [{<<"name">>, Name}, {<<"status">>, Status}]}, + Opts = [], + Url = hackney_url:make_url(?BASE_URL, Path, QS), + + case hackney:request(Method, Url, Headers, Body1, Opts) of + {ok, 200, _RespHeaders, _ClientRef} -> + ok; + {ok, Status, _RespHeaders, _ClientRef} -> + {error, Status} + end. + +%% @doc uploads an image +-spec upload_file(integer(), binary(), binary()) -> {ok, list(), swagger_api_response:swagger_api_response()} | {error, string()}. +upload_file(PetId, AdditionalMetadata, File) -> + Method = post, + Path = ["/pet/", PetId, "/uploadImage"], + QS = [], + Headers = [], + Body1 = {form, [{<<"additionalMetadata">>, AdditionalMetadata}, {<<"file">>, File}]}, + Opts = [], + Url = hackney_url:make_url(?BASE_URL, Path, QS), + + case hackney:request(Method, Url, Headers, Body1, Opts) of + {ok, 200, RespHeaders, ClientRef} -> + {ok, Body} = hackney:body(ClientRef), + {ok, RespHeaders, jsx:decode(Body, [returns_maps, {labels, attempt_atom}])} + end. + + diff --git a/samples/client/petstore/erlang-client/src/swagger_store_api.erl b/samples/client/petstore/erlang-client/src/swagger_store_api.erl new file mode 100644 index 000000000000..1061556f5f61 --- /dev/null +++ b/samples/client/petstore/erlang-client/src/swagger_store_api.erl @@ -0,0 +1,88 @@ +-module(swagger_store_api). + +-export([delete_order/1, + get_inventory/0, + get_order_by_id/1, + place_order/1]). + +-define(BASE_URL, <<"http://petstore.swagger.io/v2">>). + +%% @doc Delete purchase order by ID +%% For valid response try integer IDs with value < 1000. Anything above 1000 or nonintegers will generate API errors +-spec delete_order(binary()) -> ok | {error, integer()}. +delete_order(OrderId) -> + Method = delete, + Path = ["/store/order/", OrderId, ""], + QS = [], + Headers = [], + Body1 = [], + Opts = [], + Url = hackney_url:make_url(?BASE_URL, Path, QS), + + case hackney:request(Method, Url, Headers, Body1, Opts) of + {ok, 200, _RespHeaders, _ClientRef} -> + ok; + {ok, Status, _RespHeaders, _ClientRef} -> + {error, Status} + end. + +%% @doc Returns pet inventories by status +%% Returns a map of status codes to quantities +-spec get_inventory() -> {ok, list(), maps:map()} | {error, string()}. +get_inventory() -> + Method = get, + Path = ["/store/inventory"], + QS = [], + Headers = [], + Body1 = [], + Opts = [], + Url = hackney_url:make_url(?BASE_URL, Path, QS), + + case hackney:request(Method, Url, Headers, Body1, Opts) of + {ok, 200, RespHeaders, ClientRef} -> + {ok, Body} = hackney:body(ClientRef), + {ok, RespHeaders, jsx:decode(Body, [returns_maps, {labels, attempt_atom}])} + end. + +%% @doc Find purchase order by ID +%% For valid response try integer IDs with value <= 5 or > 10. Other values will generated exceptions +-spec get_order_by_id(integer()) -> {ok, list(), swagger_order:swagger_order()} | {error, string()}. +get_order_by_id(OrderId) -> + Method = get, + Path = ["/store/order/", OrderId, ""], + QS = [], + Headers = [], + Body1 = [], + Opts = [], + Url = hackney_url:make_url(?BASE_URL, Path, QS), + + case hackney:request(Method, Url, Headers, Body1, Opts) of + {ok, 200, RespHeaders, ClientRef} -> + {ok, Body} = hackney:body(ClientRef), + {ok, RespHeaders, jsx:decode(Body, [returns_maps, {labels, attempt_atom}])}; + {ok, 400, _RespHeaders, _ClientRef} -> + {error, "Invalid ID supplied"}; + {ok, 404, _RespHeaders, _ClientRef} -> + {error, "Order not found"} + end. + +%% @doc Place an order for a pet +-spec place_order(swagger_order:swagger_order()) -> {ok, list(), swagger_order:swagger_order()} | {error, string()}. +place_order(Body) -> + Method = post, + Path = ["/store/order"], + QS = [], + Headers = [], + Body1 = Body, + Opts = [], + Url = hackney_url:make_url(?BASE_URL, Path, QS), + + case hackney:request(Method, Url, Headers, Body1, Opts) of + {ok, 200, RespHeaders, ClientRef} -> + {ok, Body} = hackney:body(ClientRef), + {ok, RespHeaders, jsx:decode(Body, [returns_maps, {labels, attempt_atom}])}; + {ok, 400, _RespHeaders, _ClientRef} -> + {error, "Invalid Order"} + end. + + diff --git a/samples/client/petstore/erlang-client/src/swagger_tag.erl b/samples/client/petstore/erlang-client/src/swagger_tag.erl new file mode 100644 index 000000000000..5abdf9b959f2 --- /dev/null +++ b/samples/client/petstore/erlang-client/src/swagger_tag.erl @@ -0,0 +1,17 @@ +-module(swagger_tag). + +-export_type([swagger_tag/0, + encode/1, + decode/1]). + +-type swagger_tag() :: + #{ 'id' => integer(), + 'name' => binary() + }. + +encode(#{ 'id' := Id, + 'name' := Name + }) -> + #{ 'id' => Id, + 'name' => Name + } diff --git a/samples/client/petstore/erlang-client/src/swagger_user.erl b/samples/client/petstore/erlang-client/src/swagger_user.erl new file mode 100644 index 000000000000..8c82c40488ed --- /dev/null +++ b/samples/client/petstore/erlang-client/src/swagger_user.erl @@ -0,0 +1,35 @@ +-module(swagger_user). + +-export_type([swagger_user/0, + encode/1, + decode/1]). + +-type swagger_user() :: + #{ 'id' => integer(), + 'username' => binary(), + 'firstName' => binary(), + 'lastName' => binary(), + 'email' => binary(), + 'password' => binary(), + 'phone' => binary(), + 'userStatus' => integer() + }. + +encode(#{ 'id' := Id, + 'username' := Username, + 'firstName' := FirstName, + 'lastName' := LastName, + 'email' := Email, + 'password' := Password, + 'phone' := Phone, + 'userStatus' := UserStatus + }) -> + #{ 'id' => Id, + 'username' => Username, + 'firstName' => FirstName, + 'lastName' => LastName, + 'email' => Email, + 'password' => Password, + 'phone' => Phone, + 'userStatus' => UserStatus + } diff --git a/samples/client/petstore/erlang-client/src/swagger_user_api.erl b/samples/client/petstore/erlang-client/src/swagger_user_api.erl new file mode 100644 index 000000000000..fe2a84d78a86 --- /dev/null +++ b/samples/client/petstore/erlang-client/src/swagger_user_api.erl @@ -0,0 +1,165 @@ +-module(swagger_user_api). + +-export([create_user/1, + create_users_with_array_input/1, + create_users_with_list_input/1, + delete_user/1, + get_user_by_name/1, + login_user/2, + logout_user/0, + update_user/2]). + +-define(BASE_URL, <<"http://petstore.swagger.io/v2">>). + +%% @doc Create user +%% This can only be done by the logged in user. +-spec create_user(swagger_user:swagger_user()) -> ok | {error, integer()}. +create_user(Body) -> + Method = post, + Path = ["/user"], + QS = [], + Headers = [], + Body1 = Body, + Opts = [], + Url = hackney_url:make_url(?BASE_URL, Path, QS), + + case hackney:request(Method, Url, Headers, Body1, Opts) of + {ok, 200, _RespHeaders, _ClientRef} -> + ok; + {ok, Status, _RespHeaders, _ClientRef} -> + {error, Status} + end. + +%% @doc Creates list of users with given input array +-spec create_users_with_array_input(list()) -> ok | {error, integer()}. +create_users_with_array_input(Body) -> + Method = post, + Path = ["/user/createWithArray"], + QS = [], + Headers = [], + Body1 = Body, + Opts = [], + Url = hackney_url:make_url(?BASE_URL, Path, QS), + + case hackney:request(Method, Url, Headers, Body1, Opts) of + {ok, 200, _RespHeaders, _ClientRef} -> + ok; + {ok, Status, _RespHeaders, _ClientRef} -> + {error, Status} + end. + +%% @doc Creates list of users with given input array +-spec create_users_with_list_input(list()) -> ok | {error, integer()}. +create_users_with_list_input(Body) -> + Method = post, + Path = ["/user/createWithList"], + QS = [], + Headers = [], + Body1 = Body, + Opts = [], + Url = hackney_url:make_url(?BASE_URL, Path, QS), + + case hackney:request(Method, Url, Headers, Body1, Opts) of + {ok, 200, _RespHeaders, _ClientRef} -> + ok; + {ok, Status, _RespHeaders, _ClientRef} -> + {error, Status} + end. + +%% @doc Delete user +%% This can only be done by the logged in user. +-spec delete_user(binary()) -> ok | {error, integer()}. +delete_user(Username) -> + Method = delete, + Path = ["/user/", Username, ""], + QS = [], + Headers = [], + Body1 = [], + Opts = [], + Url = hackney_url:make_url(?BASE_URL, Path, QS), + + case hackney:request(Method, Url, Headers, Body1, Opts) of + {ok, 200, _RespHeaders, _ClientRef} -> + ok; + {ok, Status, _RespHeaders, _ClientRef} -> + {error, Status} + end. + +%% @doc Get user by user name +-spec get_user_by_name(binary()) -> {ok, list(), swagger_user:swagger_user()} | {error, string()}. +get_user_by_name(Username) -> + Method = get, + Path = ["/user/", Username, ""], + QS = [], + Headers = [], + Body1 = [], + Opts = [], + Url = hackney_url:make_url(?BASE_URL, Path, QS), + + case hackney:request(Method, Url, Headers, Body1, Opts) of + {ok, 200, RespHeaders, ClientRef} -> + {ok, Body} = hackney:body(ClientRef), + {ok, RespHeaders, jsx:decode(Body, [returns_maps, {labels, attempt_atom}])}; + {ok, 400, _RespHeaders, _ClientRef} -> + {error, "Invalid username supplied"}; + {ok, 404, _RespHeaders, _ClientRef} -> + {error, "User not found"} + end. + +%% @doc Logs user into the system +-spec login_user(binary(), binary()) -> {ok, list(), binary()} | {error, string()}. +login_user(Username, Password) -> + Method = get, + Path = ["/user/login"], + QS = lists:flatten([{<<"username">>, Username}, {<<"password">>, Password}]), + Headers = [], + Body1 = [], + Opts = [], + Url = hackney_url:make_url(?BASE_URL, Path, QS), + + case hackney:request(Method, Url, Headers, Body1, Opts) of + {ok, 200, RespHeaders, ClientRef} -> + {ok, Body} = hackney:body(ClientRef), + {ok, RespHeaders, jsx:decode(Body, [returns_maps, {labels, attempt_atom}])}; + {ok, 400, _RespHeaders, _ClientRef} -> + {error, "Invalid username/password supplied"} + end. + +%% @doc Logs out current logged in user session +-spec logout_user() -> ok | {error, integer()}. +logout_user() -> + Method = get, + Path = ["/user/logout"], + QS = [], + Headers = [], + Body1 = [], + Opts = [], + Url = hackney_url:make_url(?BASE_URL, Path, QS), + + case hackney:request(Method, Url, Headers, Body1, Opts) of + {ok, 200, _RespHeaders, _ClientRef} -> + ok; + {ok, Status, _RespHeaders, _ClientRef} -> + {error, Status} + end. + +%% @doc Updated user +%% This can only be done by the logged in user. +-spec update_user(binary(), swagger_user:swagger_user()) -> ok | {error, integer()}. +update_user(Username, Body) -> + Method = put, + Path = ["/user/", Username, ""], + QS = [], + Headers = [], + Body1 = Body, + Opts = [], + Url = hackney_url:make_url(?BASE_URL, Path, QS), + + case hackney:request(Method, Url, Headers, Body1, Opts) of + {ok, 200, _RespHeaders, _ClientRef} -> + ok; + {ok, Status, _RespHeaders, _ClientRef} -> + {error, Status} + end. + + From 6739481a5dcc750339806feef7be595d346dcb73 Mon Sep 17 00:00:00 2001 From: William Cheng Date: Sun, 12 Nov 2017 22:07:12 +0800 Subject: [PATCH 7/8] add tsloughter as owner erlang --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 0c2f43e466a7..4f4b7676fa75 100644 --- a/README.md +++ b/README.md @@ -24,7 +24,7 @@ ## Overview This is the swagger codegen project, which allows generation of API client libraries (SDK generation), server stubs and documentation automatically given an [OpenAPI Spec](https://github.com/OAI/OpenAPI-Specification). Currently, the following languages/frameworks are supported: -- **API clients**: **ActionScript**, **Ada**, **Apex**, **Bash**, **C#** (.net 2.0, 4.0 or later), **C++** (cpprest, Qt5, Tizen), **Clojure**, **Dart**, **Elixir**, **Eiffel**, **Go**, **Groovy**, **Haskell** (http-client, Servant), **Java** (Jersey1.x, Jersey2.x, OkHttp, Retrofit1.x, Retrofit2.x, Feign, RestTemplate, RESTEasy, Vertx, Google API Client Library for Java), **Kotlin**, **Lua**, **Node.js** (ES5, ES6, AngularJS with Google Closure Compiler annotations) **Objective-C**, **Perl**, **PHP**, **PowerShell**, **Python**, **R**, **Ruby**, **Rust**, **Scala** (akka, http4s, swagger-async-httpclient), **Swift** (2.x, 3.x, 4.x), **Typescript** (Angular1.x, Angular2.x, Fetch, jQuery, Node) +- **API clients**: **ActionScript**, **Ada**, **Apex**, **Bash**, **C#** (.net 2.0, 4.0 or later), **C++** (cpprest, Qt5, Tizen), **Clojure**, **Dart**, **Elixir**, **Eiffel**, **Erlang**, **Go**, **Groovy**, **Haskell** (http-client, Servant), **Java** (Jersey1.x, Jersey2.x, OkHttp, Retrofit1.x, Retrofit2.x, Feign, RestTemplate, RESTEasy, Vertx, Google API Client Library for Java), **Kotlin**, **Lua**, **Node.js** (ES5, ES6, AngularJS with Google Closure Compiler annotations) **Objective-C**, **Perl**, **PHP**, **PowerShell**, **Python**, **R**, **Ruby**, **Rust**, **Scala** (akka, http4s, swagger-async-httpclient), **Swift** (2.x, 3.x, 4.x), **Typescript** (Angular1.x, Angular2.x, Fetch, jQuery, Node) - **Server stubs**: **C#** (ASP.NET Core, NancyFx), **C++** (Pistache, Restbed), **Erlang**, **Go**, **Haskell** (Servant), **Java** (MSF4J, Spring, Undertow, JAX-RS: CDI, CXF, Inflector, RestEasy, Play Framework), **PHP** (Lumen, Slim, Silex, [Symfony](https://symfony.com/), [Zend Expressive](https://github.com/zendframework/zend-expressive)), **Python** (Flask), **NodeJS**, **Ruby** (Sinatra, Rails5), **Rust**, **Scala** ([Finch](https://github.com/finagle/finch), Scalatra) - **API documentation generators**: **HTML**, **Confluence Wiki** - **Configuration files**: [**Apache2**](https://httpd.apache.org/) @@ -976,6 +976,7 @@ Here is a list of template creators: * Dart: @yissachar * Elixir: @niku * Eiffel: @jvelilla + * Erlang: @tsloughter * Groovy: @victorgit * Go: @wing328 * Go (rewritten in 2.3.0): @antihax From ca58053339f787753be3fe6454ad647ae8954bf7 Mon Sep 17 00:00:00 2001 From: etherealjoy <33183834+etherealjoy@users.noreply.github.com> Date: Sun, 12 Nov 2017 15:16:26 +0100 Subject: [PATCH 8/8] Fixes Issue #6841, Map for accessing additionalProperties is generated. (#6886) The issue #6884 is still present and requires fixing outside of mustache file as well. --- .../main/resources/qt5cpp/model-body.mustache | 44 ++++++++++++++++--- 1 file changed, 37 insertions(+), 7 deletions(-) diff --git a/modules/swagger-codegen/src/main/resources/qt5cpp/model-body.mustache b/modules/swagger-codegen/src/main/resources/qt5cpp/model-body.mustache index 14c152700422..7fa52b6bde1a 100644 --- a/modules/swagger-codegen/src/main/resources/qt5cpp/model-body.mustache +++ b/modules/swagger-codegen/src/main/resources/qt5cpp/model-body.mustache @@ -58,11 +58,27 @@ void void {{classname}}::fromJsonObject(QJsonObject &pJson) { {{#vars}} - {{^isContainer}}::{{cppNamespace}}::setValue(&{{name}}, pJson["{{baseName}}"], "{{baseType}}", "{{complexType}}");{{/isContainer}} - {{#isContainer}} + {{^isContainer}}::{{cppNamespace}}::setValue(&{{name}}, pJson["{{baseName}}"], "{{baseType}}", "{{complexType}}");{{/isContainer}} + {{#isListContainer}} {{#complexType}}::{{cppNamespace}}::setValue(&{{name}}, pJson["{{baseName}}"], "{{baseType}}", "{{complexType}}");{{/complexType}} {{^complexType}}::{{cppNamespace}}::setValue(&{{name}}, pJson["{{baseName}}"], "{{baseType}}", "{{items.baseType}}");{{/complexType}} - {{/isContainer}} + {{/isListContainer}} + {{#isMapContainer}} + if( pJson["{{baseName}}"].isObject()){ + auto varmap = pJson["{{baseName}}"].toObject().toVariantMap(); + if(varmap.count() > 0){ + for(auto val : varmap.keys() ){ + { + {{items.baseType}} *{{name}}_item = new {{items.baseType}}(); + auto jsonval = QJsonValue::fromVariant(varmap[val]); + ::{{cppNamespace}}::setValue(&{{name}}_item, jsonval, "{{items.baseType}}", "{{items.baseType}}"); + {{name}}->insert({{name}}->end(), val, {{name}}_item); + } + } + } + } + + {{/isMapContainer}} {{/vars}} } @@ -83,14 +99,28 @@ QJsonObject* toJsonValue(QString("{{baseName}}"), {{name}}, obj, QString("{{complexType}}"));{{/complexType}}{{^complexType}} if({{name}} != nullptr && *{{name}} != nullptr) { obj->insert("{{name}}", QJsonValue(*{{name}})); - }{{/complexType}}{{/isContainer}}{{#isContainer}} + }{{/complexType}}{{/isContainer}}{{#isListContainer}} QJsonArray {{name}}JsonArray; toJsonArray((QList*){{name}}, &{{name}}JsonArray, "{{name}}", "{{complexType}}"); - obj->insert("{{baseName}}", {{name}}JsonArray);{{/isContainer}}{{/complexType}}{{^complexType}}{{^isContainer}} - obj->insert("{{baseName}}", QJsonValue({{name}}));{{/isContainer}}{{#isContainer}} + obj->insert("{{baseName}}", {{name}}JsonArray);{{/isListContainer}}{{#isMapContainer}} + QJsonArray {{name}}JsonArray; + for(auto keyval : {{name}}->keys()){ + QJsonObject {{name}}_jobj; + toJsonValue(keyval, ((*{{name}})[keyval]), &{{name}}_jobj, "{{complexType}}"); + {{name}}JsonArray.append({{name}}_jobj); + } + obj->insert("{{baseName}}", {{name}}JsonArray);{{/isMapContainer}}{{/complexType}}{{^complexType}}{{^isContainer}} + obj->insert("{{baseName}}", QJsonValue({{name}}));{{/isContainer}}{{#isListContainer}} QJsonArray {{name}}JsonArray; toJsonArray((QList*){{name}}, &{{name}}JsonArray, "{{name}}", "{{items.baseType}}"); - obj->insert("{{baseName}}", {{name}}JsonArray);{{/isContainer}}{{/complexType}} + obj->insert("{{baseName}}", {{name}}JsonArray);{{/isListContainer}}{{#isMapContainer}} + QJsonArray {{name}}JsonArray; + for(auto keyval : {{name}}->keys()){ + QJsonObject {{name}}_jobj; + toJsonValue(keyval, ((*{{name}})[keyval]), &{{name}}_jobj, "{{items.baseType}}"); + {{name}}JsonArray.append(portsobj); + } + obj->insert("{{baseName}}", {{name}}JsonArray);{{/isMapContainer}}{{/complexType}} {{/vars}} return obj;