From 8408a97aef841228bb4e8211653b4b2cec5c9c92 Mon Sep 17 00:00:00 2001 From: xhh Date: Mon, 24 Aug 2015 16:50:57 +0800 Subject: [PATCH 1/8] Java: Support special characters in enum values and use upper case for enum names Conflicts: samples/client/petstore/java/default/src/main/java/io/swagger/client/JSON.java samples/client/petstore/java/default/src/main/java/io/swagger/client/model/Order.java samples/client/petstore/java/default/src/main/java/io/swagger/client/model/Pet.java --- .../codegen/languages/JavaClientCodegen.java | 25 +++++++++++++++++++ .../src/main/resources/Java/JSON.mustache | 2 ++ .../main/resources/Java/enumClass.mustache | 14 +++++++++++ .../src/main/resources/Java/model.mustache | 11 +++----- .../src/main/java/io/swagger/client/JSON.java | 4 ++- .../java/io/swagger/client/model/Order.java | 21 +++++++++++++--- .../java/io/swagger/client/model/Pet.java | 23 +++++++++++++---- .../io/swagger/petstore/test/PetApiTest.java | 6 ++--- .../swagger/petstore/test/StoreApiTest.java | 2 +- .../client/petstore/java/jersey2/hello.txt | 1 - .../src/main/java/io/swagger/client/JSON.java | 4 ++- .../java/io/swagger/client/model/Order.java | 25 +++++++++++++++---- .../java/io/swagger/client/model/Pet.java | 25 +++++++++++++++---- .../io/swagger/petstore/test/PetApiTest.java | 6 ++--- .../swagger/petstore/test/StoreApiTest.java | 2 +- 15 files changed, 134 insertions(+), 37 deletions(-) create mode 100644 modules/swagger-codegen/src/main/resources/Java/enumClass.mustache delete mode 100644 samples/client/petstore/java/jersey2/hello.txt diff --git a/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/JavaClientCodegen.java b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/JavaClientCodegen.java index 379a2db2eb1b..3b35e85d954d 100644 --- a/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/JavaClientCodegen.java +++ b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/JavaClientCodegen.java @@ -318,6 +318,31 @@ public class JavaClientCodegen extends DefaultCodegen implements CodegenConfig { return codegenModel; } + @Override + public Map postProcessModels(Map objs) { + List models = (List) objs.get("models"); + for (Object _mo : models) { + Map mo = (Map) _mo; + CodegenModel cm = (CodegenModel) mo.get("model"); + for (CodegenProperty var : cm.vars) { + Map allowableValues = var.allowableValues; + if (allowableValues == null) + continue; + List values = (List) allowableValues.get("values"); + // put "enumVars" map into `allowableValues", including `name` and `value` + List> enumVars = new ArrayList>(); + for (String value : values) { + Map enumVar = new HashMap(); + enumVar.put("name", toVarName(value.toUpperCase())); + enumVar.put("value", value); + enumVars.add(enumVar); + } + allowableValues.put("enumVars", enumVars); + } + } + return objs; + } + private CodegenModel reconcileInlineEnums(CodegenModel codegenModel, CodegenModel parentCodegenModel) { // This generator uses inline classes to define enums, which breaks when // dealing with models that have subTypes. To clean this up, we will analyze diff --git a/modules/swagger-codegen/src/main/resources/Java/JSON.mustache b/modules/swagger-codegen/src/main/resources/Java/JSON.mustache index 4f90c6190b2f..7689856f5de5 100644 --- a/modules/swagger-codegen/src/main/resources/Java/JSON.mustache +++ b/modules/swagger-codegen/src/main/resources/Java/JSON.mustache @@ -14,6 +14,8 @@ public class JSON { mapper = new ObjectMapper(); mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); mapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS); + mapper.enable(SerializationFeature.WRITE_ENUMS_USING_TO_STRING); + mapper.enable(DeserializationFeature.READ_ENUMS_USING_TO_STRING); mapper.registerModule(new JodaModule()); } diff --git a/modules/swagger-codegen/src/main/resources/Java/enumClass.mustache b/modules/swagger-codegen/src/main/resources/Java/enumClass.mustache new file mode 100644 index 000000000000..1cef90b75a4a --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/Java/enumClass.mustache @@ -0,0 +1,14 @@ +public enum {{datatypeWithEnum}} { + {{#allowableValues}}{{#enumVars}}{{name}}("{{value}}"){{^-last}}, {{/-last}}{{#-last}};{{/-last}}{{/enumVars}}{{/allowableValues}} + + private String value; + + StatusEnum(String value) { + this.value = value; + } + + @Override + public String toString() { + return value; + } +} diff --git a/modules/swagger-codegen/src/main/resources/Java/model.mustache b/modules/swagger-codegen/src/main/resources/Java/model.mustache index 13c0c15c9a5a..bfb65a3d4195 100644 --- a/modules/swagger-codegen/src/main/resources/Java/model.mustache +++ b/modules/swagger-codegen/src/main/resources/Java/model.mustache @@ -18,13 +18,10 @@ import com.fasterxml.jackson.annotation.JsonProperty; {{>generatedAnnotation}} public class {{classname}} {{#parent}}extends {{{parent}}}{{/parent}} {{#serializableModel}}implements Serializable{{/serializableModel}} { {{#vars}}{{#isEnum}} - public enum {{datatypeWithEnum}} { - {{#allowableValues}}{{#values}} {{.}}, {{/values}}{{/allowableValues}} - };{{/isEnum}}{{#items.isEnum}}{{#items}} - public enum {{datatypeWithEnum}} { - {{#allowableValues}}{{#values}} {{.}}, {{/values}}{{/allowableValues}} - }; -{{/items}}{{/items.isEnum}} + +{{>enumClass}}{{/isEnum}}{{#items.isEnum}}{{#items}} + +{{>enumClass}}{{/items}}{{/items.isEnum}} private {{{datatypeWithEnum}}} {{name}} = {{{defaultValue}}};{{/vars}} {{#vars}} diff --git a/samples/client/petstore/java/default/src/main/java/io/swagger/client/JSON.java b/samples/client/petstore/java/default/src/main/java/io/swagger/client/JSON.java index 030152a99742..5523b921e45c 100644 --- a/samples/client/petstore/java/default/src/main/java/io/swagger/client/JSON.java +++ b/samples/client/petstore/java/default/src/main/java/io/swagger/client/JSON.java @@ -6,7 +6,7 @@ import com.fasterxml.jackson.datatype.joda.*; import java.io.IOException; -@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-08-24T11:46:58.447+08:00") +@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-08-24T18:19:30.060+08:00") public class JSON { private ObjectMapper mapper; @@ -14,6 +14,8 @@ public class JSON { mapper = new ObjectMapper(); mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); mapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS); + mapper.enable(SerializationFeature.WRITE_ENUMS_USING_TO_STRING); + mapper.enable(DeserializationFeature.READ_ENUMS_USING_TO_STRING); mapper.registerModule(new JodaModule()); } diff --git a/samples/client/petstore/java/default/src/main/java/io/swagger/client/model/Order.java b/samples/client/petstore/java/default/src/main/java/io/swagger/client/model/Order.java index df7ad48b6e11..e89c1f3fb408 100644 --- a/samples/client/petstore/java/default/src/main/java/io/swagger/client/model/Order.java +++ b/samples/client/petstore/java/default/src/main/java/io/swagger/client/model/Order.java @@ -9,16 +9,29 @@ import com.fasterxml.jackson.annotation.JsonProperty; @ApiModel(description = "") -@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-08-24T11:46:58.447+08:00") +@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-08-24T18:19:30.060+08:00") public class Order { private Long id = null; private Long petId = null; private Integer quantity = null; private Date shipDate = null; - public enum StatusEnum { - placed, approved, delivered, - }; + +public enum StatusEnum { + PLACED("placed"), APPROVED("approved"), DELIVERED("delivered"); + + private String value; + + StatusEnum(String value) { + this.value = value; + } + + @Override + public String toString() { + return value; + } +} + private StatusEnum status = null; private Boolean complete = null; diff --git a/samples/client/petstore/java/default/src/main/java/io/swagger/client/model/Pet.java b/samples/client/petstore/java/default/src/main/java/io/swagger/client/model/Pet.java index 68799092a32e..b3b0e1b5347f 100644 --- a/samples/client/petstore/java/default/src/main/java/io/swagger/client/model/Pet.java +++ b/samples/client/petstore/java/default/src/main/java/io/swagger/client/model/Pet.java @@ -1,8 +1,8 @@ package io.swagger.client.model; import io.swagger.client.model.Category; -import io.swagger.client.model.Tag; import java.util.*; +import io.swagger.client.model.Tag; @@ -11,7 +11,7 @@ import com.fasterxml.jackson.annotation.JsonProperty; @ApiModel(description = "") -@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-08-24T11:46:58.447+08:00") +@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-08-24T18:19:30.060+08:00") public class Pet { private Long id = null; @@ -19,9 +19,22 @@ public class Pet { private String name = null; private List photoUrls = new ArrayList(); private List tags = new ArrayList(); - public enum StatusEnum { - available, pending, sold, - }; + +public enum StatusEnum { + AVAILABLE("available"), PENDING("pending"), SOLD("sold"); + + private String value; + + StatusEnum(String value) { + this.value = value; + } + + @Override + public String toString() { + return value; + } +} + private StatusEnum status = null; diff --git a/samples/client/petstore/java/default/src/test/java/io/swagger/petstore/test/PetApiTest.java b/samples/client/petstore/java/default/src/test/java/io/swagger/petstore/test/PetApiTest.java index b6ad5fb05275..0a8f8a1665d2 100644 --- a/samples/client/petstore/java/default/src/test/java/io/swagger/petstore/test/PetApiTest.java +++ b/samples/client/petstore/java/default/src/test/java/io/swagger/petstore/test/PetApiTest.java @@ -86,7 +86,7 @@ public class PetApiTest { public void testFindPetsByStatus() throws Exception { Pet pet = createRandomPet(); pet.setName("programmer"); - pet.setStatus(Pet.StatusEnum.available); + pet.setStatus(Pet.StatusEnum.AVAILABLE); api.updatePet(pet); @@ -108,7 +108,7 @@ public class PetApiTest { public void testFindPetsByTags() throws Exception { Pet pet = createRandomPet(); pet.setName("monster"); - pet.setStatus(Pet.StatusEnum.available); + pet.setStatus(Pet.StatusEnum.AVAILABLE); List tags = new ArrayList(); Tag tag1 = new Tag(); @@ -183,7 +183,7 @@ public class PetApiTest { category.setName("really-happy"); pet.setCategory(category); - pet.setStatus(Pet.StatusEnum.available); + pet.setStatus(Pet.StatusEnum.AVAILABLE); List photos = Arrays.asList(new String[]{"http://foo.bar.com/1", "http://foo.bar.com/2"}); pet.setPhotoUrls(photos); diff --git a/samples/client/petstore/java/default/src/test/java/io/swagger/petstore/test/StoreApiTest.java b/samples/client/petstore/java/default/src/test/java/io/swagger/petstore/test/StoreApiTest.java index 508764b8c2db..a1fd7e345a81 100644 --- a/samples/client/petstore/java/default/src/test/java/io/swagger/petstore/test/StoreApiTest.java +++ b/samples/client/petstore/java/default/src/test/java/io/swagger/petstore/test/StoreApiTest.java @@ -64,7 +64,7 @@ public class StoreApiTest { order.setPetId(new Long(200)); order.setQuantity(new Integer(13)); order.setShipDate(new java.util.Date()); - order.setStatus(Order.StatusEnum.placed); + order.setStatus(Order.StatusEnum.PLACED); order.setComplete(true); return order; diff --git a/samples/client/petstore/java/jersey2/hello.txt b/samples/client/petstore/java/jersey2/hello.txt deleted file mode 100644 index 6769dd60bdf5..000000000000 --- a/samples/client/petstore/java/jersey2/hello.txt +++ /dev/null @@ -1 +0,0 @@ -Hello world! \ No newline at end of file diff --git a/samples/client/petstore/java/jersey2/src/main/java/io/swagger/client/JSON.java b/samples/client/petstore/java/jersey2/src/main/java/io/swagger/client/JSON.java index 0baddcd02c0d..3095c7bacead 100644 --- a/samples/client/petstore/java/jersey2/src/main/java/io/swagger/client/JSON.java +++ b/samples/client/petstore/java/jersey2/src/main/java/io/swagger/client/JSON.java @@ -6,7 +6,7 @@ import com.fasterxml.jackson.datatype.joda.*; import java.io.IOException; -@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-08-22T21:47:05.989+08:00") +@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-08-24T16:42:49.539+08:00") public class JSON { private ObjectMapper mapper; @@ -14,6 +14,8 @@ public class JSON { mapper = new ObjectMapper(); mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); mapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS); + mapper.enable(SerializationFeature.WRITE_ENUMS_USING_TO_STRING); + mapper.enable(DeserializationFeature.READ_ENUMS_USING_TO_STRING); mapper.registerModule(new JodaModule()); } diff --git a/samples/client/petstore/java/jersey2/src/main/java/io/swagger/client/model/Order.java b/samples/client/petstore/java/jersey2/src/main/java/io/swagger/client/model/Order.java index 671d8366be0d..2477288848da 100644 --- a/samples/client/petstore/java/jersey2/src/main/java/io/swagger/client/model/Order.java +++ b/samples/client/petstore/java/jersey2/src/main/java/io/swagger/client/model/Order.java @@ -2,21 +2,36 @@ package io.swagger.client.model; import java.util.Date; + + import io.swagger.annotations.*; import com.fasterxml.jackson.annotation.JsonProperty; @ApiModel(description = "") -@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-08-22T21:47:05.989+08:00") -public class Order { +@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-08-24T16:42:49.539+08:00") +public class Order { private Long id = null; private Long petId = null; private Integer quantity = null; private Date shipDate = null; - public enum StatusEnum { - placed, approved, delivered, - }; + +public enum StatusEnum { + PLACED("placed"), APPROVED("approved"), DELIVERED("delivered"); + + private String value; + + StatusEnum(String value) { + this.value = value; + } + + @Override + public String toString() { + return value; + } +} + private StatusEnum status = null; private Boolean complete = null; diff --git a/samples/client/petstore/java/jersey2/src/main/java/io/swagger/client/model/Pet.java b/samples/client/petstore/java/jersey2/src/main/java/io/swagger/client/model/Pet.java index 036f694ffddd..1ed729475562 100644 --- a/samples/client/petstore/java/jersey2/src/main/java/io/swagger/client/model/Pet.java +++ b/samples/client/petstore/java/jersey2/src/main/java/io/swagger/client/model/Pet.java @@ -4,22 +4,37 @@ import io.swagger.client.model.Category; import java.util.*; import io.swagger.client.model.Tag; + + import io.swagger.annotations.*; import com.fasterxml.jackson.annotation.JsonProperty; @ApiModel(description = "") -@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-08-22T21:47:05.989+08:00") -public class Pet { +@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-08-24T16:42:49.539+08:00") +public class Pet { private Long id = null; private Category category = null; private String name = null; private List photoUrls = new ArrayList(); private List tags = new ArrayList(); - public enum StatusEnum { - available, pending, sold, - }; + +public enum StatusEnum { + AVAILABLE("available"), PENDING("pending"), SOLD("sold"); + + private String value; + + StatusEnum(String value) { + this.value = value; + } + + @Override + public String toString() { + return value; + } +} + private StatusEnum status = null; diff --git a/samples/client/petstore/java/jersey2/src/test/java/io/swagger/petstore/test/PetApiTest.java b/samples/client/petstore/java/jersey2/src/test/java/io/swagger/petstore/test/PetApiTest.java index b6ad5fb05275..0a8f8a1665d2 100644 --- a/samples/client/petstore/java/jersey2/src/test/java/io/swagger/petstore/test/PetApiTest.java +++ b/samples/client/petstore/java/jersey2/src/test/java/io/swagger/petstore/test/PetApiTest.java @@ -86,7 +86,7 @@ public class PetApiTest { public void testFindPetsByStatus() throws Exception { Pet pet = createRandomPet(); pet.setName("programmer"); - pet.setStatus(Pet.StatusEnum.available); + pet.setStatus(Pet.StatusEnum.AVAILABLE); api.updatePet(pet); @@ -108,7 +108,7 @@ public class PetApiTest { public void testFindPetsByTags() throws Exception { Pet pet = createRandomPet(); pet.setName("monster"); - pet.setStatus(Pet.StatusEnum.available); + pet.setStatus(Pet.StatusEnum.AVAILABLE); List tags = new ArrayList(); Tag tag1 = new Tag(); @@ -183,7 +183,7 @@ public class PetApiTest { category.setName("really-happy"); pet.setCategory(category); - pet.setStatus(Pet.StatusEnum.available); + pet.setStatus(Pet.StatusEnum.AVAILABLE); List photos = Arrays.asList(new String[]{"http://foo.bar.com/1", "http://foo.bar.com/2"}); pet.setPhotoUrls(photos); diff --git a/samples/client/petstore/java/jersey2/src/test/java/io/swagger/petstore/test/StoreApiTest.java b/samples/client/petstore/java/jersey2/src/test/java/io/swagger/petstore/test/StoreApiTest.java index 508764b8c2db..a1fd7e345a81 100644 --- a/samples/client/petstore/java/jersey2/src/test/java/io/swagger/petstore/test/StoreApiTest.java +++ b/samples/client/petstore/java/jersey2/src/test/java/io/swagger/petstore/test/StoreApiTest.java @@ -64,7 +64,7 @@ public class StoreApiTest { order.setPetId(new Long(200)); order.setQuantity(new Integer(13)); order.setShipDate(new java.util.Date()); - order.setStatus(Order.StatusEnum.placed); + order.setStatus(Order.StatusEnum.PLACED); order.setComplete(true); return order; From a43d2163a06b42f4dce4b505ba85a05e1259b52d Mon Sep 17 00:00:00 2001 From: wing328 Date: Mon, 24 Aug 2015 21:53:28 +0800 Subject: [PATCH 2/8] add camelCase support for php variable naming --- .../codegen/languages/PhpClientCodegen.java | 22 ++++++++++++++++--- 1 file changed, 19 insertions(+), 3 deletions(-) diff --git a/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/PhpClientCodegen.java b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/PhpClientCodegen.java index cd88d916e03b..5f6c48120cb8 100644 --- a/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/PhpClientCodegen.java +++ b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/PhpClientCodegen.java @@ -24,6 +24,7 @@ public class PhpClientCodegen extends DefaultCodegen implements CodegenConfig { protected String packagePath = "SwaggerClient-php"; protected String artifactVersion = "1.0.0"; protected String srcBasePath = "lib"; + protected String variableNamingConvention= "snake_case"; public PhpClientCodegen() { super(); @@ -84,6 +85,7 @@ public class PhpClientCodegen extends DefaultCodegen implements CodegenConfig { typeMapping.put("object", "object"); typeMapping.put("DateTime", "\\DateTime"); + cliOptions.add(new CliOption("variableNamingConvention", "naming convention of variable name, e.g. camelCase. Default: snake_case")); cliOptions.add(new CliOption("invokerPackage", "The main namespace to use for all classes. e.g. Yay\\Pets")); cliOptions.add(new CliOption("packagePath", "The main package name for classes. e.g. GeneratedPetstore")); cliOptions.add(new CliOption("srcBasePath", "The directory under packagePath to serve as source root.")); @@ -279,6 +281,10 @@ public class PhpClientCodegen extends DefaultCodegen implements CodegenConfig { this.srcBasePath = srcBasePath; } + public void setParameterNamingConvention(String variableNamingConvention) { + this.variableNamingConvention = variableNamingConvention; + } + private void setComposerVendorName(String composerVendorName) { this.composerVendorName = composerVendorName; } @@ -289,9 +295,19 @@ public class PhpClientCodegen extends DefaultCodegen implements CodegenConfig { @Override public String toVarName(String name) { - // return the name in underscore style - // PhoneNumber => phone_number - name = underscore(name); + if (additionalProperties.containsKey("variableNamingConvention")) { + this.setParameterNamingConvention((String) additionalProperties.get("variableNamingConvention")); + } + + if ("camelCase".equals(variableNamingConvention)) { + // return the name in camelCase style + // phone_number => phoneNumber + name = camelize(name, true); + } else { // default to snake case + // return the name in underscore style + // PhoneNumber => phone_number + name = underscore(name); + } // parameter name starting with number won't compile // need to escape it by appending _ at the beginning From 52dc7e210c9b08033cc92b580ba74b32ff56ad2d Mon Sep 17 00:00:00 2001 From: ivanmartinvalle Date: Mon, 24 Aug 2015 18:29:01 -0500 Subject: [PATCH 3/8] Add status code and response headers of the last request to java and csharp templates per #990 --- .../main/resources/Java/ApiClient.mustache | 20 +++++++++++++++++++ .../main/resources/csharp/ApiClient.mustache | 20 +++++++++++++++++-- 2 files changed, 38 insertions(+), 2 deletions(-) diff --git a/modules/swagger-codegen/src/main/resources/Java/ApiClient.mustache b/modules/swagger-codegen/src/main/resources/Java/ApiClient.mustache index 1a0dc5bc3a73..5e18c854cba4 100644 --- a/modules/swagger-codegen/src/main/resources/Java/ApiClient.mustache +++ b/modules/swagger-codegen/src/main/resources/Java/ApiClient.mustache @@ -49,6 +49,9 @@ public class ApiClient { private Map authentications; + private int statusCode; + private Map> responseHeaders; + private DateFormat dateFormat; public ApiClient() { @@ -80,6 +83,20 @@ public class ApiClient { return this; } + /** + * Gets the status code of the previous request + */ + public int getStatusCode() { + return statusCode; + } + + /** + * Gets the response headers of the previous request + */ + public Map> getResponseHeaders() { + return responseHeaders; + } + /** * Get authentications (key: authentication name, value: authentication). */ @@ -494,6 +511,9 @@ public class ApiClient { ClientResponse response = getAPIResponse(path, method, queryParams, body, binaryBody, headerParams, formParams, accept, contentType, authNames); + statusCode = response.getStatusInfo().getStatusCode(); + responseHeaders = response.getHeaders(); + if(response.getStatusInfo() == ClientResponse.Status.NO_CONTENT) { return null; } else if (response.getStatusInfo().getFamily() == Family.SUCCESSFUL) { diff --git a/modules/swagger-codegen/src/main/resources/csharp/ApiClient.mustache b/modules/swagger-codegen/src/main/resources/csharp/ApiClient.mustache index c93537a740dc..b74ab56ea107 100644 --- a/modules/swagger-codegen/src/main/resources/csharp/ApiClient.mustache +++ b/modules/swagger-codegen/src/main/resources/csharp/ApiClient.mustache @@ -49,6 +49,16 @@ namespace {{packageName}}.Client { get { return _defaultHeaderMap; } } + + /// + /// Gets the status code of the previous request + /// + public int StatusCode { get; private set; } + + /// + /// Gets the response headers of the previous request + /// + public Dictionary ResponseHeaders { get; private set; } // Creates and sets up a RestRequest prior to a call. private RestRequest PrepareRequest( @@ -110,7 +120,10 @@ namespace {{packageName}}.Client { var request = PrepareRequest( path, method, queryParams, postBody, headerParams, formParams, fileParams, pathParams, authSettings); - return (Object)RestClient.Execute(request); + var response = RestClient.Execute(request); + StatusCode = (int) response.StatusCode; + ResponseHeaders = response.Headers.ToDictionary(x => x.Name, x => x.Value.ToString()); + return (Object) response; } /// @@ -133,7 +146,10 @@ namespace {{packageName}}.Client { var request = PrepareRequest( path, method, queryParams, postBody, headerParams, formParams, fileParams, pathParams, authSettings); - return (Object) await RestClient.ExecuteTaskAsync(request); + var response = await RestClient.ExecuteTaskAsync(request); + StatusCode = (int)response.StatusCode; + ResponseHeaders = response.Headers.ToDictionary(x => x.Name, x => x.Value.ToString()); + return (Object)response; } /// From ab5483cd0478f77b7654e77dc0621edc613b4c42 Mon Sep 17 00:00:00 2001 From: geekerzp Date: Tue, 25 Aug 2015 09:40:53 +0800 Subject: [PATCH 4/8] Add test cases for sanitizeForSerialization method in objc client. --- .../Tests/SWGApiClientTest.m | 75 +++++++++++++++++++ 1 file changed, 75 insertions(+) diff --git a/samples/client/petstore/objc/SwaggerClientTests/Tests/SWGApiClientTest.m b/samples/client/petstore/objc/SwaggerClientTests/Tests/SWGApiClientTest.m index d19180dc008e..547aff2fe1d9 100644 --- a/samples/client/petstore/objc/SwaggerClientTests/Tests/SWGApiClientTest.m +++ b/samples/client/petstore/objc/SwaggerClientTests/Tests/SWGApiClientTest.m @@ -1,7 +1,12 @@ #import #import +#import #import #import +#import +#import +#import +#import @interface SWGApiClientTest : XCTestCase @@ -98,4 +103,74 @@ XCTAssertEqualObjects(basicAuthCredentials, [config getBasicAuthToken]); } +- (void)testSanitizeForDeserialization { + id result; + id data; + + // nil + data = nil; + result = [self.apiClient sanitizeForSerialization:data]; + XCTAssertEqualObjects(result, data); + + // NSString + data = @"test string"; + result = [self.apiClient sanitizeForSerialization:data]; + XCTAssertEqualObjects(result, data); + + // NSNumber + data = @1; + result = [self.apiClient sanitizeForSerialization:data]; + XCTAssertEqualObjects(result, data); + + // SWGQueryParamCollection + data = [[SWGQueryParamCollection alloc] init]; + result = [self.apiClient sanitizeForSerialization:data]; + XCTAssertEqualObjects(result, data); + + // NSDate + data = [NSDate dateWithISO8601String:@"1997-07-16T19:20:30.45+01:0"]; + result = [self.apiClient sanitizeForSerialization:data]; + XCTAssertEqualObjects(result, [data ISO8601String]); + + // model + data = [self createPet]; + result = [self.apiClient sanitizeForSerialization:data]; + XCTAssertEqualObjects(result, [data toDictionary]); + + // NSArray + data = @[@1]; + result = [self.apiClient sanitizeForSerialization:data]; + XCTAssertEqualObjects(result, data); + + // NSDictionary + data = @{@"test key": @"test value"}; + result = [self.apiClient sanitizeForSerialization:data]; + XCTAssertEqualObjects(result, data); +} + +- (SWGPet*) createPet { + SWGPet * pet = [[SWGPet alloc] init]; + pet._id = [[NSNumber alloc] initWithLong:[[NSDate date] timeIntervalSince1970]]; + pet.name = @"monkey"; + + SWGCategory * category = [[SWGCategory alloc] init]; + category._id = [[NSNumber alloc] initWithInteger:arc4random_uniform(100000)]; + category.name = @"super-happy"; + pet.category = category; + + SWGTag *tag1 = [[SWGTag alloc] init]; + tag1._id = [[NSNumber alloc] initWithInteger:arc4random_uniform(100000)]; + tag1.name = @"test tag 1"; + SWGTag *tag2 = [[SWGTag alloc] init]; + tag2._id = [[NSNumber alloc] initWithInteger:arc4random_uniform(100000)]; + tag2.name = @"test tag 2"; + pet.tags = (NSArray *)[[NSArray alloc] initWithObjects:tag1, tag2, nil]; + + pet.status = @"available"; + + NSArray * photos = [[NSArray alloc] initWithObjects:@"http://foo.bar.com/3", @"http://foo.bar.com/4", nil]; + pet.photoUrls = photos; + return pet; +} + @end From eb21963fa5bdb0afb1f3281776fc74e0e9fe20d0 Mon Sep 17 00:00:00 2001 From: geekerzp Date: Tue, 25 Aug 2015 10:51:03 +0800 Subject: [PATCH 5/8] Update test case testSanitizeForSerialization in objc client. --- .../Tests/SWGApiClientTest.m | 43 ++++++------------- 1 file changed, 14 insertions(+), 29 deletions(-) diff --git a/samples/client/petstore/objc/SwaggerClientTests/Tests/SWGApiClientTest.m b/samples/client/petstore/objc/SwaggerClientTests/Tests/SWGApiClientTest.m index 547aff2fe1d9..3e13f618c29c 100644 --- a/samples/client/petstore/objc/SwaggerClientTests/Tests/SWGApiClientTest.m +++ b/samples/client/petstore/objc/SwaggerClientTests/Tests/SWGApiClientTest.m @@ -103,7 +103,7 @@ XCTAssertEqualObjects(basicAuthCredentials, [config getBasicAuthToken]); } -- (void)testSanitizeForDeserialization { +- (void)testSanitizeForSerialization { id result; id data; @@ -128,14 +128,24 @@ XCTAssertEqualObjects(result, data); // NSDate - data = [NSDate dateWithISO8601String:@"1997-07-16T19:20:30.45+01:0"]; + data = [NSDate dateWithISO8601String:@"1997-07-16T19:20:30.45+01:00"]; + result = [self.apiClient sanitizeForSerialization:data]; + XCTAssertEqualObjects(result, [data ISO8601String]); + + data = [NSDate dateWithISO8601String:@"1997-07-16"]; result = [self.apiClient sanitizeForSerialization:data]; XCTAssertEqualObjects(result, [data ISO8601String]); // model - data = [self createPet]; + NSDictionary *petDict = @{@"id": @1, @"name": @"monkey", + @"category": @{@"id": @1, @"name": @"test category"}, + @"tags": @[@{@"id": @1, @"name": @"test tag1"}, + @{@"id": @2, @"name": @"test tag2"}], + @"status": @"available", + @"photoUrls": @[@"http://foo.bar.com/3", @"http://foo.bar.com/4"]}; + data = [[SWGPet alloc] initWithDictionary:petDict error:nil]; result = [self.apiClient sanitizeForSerialization:data]; - XCTAssertEqualObjects(result, [data toDictionary]); + XCTAssertEqualObjects(result, petDict); // NSArray data = @[@1]; @@ -148,29 +158,4 @@ XCTAssertEqualObjects(result, data); } -- (SWGPet*) createPet { - SWGPet * pet = [[SWGPet alloc] init]; - pet._id = [[NSNumber alloc] initWithLong:[[NSDate date] timeIntervalSince1970]]; - pet.name = @"monkey"; - - SWGCategory * category = [[SWGCategory alloc] init]; - category._id = [[NSNumber alloc] initWithInteger:arc4random_uniform(100000)]; - category.name = @"super-happy"; - pet.category = category; - - SWGTag *tag1 = [[SWGTag alloc] init]; - tag1._id = [[NSNumber alloc] initWithInteger:arc4random_uniform(100000)]; - tag1.name = @"test tag 1"; - SWGTag *tag2 = [[SWGTag alloc] init]; - tag2._id = [[NSNumber alloc] initWithInteger:arc4random_uniform(100000)]; - tag2.name = @"test tag 2"; - pet.tags = (NSArray *)[[NSArray alloc] initWithObjects:tag1, tag2, nil]; - - pet.status = @"available"; - - NSArray * photos = [[NSArray alloc] initWithObjects:@"http://foo.bar.com/3", @"http://foo.bar.com/4", nil]; - pet.photoUrls = photos; - return pet; -} - @end From 1b2f491b0ea61ec9aca327dcbe5a4d0758569459 Mon Sep 17 00:00:00 2001 From: geekerzp Date: Tue, 25 Aug 2015 11:16:19 +0800 Subject: [PATCH 6/8] Add tese case for sanitizing array of models in objc client. --- .../objc/SwaggerClientTests/Tests/SWGApiClientTest.m | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/samples/client/petstore/objc/SwaggerClientTests/Tests/SWGApiClientTest.m b/samples/client/petstore/objc/SwaggerClientTests/Tests/SWGApiClientTest.m index 3e13f618c29c..e9f1a46af3ba 100644 --- a/samples/client/petstore/objc/SwaggerClientTests/Tests/SWGApiClientTest.m +++ b/samples/client/petstore/objc/SwaggerClientTests/Tests/SWGApiClientTest.m @@ -152,6 +152,12 @@ result = [self.apiClient sanitizeForSerialization:data]; XCTAssertEqualObjects(result, data); + // NSArray of models + NSArray *arrayOfPetDict = @[petDict]; + data = [NSArray arrayWithObject:[[SWGPet alloc] initWithDictionary:petDict error:nil]]; + result = [self.apiClient sanitizeForSerialization:data]; + XCTAssertEqualObjects(result, arrayOfPetDict); + // NSDictionary data = @{@"test key": @"test value"}; result = [self.apiClient sanitizeForSerialization:data]; From 568b7a4fcddfffd8d863b031b6a5b0ad831108ab Mon Sep 17 00:00:00 2001 From: geekerzp Date: Tue, 25 Aug 2015 15:04:46 +0800 Subject: [PATCH 7/8] Add test cases for sanitize_for_serialization method in python client. --- .../petstore/python/tests/test_api_client.py | 87 +++++++++++++++++-- 1 file changed, 82 insertions(+), 5 deletions(-) diff --git a/samples/client/petstore/python/tests/test_api_client.py b/samples/client/petstore/python/tests/test_api_client.py index 903fde458152..61c57cb7e460 100644 --- a/samples/client/petstore/python/tests/test_api_client.py +++ b/samples/client/petstore/python/tests/test_api_client.py @@ -10,6 +10,7 @@ $ nosetests -v import os import time import unittest +from dateutil.parser import parse import swagger_client import swagger_client.configuration @@ -51,7 +52,7 @@ class ApiClientTests(unittest.TestCase): accepts = ['APPLICATION/JSON', 'APPLICATION/XML'] accept = self.api_client.select_header_accept(accepts) self.assertEqual(accept, 'application/json') - + accepts = ['application/json', 'application/xml'] accept = self.api_client.select_header_accept(accepts) self.assertEqual(accept, 'application/json') @@ -72,19 +73,95 @@ class ApiClientTests(unittest.TestCase): content_types = ['APPLICATION/JSON', 'APPLICATION/XML'] content_type = self.api_client.select_header_content_type(content_types) self.assertEqual(content_type, 'application/json') - + content_types = ['application/json', 'application/xml'] content_type = self.api_client.select_header_content_type(content_types) self.assertEqual(content_type, 'application/json') - + content_types = ['application/xml', 'application/json'] content_type = self.api_client.select_header_content_type(content_types) self.assertEqual(content_type, 'application/json') - + content_types = ['text/plain', 'application/xml'] content_type = self.api_client.select_header_content_type(content_types) self.assertEqual(content_type, 'text/plain') - + content_types = [] content_type = self.api_client.select_header_content_type(content_types) self.assertEqual(content_type, 'application/json') + + def test_sanitize_for_serialization(self): + # None + data = None + result = self.api_client.sanitize_for_serialization(None) + self.assertEqual(result, data) + + # str + data = "test string" + result = self.api_client.sanitize_for_serialization(data) + self.assertEqual(result, data) + + # int + data = 1 + result = self.api_client.sanitize_for_serialization(data) + self.assertEqual(result, data) + + # bool + data = True + result = self.api_client.sanitize_for_serialization(data) + self.assertEqual(result, data) + + # date + data = parse("1997-07-16").date() # date + result = self.api_client.sanitize_for_serialization(data) + self.assertEqual(result, "1997-07-16") + + # datetime + data = parse("1997-07-16T19:20:30.45+01:00") # datetime + result = self.api_client.sanitize_for_serialization(data) + self.assertEqual(result, "1997-07-16T19:20:30.450000+01:00") + + # list + data = [1] + result = self.api_client.sanitize_for_serialization(data) + self.assertEqual(result, data) + + # dict + data = {"test key": "test value"} + result = self.api_client.sanitize_for_serialization(data) + self.assertEqual(result, data) + + # model + pet_dict = {"id": 1, "name": "monkey", + "category": {"id": 1, "name": "test category"}, + "tags": [{"id": 1, "name": "test tag1"}, + {"id": 2, "name": "test tag2"}], + "status": "available", + "photoUrls": ["http://foo.bar.com/3", + "http://foo.bar.com/4"]} + pet = swagger_client.Pet() + pet.id = pet_dict["id"] + pet.name = pet_dict["name"] + cate = swagger_client.Category() + cate.id = pet_dict["category"]["id"] + cate.name = pet_dict["category"]["name"] + pet.category = cate + tag1 = swagger_client.Tag() + tag1.id = pet_dict["tags"][0]["id"] + tag1.name = pet_dict["tags"][0]["name"] + tag2 = swagger_client.Tag() + tag2.id = pet_dict["tags"][1]["id"] + tag2.name = pet_dict["tags"][1]["name"] + pet.tags = [tag1, tag2] + pet.status = pet_dict["status"] + pet.photo_urls = pet_dict["photoUrls"] + + data = pet + result = self.api_client.sanitize_for_serialization(data) + self.assertEqual(result, pet_dict) + + # list of models + list_of_pet_dict = [pet_dict] + data = [pet] + result = self.api_client.sanitize_for_serialization(data) + self.assertEqual(result, list_of_pet_dict) From 570a595ffbd3f3c23cc274a3ac36327270c394c3 Mon Sep 17 00:00:00 2001 From: wing328 Date: Tue, 25 Aug 2015 15:35:22 +0800 Subject: [PATCH 8/8] fix invokerPackage with packageName in compile.mustache --- .../swagger-codegen/src/main/resources/csharp/compile.mustache | 2 +- .../csharp/SwaggerClientTest/Lib/SwaggerClient/compile.bat | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/swagger-codegen/src/main/resources/csharp/compile.mustache b/modules/swagger-codegen/src/main/resources/csharp/compile.mustache index ed4481bb4bbe..e35879e0efa1 100644 --- a/modules/swagger-codegen/src/main/resources/csharp/compile.mustache +++ b/modules/swagger-codegen/src/main/resources/csharp/compile.mustache @@ -1,3 +1,3 @@ SET CSCPATH=%SYSTEMROOT%\Microsoft.NET\Framework\v4.0.30319 -%CSCPATH%\csc /reference:bin/Newtonsoft.Json.dll;bin/RestSharp.dll /target:library /out:bin/{{invokerPackage}}.dll /recurse:src\*.cs /doc:bin/{{invokerPackage}}.xml +%CSCPATH%\csc /reference:bin/Newtonsoft.Json.dll;bin/RestSharp.dll /target:library /out:bin/{{packageName}}.dll /recurse:src\*.cs /doc:bin/{{packageName}}.xml diff --git a/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/compile.bat b/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/compile.bat index bb6ae8097eac..909633566901 100644 --- a/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/compile.bat +++ b/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/compile.bat @@ -1,3 +1,3 @@ SET CSCPATH=%SYSTEMROOT%\Microsoft.NET\Framework\v4.0.30319 -%CSCPATH%\csc /reference:bin/Newtonsoft.Json.dll;bin/RestSharp.dll /target:library /out:bin/.dll /recurse:src\*.cs /doc:bin/.xml +%CSCPATH%\csc /reference:bin/Newtonsoft.Json.dll;bin/RestSharp.dll /target:library /out:bin/IO.Swagger.dll /recurse:src\*.cs /doc:bin/IO.Swagger.xml