From f76a789a49abd11774df9611a3cd8e03ec8e4efe Mon Sep 17 00:00:00 2001 From: Testo Nakada Date: Fri, 16 Oct 2015 09:18:48 -0700 Subject: [PATCH 001/211] - make Meta generator take the swagger code gen version - generate the class name correctly if the name contains hyphen --- .../src/main/java/io/swagger/codegen/cmd/Meta.java | 13 ++++++++++--- .../src/main/resources/codegen/pom.mustache | 4 ++-- 2 files changed, 12 insertions(+), 5 deletions(-) diff --git a/modules/swagger-codegen-cli/src/main/java/io/swagger/codegen/cmd/Meta.java b/modules/swagger-codegen-cli/src/main/java/io/swagger/codegen/cmd/Meta.java index c75181c51cd..ca06652b942 100644 --- a/modules/swagger-codegen-cli/src/main/java/io/swagger/codegen/cmd/Meta.java +++ b/modules/swagger-codegen-cli/src/main/java/io/swagger/codegen/cmd/Meta.java @@ -1,6 +1,7 @@ package io.swagger.codegen.cmd; import ch.lambdaj.function.convert.Converter; +import com.google.common.base.CaseFormat; import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableMap; import com.samskivert.mustache.Mustache; @@ -9,7 +10,6 @@ import io.airlift.airline.Option; import io.swagger.codegen.DefaultGenerator; import io.swagger.codegen.SupportingFile; import org.apache.commons.io.FileUtils; -import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -55,7 +55,7 @@ public class Meta implements Runnable { final File targetDir = new File(outputFolder); LOG.info("writing to folder [{}]", targetDir.getAbsolutePath()); - String mainClass = StringUtils.capitalize(name) + "Generator"; + String mainClass = CaseFormat.LOWER_HYPHEN.to(CaseFormat.UPPER_CAMEL, name) + "Generator"; List supportingFiles = ImmutableList.of( new SupportingFile("pom.mustache", "", "pom.xml"), @@ -68,11 +68,18 @@ public class Meta implements Runnable { "src/main/resources/META-INF/services", "io.swagger.codegen.CodegenConfig") ); + String swaggerVersion = this.getClass().getPackage().getImplementationVersion(); + // if the code is running outside of the jar (i.e. from the IDE), it will not have the version available. + // let's default it with something. + if (swaggerVersion==null) { + swaggerVersion = "2.1.3"; + } Map data = new ImmutableMap.Builder() .put("generatorPackage", targetPackage) .put("generatorClass", mainClass) .put("name", name) - .put("fullyQualifiedGeneratorClass", targetPackage + "." + mainClass).build(); + .put("fullyQualifiedGeneratorClass", targetPackage + "." + mainClass) + .put("swaggerCodegenVersion", swaggerVersion).build(); with(supportingFiles).convert(processFiles(targetDir, data)); diff --git a/modules/swagger-codegen/src/main/resources/codegen/pom.mustache b/modules/swagger-codegen/src/main/resources/codegen/pom.mustache index 29a980a5091..30f1b14872c 100644 --- a/modules/swagger-codegen/src/main/resources/codegen/pom.mustache +++ b/modules/swagger-codegen/src/main/resources/codegen/pom.mustache @@ -95,8 +95,8 @@ - 2.1.3 + {{swaggerCodegenVersion}} 1.0.0 4.8.1 - \ No newline at end of file + From a5fcda99269d62f8d9ebb7961f2dd2cd180b31d7 Mon Sep 17 00:00:00 2001 From: Andras Gaal Date: Wed, 28 Oct 2015 10:52:29 +0100 Subject: [PATCH 002/211] fix: codegen does not support spec 2.0 properties for parameters: maximum ,exclusiveMaximum ,minimum ,exclusiveMinimum ,maxLength ,minLength ,pattern ,maxItems ,minItems ,uniqueItems ,multipleOf --- .gitignore | 1 + .../io/swagger/codegen/CodegenParameter.java | 56 +++++++++++++++++++ .../io/swagger/codegen/DefaultCodegen.java | 15 +++++ pom.xml | 2 +- 4 files changed, 73 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index c904ba4a5fe..76ede9e0e7a 100644 --- a/.gitignore +++ b/.gitignore @@ -55,3 +55,4 @@ samples/client/petstore/python/.projectile samples/client/petstore/python/.venv/ */.settings +modules/*/.settings/ diff --git a/modules/swagger-codegen/src/main/java/io/swagger/codegen/CodegenParameter.java b/modules/swagger-codegen/src/main/java/io/swagger/codegen/CodegenParameter.java index 38c70fcc82e..663e48ea616 100644 --- a/modules/swagger-codegen/src/main/java/io/swagger/codegen/CodegenParameter.java +++ b/modules/swagger-codegen/src/main/java/io/swagger/codegen/CodegenParameter.java @@ -23,6 +23,51 @@ public class CodegenParameter { */ public Boolean required; + /** + * See http://json-schema.org/latest/json-schema-validation.html#anchor17. + */ + public Number maximum; + /** + * See http://json-schema.org/latest/json-schema-validation.html#anchor17 + */ + public Boolean exclusiveMaximum; + /** + * See http://json-schema.org/latest/json-schema-validation.html#anchor21 + */ + public Number minimum; + /** + * See http://json-schema.org/latest/json-schema-validation.html#anchor21 + */ + public Boolean exclusiveMinimum; + /** + * See http://json-schema.org/latest/json-schema-validation.html#anchor26 + */ + public Integer maxLength; + /** + * See http://json-schema.org/latest/json-schema-validation.html#anchor29 + */ + public Integer minLength; + /** + * See http://json-schema.org/latest/json-schema-validation.html#anchor33 + */ + public String pattern; + /** + * See http://json-schema.org/latest/json-schema-validation.html#anchor42 + */ + public Integer maxItems; + /** + * See http://json-schema.org/latest/json-schema-validation.html#anchor45 + */ + public Integer minItems; + /** + * See http://json-schema.org/latest/json-schema-validation.html#anchor49 + */ + public Boolean uniqueItems; + /** + * See http://json-schema.org/latest/json-schema-validation.html#anchor14 + */ + public Number multipleOf; + public CodegenParameter copy() { CodegenParameter output = new CodegenParameter(); output.isFile = this.isFile; @@ -44,6 +89,17 @@ public class CodegenParameter { output.isCookieParam = this.isCookieParam; output.isBodyParam = this.isBodyParam; output.required = this.required; + output.maximum = this.maximum; + output.exclusiveMaximum = this.exclusiveMaximum; + output.minimum = this.minimum; + output.exclusiveMinimum = this.exclusiveMinimum; + output.maxLength = this.maxLength; + output.minLength = this.minLength; + output.pattern = this.pattern; + output.maxItems = this.maxItems; + output.minItems = this.minItems; + output.uniqueItems = this.uniqueItems; + output.multipleOf = this.multipleOf; output.jsonSchema = this.jsonSchema; output.defaultValue = this.defaultValue; output.isEnum = this.isEnum; diff --git a/modules/swagger-codegen/src/main/java/io/swagger/codegen/DefaultCodegen.java b/modules/swagger-codegen/src/main/java/io/swagger/codegen/DefaultCodegen.java index eb77efa3456..1107c4f0c88 100644 --- a/modules/swagger-codegen/src/main/java/io/swagger/codegen/DefaultCodegen.java +++ b/modules/swagger-codegen/src/main/java/io/swagger/codegen/DefaultCodegen.java @@ -1446,6 +1446,21 @@ public class DefaultCodegen { if (model.complexType != null) { imports.add(model.complexType); } + p.maxLength = qp.getMaxLength(); + p.minLength = qp.getMinLength(); + p.pattern = qp.getPattern(); + + p.maximum = qp.getMaximum(); + p.exclusiveMaximum = qp.getExclusiveMaximum(); + p.minimum = qp.getMinimum(); + p.exclusiveMinimum = qp.getExclusiveMinimum(); + p.maxLength = qp.getMaxLength(); + p.minLength = qp.getMinLength(); + p.pattern = qp.getPattern(); + p.maxItems = qp.getMaxItems(); + p.minItems = qp.getMinItems(); + p.uniqueItems = qp.getUniqueItems(); + p.multipleOf = qp.getMultipleOf(); } else { if (!(param instanceof BodyParameter)) { LOGGER.error("Cannot use Parameter " + param + " as Body Parameter"); diff --git a/pom.xml b/pom.xml index 466b8f300b8..86986c96060 100644 --- a/pom.xml +++ b/pom.xml @@ -520,7 +520,7 @@ 1.0.11 2.11.1 2.3.4 - 1.5.4 + 1.5.5-SNAPSHOT 2.1.5-SNAPSHOT 2.3 1.2 From 87786f01452b66bb66ced662200fef6b7143f830 Mon Sep 17 00:00:00 2001 From: Nadezhda Makarkina Date: Mon, 9 Nov 2015 14:01:50 +0300 Subject: [PATCH 003/211] ensureUniqueParams default value has been mooved from description to the defaaultValue field --- .../src/main/java/io/swagger/codegen/CodegenConstants.java | 2 +- .../src/main/java/io/swagger/codegen/DefaultCodegen.java | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/modules/swagger-codegen/src/main/java/io/swagger/codegen/CodegenConstants.java b/modules/swagger-codegen/src/main/java/io/swagger/codegen/CodegenConstants.java index a5bb97e5a93..f9c816df278 100644 --- a/modules/swagger-codegen/src/main/java/io/swagger/codegen/CodegenConstants.java +++ b/modules/swagger-codegen/src/main/java/io/swagger/codegen/CodegenConstants.java @@ -41,7 +41,7 @@ public class CodegenConstants { public static final String SORT_PARAMS_BY_REQUIRED_FLAG_DESC = "Sort method arguments to place required parameters before optional parameters."; public static final String ENSURE_UNIQUE_PARAMS = "ensureUniqueParams"; - public static final String ENSURE_UNIQUE_PARAMS_DESC = "Whether to ensure parameter names are unique in an operation (rename parameters that are not). Default: true"; + public static final String ENSURE_UNIQUE_PARAMS_DESC = "Whether to ensure parameter names are unique in an operation (rename parameters that are not)."; public static final String PACKAGE_NAME = "packageName"; public static final String PACKAGE_VERSION = "packageVersion"; diff --git a/modules/swagger-codegen/src/main/java/io/swagger/codegen/DefaultCodegen.java b/modules/swagger-codegen/src/main/java/io/swagger/codegen/DefaultCodegen.java index 3c8758fc15b..663263ccbbf 100644 --- a/modules/swagger-codegen/src/main/java/io/swagger/codegen/DefaultCodegen.java +++ b/modules/swagger-codegen/src/main/java/io/swagger/codegen/DefaultCodegen.java @@ -445,7 +445,8 @@ public class DefaultCodegen { cliOptions.add(new CliOption(CodegenConstants.SORT_PARAMS_BY_REQUIRED_FLAG, CodegenConstants.SORT_PARAMS_BY_REQUIRED_FLAG_DESC).defaultValue("true")); - cliOptions.add(new CliOption(CodegenConstants.ENSURE_UNIQUE_PARAMS, CodegenConstants.ENSURE_UNIQUE_PARAMS_DESC)); + cliOptions.add(new CliOption(CodegenConstants.ENSURE_UNIQUE_PARAMS, CodegenConstants.ENSURE_UNIQUE_PARAMS_DESC) + .defaultValue("true")); } /** From 9789eb4ee8f2b58e20b5b7ec5b7a90c431efa795 Mon Sep 17 00:00:00 2001 From: wing328 Date: Sun, 15 Nov 2015 18:26:36 +0800 Subject: [PATCH 004/211] remove url form ts-node, fix test case --- .../resources/TypeScript-node/api.mustache | 16 +++-- .../client/petstore/typescript-node/api.ts | 68 +++++++++++-------- .../client/petstore/typescript-node/client.ts | 9 ++- 3 files changed, 60 insertions(+), 33 deletions(-) diff --git a/modules/swagger-codegen/src/main/resources/TypeScript-node/api.mustache b/modules/swagger-codegen/src/main/resources/TypeScript-node/api.mustache index c1f311fec19..62f6760a6ec 100644 --- a/modules/swagger-codegen/src/main/resources/TypeScript-node/api.mustache +++ b/modules/swagger-codegen/src/main/resources/TypeScript-node/api.mustache @@ -73,8 +73,10 @@ class ApiKeyAuth implements Authentication { } class OAuth implements Authentication { + public accessToken: string; + applyToRequest(requestOptions: request.Options): void { - // TODO: support oauth + requestOptions.headers["Authorization"] = "Bearer " + this.accessToken; } } @@ -115,13 +117,13 @@ export class {{classname}} { {{/authMethods}} } - constructor(url: string, basePath?: string); + constructor(basePath?: string); {{#authMethods}} {{#isBasic}} - constructor(url: string, username: string, password: string, basePath?: string); + constructor(username: string, password: string, basePath?: string); {{/isBasic}} {{/authMethods}} - constructor(private url: string, basePathOrUsername: string, password?: string, basePath?: string) { + constructor(basePathOrUsername: string, password?: string, basePath?: string) { if (password) { {{#authMethods}} {{#isBasic}} @@ -156,6 +158,10 @@ export class {{classname}} { } {{/isApiKey}} {{#isOAuth}} + + set accessToken(token: string) { + this.authentications.{{name}}.accessToken = token; + } {{/isOAuth}} {{/authMethods}} private extendObj(objA: T1, objB: T2) { @@ -173,7 +179,7 @@ export class {{classname}} { {{#allParams}}* @param {{paramName}} {{description}} {{/allParams}}*/ public {{nickname}} ({{#allParams}}{{paramName}}{{^required}}?{{/required}}: {{{dataType}}}{{#hasMore}}, {{/hasMore}}{{/allParams}}) : Promise<{ response: http.ClientResponse; {{#returnType}}body: {{{returnType}}}; {{/returnType}}{{^returnType}}body?: any; {{/returnType}} }> { - const path = this.url + this.basePath + '{{path}}'{{#pathParams}} + const path = this.basePath + '{{path}}'{{#pathParams}} .replace('{' + '{{baseName}}' + '}', String({{paramName}})){{/pathParams}}; let queryParameters: any = {}; let headerParams: any = this.extendObj({}, this.defaultHeaders); diff --git a/samples/client/petstore/typescript-node/api.ts b/samples/client/petstore/typescript-node/api.ts index ab5f05b46cb..3ae51281c65 100644 --- a/samples/client/petstore/typescript-node/api.ts +++ b/samples/client/petstore/typescript-node/api.ts @@ -104,8 +104,10 @@ class ApiKeyAuth implements Authentication { } class OAuth implements Authentication { + public accessToken: string; + applyToRequest(requestOptions: request.Options): void { - // TODO: support oauth + requestOptions.headers["Authorization"] = "Bearer " + this.accessToken; } } @@ -129,8 +131,8 @@ export class UserApi { 'petstore_auth': new OAuth(), } - constructor(url: string, basePath?: string); - constructor(private url: string, basePathOrUsername: string, password?: string, basePath?: string) { + constructor(basePath?: string); + constructor(basePathOrUsername: string, password?: string, basePath?: string) { if (password) { if (basePath) { this.basePath = basePath; @@ -145,6 +147,10 @@ export class UserApi { set apiKey(key: string) { this.authentications.api_key.apiKey = key; } + + set accessToken(token: string) { + this.authentications.petstore_auth.accessToken = token; + } private extendObj(objA: T1, objB: T2) { for(let key in objB){ if(objB.hasOwnProperty(key)){ @@ -159,7 +165,7 @@ export class UserApi { * @param body Created user object */ public createUser (body?: User) : Promise<{ response: http.ClientResponse; body?: any; }> { - const path = this.url + this.basePath + '/user'; + const path = this.basePath + '/user'; let queryParameters: any = {}; let headerParams: any = this.extendObj({}, this.defaultHeaders); let formParams: any = {}; @@ -208,7 +214,7 @@ export class UserApi { * @param body List of user object */ public createUsersWithArrayInput (body?: Array) : Promise<{ response: http.ClientResponse; body?: any; }> { - const path = this.url + this.basePath + '/user/createWithArray'; + const path = this.basePath + '/user/createWithArray'; let queryParameters: any = {}; let headerParams: any = this.extendObj({}, this.defaultHeaders); let formParams: any = {}; @@ -257,7 +263,7 @@ export class UserApi { * @param body List of user object */ public createUsersWithListInput (body?: Array) : Promise<{ response: http.ClientResponse; body?: any; }> { - const path = this.url + this.basePath + '/user/createWithList'; + const path = this.basePath + '/user/createWithList'; let queryParameters: any = {}; let headerParams: any = this.extendObj({}, this.defaultHeaders); let formParams: any = {}; @@ -307,7 +313,7 @@ export class UserApi { * @param password The password for login in clear text */ public loginUser (username?: string, password?: string) : Promise<{ response: http.ClientResponse; body: string; }> { - const path = this.url + this.basePath + '/user/login'; + const path = this.basePath + '/user/login'; let queryParameters: any = {}; let headerParams: any = this.extendObj({}, this.defaultHeaders); let formParams: any = {}; @@ -362,7 +368,7 @@ export class UserApi { * */ public logoutUser () : Promise<{ response: http.ClientResponse; body?: any; }> { - const path = this.url + this.basePath + '/user/logout'; + const path = this.basePath + '/user/logout'; let queryParameters: any = {}; let headerParams: any = this.extendObj({}, this.defaultHeaders); let formParams: any = {}; @@ -410,7 +416,7 @@ export class UserApi { * @param username The name that needs to be fetched. Use user1 for testing. */ public getUserByName (username: string) : Promise<{ response: http.ClientResponse; body: User; }> { - const path = this.url + this.basePath + '/user/{username}' + const path = this.basePath + '/user/{username}' .replace('{' + 'username' + '}', String(username)); let queryParameters: any = {}; let headerParams: any = this.extendObj({}, this.defaultHeaders); @@ -465,7 +471,7 @@ export class UserApi { * @param body Updated user object */ public updateUser (username: string, body?: User) : Promise<{ response: http.ClientResponse; body?: any; }> { - const path = this.url + this.basePath + '/user/{username}' + const path = this.basePath + '/user/{username}' .replace('{' + 'username' + '}', String(username)); let queryParameters: any = {}; let headerParams: any = this.extendObj({}, this.defaultHeaders); @@ -520,7 +526,7 @@ export class UserApi { * @param username The name that needs to be deleted */ public deleteUser (username: string) : Promise<{ response: http.ClientResponse; body?: any; }> { - const path = this.url + this.basePath + '/user/{username}' + const path = this.basePath + '/user/{username}' .replace('{' + 'username' + '}', String(username)); let queryParameters: any = {}; let headerParams: any = this.extendObj({}, this.defaultHeaders); @@ -581,8 +587,8 @@ export class PetApi { 'petstore_auth': new OAuth(), } - constructor(url: string, basePath?: string); - constructor(private url: string, basePathOrUsername: string, password?: string, basePath?: string) { + constructor(basePath?: string); + constructor(basePathOrUsername: string, password?: string, basePath?: string) { if (password) { if (basePath) { this.basePath = basePath; @@ -597,6 +603,10 @@ export class PetApi { set apiKey(key: string) { this.authentications.api_key.apiKey = key; } + + set accessToken(token: string) { + this.authentications.petstore_auth.accessToken = token; + } private extendObj(objA: T1, objB: T2) { for(let key in objB){ if(objB.hasOwnProperty(key)){ @@ -611,7 +621,7 @@ export class PetApi { * @param body Pet object that needs to be added to the store */ public updatePet (body?: Pet) : Promise<{ response: http.ClientResponse; body?: any; }> { - const path = this.url + this.basePath + '/pet'; + const path = this.basePath + '/pet'; let queryParameters: any = {}; let headerParams: any = this.extendObj({}, this.defaultHeaders); let formParams: any = {}; @@ -662,7 +672,7 @@ export class PetApi { * @param body Pet object that needs to be added to the store */ public addPet (body?: Pet) : Promise<{ response: http.ClientResponse; body?: any; }> { - const path = this.url + this.basePath + '/pet'; + const path = this.basePath + '/pet'; let queryParameters: any = {}; let headerParams: any = this.extendObj({}, this.defaultHeaders); let formParams: any = {}; @@ -713,7 +723,7 @@ export class PetApi { * @param status Status values that need to be considered for filter */ public findPetsByStatus (status?: Array) : Promise<{ response: http.ClientResponse; body: Array; }> { - const path = this.url + this.basePath + '/pet/findByStatus'; + const path = this.basePath + '/pet/findByStatus'; let queryParameters: any = {}; let headerParams: any = this.extendObj({}, this.defaultHeaders); let formParams: any = {}; @@ -767,7 +777,7 @@ export class PetApi { * @param tags Tags to filter by */ public findPetsByTags (tags?: Array) : Promise<{ response: http.ClientResponse; body: Array; }> { - const path = this.url + this.basePath + '/pet/findByTags'; + const path = this.basePath + '/pet/findByTags'; let queryParameters: any = {}; let headerParams: any = this.extendObj({}, this.defaultHeaders); let formParams: any = {}; @@ -821,7 +831,7 @@ export class PetApi { * @param petId ID of pet that needs to be fetched */ public getPetById (petId: number) : Promise<{ response: http.ClientResponse; body: Pet; }> { - const path = this.url + this.basePath + '/pet/{petId}' + const path = this.basePath + '/pet/{petId}' .replace('{' + 'petId' + '}', String(petId)); let queryParameters: any = {}; let headerParams: any = this.extendObj({}, this.defaultHeaders); @@ -879,7 +889,7 @@ export class PetApi { * @param status Updated status of the pet */ public updatePetWithForm (petId: string, name?: string, status?: string) : Promise<{ response: http.ClientResponse; body?: any; }> { - const path = this.url + this.basePath + '/pet/{petId}' + const path = this.basePath + '/pet/{petId}' .replace('{' + 'petId' + '}', String(petId)); let queryParameters: any = {}; let headerParams: any = this.extendObj({}, this.defaultHeaders); @@ -944,7 +954,7 @@ export class PetApi { * @param apiKey */ public deletePet (petId: number, apiKey?: string) : Promise<{ response: http.ClientResponse; body?: any; }> { - const path = this.url + this.basePath + '/pet/{petId}' + const path = this.basePath + '/pet/{petId}' .replace('{' + 'petId' + '}', String(petId)); let queryParameters: any = {}; let headerParams: any = this.extendObj({}, this.defaultHeaders); @@ -1004,7 +1014,7 @@ export class PetApi { * @param file file to upload */ public uploadFile (petId: number, additionalMetadata?: string, file?: any) : Promise<{ response: http.ClientResponse; body?: any; }> { - const path = this.url + this.basePath + '/pet/{petId}/uploadImage' + const path = this.basePath + '/pet/{petId}/uploadImage' .replace('{' + 'petId' + '}', String(petId)); let queryParameters: any = {}; let headerParams: any = this.extendObj({}, this.defaultHeaders); @@ -1076,8 +1086,8 @@ export class StoreApi { 'petstore_auth': new OAuth(), } - constructor(url: string, basePath?: string); - constructor(private url: string, basePathOrUsername: string, password?: string, basePath?: string) { + constructor(basePath?: string); + constructor(basePathOrUsername: string, password?: string, basePath?: string) { if (password) { if (basePath) { this.basePath = basePath; @@ -1092,6 +1102,10 @@ export class StoreApi { set apiKey(key: string) { this.authentications.api_key.apiKey = key; } + + set accessToken(token: string) { + this.authentications.petstore_auth.accessToken = token; + } private extendObj(objA: T1, objB: T2) { for(let key in objB){ if(objB.hasOwnProperty(key)){ @@ -1105,7 +1119,7 @@ export class StoreApi { * Returns a map of status codes to quantities */ public getInventory () : Promise<{ response: http.ClientResponse; body: { [key: string]: number; }; }> { - const path = this.url + this.basePath + '/store/inventory'; + const path = this.basePath + '/store/inventory'; let queryParameters: any = {}; let headerParams: any = this.extendObj({}, this.defaultHeaders); let formParams: any = {}; @@ -1155,7 +1169,7 @@ export class StoreApi { * @param body order placed for purchasing the pet */ public placeOrder (body?: Order) : Promise<{ response: http.ClientResponse; body: Order; }> { - const path = this.url + this.basePath + '/store/order'; + const path = this.basePath + '/store/order'; let queryParameters: any = {}; let headerParams: any = this.extendObj({}, this.defaultHeaders); let formParams: any = {}; @@ -1204,7 +1218,7 @@ export class StoreApi { * @param orderId ID of pet that needs to be fetched */ public getOrderById (orderId: string) : Promise<{ response: http.ClientResponse; body: Order; }> { - const path = this.url + this.basePath + '/store/order/{orderId}' + const path = this.basePath + '/store/order/{orderId}' .replace('{' + 'orderId' + '}', String(orderId)); let queryParameters: any = {}; let headerParams: any = this.extendObj({}, this.defaultHeaders); @@ -1258,7 +1272,7 @@ export class StoreApi { * @param orderId ID of the order that needs to be deleted */ public deleteOrder (orderId: string) : Promise<{ response: http.ClientResponse; body?: any; }> { - const path = this.url + this.basePath + '/store/order/{orderId}' + const path = this.basePath + '/store/order/{orderId}' .replace('{' + 'orderId' + '}', String(orderId)); let queryParameters: any = {}; let headerParams: any = this.extendObj({}, this.defaultHeaders); diff --git a/samples/client/petstore/typescript-node/client.ts b/samples/client/petstore/typescript-node/client.ts index 506f33f014e..891feef3902 100644 --- a/samples/client/petstore/typescript-node/client.ts +++ b/samples/client/petstore/typescript-node/client.ts @@ -1,11 +1,18 @@ import api = require('./api'); import fs = require('fs'); -var petApi = new api.PetApi('http://petstore.swagger.io/'); +var petApi = new api.PetApi(); petApi.apiKey = 'special-key'; +var tag1 = new api.Tag(); +tag1.id = 18291; +tag1.name = 'TS tag 1'; + var pet = new api.Pet(); pet.name = 'TypeScriptDoggie'; +pet.id = 18291; +pet.photoUrls = ["http://url1", "http://url2"]; +pet.tags = [tag1]; var petId: any; From 431cdc9c3776dddfdacab3a99c5e38d727f5c4cb Mon Sep 17 00:00:00 2001 From: xhh Date: Tue, 17 Nov 2015 17:54:13 +0800 Subject: [PATCH 005/211] Java okhttp-gson: fix datetime format for Android by detecting the current environment (Android SDK version and Java version) and determine a default datetime format accordingly Closes #1573 --- .../libraries/okhttp-gson/ApiClient.mustache | 87 ++++++++++++++++--- .../java/io/swagger/client/ApiClient.java | 87 ++++++++++++++++--- 2 files changed, 148 insertions(+), 26 deletions(-) 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 f238c37fb47..8ce2407cbe3 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 @@ -64,6 +64,38 @@ import {{invokerPackage}}.auth.ApiKeyAuth; import {{invokerPackage}}.auth.OAuth; public class ApiClient { + public static final double JAVA_VERSION; + public static final boolean IS_ANDROID; + public static final int ANDROID_SDK_VERSION; + + static { + JAVA_VERSION = Double.parseDouble(System.getProperty("java.specification.version")); + boolean isAndroid; + try { + Class.forName("android.app.Activity"); + isAndroid = true; + } catch (ClassNotFoundException e) { + isAndroid = false; + } + IS_ANDROID = isAndroid; + int sdkVersion = 0; + if (IS_ANDROID) { + try { + sdkVersion = Class.forName("android.os.Build$VERSION").getField("SDK_INT").getInt(null); + } catch (Exception e) { + try { + sdkVersion = Integer.parseInt((String) Class.forName("android.os.Build$VERSION").getField("SDK").get(null)); + } catch (Exception e2) { } + } + } + ANDROID_SDK_VERSION = sdkVersion; + } + + /** + * The datetime format to be used when lenientDatetimeFormat is enabled. + */ + public static final String LENIENT_DATETIME_FORMAT = "yyyy-MM-dd'T'HH:mm:ss.SSSZ"; + private String basePath = "{{basePath}}"; private boolean lenientOnJson = false; private boolean debugging = false; @@ -100,8 +132,7 @@ public class ApiClient { this.dateFormat = new SimpleDateFormat("yyyy-MM-dd"); // Always use UTC as the default time zone when dealing with date (without time). this.dateFormat.setTimeZone(TimeZone.getTimeZone("UTC")); - // Use the system's default time zone when dealing with datetime (mainly formatting). - this.datetimeFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSXXX"); + initDatetimeFormat(); // Be lenient on datetime formats when parsing datetime from string. // See parseDatetime. @@ -263,25 +294,30 @@ public class ApiClient { if (str == null) return null; + DateFormat format; if (lenientDatetimeFormat) { /* - * When lenientDatetimeFormat is enabled, process the given string - * to support various formats defined by ISO 8601. + * When lenientDatetimeFormat is enabled, normalize the date string + * into LENIENT_DATETIME_FORMAT to support various formats + * defined by ISO 8601. */ // normalize time zone - // trailing "Z": 2015-08-16T08:20:05Z => 2015-08-16T08:20:05+00:00 - str = str.replaceAll("[zZ]\\z", "+00:00"); - // add colon: 2015-08-16T08:20:05+0000 => 2015-08-16T08:20:05+00:00 - str = str.replaceAll("([+-]\\d{2})(\\d{2})\\z", "$1:$2"); - // expand time zone: 2015-08-16T08:20:05+00 => 2015-08-16T08:20:05+00:00 - str = str.replaceAll("([+-]\\d{2})\\z", "$1:00"); + // trailing "Z": 2015-08-16T08:20:05Z => 2015-08-16T08:20:05+0000 + str = str.replaceAll("[zZ]\\z", "+0000"); + // remove colon in time zone: 2015-08-16T08:20:05+00:00 => 2015-08-16T08:20:05+0000 + str = str.replaceAll("([+-]\\d{2}):(\\d{2})\\z", "$1$2"); + // expand time zone: 2015-08-16T08:20:05+00 => 2015-08-16T08:20:05+0000 + str = str.replaceAll("([+-]\\d{2})\\z", "$100"); // add milliseconds when missing - // 2015-08-16T08:20:05+00:00 => 2015-08-16T08:20:05.000+00:00 - str = str.replaceAll("(:\\d{1,2})([+-]\\d{2}:\\d{2})\\z", "$1.000$2"); + // 2015-08-16T08:20:05+0000 => 2015-08-16T08:20:05.000+0000 + str = str.replaceAll("(:\\d{1,2})([+-]\\d{4})\\z", "$1.000$2"); + format = new SimpleDateFormat(LENIENT_DATETIME_FORMAT); + } else { + format = this.datetimeFormat; } try { - return datetimeFormat.parse(str); + return format.parse(str); } catch (ParseException e) { throw new RuntimeException(e); } @@ -916,6 +952,31 @@ public class ApiClient { } } + /** + * Initialize datetime format according to the current environment, e.g. Java 1.7 and Android. + */ + private void initDatetimeFormat() { + String formatWithTimeZone = null; + if (IS_ANDROID) { + if (ANDROID_SDK_VERSION >= 18) { + // The time zone format "ZZZZZ" is available since Android 4.3 (SDK version 18) + formatWithTimeZone = "yyyy-MM-dd'T'HH:mm:ss.SSSZZZZZ"; + } + } else if (JAVA_VERSION >= 1.7) { + // The time zone format "XXX" is available since Java 1.7 + formatWithTimeZone = "yyyy-MM-dd'T'HH:mm:ss.SSSXXX"; + } + if (formatWithTimeZone != null) { + this.datetimeFormat = new SimpleDateFormat(formatWithTimeZone); + // NOTE: Use the system's default time zone (mainly for datetime formatting). + } else { + // Use a common format that works across all systems. + this.datetimeFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"); + // Always use the UTC time zone as we are using a constant trailing "Z" here. + this.datetimeFormat.setTimeZone(TimeZone.getTimeZone("UTC")); + } + } + /** * Apply SSL related settings to httpClient according to the current values of * verifyingSsl and sslCaCert. 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 51c3d5464f2..6e4e299ad3a 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 @@ -64,6 +64,38 @@ import io.swagger.client.auth.ApiKeyAuth; import io.swagger.client.auth.OAuth; public class ApiClient { + public static final double JAVA_VERSION; + public static final boolean IS_ANDROID; + public static final int ANDROID_SDK_VERSION; + + static { + JAVA_VERSION = Double.parseDouble(System.getProperty("java.specification.version")); + boolean isAndroid; + try { + Class.forName("android.app.Activity"); + isAndroid = true; + } catch (ClassNotFoundException e) { + isAndroid = false; + } + IS_ANDROID = isAndroid; + int sdkVersion = 0; + if (IS_ANDROID) { + try { + sdkVersion = Class.forName("android.os.Build$VERSION").getField("SDK_INT").getInt(null); + } catch (Exception e) { + try { + sdkVersion = Integer.parseInt((String) Class.forName("android.os.Build$VERSION").getField("SDK").get(null)); + } catch (Exception e2) { } + } + } + ANDROID_SDK_VERSION = sdkVersion; + } + + /** + * The datetime format to be used when lenientDatetimeFormat is enabled. + */ + public static final String LENIENT_DATETIME_FORMAT = "yyyy-MM-dd'T'HH:mm:ss.SSSZ"; + private String basePath = "http://petstore.swagger.io/v2"; private boolean lenientOnJson = false; private boolean debugging = false; @@ -100,8 +132,7 @@ public class ApiClient { this.dateFormat = new SimpleDateFormat("yyyy-MM-dd"); // Always use UTC as the default time zone when dealing with date (without time). this.dateFormat.setTimeZone(TimeZone.getTimeZone("UTC")); - // Use the system's default time zone when dealing with datetime (mainly formatting). - this.datetimeFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSXXX"); + initDatetimeFormat(); // Be lenient on datetime formats when parsing datetime from string. // See parseDatetime. @@ -262,25 +293,30 @@ public class ApiClient { if (str == null) return null; + DateFormat format; if (lenientDatetimeFormat) { /* - * When lenientDatetimeFormat is enabled, process the given string - * to support various formats defined by ISO 8601. + * When lenientDatetimeFormat is enabled, normalize the date string + * into LENIENT_DATETIME_FORMAT to support various formats + * defined by ISO 8601. */ // normalize time zone - // trailing "Z": 2015-08-16T08:20:05Z => 2015-08-16T08:20:05+00:00 - str = str.replaceAll("[zZ]\\z", "+00:00"); - // add colon: 2015-08-16T08:20:05+0000 => 2015-08-16T08:20:05+00:00 - str = str.replaceAll("([+-]\\d{2})(\\d{2})\\z", "$1:$2"); - // expand time zone: 2015-08-16T08:20:05+00 => 2015-08-16T08:20:05+00:00 - str = str.replaceAll("([+-]\\d{2})\\z", "$1:00"); + // trailing "Z": 2015-08-16T08:20:05Z => 2015-08-16T08:20:05+0000 + str = str.replaceAll("[zZ]\\z", "+0000"); + // remove colon in time zone: 2015-08-16T08:20:05+00:00 => 2015-08-16T08:20:05+0000 + str = str.replaceAll("([+-]\\d{2}):(\\d{2})\\z", "$1$2"); + // expand time zone: 2015-08-16T08:20:05+00 => 2015-08-16T08:20:05+0000 + str = str.replaceAll("([+-]\\d{2})\\z", "$100"); // add milliseconds when missing - // 2015-08-16T08:20:05+00:00 => 2015-08-16T08:20:05.000+00:00 - str = str.replaceAll("(:\\d{1,2})([+-]\\d{2}:\\d{2})\\z", "$1.000$2"); + // 2015-08-16T08:20:05+0000 => 2015-08-16T08:20:05.000+0000 + str = str.replaceAll("(:\\d{1,2})([+-]\\d{4})\\z", "$1.000$2"); + format = new SimpleDateFormat(LENIENT_DATETIME_FORMAT); + } else { + format = this.datetimeFormat; } try { - return datetimeFormat.parse(str); + return format.parse(str); } catch (ParseException e) { throw new RuntimeException(e); } @@ -915,6 +951,31 @@ public class ApiClient { } } + /** + * Initialize datetime format according to the current environment, e.g. Java 1.7 and Android. + */ + private void initDatetimeFormat() { + String formatWithTimeZone = null; + if (IS_ANDROID) { + if (ANDROID_SDK_VERSION >= 18) { + // The time zone format "ZZZZZ" is available since Android 4.3 (SDK version 18) + formatWithTimeZone = "yyyy-MM-dd'T'HH:mm:ss.SSSZZZZZ"; + } + } else if (JAVA_VERSION >= 1.7) { + // The time zone format "XXX" is available since Java 1.7 + formatWithTimeZone = "yyyy-MM-dd'T'HH:mm:ss.SSSXXX"; + } + if (formatWithTimeZone != null) { + this.datetimeFormat = new SimpleDateFormat(formatWithTimeZone); + // NOTE: Use the system's default time zone (mainly for datetime formatting). + } else { + // Use a common format that works across all systems. + this.datetimeFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"); + // Always use the UTC time zone as we are using a constant trailing "Z" here. + this.datetimeFormat.setTimeZone(TimeZone.getTimeZone("UTC")); + } + } + /** * Apply SSL related settings to httpClient according to the current values of * verifyingSsl and sslCaCert. From 65b9f9dcce17589d7320ed118b73d52bf43c9be7 Mon Sep 17 00:00:00 2001 From: jfastnacht Date: Wed, 18 Nov 2015 15:05:05 +0100 Subject: [PATCH 006/211] Added basic Slim Framework support based on silex-PHP --- bin/all-petstore.sh | 1 + bin/slim-petstore-server.sh | 31 +++ .../languages/SlimFrameworkServerCodegen.java | 195 ++++++++++++++++++ .../services/io.swagger.codegen.CodegenConfig | 1 + .../src/main/resources/slim/.htaccess | 5 + .../src/main/resources/slim/README.mustache | 10 + .../src/main/resources/slim/composer.json | 5 + .../src/main/resources/slim/index.mustache | 22 ++ .../SlimFrameworkServerOptionsProvider.java | 30 +++ .../slim/SlimFrameworkServerOptionsTest.java | 32 +++ .../online/OnlineGeneratorOptionsTest.java | 12 +- .../petstore/slim/SwaggerServer/.htaccess | 5 + .../petstore/slim/SwaggerServer/README.md | 10 + .../petstore/slim/SwaggerServer/composer.json | 5 + .../petstore/slim/SwaggerServer/index.php | 182 ++++++++++++++++ 15 files changed, 541 insertions(+), 5 deletions(-) create mode 100644 bin/slim-petstore-server.sh create mode 100644 modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/SlimFrameworkServerCodegen.java create mode 100644 modules/swagger-codegen/src/main/resources/slim/.htaccess create mode 100644 modules/swagger-codegen/src/main/resources/slim/README.mustache create mode 100644 modules/swagger-codegen/src/main/resources/slim/composer.json create mode 100644 modules/swagger-codegen/src/main/resources/slim/index.mustache create mode 100644 modules/swagger-codegen/src/test/java/io/swagger/codegen/options/SlimFrameworkServerOptionsProvider.java create mode 100644 modules/swagger-codegen/src/test/java/io/swagger/codegen/slim/SlimFrameworkServerOptionsTest.java create mode 100644 samples/server/petstore/slim/SwaggerServer/.htaccess create mode 100644 samples/server/petstore/slim/SwaggerServer/README.md create mode 100644 samples/server/petstore/slim/SwaggerServer/composer.json create mode 100644 samples/server/petstore/slim/SwaggerServer/index.php diff --git a/bin/all-petstore.sh b/bin/all-petstore.sh index dc2b4116070..9a3400e020d 100755 --- a/bin/all-petstore.sh +++ b/bin/all-petstore.sh @@ -40,6 +40,7 @@ cd $APP_DIR ./bin/scala-petstore.sh ./bin/scalatra-petstore-server.sh ./bin/silex-petstore-server.sh +./bin/slim-petstore-server.sh ./bin/spring-mvc-petstore-server.sh ./bin/swift-petstore.sh ./bin/tizen-petstore.sh diff --git a/bin/slim-petstore-server.sh b/bin/slim-petstore-server.sh new file mode 100644 index 00000000000..654fc1d0e01 --- /dev/null +++ b/bin/slim-petstore-server.sh @@ -0,0 +1,31 @@ +#!/bin/sh + +SCRIPT="$0" + +while [ -h "$SCRIPT" ] ; do + ls=`ls -ld "$SCRIPT"` + link=`expr "$ls" : '.*-> \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + SCRIPT="$link" + else + SCRIPT=`dirname "$SCRIPT"`/"$link" + fi +done + +if [ ! -d "${APP_DIR}" ]; then + APP_DIR=`dirname "$SCRIPT"`/.. + APP_DIR=`cd "${APP_DIR}"; pwd` +fi + +executable="./modules/swagger-codegen-cli/target/swagger-codegen-cli.jar" + +if [ ! -f "$executable" ] +then + mvn clean package +fi + +# if you've executed sbt assembly previously it will use that instead. +export JAVA_OPTS="${JAVA_OPTS} -XX:MaxPermSize=256M -Xmx1024M -DloggerPath=conf/log4j.properties" +ags="$@ generate -t modules/swagger-codegen/src/main/resources/slim -i modules/swagger-codegen/src/test/resources/2_0/petstore.json -l slim -o samples/server/petstore/slim" + +java $JAVA_OPTS -jar $executable $ags diff --git a/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/SlimFrameworkServerCodegen.java b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/SlimFrameworkServerCodegen.java new file mode 100644 index 00000000000..1b8680cab6e --- /dev/null +++ b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/SlimFrameworkServerCodegen.java @@ -0,0 +1,195 @@ +package io.swagger.codegen.languages; + +import io.swagger.codegen.CodegenConfig; +import io.swagger.codegen.CodegenConstants; +import io.swagger.codegen.CodegenType; +import io.swagger.codegen.DefaultCodegen; +import io.swagger.codegen.SupportingFile; +import io.swagger.models.properties.ArrayProperty; +import io.swagger.models.properties.MapProperty; +import io.swagger.models.properties.Property; + +import java.io.File; +import java.util.Arrays; +import java.util.HashMap; +import java.util.HashSet; + +public class SlimFrameworkServerCodegen extends DefaultCodegen implements CodegenConfig { + protected String invokerPackage; + protected String groupId = "io.swagger"; + protected String artifactId = "swagger-server"; + protected String artifactVersion = "1.0.0"; + + public SlimFrameworkServerCodegen() { + super(); + + invokerPackage = camelize("SwaggerServer"); + + String packagePath = "SwaggerServer"; + + modelPackage = packagePath + "/lib/models"; + apiPackage = packagePath + "/lib"; + outputFolder = "generated-code/slim"; + + // no model, api files + modelTemplateFiles.clear(); + apiTemplateFiles.clear(); + + embeddedTemplateDir = templateDir = "slim"; + + reservedWords = new HashSet( + Arrays.asList( + "__halt_compiler", "abstract", "and", "array", "as", "break", "callable", "case", "catch", "class", "clone", "const", "continue", "declare", "default", "die", "do", "echo", "else", "elseif", "empty", "enddeclare", "endfor", "endforeach", "endif", "endswitch", "endwhile", "eval", "exit", "extends", "final", "for", "foreach", "function", "global", "goto", "if", "implements", "include", "include_once", "instanceof", "insteadof", "interface", "isset", "list", "namespace", "new", "or", "print", "private", "protected", "public", "require", "require_once", "return", "static", "switch", "throw", "trait", "try", "unset", "use", "var", "while", "xor") + ); + + additionalProperties.put(CodegenConstants.INVOKER_PACKAGE, invokerPackage); + additionalProperties.put(CodegenConstants.GROUP_ID, groupId); + additionalProperties.put(CodegenConstants.ARTIFACT_ID, artifactId); + additionalProperties.put(CodegenConstants.ARTIFACT_VERSION, artifactVersion); + + // ref: http://php.net/manual/en/language.types.intro.php + languageSpecificPrimitives = new HashSet( + Arrays.asList( + "boolean", + "int", + "integer", + "double", + "float", + "string", + "object", + "DateTime", + "mixed", + "number") + ); + + instantiationTypes.put("array", "array"); + instantiationTypes.put("map", "map"); + + // ref: https://github.com/swagger-api/swagger-spec/blob/master/versions/2.0.md#data-types + typeMapping = new HashMap(); + typeMapping.put("integer", "int"); + typeMapping.put("long", "int"); + typeMapping.put("float", "float"); + typeMapping.put("double", "double"); + typeMapping.put("string", "string"); + typeMapping.put("byte", "int"); + typeMapping.put("boolean", "boolean"); + typeMapping.put("date", "DateTime"); + typeMapping.put("datetime", "DateTime"); + typeMapping.put("file", "string"); + typeMapping.put("map", "map"); + typeMapping.put("array", "array"); + typeMapping.put("list", "array"); + typeMapping.put("object", "object"); + + supportingFiles.add(new SupportingFile("README.mustache", packagePath.replace('/', File.separatorChar), "README.md")); + supportingFiles.add(new SupportingFile("composer.json", packagePath.replace('/', File.separatorChar), "composer.json")); + supportingFiles.add(new SupportingFile("index.mustache", packagePath.replace('/', File.separatorChar), "index.php")); + supportingFiles.add(new SupportingFile(".htaccess", packagePath.replace('/', File.separatorChar), ".htaccess")); + } + + public CodegenType getTag() { + return CodegenType.SERVER; + } + + public String getName() { + return "slim"; + } + + public String getHelp() { + return "Generates a Slim Framework server library."; + } + + @Override + public String escapeReservedWord(String name) { + return "_" + name; + } + + @Override + public String apiFileFolder() { + return (outputFolder + "/" + apiPackage()).replace('/', File.separatorChar); + } + + public String modelFileFolder() { + return (outputFolder + "/" + modelPackage()).replace('/', File.separatorChar); + } + + @Override + public String getTypeDeclaration(Property p) { + if (p instanceof ArrayProperty) { + ArrayProperty ap = (ArrayProperty) p; + Property inner = ap.getItems(); + return getSwaggerType(p) + "[" + getTypeDeclaration(inner) + "]"; + } else if (p instanceof MapProperty) { + MapProperty mp = (MapProperty) p; + Property inner = mp.getAdditionalProperties(); + return getSwaggerType(p) + "[string," + getTypeDeclaration(inner) + "]"; + } + return super.getTypeDeclaration(p); + } + + @Override + public String getSwaggerType(Property p) { + String swaggerType = super.getSwaggerType(p); + String type = null; + if (typeMapping.containsKey(swaggerType)) { + type = typeMapping.get(swaggerType); + if (languageSpecificPrimitives.contains(type)) { + return type; + } else if (instantiationTypes.containsKey(type)) { + return type; + } + } else { + type = swaggerType; + } + if (type == null) { + return null; + } + return toModelName(type); + } + + public String toDefaultValue(Property p) { + return "null"; + } + + + @Override + public String toVarName(String name) { + // return the name in underscore style + // PhoneNumber => phone_number + name = underscore(name); + + // parameter name starting with number won't compile + // need to escape it by appending _ at the beginning + if (name.matches("^\\d.*")) { + name = "_" + name; + } + + return name; + } + + @Override + public String toParamName(String name) { + // should be the same as variable name + return toVarName(name); + } + + @Override + public String toModelName(String name) { + // model name cannot use reserved keyword + if (reservedWords.contains(name)) { + escapeReservedWord(name); // e.g. return => _return + } + + // camelize the model name + // phone_number => PhoneNumber + return camelize(name); + } + + @Override + public String toModelFilename(String name) { + // should be the same as the model name + return toModelName(name); + } + +} diff --git a/modules/swagger-codegen/src/main/resources/META-INF/services/io.swagger.codegen.CodegenConfig b/modules/swagger-codegen/src/main/resources/META-INF/services/io.swagger.codegen.CodegenConfig index 4cf785abbd8..192440ee40f 100644 --- a/modules/swagger-codegen/src/main/resources/META-INF/services/io.swagger.codegen.CodegenConfig +++ b/modules/swagger-codegen/src/main/resources/META-INF/services/io.swagger.codegen.CodegenConfig @@ -17,6 +17,7 @@ io.swagger.codegen.languages.ScalaClientCodegen io.swagger.codegen.languages.ScalatraServerCodegen io.swagger.codegen.languages.SilexServerCodegen io.swagger.codegen.languages.SinatraServerCodegen +io.swagger.codegen.languages.SlimFrameworkServerCodegen io.swagger.codegen.languages.SpringMVCServerCodegen io.swagger.codegen.languages.StaticDocCodegen io.swagger.codegen.languages.StaticHtmlGenerator diff --git a/modules/swagger-codegen/src/main/resources/slim/.htaccess b/modules/swagger-codegen/src/main/resources/slim/.htaccess new file mode 100644 index 00000000000..e47b5fb8a0c --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/slim/.htaccess @@ -0,0 +1,5 @@ + + RewriteEngine On + RewriteCond %{REQUEST_FILENAME} !-f + RewriteRule ^(.*)$ index.php?_url=/$1 [QSA,L] + \ No newline at end of file diff --git a/modules/swagger-codegen/src/main/resources/slim/README.mustache b/modules/swagger-codegen/src/main/resources/slim/README.mustache new file mode 100644 index 00000000000..3b19f46bd38 --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/slim/README.mustache @@ -0,0 +1,10 @@ +# Swagger generated server + +## Overview +This server was generated by the [swagger-codegen](https://github.com/swagger-api/swagger-codegen) project. By using the +[swagger-spec](https://github.com/swagger-api/swagger-core/wiki) from a remote server, you can easily generate a server stub. This +is an example of building a PHP server. + +This example uses the [Slim Framework](http://www.slimframework.com/). To see how to make this your own, please take a look at the template here: + +[TEMPLATES](https://github.com/swagger-api/swagger-codegen/tree/master/modules/swagger-codegen/src/main/resources/slim/) diff --git a/modules/swagger-codegen/src/main/resources/slim/composer.json b/modules/swagger-codegen/src/main/resources/slim/composer.json new file mode 100644 index 00000000000..a33f327440d --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/slim/composer.json @@ -0,0 +1,5 @@ +{ + "require": { + "slim/slim": "3.*" + } +} \ No newline at end of file diff --git a/modules/swagger-codegen/src/main/resources/slim/index.mustache b/modules/swagger-codegen/src/main/resources/slim/index.mustache new file mode 100644 index 00000000000..ab91368063f --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/slim/index.mustache @@ -0,0 +1,22 @@ +{{httpMethod}}('{{path}}', function(Application $app, Request $request{{#pathParams}}, ${{paramName}}{{/pathParams}}) { + {{#queryParams}}${{paramName}} = $request->get('{{paramName}}');{{newline}} {{/queryParams}} + {{#formParams}}${{paramName}} = $request->get('{{paramName}}');{{newline}} {{/formParams}} + return new Response('How about implementing {{nickname}} as a {{httpMethod}} method ?'); + }); + + {{/operation}} + {{/operations}} + {{/apis}} +{{/apiInfo}} + +$app->run(); diff --git a/modules/swagger-codegen/src/test/java/io/swagger/codegen/options/SlimFrameworkServerOptionsProvider.java b/modules/swagger-codegen/src/test/java/io/swagger/codegen/options/SlimFrameworkServerOptionsProvider.java new file mode 100644 index 00000000000..d7676725750 --- /dev/null +++ b/modules/swagger-codegen/src/test/java/io/swagger/codegen/options/SlimFrameworkServerOptionsProvider.java @@ -0,0 +1,30 @@ +package io.swagger.codegen.options; + +import io.swagger.codegen.CodegenConstants; + +import com.google.common.collect.ImmutableMap; + +import java.util.Map; + +public class SlimFrameworkServerOptionsProvider implements OptionsProvider { + public static final String SORT_PARAMS_VALUE = "false"; + public static final String ENSURE_UNIQUE_PARAMS_VALUE = "true"; + + @Override + public String getLanguage() { + return "slim"; + } + + @Override + public Map createOptions() { + ImmutableMap.Builder builder = new ImmutableMap.Builder(); + return builder.put(CodegenConstants.SORT_PARAMS_BY_REQUIRED_FLAG, SORT_PARAMS_VALUE) + .put(CodegenConstants.ENSURE_UNIQUE_PARAMS, ENSURE_UNIQUE_PARAMS_VALUE) + .build(); + } + + @Override + public boolean isServer() { + return true; + } +} diff --git a/modules/swagger-codegen/src/test/java/io/swagger/codegen/slim/SlimFrameworkServerOptionsTest.java b/modules/swagger-codegen/src/test/java/io/swagger/codegen/slim/SlimFrameworkServerOptionsTest.java new file mode 100644 index 00000000000..51c668bd931 --- /dev/null +++ b/modules/swagger-codegen/src/test/java/io/swagger/codegen/slim/SlimFrameworkServerOptionsTest.java @@ -0,0 +1,32 @@ +package io.swagger.codegen.slim; + +import io.swagger.codegen.AbstractOptionsTest; +import io.swagger.codegen.CodegenConfig; +import io.swagger.codegen.languages.SlimFrameworkServerCodegen; +import io.swagger.codegen.options.SlimFrameworkServerOptionsProvider; + +import mockit.Expectations; +import mockit.Tested; + +public class SlimFrameworkServerOptionsTest extends AbstractOptionsTest { + + @Tested + private SlimFrameworkServerCodegen clientCodegen; + + public SlimFrameworkServerOptionsTest() { + super(new SlimFrameworkServerOptionsProvider()); + } + + @Override + protected CodegenConfig getCodegenConfig() { + return clientCodegen; + } + + @Override + protected void setExpectations() { + new Expectations(clientCodegen) {{ + clientCodegen.setSortParamsByRequiredFlag(Boolean.valueOf(SlimFrameworkServerOptionsProvider.SORT_PARAMS_VALUE)); + times = 1; + }}; + } +} diff --git a/modules/swagger-generator/src/test/java/io/swagger/generator/online/OnlineGeneratorOptionsTest.java b/modules/swagger-generator/src/test/java/io/swagger/generator/online/OnlineGeneratorOptionsTest.java index fc015f433ea..0d2574673d6 100644 --- a/modules/swagger-generator/src/test/java/io/swagger/generator/online/OnlineGeneratorOptionsTest.java +++ b/modules/swagger-generator/src/test/java/io/swagger/generator/online/OnlineGeneratorOptionsTest.java @@ -28,6 +28,7 @@ import io.swagger.codegen.options.ScalaClientOptionsProvider; import io.swagger.codegen.options.ScalatraServerOptionsProvider; import io.swagger.codegen.options.SilexServerOptionsProvider; import io.swagger.codegen.options.SinatraServerOptionsProvider; +import io.swagger.codegen.options.SlimFrameworkServerOptionsProvider; import io.swagger.codegen.options.SpringMVCServerOptionsProvider; import io.swagger.codegen.options.StaticDocOptionsProvider; import io.swagger.codegen.options.StaticHtmlOptionsProvider; @@ -77,11 +78,12 @@ public class OnlineGeneratorOptionsTest { {new PythonClientOptionsProvider()}, {new Qt5CPPOptionsProvider()}, {new RubyClientOptionsProvider()}, {new ScalaClientOptionsProvider()}, {new ScalatraServerOptionsProvider()}, {new SilexServerOptionsProvider()}, - {new SinatraServerOptionsProvider()}, {new SpringMVCServerOptionsProvider()}, - {new StaticDocOptionsProvider()}, {new StaticHtmlOptionsProvider()}, - {new SwaggerOptionsProvider()}, {new SwaggerYamlOptionsProvider()}, - {new SwiftOptionsProvider()}, {new TizenClientOptionsProvider()}, - {new TypeScriptAngularClientOptionsProvider()}, {new TypeScriptNodeClientOptionsProvider()} + {new SinatraServerOptionsProvider()}, {new SlimFrameworkServerOptionsProvider()}, + {new SpringMVCServerOptionsProvider()}, {new StaticDocOptionsProvider()}, + {new StaticHtmlOptionsProvider()}, {new SwaggerOptionsProvider()}, + {new SwaggerYamlOptionsProvider()}, {new SwiftOptionsProvider()}, + {new TizenClientOptionsProvider()}, {new TypeScriptAngularClientOptionsProvider()}, + {new TypeScriptNodeClientOptionsProvider()} }; } diff --git a/samples/server/petstore/slim/SwaggerServer/.htaccess b/samples/server/petstore/slim/SwaggerServer/.htaccess new file mode 100644 index 00000000000..e47b5fb8a0c --- /dev/null +++ b/samples/server/petstore/slim/SwaggerServer/.htaccess @@ -0,0 +1,5 @@ + + RewriteEngine On + RewriteCond %{REQUEST_FILENAME} !-f + RewriteRule ^(.*)$ index.php?_url=/$1 [QSA,L] + \ No newline at end of file diff --git a/samples/server/petstore/slim/SwaggerServer/README.md b/samples/server/petstore/slim/SwaggerServer/README.md new file mode 100644 index 00000000000..3b19f46bd38 --- /dev/null +++ b/samples/server/petstore/slim/SwaggerServer/README.md @@ -0,0 +1,10 @@ +# Swagger generated server + +## Overview +This server was generated by the [swagger-codegen](https://github.com/swagger-api/swagger-codegen) project. By using the +[swagger-spec](https://github.com/swagger-api/swagger-core/wiki) from a remote server, you can easily generate a server stub. This +is an example of building a PHP server. + +This example uses the [Slim Framework](http://www.slimframework.com/). To see how to make this your own, please take a look at the template here: + +[TEMPLATES](https://github.com/swagger-api/swagger-codegen/tree/master/modules/swagger-codegen/src/main/resources/slim/) diff --git a/samples/server/petstore/slim/SwaggerServer/composer.json b/samples/server/petstore/slim/SwaggerServer/composer.json new file mode 100644 index 00000000000..a33f327440d --- /dev/null +++ b/samples/server/petstore/slim/SwaggerServer/composer.json @@ -0,0 +1,5 @@ +{ + "require": { + "slim/slim": "3.*" + } +} \ No newline at end of file diff --git a/samples/server/petstore/slim/SwaggerServer/index.php b/samples/server/petstore/slim/SwaggerServer/index.php new file mode 100644 index 00000000000..c2b4741bb0c --- /dev/null +++ b/samples/server/petstore/slim/SwaggerServer/index.php @@ -0,0 +1,182 @@ +POST('/user', function(Application $app, Request $request) { + + + return new Response('How about implementing createUser as a POST method ?'); + }); + + + +$app->POST('/user/createWithArray', function(Application $app, Request $request) { + + + return new Response('How about implementing createUsersWithArrayInput as a POST method ?'); + }); + + + +$app->POST('/user/createWithList', function(Application $app, Request $request) { + + + return new Response('How about implementing createUsersWithListInput as a POST method ?'); + }); + + + +$app->GET('/user/login', function(Application $app, Request $request) { + $username = $request->get('username'); $password = $request->get('password'); + + return new Response('How about implementing loginUser as a GET method ?'); + }); + + + +$app->GET('/user/logout', function(Application $app, Request $request) { + + + return new Response('How about implementing logoutUser as a GET method ?'); + }); + + + +$app->GET('/user/{username}', function(Application $app, Request $request, $username) { + + + return new Response('How about implementing getUserByName as a GET method ?'); + }); + + + +$app->PUT('/user/{username}', function(Application $app, Request $request, $username) { + + + return new Response('How about implementing updateUser as a PUT method ?'); + }); + + + +$app->DELETE('/user/{username}', function(Application $app, Request $request, $username) { + + + return new Response('How about implementing deleteUser as a DELETE method ?'); + }); + + + + + + + +$app->GET('/store/inventory', function(Application $app, Request $request) { + + + return new Response('How about implementing getInventory as a GET method ?'); + }); + + + +$app->POST('/store/order', function(Application $app, Request $request) { + + + return new Response('How about implementing placeOrder as a POST method ?'); + }); + + + +$app->GET('/store/order/{orderId}', function(Application $app, Request $request, $order_id) { + + + return new Response('How about implementing getOrderById as a GET method ?'); + }); + + + +$app->DELETE('/store/order/{orderId}', function(Application $app, Request $request, $order_id) { + + + return new Response('How about implementing deleteOrder as a DELETE method ?'); + }); + + + + + + + +$app->PUT('/pet', function(Application $app, Request $request) { + + + return new Response('How about implementing updatePet as a PUT method ?'); + }); + + + +$app->POST('/pet', function(Application $app, Request $request) { + + + return new Response('How about implementing addPet as a POST method ?'); + }); + + + +$app->GET('/pet/findByStatus', function(Application $app, Request $request) { + $status = $request->get('status'); + + return new Response('How about implementing findPetsByStatus as a GET method ?'); + }); + + + +$app->GET('/pet/findByTags', function(Application $app, Request $request) { + $tags = $request->get('tags'); + + return new Response('How about implementing findPetsByTags as a GET method ?'); + }); + + + +$app->GET('/pet/{petId}', function(Application $app, Request $request, $pet_id) { + + + return new Response('How about implementing getPetById as a GET method ?'); + }); + + + +$app->POST('/pet/{petId}', function(Application $app, Request $request, $pet_id) { + + $name = $request->get('name'); $status = $request->get('status'); + return new Response('How about implementing updatePetWithForm as a POST method ?'); + }); + + + +$app->DELETE('/pet/{petId}', function(Application $app, Request $request, $pet_id) { + + + return new Response('How about implementing deletePet as a DELETE method ?'); + }); + + + +$app->POST('/pet/{petId}/uploadImage', function(Application $app, Request $request, $pet_id) { + + $additional_metadata = $request->get('additional_metadata'); $file = $request->get('file'); + return new Response('How about implementing uploadFile as a POST method ?'); + }); + + + + + + +$app->run(); From b9c1158bfe3fe3958fe3596569f2feefa1388f99 Mon Sep 17 00:00:00 2001 From: gaalandr Date: Wed, 18 Nov 2015 17:52:32 +0100 Subject: [PATCH 007/211] Update CodegenParameter.java --- .../src/main/java/io/swagger/codegen/CodegenParameter.java | 1 + 1 file changed, 1 insertion(+) diff --git a/modules/swagger-codegen/src/main/java/io/swagger/codegen/CodegenParameter.java b/modules/swagger-codegen/src/main/java/io/swagger/codegen/CodegenParameter.java index 663e48ea616..ab934075a53 100644 --- a/modules/swagger-codegen/src/main/java/io/swagger/codegen/CodegenParameter.java +++ b/modules/swagger-codegen/src/main/java/io/swagger/codegen/CodegenParameter.java @@ -114,3 +114,4 @@ public class CodegenParameter { return output; } } + From 1358a39d0d1283366d04634704b2763cb132e71b Mon Sep 17 00:00:00 2001 From: xhh Date: Thu, 19 Nov 2015 16:04:27 +0800 Subject: [PATCH 008/211] Include the petstore clojure client into integration tests --- pom.xml | 13 +++++++++ samples/client/petstore/clojure/.gitignore | 1 - samples/client/petstore/clojure/pom.xml | 32 ++++++++++++++++++++++ 3 files changed, 45 insertions(+), 1 deletion(-) create mode 100644 samples/client/petstore/clojure/pom.xml diff --git a/pom.xml b/pom.xml index e6d319c42d7..ada3dc0dc4a 100644 --- a/pom.xml +++ b/pom.xml @@ -305,6 +305,18 @@ samples/client/petstore/android-java + + clojure-client + + + env + clojure + + + + samples/client/petstore/clojure + + java-client @@ -435,6 +447,7 @@ samples/client/petstore/android-java + samples/client/petstore/clojure samples/client/petstore/java/default samples/client/petstore/java/jersey2 samples/client/petstore/java/okhttp-gson diff --git a/samples/client/petstore/clojure/.gitignore b/samples/client/petstore/clojure/.gitignore index c53038ec0e3..055b6ac4772 100644 --- a/samples/client/petstore/clojure/.gitignore +++ b/samples/client/petstore/clojure/.gitignore @@ -1,7 +1,6 @@ /target /classes /checkouts -pom.xml pom.xml.asc *.jar *.class diff --git a/samples/client/petstore/clojure/pom.xml b/samples/client/petstore/clojure/pom.xml new file mode 100644 index 00000000000..a36506d1b90 --- /dev/null +++ b/samples/client/petstore/clojure/pom.xml @@ -0,0 +1,32 @@ + + 4.0.0 + io.swagger + swagger-petstore-clojure + pom + 1.0-SNAPSHOT + Swagger Petstore - Clojure Client + + + + org.codehaus.mojo + exec-maven-plugin + 1.2.1 + + + lein-test + integration-test + + exec + + + lein + + test + + + + + + + + From d198a5a41911e6c6d31c2b4f2d8a23e17b329e34 Mon Sep 17 00:00:00 2001 From: xhh Date: Thu, 19 Nov 2015 17:38:08 +0800 Subject: [PATCH 009/211] Add support config options to Clojure client --- .../languages/ClojureClientCodegen.java | 40 ++++++++++++++----- .../src/main/resources/clojure/api.mustache | 2 +- .../main/resources/clojure/project.mustache | 6 +-- 3 files changed, 34 insertions(+), 14 deletions(-) diff --git a/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/ClojureClientCodegen.java b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/ClojureClientCodegen.java index 0277c2d9077..a358cc05b51 100644 --- a/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/ClojureClientCodegen.java +++ b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/ClojureClientCodegen.java @@ -1,5 +1,6 @@ package io.swagger.codegen.languages; +import io.swagger.codegen.CliOption; import io.swagger.codegen.CodegenConfig; import io.swagger.codegen.CodegenConstants; import io.swagger.codegen.CodegenOperation; @@ -13,8 +14,6 @@ import io.swagger.models.Swagger; import org.apache.commons.lang.StringUtils; import java.io.File; -import java.util.Arrays; -import java.util.HashSet; import java.util.Map; import java.util.List; @@ -23,13 +22,15 @@ public class ClojureClientCodegen extends DefaultCodegen implements CodegenConfi private static final String PROJECT_DESCRIPTION = "projectDescription"; private static final String PROJECT_VERSION = "projectVersion"; private static final String PROJECT_URL = "projectUrl"; - private static final String LICENSE_NAME = "licenseName"; - private static final String LICENSE_URL = "licenseUrl"; + private static final String PROJECT_LICENSE_NAME = "projectLicenseName"; + private static final String PROJECT_LICENSE_URL = "projectLicenseUrl"; private static final String BASE_NAMESPACE = "baseNamespace"; protected String projectName = null; protected String projectDescription = null; protected String projectVersion = null; + protected String baseNamespace = null; + protected String sourceFolder = "src"; public ClojureClientCodegen() { @@ -37,6 +38,21 @@ public class ClojureClientCodegen extends DefaultCodegen implements CodegenConfi outputFolder = "generated-code" + File.separator + "clojure"; apiTemplateFiles.put("api.mustache", ".clj"); embeddedTemplateDir = templateDir = "clojure"; + + cliOptions.add(new CliOption(PROJECT_NAME, + "name of the project (Default: generated from info.title or \"swagger-clj-client\")")); + cliOptions.add(new CliOption(PROJECT_DESCRIPTION, + "description of the project (Default: using info.description or \"Client library of \")")); + cliOptions.add(new CliOption(PROJECT_VERSION, + "version of the project (Default: using info.version or \"1.0.0\")")); + cliOptions.add(new CliOption(PROJECT_URL, + "URL of the project (Default: using info.contact.url or not included in project.clj)")); + cliOptions.add(new CliOption(PROJECT_LICENSE_NAME, + "name of the license the project uses (Default: using info.license.name or not included in project.clj)")); + cliOptions.add(new CliOption(PROJECT_LICENSE_URL, + "URL of the license the project uses (Default: using info.license.url or not included in project.clj)")); + cliOptions.add(new CliOption(BASE_NAMESPACE, + "the base/top namespace (Default: generated from projectName)")); } @Override @@ -67,6 +83,9 @@ public class ClojureClientCodegen extends DefaultCodegen implements CodegenConfi if (additionalProperties.containsKey(PROJECT_VERSION)) { projectVersion = ((String) additionalProperties.get(PROJECT_VERSION)); } + if (additionalProperties.containsKey(BASE_NAMESPACE)) { + baseNamespace = ((String) additionalProperties.get(BASE_NAMESPACE)); + } if (swagger.getInfo() != null) { Info info = swagger.getInfo(); @@ -91,11 +110,11 @@ public class ClojureClientCodegen extends DefaultCodegen implements CodegenConfi } if (info.getLicense() != null) { License license = info.getLicense(); - if (additionalProperties.get(LICENSE_NAME) == null) { - additionalProperties.put(LICENSE_NAME, license.getName()); + if (additionalProperties.get(PROJECT_LICENSE_NAME) == null) { + additionalProperties.put(PROJECT_LICENSE_NAME, license.getName()); } - if (additionalProperties.get(LICENSE_URL) == null) { - additionalProperties.put(LICENSE_URL, license.getUrl()); + if (additionalProperties.get(PROJECT_LICENSE_URL) == null) { + additionalProperties.put(PROJECT_LICENSE_URL, license.getUrl()); } } } @@ -110,8 +129,9 @@ public class ClojureClientCodegen extends DefaultCodegen implements CodegenConfi if (projectDescription == null) { projectDescription = "Client library of " + projectName; } - - final String baseNamespace = dashize(projectName); + if (baseNamespace == null) { + baseNamespace = dashize(projectName); + } apiPackage = baseNamespace + ".api"; additionalProperties.put(PROJECT_NAME, projectName); diff --git a/modules/swagger-codegen/src/main/resources/clojure/api.mustache b/modules/swagger-codegen/src/main/resources/clojure/api.mustache index a4425280f1b..1acdf94d764 100644 --- a/modules/swagger-codegen/src/main/resources/clojure/api.mustache +++ b/modules/swagger-codegen/src/main/resources/clojure/api.mustache @@ -1,5 +1,5 @@ {{=< >=}}(ns . - (:require [.core :refer [call-api check-required-params]]) + (:require [.core :refer [call-api check-required-params]]) (:import (java.io File))) <#operations><#operation> (defn diff --git a/modules/swagger-codegen/src/main/resources/clojure/project.mustache b/modules/swagger-codegen/src/main/resources/clojure/project.mustache index c403c9c43c6..df83142e428 100644 --- a/modules/swagger-codegen/src/main/resources/clojure/project.mustache +++ b/modules/swagger-codegen/src/main/resources/clojure/project.mustache @@ -1,8 +1,8 @@ {{=< >=}}(defproject <&projectName> "<&projectVersion>" :description "<&projectDescription>"<#projectUrl> - :url "<&projectUrl>"<#licenseName> - :license {:name "<&licenseName>"<#licenseUrl> - :url "<&licenseUrl>"} + :url "<&projectUrl>"<#projectLicenseName> + :license {:name "<&projectLicenseName>"<#projectLicenseUrl> + :url "<&projectLicenseUrl>"} :dependencies [[org.clojure/clojure "1.7.0"] [clj-http "2.0.0"] [cheshire "5.5.0"]]) From ab062b1386856b7666e3a207c191bcd4a15a9b33 Mon Sep 17 00:00:00 2001 From: Andras Gaal Date: Thu, 19 Nov 2015 15:15:48 +0100 Subject: [PATCH 010/211] fix boolean getter errors --- .../src/main/java/io/swagger/codegen/DefaultCodegen.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/modules/swagger-codegen/src/main/java/io/swagger/codegen/DefaultCodegen.java b/modules/swagger-codegen/src/main/java/io/swagger/codegen/DefaultCodegen.java index 8c2d0e72559..219c5a5efb3 100644 --- a/modules/swagger-codegen/src/main/java/io/swagger/codegen/DefaultCodegen.java +++ b/modules/swagger-codegen/src/main/java/io/swagger/codegen/DefaultCodegen.java @@ -1496,15 +1496,15 @@ public class DefaultCodegen { p.pattern = qp.getPattern(); p.maximum = qp.getMaximum(); - p.exclusiveMaximum = qp.getExclusiveMaximum(); + p.exclusiveMaximum = qp.isExclusiveMaximum(); p.minimum = qp.getMinimum(); - p.exclusiveMinimum = qp.getExclusiveMinimum(); + p.exclusiveMinimum = qp.isExclusiveMinimum(); p.maxLength = qp.getMaxLength(); p.minLength = qp.getMinLength(); p.pattern = qp.getPattern(); p.maxItems = qp.getMaxItems(); p.minItems = qp.getMinItems(); - p.uniqueItems = qp.getUniqueItems(); + p.uniqueItems = qp.isUniqueItems(); p.multipleOf = qp.getMultipleOf(); } else { if (!(param instanceof BodyParameter)) { From 271661aec79771e15ce65943a1ed1e8af1ca4d34 Mon Sep 17 00:00:00 2001 From: wing328 Date: Fri, 20 Nov 2015 17:01:21 +0800 Subject: [PATCH 011/211] update python auth to skip empty token/username,password --- .../main/resources/python/api_client.mustache | 4 ++- samples/client/petstore/python/.coverage | 2 +- .../petstore/python/dev-requirements.txt.log | 14 ++++++++ .../python/swagger_client/api_client.py | 4 ++- .../python/swagger_client/apis/pet_api.py | 32 ++++++++++++------- .../python/swagger_client/apis/store_api.py | 16 ++++++---- .../python/swagger_client/apis/user_api.py | 26 +++++++++------ 7 files changed, 68 insertions(+), 30 deletions(-) diff --git a/modules/swagger-codegen/src/main/resources/python/api_client.mustache b/modules/swagger-codegen/src/main/resources/python/api_client.mustache index 969eb4e7992..d097ec4536d 100644 --- a/modules/swagger-codegen/src/main/resources/python/api_client.mustache +++ b/modules/swagger-codegen/src/main/resources/python/api_client.mustache @@ -453,7 +453,9 @@ class ApiClient(object): for auth in auth_settings: auth_setting = config.auth_settings().get(auth) if auth_setting: - if auth_setting['in'] == 'header': + if not auth_setting['value']: + continue + elif auth_setting['in'] == 'header': headers[auth_setting['key']] = auth_setting['value'] elif auth_setting['in'] == 'query': querys[auth_setting['key']] = auth_setting['value'] diff --git a/samples/client/petstore/python/.coverage b/samples/client/petstore/python/.coverage index 03f8b2a2d03..ddd00f77a03 100644 --- a/samples/client/petstore/python/.coverage +++ b/samples/client/petstore/python/.coverage @@ -1 +1 @@ -!coverage.py: This is a private format, don't read it directly!{"runs": [{"brief_sys": "CPython 3.4.3 Darwin"}], "lines": {"/Users/williamcheng/Code/swagger-codegen/samples/client/petstore/python/swagger_client/models/user.py": [70, 136, 202, 272, 81, 147, 213, 22, 25, 92, 29, 158, 224, 103, 169, 235, 114, 19, 180, 30, 246, 266, 191, 125, 21], "/Users/williamcheng/Code/swagger-codegen/samples/client/petstore/python/swagger_client/rest.py": [20, 21, 23, 24, 25, 26, 27, 28, 31, 33, 35, 36, 40, 42, 48, 51, 53, 54, 55, 56, 57, 59, 63, 65, 72, 74, 82, 83, 88, 92, 95, 98, 101, 102, 103, 104, 105, 106, 109, 110, 121, 122, 124, 129, 130, 132, 135, 137, 138, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 152, 153, 154, 155, 156, 159, 160, 161, 166, 170, 171, 174, 176, 177, 179, 181, 182, 183, 184, 186, 191, 198, 199, 200, 201, 203, 204, 205, 206, 207, 208, 210, 211, 212, 213, 214, 215, 217, 225, 227, 228, 229, 230, 231, 232, 239, 243, 244, 245, 246, 248, 249, 251], "/Users/williamcheng/Code/swagger-codegen/samples/client/petstore/python/swagger_client/models/__init__.py": [1, 4, 5, 6, 7, 8], "/Users/williamcheng/Code/swagger-codegen/samples/client/petstore/python/swagger_client/apis/__init__.py": [1, 4, 5, 6], "/Users/williamcheng/Code/swagger-codegen/samples/client/petstore/python/swagger_client/models/tag.py": [72, 74, 109, 19, 21, 22, 104, 25, 29, 30, 96, 100, 114, 102, 39, 40, 41, 103, 44, 45, 46, 112, 49, 50, 83, 116, 94, 52, 122, 61, 85, 63], "/Users/williamcheng/Code/swagger-codegen/samples/client/petstore/python/swagger_client/models/pet.py": [128, 130, 150, 172, 139, 141, 19, 215, 21, 22, 152, 25, 29, 30, 161, 163, 39, 40, 41, 42, 43, 44, 45, 174, 48, 49, 50, 51, 52, 53, 54, 183, 57, 58, 59, 60, 61, 62, 64, 194, 195, 200, 73, 202, 75, 206, 208, 209, 210, 211, 84, 213, 86, 185, 216, 218, 220, 222, 95, 97, 226, 228, 106, 108, 117, 119, 212], "/Users/williamcheng/Code/swagger-codegen/samples/client/petstore/python/swagger_client/apis/pet_api.py": [469, 18, 20, 22, 23, 536, 26, 539, 28, 29, 69, 32, 545, 546, 548, 37, 39, 40, 41, 42, 555, 44, 557, 558, 559, 48, 561, 562, 564, 567, 568, 569, 70, 573, 574, 577, 579, 580, 581, 582, 583, 584, 585, 586, 587, 588, 589, 591, 80, 82, 83, 85, 87, 89, 91, 92, 94, 95, 96, 99, 100, 101, 614, 617, 618, 620, 621, 622, 111, 157, 113, 114, 627, 628, 106, 630, 631, 120, 633, 634, 635, 637, 639, 641, 642, 643, 644, 645, 646, 449, 648, 651, 652, 653, 109, 144, 657, 658, 147, 148, 661, 73, 663, 664, 665, 666, 155, 668, 538, 670, 671, 160, 112, 162, 164, 166, 167, 169, 170, 171, 174, 175, 176, 115, 180, 181, 184, 116, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 118, 198, 535, 119, 121, 219, 220, 222, 549, 224, 123, 229, 230, 232, 233, 551, 237, 238, 239, 552, 243, 244, 246, 553, 249, 250, 383, 255, 256, 259, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 673, 273, 46, 294, 295, 297, 298, 299, 304, 305, 307, 308, 310, 312, 313, 314, 223, 316, 318, 319, 321, 324, 325, 326, 330, 331, 45, 334, 336, 337, 338, 339, 340, 667, 342, 343, 344, 345, 346, 348, 540, 145, 483, 369, 372, 373, 375, 376, 377, 382, 149, 385, 386, 235, 388, 389, 390, 392, 394, 396, 397, 399, 402, 403, 404, 408, 409, 412, 154, 414, 415, 416, 417, 418, 419, 420, 421, 422, 423, 424, 426, 669, 72, 105, 158, 241, 74, 117, 672, 452, 453, 455, 456, 457, 462, 463, 465, 466, 468, 532, 470, 472, 474, 79, 476, 477, 478, 479, 480, 481, 251, 486, 487, 488, 492, 493, 496, 498, 499, 500, 501, 502, 503, 504, 505, 506, 507, 508, 510, 341], "/Users/williamcheng/Code/swagger-codegen/samples/client/petstore/python/swagger_client/__init__.py": [1, 4, 5, 6, 7, 8, 11, 12, 13, 16, 18, 20], "/Users/williamcheng/Code/swagger-codegen/samples/client/petstore/python/swagger_client/apis/store_api.py": [273, 18, 20, 22, 23, 26, 28, 29, 32, 37, 39, 40, 41, 44, 46, 48, 195, 68, 69, 71, 72, 79, 81, 82, 84, 86, 88, 90, 91, 93, 96, 97, 98, 102, 103, 106, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 120], "/Users/williamcheng/Code/swagger-codegen/samples/client/petstore/python/swagger_client/models/category.py": [72, 74, 109, 19, 21, 22, 104, 25, 29, 30, 96, 100, 114, 102, 39, 40, 41, 103, 44, 45, 46, 112, 49, 50, 83, 116, 94, 52, 122, 61, 85, 63], "/Users/williamcheng/Code/swagger-codegen/samples/client/petstore/python/swagger_client/models/order.py": [130, 44, 141, 45, 19, 21, 22, 152, 25, 29, 30, 52, 161, 163, 39, 40, 41, 42, 43, 172, 173, 174, 175, 48, 49, 50, 51, 180, 53, 54, 57, 58, 59, 60, 61, 62, 191, 64, 202, 75, 86, 176, 222, 97, 228, 178, 108, 119], "/Users/williamcheng/Code/swagger-codegen/samples/client/petstore/python/swagger_client/api_client.py": [516, 523, 524, 525, 19, 21, 22, 535, 24, 26, 27, 28, 29, 30, 31, 32, 33, 34, 36, 37, 40, 42, 44, 49, 52, 566, 567, 568, 569, 570, 571, 573, 68, 69, 70, 75, 76, 77, 79, 80, 82, 84, 91, 96, 98, 102, 103, 104, 107, 108, 109, 111, 112, 115, 116, 117, 118, 119, 120, 123, 124, 125, 126, 129, 130, 131, 134, 137, 138, 23, 141, 144, 145, 146, 147, 149, 152, 153, 155, 157, 158, 160, 162, 171, 172, 174, 176, 191, 192, 544, 194, 195, 196, 197, 198, 199, 200, 201, 202, 204, 205, 212, 213, 214, 216, 217, 219, 231, 235, 236, 240, 242, 251, 252, 254, 255, 256, 257, 258, 260, 261, 262, 263, 556, 267, 268, 269, 272, 274, 275, 276, 278, 279, 280, 281, 283, 286, 287, 288, 564, 316, 317, 318, 319, 320, 322, 323, 324, 325, 326, 327, 328, 329, 330, 332, 333, 337, 338, 339, 340, 341, 345, 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, 369, 370, 371, 372, 379, 387, 389, 390, 392, 393, 394, 395, 397, 398, 399, 400, 401, 402, 404, 406, 413, 414, 416, 418, 419, 421, 423, 430, 431, 433, 435, 436, 438, 440, 501, 448, 450, 453, 454, 455, 456, 457, 465, 546, 491, 500, 545, 506, 508], "/Users/williamcheng/Code/swagger-codegen/samples/client/petstore/python/swagger_client/configuration.py": [135, 136, 137, 138, 139, 142, 19, 149, 22, 23, 25, 26, 27, 29, 158, 31, 32, 34, 36, 37, 39, 40, 41, 170, 43, 172, 46, 47, 189, 179, 52, 54, 59, 61, 190, 63, 192, 224, 67, 69, 71, 200, 73, 204, 80, 81, 82, 84, 213, 86, 199, 88, 90, 219, 92, 221, 222, 223, 96, 225, 98, 100, 102, 230, 104, 167, 111, 76, 168, 157, 122, 123, 42, 21], "/Users/williamcheng/Code/swagger-codegen/samples/client/petstore/python/swagger_client/apis/user_api.py": [32, 37, 198, 39, 423, 582, 48, 273, 18, 20, 501, 22, 23, 26, 123, 28, 29, 351]}} \ No newline at end of file +!coverage.py: This is a private format, don't read it directly!{"lines": {"/Users/williamcheng/Code/wing328/swagger-codegen/samples/client/petstore/python/swagger_client/apis/pet_api.py": [512, 513, 514, 516, 86, 18, 20, 22, 23, 26, 539, 28, 29, 542, 543, 32, 548, 37, 39, 40, 41, 42, 555, 556, 45, 558, 559, 560, 562, 564, 565, 566, 568, 569, 571, 574, 575, 576, 580, 581, 70, 584, 73, 586, 587, 588, 589, 590, 591, 592, 593, 594, 595, 596, 598, 88, 90, 92, 93, 95, 96, 97, 100, 101, 102, 106, 107, 621, 622, 624, 625, 626, 79, 116, 117, 118, 631, 632, 121, 122, 635, 124, 638, 639, 641, 642, 643, 645, 647, 649, 650, 651, 652, 653, 654, 656, 145, 146, 659, 148, 661, 150, 665, 666, 155, 156, 538, 159, 160, 673, 162, 675, 164, 677, 166, 679, 168, 169, 171, 172, 173, 541, 176, 177, 178, 115, 182, 183, 186, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 552, 200, 119, 120, 377, 221, 222, 549, 224, 225, 226, 231, 232, 431, 235, 236, 110, 238, 240, 241, 242, 244, 246, 247, 249, 383, 252, 253, 254, 258, 259, 262, 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 276, 46, 48, 297, 298, 300, 301, 302, 44, 307, 308, 311, 312, 314, 316, 317, 318, 320, 322, 323, 325, 113, 328, 329, 330, 334, 335, 338, 340, 341, 342, 343, 344, 345, 346, 347, 348, 349, 350, 485, 352, 84, 114, 373, 374, 376, 660, 378, 149, 384, 387, 390, 391, 393, 394, 395, 397, 399, 401, 402, 404, 407, 408, 409, 413, 414, 69, 417, 419, 420, 421, 422, 423, 424, 425, 426, 427, 428, 429, 669, 72, 671, 74, 672, 83, 454, 455, 457, 458, 459, 674, 112, 464, 465, 468, 471, 472, 676, 474, 475, 476, 478, 480, 80, 482, 483, 484, 678, 486, 487, 489, 492, 493, 494, 680, 498, 499, 502, 681, 504, 505, 506, 507, 508, 509, 510, 511], "/Users/williamcheng/Code/wing328/swagger-codegen/samples/client/petstore/python/swagger_client/apis/user_api.py": [32, 355, 37, 39, 200, 124, 428, 589, 48, 18, 20, 22, 23, 276, 26, 507, 28, 29], "/Users/williamcheng/Code/wing328/swagger-codegen/samples/client/petstore/python/swagger_client/api_client.py": [518, 525, 526, 527, 19, 21, 22, 23, 24, 537, 26, 27, 28, 29, 30, 31, 32, 33, 34, 547, 36, 37, 40, 42, 44, 558, 49, 52, 566, 568, 569, 570, 571, 572, 573, 575, 68, 69, 70, 75, 76, 77, 79, 80, 82, 84, 91, 96, 98, 102, 103, 104, 107, 108, 109, 111, 112, 115, 116, 117, 118, 119, 120, 123, 124, 125, 126, 129, 130, 131, 134, 137, 138, 141, 144, 145, 146, 147, 149, 152, 153, 155, 157, 158, 160, 162, 171, 172, 174, 176, 191, 192, 194, 195, 196, 197, 198, 199, 200, 201, 202, 204, 205, 212, 213, 214, 216, 217, 219, 231, 235, 236, 240, 242, 251, 252, 254, 255, 256, 257, 258, 260, 261, 262, 263, 267, 268, 269, 272, 274, 275, 276, 278, 279, 280, 281, 283, 286, 287, 288, 316, 317, 318, 319, 320, 322, 323, 324, 325, 326, 327, 328, 329, 330, 332, 333, 337, 338, 339, 340, 341, 345, 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, 369, 370, 371, 372, 379, 387, 389, 390, 392, 393, 394, 395, 548, 397, 398, 399, 400, 401, 402, 404, 406, 413, 414, 416, 418, 419, 421, 423, 430, 431, 433, 435, 436, 438, 440, 448, 450, 453, 454, 455, 456, 458, 459, 467, 546, 493, 502, 503, 508, 510], "/Users/williamcheng/Code/wing328/swagger-codegen/samples/client/petstore/python/swagger_client/models/category.py": [72, 74, 109, 19, 21, 22, 104, 25, 29, 30, 96, 100, 114, 102, 39, 40, 41, 103, 44, 45, 46, 112, 49, 50, 83, 116, 94, 52, 122, 61, 85, 63], "/Users/williamcheng/Code/wing328/swagger-codegen/samples/client/petstore/python/swagger_client/rest.py": [20, 21, 23, 24, 25, 26, 27, 28, 31, 33, 35, 36, 40, 42, 48, 51, 53, 54, 55, 56, 57, 59, 63, 65, 72, 74, 82, 83, 88, 92, 95, 98, 101, 102, 103, 104, 105, 106, 109, 110, 121, 122, 124, 129, 130, 132, 135, 137, 138, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 152, 153, 154, 155, 156, 159, 160, 161, 166, 170, 171, 174, 176, 177, 179, 181, 182, 183, 184, 186, 191, 198, 199, 200, 201, 203, 204, 205, 206, 207, 208, 210, 211, 212, 213, 214, 215, 217, 225, 227, 228, 229, 230, 231, 232, 239, 243, 244, 245, 246, 248, 249, 251], "/Users/williamcheng/Code/wing328/swagger-codegen/samples/client/petstore/python/swagger_client/models/__init__.py": [1, 4, 5, 6, 7, 8], "/Users/williamcheng/Code/wing328/swagger-codegen/samples/client/petstore/python/swagger_client/apis/store_api.py": [18, 276, 22, 23, 26, 28, 29, 197, 32, 37, 39, 40, 41, 44, 46, 48, 20, 68, 69, 71, 72, 79, 82, 83, 85, 87, 89, 91, 92, 94, 97, 98, 99, 103, 104, 107, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 121], "/Users/williamcheng/Code/wing328/swagger-codegen/samples/client/petstore/python/swagger_client/configuration.py": [135, 136, 137, 138, 139, 142, 19, 149, 22, 23, 25, 26, 27, 29, 158, 31, 32, 34, 36, 37, 39, 40, 41, 170, 43, 172, 46, 47, 189, 179, 52, 54, 59, 61, 190, 63, 192, 224, 67, 69, 71, 200, 73, 204, 80, 81, 82, 84, 213, 86, 199, 88, 90, 219, 92, 221, 222, 223, 96, 225, 98, 100, 102, 230, 104, 167, 111, 76, 168, 157, 122, 123, 42, 21], "/Users/williamcheng/Code/wing328/swagger-codegen/samples/client/petstore/python/swagger_client/__init__.py": [1, 4, 5, 6, 7, 8, 11, 12, 13, 16, 18, 20], "/Users/williamcheng/Code/wing328/swagger-codegen/samples/client/petstore/python/swagger_client/models/pet.py": [128, 130, 150, 172, 139, 141, 19, 215, 21, 22, 152, 25, 29, 30, 161, 163, 39, 40, 41, 42, 43, 44, 45, 174, 48, 49, 50, 51, 52, 53, 54, 183, 57, 58, 59, 60, 61, 62, 64, 194, 195, 200, 73, 202, 75, 206, 208, 209, 210, 211, 84, 213, 86, 185, 216, 218, 220, 222, 95, 97, 226, 228, 106, 108, 117, 119, 212], "/Users/williamcheng/Code/wing328/swagger-codegen/samples/client/petstore/python/swagger_client/models/user.py": [70, 136, 202, 272, 81, 147, 213, 22, 25, 92, 29, 158, 224, 103, 169, 235, 114, 19, 180, 30, 246, 266, 191, 125, 21], "/Users/williamcheng/Code/wing328/swagger-codegen/samples/client/petstore/python/swagger_client/apis/__init__.py": [1, 4, 5, 6], "/Users/williamcheng/Code/wing328/swagger-codegen/samples/client/petstore/python/swagger_client/models/order.py": [130, 44, 141, 45, 19, 21, 22, 152, 25, 29, 30, 52, 161, 163, 39, 40, 41, 42, 43, 172, 173, 174, 175, 48, 49, 50, 51, 180, 53, 54, 57, 58, 59, 60, 61, 62, 191, 64, 202, 75, 86, 176, 222, 97, 228, 178, 108, 119], "/Users/williamcheng/Code/wing328/swagger-codegen/samples/client/petstore/python/swagger_client/models/tag.py": [72, 74, 109, 19, 21, 22, 104, 25, 29, 30, 96, 100, 114, 102, 39, 40, 41, 103, 44, 45, 46, 112, 49, 50, 83, 116, 94, 52, 122, 61, 85, 63]}} \ No newline at end of file diff --git a/samples/client/petstore/python/dev-requirements.txt.log b/samples/client/petstore/python/dev-requirements.txt.log index 0d8dcbb5831..316a9394b50 100644 --- a/samples/client/petstore/python/dev-requirements.txt.log +++ b/samples/client/petstore/python/dev-requirements.txt.log @@ -20,3 +20,17 @@ Requirement already satisfied (use --upgrade to upgrade): randomize in ./.venv/l Requirement already satisfied (use --upgrade to upgrade): virtualenv>=1.11.2 in ./.venv/lib/python2.7/site-packages (from tox->-r dev-requirements.txt (line 2)) Requirement already satisfied (use --upgrade to upgrade): py>=1.4.17 in ./.venv/lib/python2.7/site-packages (from tox->-r dev-requirements.txt (line 2)) Requirement already satisfied (use --upgrade to upgrade): pluggy<0.4.0,>=0.3.0 in ./.venv/lib/python2.7/site-packages (from tox->-r dev-requirements.txt (line 2)) +Requirement already satisfied (use --upgrade to upgrade): nose in ./venv/lib/python2.7/site-packages (from -r dev-requirements.txt (line 1)) +Requirement already satisfied (use --upgrade to upgrade): tox in ./venv/lib/python2.7/site-packages (from -r dev-requirements.txt (line 2)) +Requirement already satisfied (use --upgrade to upgrade): coverage in ./venv/lib/python2.7/site-packages (from -r dev-requirements.txt (line 3)) +Requirement already satisfied (use --upgrade to upgrade): randomize in ./venv/lib/python2.7/site-packages (from -r dev-requirements.txt (line 4)) +Requirement already satisfied (use --upgrade to upgrade): virtualenv>=1.11.2 in ./venv/lib/python2.7/site-packages (from tox->-r dev-requirements.txt (line 2)) +Requirement already satisfied (use --upgrade to upgrade): py>=1.4.17 in ./venv/lib/python2.7/site-packages (from tox->-r dev-requirements.txt (line 2)) +Requirement already satisfied (use --upgrade to upgrade): pluggy<0.4.0,>=0.3.0 in ./venv/lib/python2.7/site-packages (from tox->-r dev-requirements.txt (line 2)) +Requirement already satisfied (use --upgrade to upgrade): nose in ./venv/lib/python2.7/site-packages (from -r dev-requirements.txt (line 1)) +Requirement already satisfied (use --upgrade to upgrade): tox in ./venv/lib/python2.7/site-packages (from -r dev-requirements.txt (line 2)) +Requirement already satisfied (use --upgrade to upgrade): coverage in ./venv/lib/python2.7/site-packages (from -r dev-requirements.txt (line 3)) +Requirement already satisfied (use --upgrade to upgrade): randomize in ./venv/lib/python2.7/site-packages (from -r dev-requirements.txt (line 4)) +Requirement already satisfied (use --upgrade to upgrade): virtualenv>=1.11.2 in ./venv/lib/python2.7/site-packages (from tox->-r dev-requirements.txt (line 2)) +Requirement already satisfied (use --upgrade to upgrade): py>=1.4.17 in ./venv/lib/python2.7/site-packages (from tox->-r dev-requirements.txt (line 2)) +Requirement already satisfied (use --upgrade to upgrade): pluggy<0.4.0,>=0.3.0 in ./venv/lib/python2.7/site-packages (from tox->-r dev-requirements.txt (line 2)) diff --git a/samples/client/petstore/python/swagger_client/api_client.py b/samples/client/petstore/python/swagger_client/api_client.py index fdc92cae77f..f3c66bd3706 100644 --- a/samples/client/petstore/python/swagger_client/api_client.py +++ b/samples/client/petstore/python/swagger_client/api_client.py @@ -453,7 +453,9 @@ class ApiClient(object): for auth in auth_settings: auth_setting = config.auth_settings().get(auth) if auth_setting: - if auth_setting['in'] == 'header': + if not auth_setting['value']: + continue + elif auth_setting['in'] == 'header': headers[auth_setting['key']] = auth_setting['value'] elif auth_setting['in'] == 'query': querys[auth_setting['key']] = auth_setting['value'] diff --git a/samples/client/petstore/python/swagger_client/apis/pet_api.py b/samples/client/petstore/python/swagger_client/apis/pet_api.py index d68d34e6774..d7bc11daaaf 100644 --- a/samples/client/petstore/python/swagger_client/apis/pet_api.py +++ b/samples/client/petstore/python/swagger_client/apis/pet_api.py @@ -79,6 +79,7 @@ class PetApi(object): params[key] = val del params['kwargs'] + resource_path = '/pet'.replace('{format}', 'json') method = 'PUT' @@ -154,6 +155,7 @@ class PetApi(object): params[key] = val del params['kwargs'] + resource_path = '/pet'.replace('{format}', 'json') method = 'POST' @@ -229,6 +231,7 @@ class PetApi(object): params[key] = val del params['kwargs'] + resource_path = '/pet/findByStatus'.replace('{format}', 'json') method = 'GET' @@ -304,6 +307,7 @@ class PetApi(object): params[key] = val del params['kwargs'] + resource_path = '/pet/findByTags'.replace('{format}', 'json') method = 'GET' @@ -365,9 +369,6 @@ class PetApi(object): If the method is called asynchronously, returns the request thread. """ - # verify the required parameter 'pet_id' is set - if pet_id is None: - raise ValueError("Missing the required parameter `pet_id` when calling `get_pet_by_id`") all_params = ['pet_id'] all_params.append('callback') @@ -382,6 +383,10 @@ class PetApi(object): params[key] = val del params['kwargs'] + # verify the required parameter 'pet_id' is set + if ('pet_id' not in params) or (params['pet_id'] is None): + raise ValueError("Missing the required parameter `pet_id` when calling `get_pet_by_id`") + resource_path = '/pet/{petId}'.replace('{format}', 'json') method = 'GET' @@ -445,9 +450,6 @@ class PetApi(object): If the method is called asynchronously, returns the request thread. """ - # verify the required parameter 'pet_id' is set - if pet_id is None: - raise ValueError("Missing the required parameter `pet_id` when calling `update_pet_with_form`") all_params = ['pet_id', 'name', 'status'] all_params.append('callback') @@ -462,6 +464,10 @@ class PetApi(object): params[key] = val del params['kwargs'] + # verify the required parameter 'pet_id' is set + if ('pet_id' not in params) or (params['pet_id'] is None): + raise ValueError("Missing the required parameter `pet_id` when calling `update_pet_with_form`") + resource_path = '/pet/{petId}'.replace('{format}', 'json') method = 'POST' @@ -528,9 +534,6 @@ class PetApi(object): If the method is called asynchronously, returns the request thread. """ - # verify the required parameter 'pet_id' is set - if pet_id is None: - raise ValueError("Missing the required parameter `pet_id` when calling `delete_pet`") all_params = ['pet_id', 'api_key'] all_params.append('callback') @@ -545,6 +548,10 @@ class PetApi(object): params[key] = val del params['kwargs'] + # verify the required parameter 'pet_id' is set + if ('pet_id' not in params) or (params['pet_id'] is None): + raise ValueError("Missing the required parameter `pet_id` when calling `delete_pet`") + resource_path = '/pet/{petId}'.replace('{format}', 'json') method = 'DELETE' @@ -610,9 +617,6 @@ class PetApi(object): If the method is called asynchronously, returns the request thread. """ - # verify the required parameter 'pet_id' is set - if pet_id is None: - raise ValueError("Missing the required parameter `pet_id` when calling `upload_file`") all_params = ['pet_id', 'additional_metadata', 'file'] all_params.append('callback') @@ -627,6 +631,10 @@ class PetApi(object): params[key] = val del params['kwargs'] + # verify the required parameter 'pet_id' is set + if ('pet_id' not in params) or (params['pet_id'] is None): + raise ValueError("Missing the required parameter `pet_id` when calling `upload_file`") + resource_path = '/pet/{petId}/uploadImage'.replace('{format}', 'json') method = 'POST' diff --git a/samples/client/petstore/python/swagger_client/apis/store_api.py b/samples/client/petstore/python/swagger_client/apis/store_api.py index 9e08a0b2f47..e3835990a30 100644 --- a/samples/client/petstore/python/swagger_client/apis/store_api.py +++ b/samples/client/petstore/python/swagger_client/apis/store_api.py @@ -78,6 +78,7 @@ class StoreApi(object): params[key] = val del params['kwargs'] + resource_path = '/store/inventory'.replace('{format}', 'json') method = 'GET' @@ -151,6 +152,7 @@ class StoreApi(object): params[key] = val del params['kwargs'] + resource_path = '/store/order'.replace('{format}', 'json') method = 'POST' @@ -212,9 +214,6 @@ class StoreApi(object): If the method is called asynchronously, returns the request thread. """ - # verify the required parameter 'order_id' is set - if order_id is None: - raise ValueError("Missing the required parameter `order_id` when calling `get_order_by_id`") all_params = ['order_id'] all_params.append('callback') @@ -229,6 +228,10 @@ class StoreApi(object): params[key] = val del params['kwargs'] + # verify the required parameter 'order_id' is set + if ('order_id' not in params) or (params['order_id'] is None): + raise ValueError("Missing the required parameter `order_id` when calling `get_order_by_id`") + resource_path = '/store/order/{orderId}'.replace('{format}', 'json') method = 'GET' @@ -290,9 +293,6 @@ class StoreApi(object): If the method is called asynchronously, returns the request thread. """ - # verify the required parameter 'order_id' is set - if order_id is None: - raise ValueError("Missing the required parameter `order_id` when calling `delete_order`") all_params = ['order_id'] all_params.append('callback') @@ -307,6 +307,10 @@ class StoreApi(object): params[key] = val del params['kwargs'] + # verify the required parameter 'order_id' is set + if ('order_id' not in params) or (params['order_id'] is None): + raise ValueError("Missing the required parameter `order_id` when calling `delete_order`") + resource_path = '/store/order/{orderId}'.replace('{format}', 'json') method = 'DELETE' diff --git a/samples/client/petstore/python/swagger_client/apis/user_api.py b/samples/client/petstore/python/swagger_client/apis/user_api.py index aa35e6db53a..4394941b1d5 100644 --- a/samples/client/petstore/python/swagger_client/apis/user_api.py +++ b/samples/client/petstore/python/swagger_client/apis/user_api.py @@ -79,6 +79,7 @@ class UserApi(object): params[key] = val del params['kwargs'] + resource_path = '/user'.replace('{format}', 'json') method = 'POST' @@ -154,6 +155,7 @@ class UserApi(object): params[key] = val del params['kwargs'] + resource_path = '/user/createWithArray'.replace('{format}', 'json') method = 'POST' @@ -229,6 +231,7 @@ class UserApi(object): params[key] = val del params['kwargs'] + resource_path = '/user/createWithList'.replace('{format}', 'json') method = 'POST' @@ -305,6 +308,7 @@ class UserApi(object): params[key] = val del params['kwargs'] + resource_path = '/user/login'.replace('{format}', 'json') method = 'GET' @@ -381,6 +385,7 @@ class UserApi(object): params[key] = val del params['kwargs'] + resource_path = '/user/logout'.replace('{format}', 'json') method = 'GET' @@ -440,9 +445,6 @@ class UserApi(object): If the method is called asynchronously, returns the request thread. """ - # verify the required parameter 'username' is set - if username is None: - raise ValueError("Missing the required parameter `username` when calling `get_user_by_name`") all_params = ['username'] all_params.append('callback') @@ -457,6 +459,10 @@ class UserApi(object): params[key] = val del params['kwargs'] + # verify the required parameter 'username' is set + if ('username' not in params) or (params['username'] is None): + raise ValueError("Missing the required parameter `username` when calling `get_user_by_name`") + resource_path = '/user/{username}'.replace('{format}', 'json') method = 'GET' @@ -519,9 +525,6 @@ class UserApi(object): If the method is called asynchronously, returns the request thread. """ - # verify the required parameter 'username' is set - if username is None: - raise ValueError("Missing the required parameter `username` when calling `update_user`") all_params = ['username', 'body'] all_params.append('callback') @@ -536,6 +539,10 @@ class UserApi(object): params[key] = val del params['kwargs'] + # verify the required parameter 'username' is set + if ('username' not in params) or (params['username'] is None): + raise ValueError("Missing the required parameter `username` when calling `update_user`") + resource_path = '/user/{username}'.replace('{format}', 'json') method = 'PUT' @@ -599,9 +606,6 @@ class UserApi(object): If the method is called asynchronously, returns the request thread. """ - # verify the required parameter 'username' is set - if username is None: - raise ValueError("Missing the required parameter `username` when calling `delete_user`") all_params = ['username'] all_params.append('callback') @@ -616,6 +620,10 @@ class UserApi(object): params[key] = val del params['kwargs'] + # verify the required parameter 'username' is set + if ('username' not in params) or (params['username'] is None): + raise ValueError("Missing the required parameter `username` when calling `delete_user`") + resource_path = '/user/{username}'.replace('{format}', 'json') method = 'DELETE' From b823e8bd35d236e04d6f4e69a19422ec75c44c06 Mon Sep 17 00:00:00 2001 From: xhh Date: Fri, 20 Nov 2015 17:34:46 +0800 Subject: [PATCH 012/211] Ignore auths when value not specified in Java clients --- .../src/main/resources/Java/auth/ApiKeyAuth.mustache | 3 +++ .../src/main/resources/Java/auth/HttpBasicAuth.mustache | 3 +++ .../Java/libraries/okhttp-gson/auth/HttpBasicAuth.mustache | 3 +++ .../src/main/java/io/swagger/client/auth/ApiKeyAuth.java | 5 ++++- .../src/main/java/io/swagger/client/auth/HttpBasicAuth.java | 5 ++++- .../src/main/java/io/swagger/client/auth/ApiKeyAuth.java | 5 ++++- .../src/main/java/io/swagger/client/auth/HttpBasicAuth.java | 5 ++++- .../src/main/java/io/swagger/client/auth/ApiKeyAuth.java | 5 ++++- .../src/main/java/io/swagger/client/auth/HttpBasicAuth.java | 3 +++ 9 files changed, 32 insertions(+), 5 deletions(-) diff --git a/modules/swagger-codegen/src/main/resources/Java/auth/ApiKeyAuth.mustache b/modules/swagger-codegen/src/main/resources/Java/auth/ApiKeyAuth.mustache index 04be4812292..931d17b0d04 100644 --- a/modules/swagger-codegen/src/main/resources/Java/auth/ApiKeyAuth.mustache +++ b/modules/swagger-codegen/src/main/resources/Java/auth/ApiKeyAuth.mustache @@ -44,6 +44,9 @@ public class ApiKeyAuth implements Authentication { @Override public void applyToParams(List queryParams, Map headerParams) { + if (apiKey == null) { + return; + } String value; if (apiKeyPrefix != null) { value = apiKeyPrefix + " " + apiKey; diff --git a/modules/swagger-codegen/src/main/resources/Java/auth/HttpBasicAuth.mustache b/modules/swagger-codegen/src/main/resources/Java/auth/HttpBasicAuth.mustache index 63813e2504e..509f4742b61 100644 --- a/modules/swagger-codegen/src/main/resources/Java/auth/HttpBasicAuth.mustache +++ b/modules/swagger-codegen/src/main/resources/Java/auth/HttpBasicAuth.mustache @@ -31,6 +31,9 @@ public class HttpBasicAuth implements Authentication { @Override public void applyToParams(List queryParams, Map headerParams) { + if (username == null && password == null) { + return; + } String str = (username == null ? "" : username) + ":" + (password == null ? "" : password); try { headerParams.put("Authorization", "Basic " + DatatypeConverter.printBase64Binary(str.getBytes("UTF-8"))); diff --git a/modules/swagger-codegen/src/main/resources/Java/libraries/okhttp-gson/auth/HttpBasicAuth.mustache b/modules/swagger-codegen/src/main/resources/Java/libraries/okhttp-gson/auth/HttpBasicAuth.mustache index 5b4070fcafb..76fa4a2d0a3 100644 --- a/modules/swagger-codegen/src/main/resources/Java/libraries/okhttp-gson/auth/HttpBasicAuth.mustache +++ b/modules/swagger-codegen/src/main/resources/Java/libraries/okhttp-gson/auth/HttpBasicAuth.mustache @@ -31,6 +31,9 @@ public class HttpBasicAuth implements Authentication { @Override public void applyToParams(List queryParams, Map headerParams) { + if (username == null && password == null) { + return; + } String str = (username == null ? "" : username) + ":" + (password == null ? "" : password); try { headerParams.put("Authorization", "Basic " + Base64.encodeToString(str.getBytes("UTF-8"), false)); diff --git a/samples/client/petstore/java/default/src/main/java/io/swagger/client/auth/ApiKeyAuth.java b/samples/client/petstore/java/default/src/main/java/io/swagger/client/auth/ApiKeyAuth.java index 14891e3504f..0011210c8cc 100644 --- a/samples/client/petstore/java/default/src/main/java/io/swagger/client/auth/ApiKeyAuth.java +++ b/samples/client/petstore/java/default/src/main/java/io/swagger/client/auth/ApiKeyAuth.java @@ -5,7 +5,7 @@ import io.swagger.client.Pair; import java.util.Map; import java.util.List; -@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-10-30T16:36:47.681+08:00") +@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-11-20T17:28:23.285+08:00") public class ApiKeyAuth implements Authentication { private final String location; private final String paramName; @@ -44,6 +44,9 @@ public class ApiKeyAuth implements Authentication { @Override public void applyToParams(List queryParams, Map headerParams) { + if (apiKey == null) { + return; + } String value; if (apiKeyPrefix != null) { value = apiKeyPrefix + " " + apiKey; diff --git a/samples/client/petstore/java/default/src/main/java/io/swagger/client/auth/HttpBasicAuth.java b/samples/client/petstore/java/default/src/main/java/io/swagger/client/auth/HttpBasicAuth.java index 99ff90e4c6f..074f1833542 100644 --- a/samples/client/petstore/java/default/src/main/java/io/swagger/client/auth/HttpBasicAuth.java +++ b/samples/client/petstore/java/default/src/main/java/io/swagger/client/auth/HttpBasicAuth.java @@ -8,7 +8,7 @@ import java.util.List; import java.io.UnsupportedEncodingException; import javax.xml.bind.DatatypeConverter; -@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-10-30T16:36:47.681+08:00") +@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-11-20T17:28:23.285+08:00") public class HttpBasicAuth implements Authentication { private String username; private String password; @@ -31,6 +31,9 @@ public class HttpBasicAuth implements Authentication { @Override public void applyToParams(List queryParams, Map headerParams) { + if (username == null && password == null) { + return; + } String str = (username == null ? "" : username) + ":" + (password == null ? "" : password); try { headerParams.put("Authorization", "Basic " + DatatypeConverter.printBase64Binary(str.getBytes("UTF-8"))); diff --git a/samples/client/petstore/java/jersey2/src/main/java/io/swagger/client/auth/ApiKeyAuth.java b/samples/client/petstore/java/jersey2/src/main/java/io/swagger/client/auth/ApiKeyAuth.java index d7d3d3e63b0..bc3bdaefc44 100644 --- a/samples/client/petstore/java/jersey2/src/main/java/io/swagger/client/auth/ApiKeyAuth.java +++ b/samples/client/petstore/java/jersey2/src/main/java/io/swagger/client/auth/ApiKeyAuth.java @@ -5,7 +5,7 @@ import io.swagger.client.Pair; import java.util.Map; import java.util.List; -@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-11-17T11:17:50.535-05:00") +@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-11-20T17:28:47.318+08:00") public class ApiKeyAuth implements Authentication { private final String location; private final String paramName; @@ -44,6 +44,9 @@ public class ApiKeyAuth implements Authentication { @Override public void applyToParams(List queryParams, Map headerParams) { + if (apiKey == null) { + return; + } String value; if (apiKeyPrefix != null) { value = apiKeyPrefix + " " + apiKey; diff --git a/samples/client/petstore/java/jersey2/src/main/java/io/swagger/client/auth/HttpBasicAuth.java b/samples/client/petstore/java/jersey2/src/main/java/io/swagger/client/auth/HttpBasicAuth.java index 390502ab9e5..0abfc056e1d 100644 --- a/samples/client/petstore/java/jersey2/src/main/java/io/swagger/client/auth/HttpBasicAuth.java +++ b/samples/client/petstore/java/jersey2/src/main/java/io/swagger/client/auth/HttpBasicAuth.java @@ -8,7 +8,7 @@ import java.util.List; import java.io.UnsupportedEncodingException; import javax.xml.bind.DatatypeConverter; -@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-11-17T11:17:50.535-05:00") +@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-11-20T17:28:47.318+08:00") public class HttpBasicAuth implements Authentication { private String username; private String password; @@ -31,6 +31,9 @@ public class HttpBasicAuth implements Authentication { @Override public void applyToParams(List queryParams, Map headerParams) { + if (username == null && password == null) { + return; + } String str = (username == null ? "" : username) + ":" + (password == null ? "" : password); try { headerParams.put("Authorization", "Basic " + DatatypeConverter.printBase64Binary(str.getBytes("UTF-8"))); diff --git a/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/auth/ApiKeyAuth.java b/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/auth/ApiKeyAuth.java index c072321f457..fbfda66f881 100644 --- a/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/auth/ApiKeyAuth.java +++ b/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/auth/ApiKeyAuth.java @@ -5,7 +5,7 @@ import io.swagger.client.Pair; import java.util.Map; import java.util.List; -@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-10-20T11:42:25.339-07:00") +@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-11-20T17:28:54.086+08:00") public class ApiKeyAuth implements Authentication { private final String location; private final String paramName; @@ -44,6 +44,9 @@ public class ApiKeyAuth implements Authentication { @Override public void applyToParams(List queryParams, Map headerParams) { + if (apiKey == null) { + return; + } String value; if (apiKeyPrefix != null) { value = apiKeyPrefix + " " + apiKey; diff --git a/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/auth/HttpBasicAuth.java b/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/auth/HttpBasicAuth.java index d2b56433169..38617121e30 100644 --- a/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/auth/HttpBasicAuth.java +++ b/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/auth/HttpBasicAuth.java @@ -31,6 +31,9 @@ public class HttpBasicAuth implements Authentication { @Override public void applyToParams(List queryParams, Map headerParams) { + if (username == null && password == null) { + return; + } String str = (username == null ? "" : username) + ":" + (password == null ? "" : password); try { headerParams.put("Authorization", "Basic " + Base64.encodeToString(str.getBytes("UTF-8"), false)); From 8303374aa50b37d63ffd903ed6ab6df9ea152ca6 Mon Sep 17 00:00:00 2001 From: wing328 Date: Fri, 20 Nov 2015 17:36:17 +0800 Subject: [PATCH 013/211] update perl auth to skip null apikey/username&password --- .../main/resources/perl/ApiClient.mustache | 20 ++++++++++++++++--- .../perl/lib/WWW/SwaggerClient/ApiClient.pm | 12 ++++++++--- .../perl/lib/WWW/SwaggerClient/Role.pm | 4 ++-- 3 files changed, 28 insertions(+), 8 deletions(-) diff --git a/modules/swagger-codegen/src/main/resources/perl/ApiClient.mustache b/modules/swagger-codegen/src/main/resources/perl/ApiClient.mustache index bf1220912d2..1623721cc70 100644 --- a/modules/swagger-codegen/src/main/resources/perl/ApiClient.mustache +++ b/modules/swagger-codegen/src/main/resources/perl/ApiClient.mustache @@ -317,14 +317,28 @@ sub update_params_for_auth { foreach my $auth (@$auth_settings) { # determine which one to use if (!defined($auth)) { + # TODO show warning about auth setting not defined } {{#authMethods}}elsif ($auth eq '{{name}}') { - {{#isApiKey}}{{#isKeyInHeader}}$header_params->{'{{keyParamName}}'} = $self->get_api_key_with_prefix('{{keyParamName}}');{{/isKeyInHeader}}{{#isKeyInQuery}}$query_params->{'{{keyParamName}}'} = $self->get_api_key_with_prefix('{{keyParamName}}');{{/isKeyInQuery}}{{/isApiKey}}{{#isBasic}}$header_params->{'Authorization'} = 'Basic '.encode_base64($WWW::{{moduleName}}::Configuration::username.":".$WWW::{{moduleName}}::Configuration::password);{{/isBasic}} - {{#isOAuth}}$header_params->{'Authorization'} = 'Bearer ' . $WWW::{{moduleName}}::Configuration::access_token;{{/isOAuth}} + {{#isApiKey}}{{#isKeyInHeader}} + my $api_key = $self->get_api_key_with_prefix('{{keyParamName}}'); + if ($api_key) { + $header_params->{'{{keyParamName}}'} = $api_key; + }{{/isKeyInHeader}}{{#isKeyInQuery}} + my $api_key = $self->get_api_key_with_prefix('{{keyParamName}}'); + if ($api_key) { + $query_params->{'{{keyParamName}}'} = $api_key; + }{{/isKeyInQuery}}{{/isApiKey}}{{#isBasic}} + if ($WWW::{{moduleName}}::Configuration::username || $WWW::{{moduleName}}::Configuration::password) { + $header_params->{'Authorization'} = 'Basic ' . encode_base64($WWW::{{moduleName}}::Configuration::username . ":" . $WWW::{{moduleName}}::Configuration::password); + }{{/isBasic}}{{#isOAuth}} + if ($WWW::{{moduleName}}::Configuration::access_token) { + $header_params->{'Authorization'} = 'Bearer ' . $WWW::{{moduleName}}::Configuration::access_token; + }{{/isOAuth}} } {{/authMethods}} else { - # TODO show warning about security definition not found + # TODO show warning about security definition not found } } } diff --git a/samples/client/petstore/perl/lib/WWW/SwaggerClient/ApiClient.pm b/samples/client/petstore/perl/lib/WWW/SwaggerClient/ApiClient.pm index dbd822cc1d4..11f2ab3f236 100644 --- a/samples/client/petstore/perl/lib/WWW/SwaggerClient/ApiClient.pm +++ b/samples/client/petstore/perl/lib/WWW/SwaggerClient/ApiClient.pm @@ -317,18 +317,24 @@ sub update_params_for_auth { foreach my $auth (@$auth_settings) { # determine which one to use if (!defined($auth)) { + # TODO show warning about auth setting not defined } elsif ($auth eq 'api_key') { - $header_params->{'api_key'} = $self->get_api_key_with_prefix('api_key'); + my $api_key = $self->get_api_key_with_prefix('api_key'); + if ($api_key) { + $header_params->{'api_key'} = $api_key; + } } elsif ($auth eq 'petstore_auth') { - $header_params->{'Authorization'} = 'Bearer ' . $WWW::SwaggerClient::Configuration::access_token; + if ($WWW::SwaggerClient::Configuration::access_token) { + $header_params->{'Authorization'} = 'Bearer ' . $WWW::SwaggerClient::Configuration::access_token; + } } else { - # TODO show warning about security definition not found + # TODO show warning about security definition not found } } } diff --git a/samples/client/petstore/perl/lib/WWW/SwaggerClient/Role.pm b/samples/client/petstore/perl/lib/WWW/SwaggerClient/Role.pm index feb5228cb61..941d9e0ce24 100644 --- a/samples/client/petstore/perl/lib/WWW/SwaggerClient/Role.pm +++ b/samples/client/petstore/perl/lib/WWW/SwaggerClient/Role.pm @@ -37,7 +37,7 @@ has version_info => ( is => 'ro', default => sub { { app_name => 'Swagger Petstore', app_version => '1.0.0', - generated_date => '2015-11-13T20:46:43.271Z', + generated_date => '2015-11-20T17:35:18.902+08:00', generator_class => 'class io.swagger.codegen.languages.PerlClientCodegen', } }, documentation => 'Information about the application version and the codegen codebase version' @@ -103,7 +103,7 @@ Automatically generated by the Perl Swagger Codegen project: =over 4 -=item Build date: 2015-11-13T20:46:43.271Z +=item Build date: 2015-11-20T17:35:18.902+08:00 =item Build package: class io.swagger.codegen.languages.PerlClientCodegen From 81cf57a00b2f279d8610090f28fb51e119f9a3e3 Mon Sep 17 00:00:00 2001 From: xhh Date: Fri, 20 Nov 2015 20:10:05 +0800 Subject: [PATCH 014/211] Use okhttp's Credentials class to build basic auth string --- .../okhttp-gson/auth/HttpBasicAuth.mustache | 11 +++---- .../Java/libraries/okhttp-gson/pom.mustache | 5 --- .../client/petstore/java/okhttp-gson/pom.xml | 5 --- .../io/swagger/client/auth/HttpBasicAuth.java | 11 +++---- .../swagger/client/auth/ApiKeyAuthTest.java | 31 ++++++++++++++++++- .../client/auth/HttpBasicAuthTest.java | 10 ++++++ 6 files changed, 48 insertions(+), 25 deletions(-) diff --git a/modules/swagger-codegen/src/main/resources/Java/libraries/okhttp-gson/auth/HttpBasicAuth.mustache b/modules/swagger-codegen/src/main/resources/Java/libraries/okhttp-gson/auth/HttpBasicAuth.mustache index 76fa4a2d0a3..f3ed85d980b 100644 --- a/modules/swagger-codegen/src/main/resources/Java/libraries/okhttp-gson/auth/HttpBasicAuth.mustache +++ b/modules/swagger-codegen/src/main/resources/Java/libraries/okhttp-gson/auth/HttpBasicAuth.mustache @@ -2,7 +2,7 @@ package {{invokerPackage}}.auth; import {{invokerPackage}}.Pair; -import com.migcomponents.migbase64.Base64; +import com.squareup.okhttp.Credentials; import java.util.Map; import java.util.List; @@ -34,11 +34,8 @@ public class HttpBasicAuth implements Authentication { if (username == null && password == null) { return; } - String str = (username == null ? "" : username) + ":" + (password == null ? "" : password); - try { - headerParams.put("Authorization", "Basic " + Base64.encodeToString(str.getBytes("UTF-8"), false)); - } catch (UnsupportedEncodingException e) { - throw new RuntimeException(e); - } + headerParams.put("Authorization", Credentials.basic( + username == null ? "" : username, + password == null ? "" : password)); } } diff --git a/modules/swagger-codegen/src/main/resources/Java/libraries/okhttp-gson/pom.mustache b/modules/swagger-codegen/src/main/resources/Java/libraries/okhttp-gson/pom.mustache index 67fc10e8323..0d7e9015101 100644 --- a/modules/swagger-codegen/src/main/resources/Java/libraries/okhttp-gson/pom.mustache +++ b/modules/swagger-codegen/src/main/resources/Java/libraries/okhttp-gson/pom.mustache @@ -122,11 +122,6 @@ gson ${gson-version} - - com.brsanthu - migbase64 - 2.2 - diff --git a/samples/client/petstore/java/okhttp-gson/pom.xml b/samples/client/petstore/java/okhttp-gson/pom.xml index 2442e1c318e..9fa057be939 100644 --- a/samples/client/petstore/java/okhttp-gson/pom.xml +++ b/samples/client/petstore/java/okhttp-gson/pom.xml @@ -122,11 +122,6 @@ gson ${gson-version} - - com.brsanthu - migbase64 - 2.2 - diff --git a/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/auth/HttpBasicAuth.java b/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/auth/HttpBasicAuth.java index 38617121e30..6ed16d1db30 100644 --- a/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/auth/HttpBasicAuth.java +++ b/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/auth/HttpBasicAuth.java @@ -2,7 +2,7 @@ package io.swagger.client.auth; import io.swagger.client.Pair; -import com.migcomponents.migbase64.Base64; +import com.squareup.okhttp.Credentials; import java.util.Map; import java.util.List; @@ -34,11 +34,8 @@ public class HttpBasicAuth implements Authentication { if (username == null && password == null) { return; } - String str = (username == null ? "" : username) + ":" + (password == null ? "" : password); - try { - headerParams.put("Authorization", "Basic " + Base64.encodeToString(str.getBytes("UTF-8"), false)); - } catch (UnsupportedEncodingException e) { - throw new RuntimeException(e); - } + headerParams.put("Authorization", Credentials.basic( + username == null ? "" : username, + password == null ? "" : password)); } } diff --git a/samples/client/petstore/java/okhttp-gson/src/test/java/io/swagger/client/auth/ApiKeyAuthTest.java b/samples/client/petstore/java/okhttp-gson/src/test/java/io/swagger/client/auth/ApiKeyAuthTest.java index 5bdb4fb78fb..3715e9724e6 100644 --- a/samples/client/petstore/java/okhttp-gson/src/test/java/io/swagger/client/auth/ApiKeyAuthTest.java +++ b/samples/client/petstore/java/okhttp-gson/src/test/java/io/swagger/client/auth/ApiKeyAuthTest.java @@ -29,9 +29,23 @@ public class ApiKeyAuthTest { assertEquals(0, headerParams.size()); } + @Test + public void testApplyToParamsInQueryWithNullValue() { + List queryParams = new ArrayList(); + Map headerParams = new HashMap(); + + ApiKeyAuth auth = new ApiKeyAuth("query", "api_key"); + auth.setApiKey(null); + auth.applyToParams(queryParams, headerParams); + + // no changes to parameters + assertEquals(0, queryParams.size()); + assertEquals(0, headerParams.size()); + } + @Test public void testApplyToParamsInHeaderWithPrefix() { - List queryParams = new ArrayList(); + List queryParams = new ArrayList(); Map headerParams = new HashMap(); ApiKeyAuth auth = new ApiKeyAuth("header", "X-API-TOKEN"); @@ -44,4 +58,19 @@ public class ApiKeyAuthTest { assertEquals(1, headerParams.size()); assertEquals("Token my-api-token", headerParams.get("X-API-TOKEN")); } + + @Test + public void testApplyToParamsInHeaderWithNullValue() { + List queryParams = new ArrayList(); + Map headerParams = new HashMap(); + + ApiKeyAuth auth = new ApiKeyAuth("header", "X-API-TOKEN"); + auth.setApiKey(null); + auth.setApiKeyPrefix("Token"); + auth.applyToParams(queryParams, headerParams); + + // no changes to parameters + assertEquals(0, queryParams.size()); + assertEquals(0, headerParams.size()); + } } diff --git a/samples/client/petstore/java/okhttp-gson/src/test/java/io/swagger/client/auth/HttpBasicAuthTest.java b/samples/client/petstore/java/okhttp-gson/src/test/java/io/swagger/client/auth/HttpBasicAuthTest.java index 52c5497ba83..ddee04f57fc 100644 --- a/samples/client/petstore/java/okhttp-gson/src/test/java/io/swagger/client/auth/HttpBasicAuthTest.java +++ b/samples/client/petstore/java/okhttp-gson/src/test/java/io/swagger/client/auth/HttpBasicAuthTest.java @@ -48,5 +48,15 @@ public class HttpBasicAuthTest { // the string below is base64-encoded result of "my-username:" with the "Basic " prefix expected = "Basic bXktdXNlcm5hbWU6"; assertEquals(expected, headerParams.get("Authorization")); + + // null username and password should be ignored + queryParams = new ArrayList(); + headerParams = new HashMap(); + auth.setUsername(null); + auth.setPassword(null); + auth.applyToParams(queryParams, headerParams); + // no changes to parameters + assertEquals(0, queryParams.size()); + assertEquals(0, headerParams.size()); } } From 1ce3b67aa42572e91a2f77701c0dde40f6c7307b Mon Sep 17 00:00:00 2001 From: wing328 Date: Sat, 21 Nov 2015 13:22:00 +0800 Subject: [PATCH 015/211] add equal and gethashcode to C# model --- .../src/main/resources/csharp/model.mustache | 122 +++++-- .../main/csharp/IO/Swagger/Model/Category.cs | 147 ++++++--- .../src/main/csharp/IO/Swagger/Model/Order.cs | 249 ++++++++++----- .../src/main/csharp/IO/Swagger/Model/Pet.cs | 249 ++++++++++----- .../src/main/csharp/IO/Swagger/Model/Tag.cs | 147 ++++++--- .../src/main/csharp/IO/Swagger/Model/User.cs | 299 ++++++++++++------ .../csharp/SwaggerClientTest/TestPet.cs | 46 +++ .../bin/Debug/SwaggerClientTest.dll | Bin 62464 -> 67072 bytes .../bin/Debug/SwaggerClientTest.dll.mdb | Bin 19469 -> 21049 bytes ...ClientTest.csproj.FilesWrittenAbsolute.txt | 16 +- .../obj/Debug/SwaggerClientTest.dll | Bin 62464 -> 67072 bytes .../obj/Debug/SwaggerClientTest.dll.mdb | Bin 19469 -> 21049 bytes 12 files changed, 883 insertions(+), 392 deletions(-) diff --git a/modules/swagger-codegen/src/main/resources/csharp/model.mustache b/modules/swagger-codegen/src/main/resources/csharp/model.mustache index d40ece4cc02..c95d2f1a1b9 100644 --- a/modules/swagger-codegen/src/main/resources/csharp/model.mustache +++ b/modules/swagger-codegen/src/main/resources/csharp/model.mustache @@ -8,46 +8,98 @@ using Newtonsoft.Json; {{#models}} {{#model}} -namespace {{packageName}}.Model { - - /// - /// {{description}} - /// - [DataContract] - public class {{classname}}{{#parent}} : {{{parent}}}{{/parent}} { - {{#vars}} - /// - /// {{^description}}Gets or Sets {{{name}}}{{/description}}{{#description}}{{{description}}}{{/description}} - /// {{#description}} - /// {{{description}}}{{/description}} - [DataMember(Name="{{baseName}}", EmitDefaultValue=false)] - public {{{datatype}}} {{name}} { get; set; } - - {{/vars}} +namespace {{packageName}}.Model +{ /// - /// Get the string presentation of the object + /// {{description}} /// - /// String presentation of the object - public override string ToString() { - var sb = new StringBuilder(); - sb.Append("class {{classname}} {\n"); - {{#vars}} - sb.Append(" {{name}}: ").Append({{name}}).Append("\n"); - {{/vars}} - sb.Append("}\n"); - return sb.ToString(); - } + [DataContract] + public class {{classname}} : IEquatable<{{classname}}>{{#parent}}, {{{parent}}}{{/parent}} + { + {{#vars}} + /// + /// {{^description}}Gets or Sets {{{name}}}{{/description}}{{#description}}{{{description}}}{{/description}} + /// {{#description}} + /// {{{description}}}{{/description}} + [DataMember(Name="{{baseName}}", EmitDefaultValue=false)] + public {{{datatype}}} {{name}} { get; set; } + + {{/vars}} + + /// + /// Returns the string presentation of the object + /// + /// String presentation of the object + public override string ToString() + { + var sb = new StringBuilder(); + sb.Append("class {{classname}} {\n"); + {{#vars}}sb.Append(" {{name}}: ").Append({{name}}).Append("\n"); + {{/vars}} + sb.Append("}\n"); + return sb.ToString(); + } + + /// + /// Returns the JSON string presentation of the object + /// + /// JSON string presentation of the object + public {{#parent}} new {{/parent}}string ToJson() + { + return JsonConvert.SerializeObject(this, Formatting.Indented); + } - /// - /// Get the JSON string presentation of the object - /// - /// JSON string presentation of the object - public {{#parent}} new {{/parent}}string ToJson() { - return JsonConvert.SerializeObject(this, Formatting.Indented); - } + /// + /// Returns true if objects are equal + /// + /// Object to be compared + /// Boolean + public override bool Equals(object obj) + { + // credit: http://stackoverflow.com/a/10454552/677735 + return this.Equals(obj as {{classname}}); + } -} + /// + /// Returns true if {{classname}} instances are equal + /// + /// Instance of {{classname}} to be compared + /// Boolean + public bool Equals({{classname}} other) + { + // credit: http://stackoverflow.com/a/10454552/677735 + if (other == null) + return false; + + return {{#vars}} + ( + this.{{name}} == other.{{name}} || + this.{{name}} != null && + this.{{name}}.Equals(other.{{name}}) + ){{#hasMore}} && {{/hasMore}}{{/vars}}; + } + + /// + /// Gets the hash code + /// + /// Hash code + public override int GetHashCode() + { + // credit: http://stackoverflow.com/a/263416/677735 + unchecked // Overflow is fine, just wrap + { + int hash = 41; + // Suitable nullity checks etc, of course :) + {{#vars}} + if (this.{{name}} != null) + hash = hash * 57 + this.{{name}}.GetHashCode(); + {{/vars}} + return hash; + } + } + + } {{/model}} {{/models}} } diff --git a/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Model/Category.cs b/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Model/Category.cs index 56ebfdb3b7b..6b39196b2b7 100644 --- a/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Model/Category.cs +++ b/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Model/Category.cs @@ -6,52 +6,111 @@ using System.Collections.Generic; using System.Runtime.Serialization; using Newtonsoft.Json; -namespace IO.Swagger.Model { - - /// - /// - /// - [DataContract] - public class Category { - - /// - /// Gets or Sets Id - /// - [DataMember(Name="id", EmitDefaultValue=false)] - public long? Id { get; set; } - - - /// - /// Gets or Sets Name - /// - [DataMember(Name="name", EmitDefaultValue=false)] - public string Name { get; set; } - - +namespace IO.Swagger.Model +{ /// - /// Get the string presentation of the object + /// /// - /// String presentation of the object - public override string ToString() { - var sb = new StringBuilder(); - sb.Append("class Category {\n"); - - sb.Append(" Id: ").Append(Id).Append("\n"); - - sb.Append(" Name: ").Append(Name).Append("\n"); - - sb.Append("}\n"); - return sb.ToString(); + [DataContract] + public class Category : IEquatable + { + + /// + /// Gets or Sets Id + /// + [DataMember(Name="id", EmitDefaultValue=false)] + public long? Id { get; set; } + + + /// + /// Gets or Sets Name + /// + [DataMember(Name="name", EmitDefaultValue=false)] + public string Name { get; set; } + + + + /// + /// Returns the string presentation of the object + /// + /// String presentation of the object + public override string ToString() + { + var sb = new StringBuilder(); + sb.Append("class Category {\n"); + sb.Append(" Id: ").Append(Id).Append("\n"); + sb.Append(" Name: ").Append(Name).Append("\n"); + + sb.Append("}\n"); + return sb.ToString(); + } + + /// + /// Returns the JSON string presentation of the object + /// + /// JSON string presentation of the object + public string ToJson() + { + return JsonConvert.SerializeObject(this, Formatting.Indented); + } + + /// + /// Returns true if objects are equal + /// + /// Object to be compared + /// Boolean + public override bool Equals(object obj) + { + // credit: http://stackoverflow.com/a/10454552/677735 + return this.Equals(obj as Category); + } + + /// + /// Returns true if Category instances are equal + /// + /// Instance of Category to be compared + /// Boolean + public bool Equals(Category other) + { + // credit: http://stackoverflow.com/a/10454552/677735 + if (other == null) + return false; + + return + ( + this.Id == other.Id || + this.Id != null && + this.Id.Equals(other.Id) + ) && + ( + this.Name == other.Name || + this.Name != null && + this.Name.Equals(other.Name) + ); + } + + /// + /// Gets the hash code + /// + /// Hash code + public override int GetHashCode() + { + // credit: http://stackoverflow.com/a/263416/677735 + unchecked // Overflow is fine, just wrap + { + int hash = 41; + // Suitable nullity checks etc, of course :) + + if (this.Id != null) + hash = hash * 57 + this.Id.GetHashCode(); + + if (this.Name != null) + hash = hash * 57 + this.Name.GetHashCode(); + + return hash; + } + } + } - - /// - /// Get the JSON string presentation of the object - /// - /// JSON string presentation of the object - public string ToJson() { - return JsonConvert.SerializeObject(this, Formatting.Indented); - } - -} } diff --git a/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Model/Order.cs b/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Model/Order.cs index 1fa62c1605a..8346e1cc6d8 100644 --- a/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Model/Order.cs +++ b/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Model/Order.cs @@ -6,89 +6,176 @@ using System.Collections.Generic; using System.Runtime.Serialization; using Newtonsoft.Json; -namespace IO.Swagger.Model { - - /// - /// - /// - [DataContract] - public class Order { - - /// - /// Gets or Sets Id - /// - [DataMember(Name="id", EmitDefaultValue=false)] - public long? Id { get; set; } - - - /// - /// Gets or Sets PetId - /// - [DataMember(Name="petId", EmitDefaultValue=false)] - public long? PetId { get; set; } - - - /// - /// Gets or Sets Quantity - /// - [DataMember(Name="quantity", EmitDefaultValue=false)] - public int? Quantity { get; set; } - - - /// - /// Gets or Sets ShipDate - /// - [DataMember(Name="shipDate", EmitDefaultValue=false)] - public DateTime? ShipDate { get; set; } - - - /// - /// Order Status - /// - /// Order Status - [DataMember(Name="status", EmitDefaultValue=false)] - public string Status { get; set; } - - - /// - /// Gets or Sets Complete - /// - [DataMember(Name="complete", EmitDefaultValue=false)] - public bool? Complete { get; set; } - - +namespace IO.Swagger.Model +{ /// - /// Get the string presentation of the object + /// /// - /// String presentation of the object - public override string ToString() { - var sb = new StringBuilder(); - sb.Append("class Order {\n"); - - sb.Append(" Id: ").Append(Id).Append("\n"); - - sb.Append(" PetId: ").Append(PetId).Append("\n"); - - sb.Append(" Quantity: ").Append(Quantity).Append("\n"); - - sb.Append(" ShipDate: ").Append(ShipDate).Append("\n"); - - sb.Append(" Status: ").Append(Status).Append("\n"); - - sb.Append(" Complete: ").Append(Complete).Append("\n"); - - sb.Append("}\n"); - return sb.ToString(); + [DataContract] + public class Order : IEquatable + { + + /// + /// Gets or Sets Id + /// + [DataMember(Name="id", EmitDefaultValue=false)] + public long? Id { get; set; } + + + /// + /// Gets or Sets PetId + /// + [DataMember(Name="petId", EmitDefaultValue=false)] + public long? PetId { get; set; } + + + /// + /// Gets or Sets Quantity + /// + [DataMember(Name="quantity", EmitDefaultValue=false)] + public int? Quantity { get; set; } + + + /// + /// Gets or Sets ShipDate + /// + [DataMember(Name="shipDate", EmitDefaultValue=false)] + public DateTime? ShipDate { get; set; } + + + /// + /// Order Status + /// + /// Order Status + [DataMember(Name="status", EmitDefaultValue=false)] + public string Status { get; set; } + + + /// + /// Gets or Sets Complete + /// + [DataMember(Name="complete", EmitDefaultValue=false)] + public bool? Complete { get; set; } + + + + /// + /// Returns the string presentation of the object + /// + /// String presentation of the object + public override string ToString() + { + var sb = new StringBuilder(); + sb.Append("class Order {\n"); + sb.Append(" Id: ").Append(Id).Append("\n"); + sb.Append(" PetId: ").Append(PetId).Append("\n"); + sb.Append(" Quantity: ").Append(Quantity).Append("\n"); + sb.Append(" ShipDate: ").Append(ShipDate).Append("\n"); + sb.Append(" Status: ").Append(Status).Append("\n"); + sb.Append(" Complete: ").Append(Complete).Append("\n"); + + sb.Append("}\n"); + return sb.ToString(); + } + + /// + /// Returns the JSON string presentation of the object + /// + /// JSON string presentation of the object + public string ToJson() + { + return JsonConvert.SerializeObject(this, Formatting.Indented); + } + + /// + /// Returns true if objects are equal + /// + /// Object to be compared + /// Boolean + public override bool Equals(object obj) + { + // credit: http://stackoverflow.com/a/10454552/677735 + return this.Equals(obj as Order); + } + + /// + /// Returns true if Order instances are equal + /// + /// Instance of Order to be compared + /// Boolean + public bool Equals(Order other) + { + // credit: http://stackoverflow.com/a/10454552/677735 + if (other == null) + return false; + + return + ( + this.Id == other.Id || + this.Id != null && + this.Id.Equals(other.Id) + ) && + ( + this.PetId == other.PetId || + this.PetId != null && + this.PetId.Equals(other.PetId) + ) && + ( + this.Quantity == other.Quantity || + this.Quantity != null && + this.Quantity.Equals(other.Quantity) + ) && + ( + this.ShipDate == other.ShipDate || + this.ShipDate != null && + this.ShipDate.Equals(other.ShipDate) + ) && + ( + this.Status == other.Status || + this.Status != null && + this.Status.Equals(other.Status) + ) && + ( + this.Complete == other.Complete || + this.Complete != null && + this.Complete.Equals(other.Complete) + ); + } + + /// + /// Gets the hash code + /// + /// Hash code + public override int GetHashCode() + { + // credit: http://stackoverflow.com/a/263416/677735 + unchecked // Overflow is fine, just wrap + { + int hash = 41; + // Suitable nullity checks etc, of course :) + + if (this.Id != null) + hash = hash * 57 + this.Id.GetHashCode(); + + if (this.PetId != null) + hash = hash * 57 + this.PetId.GetHashCode(); + + if (this.Quantity != null) + hash = hash * 57 + this.Quantity.GetHashCode(); + + if (this.ShipDate != null) + hash = hash * 57 + this.ShipDate.GetHashCode(); + + if (this.Status != null) + hash = hash * 57 + this.Status.GetHashCode(); + + if (this.Complete != null) + hash = hash * 57 + this.Complete.GetHashCode(); + + return hash; + } + } + } - - /// - /// Get the JSON string presentation of the object - /// - /// JSON string presentation of the object - public string ToJson() { - return JsonConvert.SerializeObject(this, Formatting.Indented); - } - -} } diff --git a/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Model/Pet.cs b/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Model/Pet.cs index 37c80259944..3c5264fe8c8 100644 --- a/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Model/Pet.cs +++ b/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Model/Pet.cs @@ -6,89 +6,176 @@ using System.Collections.Generic; using System.Runtime.Serialization; using Newtonsoft.Json; -namespace IO.Swagger.Model { - - /// - /// - /// - [DataContract] - public class Pet { - - /// - /// Gets or Sets Id - /// - [DataMember(Name="id", EmitDefaultValue=false)] - public long? Id { get; set; } - - - /// - /// Gets or Sets Category - /// - [DataMember(Name="category", EmitDefaultValue=false)] - public Category Category { get; set; } - - - /// - /// Gets or Sets Name - /// - [DataMember(Name="name", EmitDefaultValue=false)] - public string Name { get; set; } - - - /// - /// Gets or Sets PhotoUrls - /// - [DataMember(Name="photoUrls", EmitDefaultValue=false)] - public List PhotoUrls { get; set; } - - - /// - /// Gets or Sets Tags - /// - [DataMember(Name="tags", EmitDefaultValue=false)] - public List Tags { get; set; } - - - /// - /// pet status in the store - /// - /// pet status in the store - [DataMember(Name="status", EmitDefaultValue=false)] - public string Status { get; set; } - - +namespace IO.Swagger.Model +{ /// - /// Get the string presentation of the object + /// /// - /// String presentation of the object - public override string ToString() { - var sb = new StringBuilder(); - sb.Append("class Pet {\n"); - - sb.Append(" Id: ").Append(Id).Append("\n"); - - sb.Append(" Category: ").Append(Category).Append("\n"); - - sb.Append(" Name: ").Append(Name).Append("\n"); - - sb.Append(" PhotoUrls: ").Append(PhotoUrls).Append("\n"); - - sb.Append(" Tags: ").Append(Tags).Append("\n"); - - sb.Append(" Status: ").Append(Status).Append("\n"); - - sb.Append("}\n"); - return sb.ToString(); + [DataContract] + public class Pet : IEquatable + { + + /// + /// Gets or Sets Id + /// + [DataMember(Name="id", EmitDefaultValue=false)] + public long? Id { get; set; } + + + /// + /// Gets or Sets Category + /// + [DataMember(Name="category", EmitDefaultValue=false)] + public Category Category { get; set; } + + + /// + /// Gets or Sets Name + /// + [DataMember(Name="name", EmitDefaultValue=false)] + public string Name { get; set; } + + + /// + /// Gets or Sets PhotoUrls + /// + [DataMember(Name="photoUrls", EmitDefaultValue=false)] + public List PhotoUrls { get; set; } + + + /// + /// Gets or Sets Tags + /// + [DataMember(Name="tags", EmitDefaultValue=false)] + public List Tags { get; set; } + + + /// + /// pet status in the store + /// + /// pet status in the store + [DataMember(Name="status", EmitDefaultValue=false)] + public string Status { get; set; } + + + + /// + /// Returns the string presentation of the object + /// + /// String presentation of the object + public override string ToString() + { + var sb = new StringBuilder(); + sb.Append("class Pet {\n"); + sb.Append(" Id: ").Append(Id).Append("\n"); + sb.Append(" Category: ").Append(Category).Append("\n"); + sb.Append(" Name: ").Append(Name).Append("\n"); + sb.Append(" PhotoUrls: ").Append(PhotoUrls).Append("\n"); + sb.Append(" Tags: ").Append(Tags).Append("\n"); + sb.Append(" Status: ").Append(Status).Append("\n"); + + sb.Append("}\n"); + return sb.ToString(); + } + + /// + /// Returns the JSON string presentation of the object + /// + /// JSON string presentation of the object + public string ToJson() + { + return JsonConvert.SerializeObject(this, Formatting.Indented); + } + + /// + /// Returns true if objects are equal + /// + /// Object to be compared + /// Boolean + public override bool Equals(object obj) + { + // credit: http://stackoverflow.com/a/10454552/677735 + return this.Equals(obj as Pet); + } + + /// + /// Returns true if Pet instances are equal + /// + /// Instance of Pet to be compared + /// Boolean + public bool Equals(Pet other) + { + // credit: http://stackoverflow.com/a/10454552/677735 + if (other == null) + return false; + + return + ( + this.Id == other.Id || + this.Id != null && + this.Id.Equals(other.Id) + ) && + ( + this.Category == other.Category || + this.Category != null && + this.Category.Equals(other.Category) + ) && + ( + this.Name == other.Name || + this.Name != null && + this.Name.Equals(other.Name) + ) && +// ( +// this.PhotoUrls == other.PhotoUrls || +// this.PhotoUrls != null && +// this.PhotoUrls.Equals(other.PhotoUrls) +// ) && + ( + this.Tags == other.Tags || + this.Tags != null && + this.Tags.Equals(other.Tags) + ) && + ( + this.Status == other.Status || + this.Status != null && + this.Status.Equals(other.Status) + ); + } + + /// + /// Gets the hash code + /// + /// Hash code + public override int GetHashCode() + { + // credit: http://stackoverflow.com/a/263416/677735 + unchecked // Overflow is fine, just wrap + { + int hash = 41; + // Suitable nullity checks etc, of course :) + + if (this.Id != null) + hash = hash * 57 + this.Id.GetHashCode(); + + if (this.Category != null) + hash = hash * 57 + this.Category.GetHashCode(); + + if (this.Name != null) + hash = hash * 57 + this.Name.GetHashCode(); + + if (this.PhotoUrls != null) + hash = hash * 57 + this.PhotoUrls.GetHashCode(); + + if (this.Tags != null) + hash = hash * 57 + this.Tags.GetHashCode(); + + if (this.Status != null) + hash = hash * 57 + this.Status.GetHashCode(); + + return hash; + } + } + } - - /// - /// Get the JSON string presentation of the object - /// - /// JSON string presentation of the object - public string ToJson() { - return JsonConvert.SerializeObject(this, Formatting.Indented); - } - -} } diff --git a/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Model/Tag.cs b/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Model/Tag.cs index 7d2ea38833b..6e8f84b89e9 100644 --- a/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Model/Tag.cs +++ b/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Model/Tag.cs @@ -6,52 +6,111 @@ using System.Collections.Generic; using System.Runtime.Serialization; using Newtonsoft.Json; -namespace IO.Swagger.Model { - - /// - /// - /// - [DataContract] - public class Tag { - - /// - /// Gets or Sets Id - /// - [DataMember(Name="id", EmitDefaultValue=false)] - public long? Id { get; set; } - - - /// - /// Gets or Sets Name - /// - [DataMember(Name="name", EmitDefaultValue=false)] - public string Name { get; set; } - - +namespace IO.Swagger.Model +{ /// - /// Get the string presentation of the object + /// /// - /// String presentation of the object - public override string ToString() { - var sb = new StringBuilder(); - sb.Append("class Tag {\n"); - - sb.Append(" Id: ").Append(Id).Append("\n"); - - sb.Append(" Name: ").Append(Name).Append("\n"); - - sb.Append("}\n"); - return sb.ToString(); + [DataContract] + public class Tag : IEquatable + { + + /// + /// Gets or Sets Id + /// + [DataMember(Name="id", EmitDefaultValue=false)] + public long? Id { get; set; } + + + /// + /// Gets or Sets Name + /// + [DataMember(Name="name", EmitDefaultValue=false)] + public string Name { get; set; } + + + + /// + /// Returns the string presentation of the object + /// + /// String presentation of the object + public override string ToString() + { + var sb = new StringBuilder(); + sb.Append("class Tag {\n"); + sb.Append(" Id: ").Append(Id).Append("\n"); + sb.Append(" Name: ").Append(Name).Append("\n"); + + sb.Append("}\n"); + return sb.ToString(); + } + + /// + /// Returns the JSON string presentation of the object + /// + /// JSON string presentation of the object + public string ToJson() + { + return JsonConvert.SerializeObject(this, Formatting.Indented); + } + + /// + /// Returns true if objects are equal + /// + /// Object to be compared + /// Boolean + public override bool Equals(object obj) + { + // credit: http://stackoverflow.com/a/10454552/677735 + return this.Equals(obj as Tag); + } + + /// + /// Returns true if Tag instances are equal + /// + /// Instance of Tag to be compared + /// Boolean + public bool Equals(Tag other) + { + // credit: http://stackoverflow.com/a/10454552/677735 + if (other == null) + return false; + + return + ( + this.Id == other.Id || + this.Id != null && + this.Id.Equals(other.Id) + ) && + ( + this.Name == other.Name || + this.Name != null && + this.Name.Equals(other.Name) + ); + } + + /// + /// Gets the hash code + /// + /// Hash code + public override int GetHashCode() + { + // credit: http://stackoverflow.com/a/263416/677735 + unchecked // Overflow is fine, just wrap + { + int hash = 41; + // Suitable nullity checks etc, of course :) + + if (this.Id != null) + hash = hash * 57 + this.Id.GetHashCode(); + + if (this.Name != null) + hash = hash * 57 + this.Name.GetHashCode(); + + return hash; + } + } + } - - /// - /// Get the JSON string presentation of the object - /// - /// JSON string presentation of the object - public string ToJson() { - return JsonConvert.SerializeObject(this, Formatting.Indented); - } - -} } diff --git a/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Model/User.cs b/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Model/User.cs index 5430d1182cb..aff43555136 100644 --- a/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Model/User.cs +++ b/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Model/User.cs @@ -6,107 +6,208 @@ using System.Collections.Generic; using System.Runtime.Serialization; using Newtonsoft.Json; -namespace IO.Swagger.Model { - - /// - /// - /// - [DataContract] - public class User { - - /// - /// Gets or Sets Id - /// - [DataMember(Name="id", EmitDefaultValue=false)] - public long? Id { get; set; } - - - /// - /// Gets or Sets Username - /// - [DataMember(Name="username", EmitDefaultValue=false)] - public string Username { get; set; } - - - /// - /// Gets or Sets FirstName - /// - [DataMember(Name="firstName", EmitDefaultValue=false)] - public string FirstName { get; set; } - - - /// - /// Gets or Sets LastName - /// - [DataMember(Name="lastName", EmitDefaultValue=false)] - public string LastName { get; set; } - - - /// - /// Gets or Sets Email - /// - [DataMember(Name="email", EmitDefaultValue=false)] - public string Email { get; set; } - - - /// - /// Gets or Sets Password - /// - [DataMember(Name="password", EmitDefaultValue=false)] - public string Password { get; set; } - - - /// - /// Gets or Sets Phone - /// - [DataMember(Name="phone", EmitDefaultValue=false)] - public string Phone { get; set; } - - - /// - /// User Status - /// - /// User Status - [DataMember(Name="userStatus", EmitDefaultValue=false)] - public int? UserStatus { get; set; } - - +namespace IO.Swagger.Model +{ /// - /// Get the string presentation of the object + /// /// - /// String presentation of the object - public override string ToString() { - var sb = new StringBuilder(); - sb.Append("class User {\n"); - - sb.Append(" Id: ").Append(Id).Append("\n"); - - sb.Append(" Username: ").Append(Username).Append("\n"); - - sb.Append(" FirstName: ").Append(FirstName).Append("\n"); - - sb.Append(" LastName: ").Append(LastName).Append("\n"); - - sb.Append(" Email: ").Append(Email).Append("\n"); - - sb.Append(" Password: ").Append(Password).Append("\n"); - - sb.Append(" Phone: ").Append(Phone).Append("\n"); - - sb.Append(" UserStatus: ").Append(UserStatus).Append("\n"); - - sb.Append("}\n"); - return sb.ToString(); + [DataContract] + public class User : IEquatable + { + + /// + /// Gets or Sets Id + /// + [DataMember(Name="id", EmitDefaultValue=false)] + public long? Id { get; set; } + + + /// + /// Gets or Sets Username + /// + [DataMember(Name="username", EmitDefaultValue=false)] + public string Username { get; set; } + + + /// + /// Gets or Sets FirstName + /// + [DataMember(Name="firstName", EmitDefaultValue=false)] + public string FirstName { get; set; } + + + /// + /// Gets or Sets LastName + /// + [DataMember(Name="lastName", EmitDefaultValue=false)] + public string LastName { get; set; } + + + /// + /// Gets or Sets Email + /// + [DataMember(Name="email", EmitDefaultValue=false)] + public string Email { get; set; } + + + /// + /// Gets or Sets Password + /// + [DataMember(Name="password", EmitDefaultValue=false)] + public string Password { get; set; } + + + /// + /// Gets or Sets Phone + /// + [DataMember(Name="phone", EmitDefaultValue=false)] + public string Phone { get; set; } + + + /// + /// User Status + /// + /// User Status + [DataMember(Name="userStatus", EmitDefaultValue=false)] + public int? UserStatus { get; set; } + + + + /// + /// Returns the string presentation of the object + /// + /// String presentation of the object + public override string ToString() + { + var sb = new StringBuilder(); + sb.Append("class User {\n"); + sb.Append(" Id: ").Append(Id).Append("\n"); + sb.Append(" Username: ").Append(Username).Append("\n"); + sb.Append(" FirstName: ").Append(FirstName).Append("\n"); + sb.Append(" LastName: ").Append(LastName).Append("\n"); + sb.Append(" Email: ").Append(Email).Append("\n"); + sb.Append(" Password: ").Append(Password).Append("\n"); + sb.Append(" Phone: ").Append(Phone).Append("\n"); + sb.Append(" UserStatus: ").Append(UserStatus).Append("\n"); + + sb.Append("}\n"); + return sb.ToString(); + } + + /// + /// Returns the JSON string presentation of the object + /// + /// JSON string presentation of the object + public string ToJson() + { + return JsonConvert.SerializeObject(this, Formatting.Indented); + } + + /// + /// Returns true if objects are equal + /// + /// Object to be compared + /// Boolean + public override bool Equals(object obj) + { + // credit: http://stackoverflow.com/a/10454552/677735 + return this.Equals(obj as User); + } + + /// + /// Returns true if User instances are equal + /// + /// Instance of User to be compared + /// Boolean + public bool Equals(User other) + { + // credit: http://stackoverflow.com/a/10454552/677735 + if (other == null) + return false; + + return + ( + this.Id == other.Id || + this.Id != null && + this.Id.Equals(other.Id) + ) && + ( + this.Username == other.Username || + this.Username != null && + this.Username.Equals(other.Username) + ) && + ( + this.FirstName == other.FirstName || + this.FirstName != null && + this.FirstName.Equals(other.FirstName) + ) && + ( + this.LastName == other.LastName || + this.LastName != null && + this.LastName.Equals(other.LastName) + ) && + ( + this.Email == other.Email || + this.Email != null && + this.Email.Equals(other.Email) + ) && + ( + this.Password == other.Password || + this.Password != null && + this.Password.Equals(other.Password) + ) && + ( + this.Phone == other.Phone || + this.Phone != null && + this.Phone.Equals(other.Phone) + ) && + ( + this.UserStatus == other.UserStatus || + this.UserStatus != null && + this.UserStatus.Equals(other.UserStatus) + ); + } + + /// + /// Gets the hash code + /// + /// Hash code + public override int GetHashCode() + { + // credit: http://stackoverflow.com/a/263416/677735 + unchecked // Overflow is fine, just wrap + { + int hash = 41; + // Suitable nullity checks etc, of course :) + + if (this.Id != null) + hash = hash * 57 + this.Id.GetHashCode(); + + if (this.Username != null) + hash = hash * 57 + this.Username.GetHashCode(); + + if (this.FirstName != null) + hash = hash * 57 + this.FirstName.GetHashCode(); + + if (this.LastName != null) + hash = hash * 57 + this.LastName.GetHashCode(); + + if (this.Email != null) + hash = hash * 57 + this.Email.GetHashCode(); + + if (this.Password != null) + hash = hash * 57 + this.Password.GetHashCode(); + + if (this.Phone != null) + hash = hash * 57 + this.Phone.GetHashCode(); + + if (this.UserStatus != null) + hash = hash * 57 + this.UserStatus.GetHashCode(); + + return hash; + } + } + } - - /// - /// Get the JSON string presentation of the object - /// - /// JSON string presentation of the object - public string ToJson() { - return JsonConvert.SerializeObject(this, Formatting.Indented); - } - -} } diff --git a/samples/client/petstore/csharp/SwaggerClientTest/TestPet.cs b/samples/client/petstore/csharp/SwaggerClientTest/TestPet.cs index 5a42b8703c2..6fe0de92cac 100644 --- a/samples/client/petstore/csharp/SwaggerClientTest/TestPet.cs +++ b/samples/client/petstore/csharp/SwaggerClientTest/TestPet.cs @@ -144,6 +144,52 @@ namespace SwaggerClient.TestPet } + [Test ()] + public void TestEqual() + { + // create pet + Pet p1 = new Pet(); + p1.Id = petId; + p1.Name = "Csharp test"; + p1.Status = "available"; + // create Category object + Category category1 = new Category(); + category1.Id = 56; + category1.Name = "sample category name2"; + List photoUrls1 = new List(new String[] {"sample photoUrls"}); + // create Tag object + Tag tag1 = new Tag(); + tag1.Id = petId; + tag1.Name = "sample tag name1"; + List tags1 = new List(new Tag[] {tag1}); + p1.Tags = tags1; + p1.Category = category1; + p1.PhotoUrls = photoUrls1; + + // create pet + Pet p2 = new Pet(); + p2.Id = petId; + p2.Name = "Csharp test"; + p2.Status = "available"; + // create Category object + Category category2 = new Category(); + category2.Id = 56; + category2.Name = "sample category name2"; + List photoUrls2 = new List(new String[] {"sample photoUrls"}); + // create Tag object + Tag tag2 = new Tag(); + tag2.Id = petId; + tag2.Name = "sample tag name1"; + List tags2 = new List(new Tag[] {tag2}); + p2.Tags = tags2; + p2.Category = category2; + p2.PhotoUrls = photoUrls2; + + Assert.IsTrue (category1.Equals (category2)); + Assert.IsTrue (tag1.Equals (tag2)); + Assert.IsTrue (p1.Equals(p2)); + } + } } diff --git a/samples/client/petstore/csharp/SwaggerClientTest/bin/Debug/SwaggerClientTest.dll b/samples/client/petstore/csharp/SwaggerClientTest/bin/Debug/SwaggerClientTest.dll index c975e54d4bed8fc21372acb08c3eaa6fab9aa969..5e020c8b222027bde45f4a7a71a9cde3f078339b 100755 GIT binary patch delta 11756 zcmb`N2Y6J~wt&|;Q`4rLGczf)gb)}h5+q7O5u}I_u0{lGND)w}11W$HaN<>wi*PS^ zkX`~26huHG9U-&`(n1kYP;xa!t_BPGEKk9^*4jHWlZ5*|zwf>IzFD*Xwbm|c?Q-_a zH-%SBg|p3bm&e@z04u)n)wt2T^#dK{4Hf7^n5=-^G%rOrQj{Ul&90LM-#3g|N-Gr< zW4qE^H7mwtB_$CWDQE$>2j41K;M{6}U!DPUT6MKUNsfBk@Wx&Rta*a~q6-%)V1Aax zA}qCWdu~{LB}F4!n}d3~3SMmD4gfc(rh*u3&A$YP7oAD1TU(+apMCh5MLwpEHZ1z0 zGdJOf>Nn6QMpOJdup3i=C{|OM+H0uRQH@L=Hkk)2+}4om@({zBAtObKbTun%lG>=4+64%lTYB_3rc917+kbj9}E z0E3&{5*-eLhMARwMr)I-M}-=rk)zm+#)r|FddR}6(upu2Y}Po=Syao$svjpOx+NIr zM&&4-jI`0IN@pW`bZ@1LF%RW(BV|HTtm1?TfraR&`d5;|NE{QRtTN&zCK+9^RBZGa zlcuaOCXPwAzK)&DZeZk$@fsV(WYn9qSc-fD`h=nsleSa^xU<%zy^I>wzZ_k|lScGs zCXM{Ulh!HJl9)8I)|)gRJFP^MZqY1qkuX{{Yt1ULh*e^ZSS7g9aG309(`;6QuN41aV>Fhg_H$>{U!X#%Xc>z1$e%84(SI`uo;%r>0I1-X#i@eERYtUp0kc`|S#96cIIPez9 z%4aPtG2N}X{rfopMorTgF=cN50UE1DAHiBVV^3Yv*&(ZGxG|6BF$Ksvy8#cBBoFlF zo6>`M?8=*x_av<+TBCLLB&mb-HzlnFUYj_`EbK^bPEynIth0qzk(w4H&3}YD>v3hu z=@q+L=AG6d%`LhIYntZ?!L=wSp~jzc9X=rl+zdj9=+yc*piu?lK-9o2qm-o*O$x*+hqkVi;q_C9B6A#+-3YjO=kS z%2s2*xMXF!F$v{PJWXzXgv8MT!}#hRA&=s$;EIem_wPlG>c`VR;s_!7Ge-#dg^!T` z;k80KafDE*-iH2wo!&;1DL}GQN=T8lGgK6|z!G%G!dbxqmT(P{k=uYc>#w+kYk7!$ zFqZ3W=XxY%PgKmxsbhY$PLlB9_mjutVsX6s-MF;z#Uz*hk0k2B2)*WCM`8 z{`#lPL_CxTLrachc4On>sYVzG)~wa7wJQ>aDstrEii9B>hZnXHN?ZM>Agx&k_TK@6 zQ>QiqFh?7|jT@%yrv*z(b?}5HH+`;QCDnffo38U*+lP&1)moI86?EN?uHokz(VtnA z6rixQ^^yE}*`Q-EaT#1qSj4?Bb=zV^J|>@rdlgiZ%U5_Tk}O-57a zB;(G)(?Iwir=jHBc(a1Hk&gnsm1CItH01;z2ZJWWD5tnI9ZRRVv;s?KxwH>UA8@Gx zOCM4xw%8TAxqO88mHX>mNSu_OPjN7HCa#AH(4*GGwMUKWKZdU1i6i4V= zaaP+p4x(BjYtM2ul9APjvwq?A7jg(%MZM2hjVC5XM>4V=an}Ai4x-wdto@Lyk&LWH zEbk3r2T@Jj8$LpZAU{mSU5i+!+Z`cZ9K=Hwx$a$y9qFmc58%6CH7;5{7I%d7*kiKXJ&&Qxr1#2}3rX zhOmt=WaC_iZG<5k<%8CGof``$%p9Z}4kb&vA$MOn++h)qXZ)v4r>cNk|auo*Sh-2Jr6-{Im%RNRHdyjM`f*qUUH7M}AFZMjD2 z#DqR&STi=S6cuq%k&PWdO;m0tH@0vHi}7>lR8R9otTj;|c z*k+{WrYLtC6La-M8c*(0s+@|(miVAFfd#imZ?eYmXp_+pV+*`*%**vPEJ5%er%E(t zyLc=U+XLH;^1Or~exi$yc7JpL_k%biL=_rjEjyj3Y_bQoVlmgG!32LhfL6JQ>`F>s z;3PIBz1}9TuHH z!I5DQw8D;Z4D<3cf;>%4&>UmSeG3!kZ;Q#P+l?4w?rE~8Q;LI_Mq3~}p-Y)}*7PFQ z*z89!!L`DxJ*PAUY3#y@Hn2876lw;_BkhVK%{E3AG)bV5%8s#?HMA>?q5@CHduh9P z^4w^Mj-L~St)}^SnXS&F#UFz!7%%VESg;51u)w9AiEV&p_Lm#q6vR71BPZ2qL!Z>< zZc5W^T+My{PaDzLHnC~&|8e_a416f)7PlpGC)2UuwuH|GEQbz;1U?ybtJ_-ZY;aqR zeG?OTaJnt86dTa(ZhK^-bUe82_0I>lT^1(# zv=Dw~+RwBOer2k*Q!{(uH>N1uo(0NrxX#p!=@a;a=`N;kKv8(0Ok@cX&SG>a7B;@a zl%m*}K4H2|iDLShsizXdq+xywl>SN_Q##W~#mUr%X|m#G>J&?!GZkHV9{Wpi0%mQo z60ayF-%nj06?|4}=fG*_SD9s|*1@5MXd&86AzFbpbBNY!cRDcV{3^5T*7`ay%aTr` z4U;9Q0&SQqNk3|X9TDO9EQu170&`P^jS|!p$|X^PQi0E8thYOeS!f1R z=!iz745dLub3v4$=8)V%5M`(ZZ1xNK0~6$j?<7%zZh@ICg^d!_8ZJnp1hs_`t%Z#e z)DAXCdO!~@akPg)c-9y>tPpM2*F?}!eOm;b)8BP=40%@SN1UBP z^u2!4**Qce&qiC95IH>;g3dePJe@~kN*rC`_YiHgbpv-VwgFAkU63q^rl~u06U5Wh z9UhfL)6^YCFjXlOL=V_-H?>lwP!K(!QW6Cb>;W0~2qQ(&6Y?cd6usa|wy;qYcZ2_4 zK@>%Am`3LyHi}U=xe`*DCD}8<#g&*^c_z8I5>qG7bQf1*8sK@!)i;PmdX-u7(fAhu zNORD5Ux?oHq(t2xqOG1+Tn~ikkf$F!7@||2%@K6jv&qz2xNwnswL+aWA}5H--(!6HHS!@i&F8(@p1v%coh8(@#5fBL?*zXj)+p0i)`HPtu5WnrT( zU=v(nT3|QD`=U01@*;J=!0w7~p$9iXti(oW+ze@wTB30?q)Y06wznZ$Qg5`q4gDoO zgtjd(LDFcnZGj3wFdc0rFlz>NI4|Ml_||#}>=6X7#HZ^eM&6uw_uBYQ`a7V$L|!xO zZ^id9md;5Gz7xOEwiVJ@TL#NxC&M<_EPUYIc%tLdcGle|W*dCRRHdACKc;VoJu|7b zGWgj2lYIv?`5U**>DU2&L3ZkQ2XvQ&{UY_1bUKK}o$#c@i)h>l6C`~RKUd!cvm{-M zFG89x>5uqz`fk`LDK=p@(hf<936o(DoRQQlVWVviT$0o_;jsQL{3NM!Lhu7bm?fg1 z==Vax%NzwqzZWu?%7CKZ3lB3<^q=bc0RArOQS_yd{Eu+-rQjFD(U(GZNfdo4^p%vI zFfZuY4^K)Qn6MOSf~09Nli>i&l0?&V0Om^?p0LVu5H?DhnD92z4oSg;U7ka5M$*iL z<4BhzQDzRqPm(Az^o@9KIQlX$&kILi2FXk!`ZDOrMA4u3yayZb7nqv4KLSC6>+#$l zfti9h`XjJf5=DOmHb|lXj|QPkB1L!<%9+GMd>?Y~R~ZSL$0LLXe)j`BJXPb9f$p5d?9G{op(tS|%FRn7)&g#AIF}Y_~GGRtoCEbVbsGOc_PO_5{j_zd#33;BugUOhwwuCu^f!uYEcGJXV=nPKBc@S`NMeGH|Y!nTj0ToTzX!l66Ewu^9164@@nhP%SH zORz^0**<|IJ<%4FQG5b>_*N(e^C`6Ei=T+_Q|K&-DqeZC^m9B(hb(lmOd;Jcm^pm(V#kT=7fjD~T#zfgkh3wku#R5Ja|r!Cbyl ziLCt#rtx(^1o#ys@Y7k?z5+iJ-gLJ6Z2H&GQ{rBvYB1)$+R#`(zp!M|{Iw?gV*Hk@ zz;3sZzQ|t-l4~qvKWq-m8a>v?2-hfGG}tI#)XZqS*rUhbp%#meoj81iIN%j8)YNW4hmY5SWT-9M9j8cm& zlVYCd^53w$(ipcgzR8i8Qr7I3@*w=69^~>-^!e5(UfD@$Z(Ls4DREHjFcY;i%tSuJ zxjf2LY?)!SFG^L87!MUqR^BvD6~!y(j4z8)6K}*0!=Ja%-^~789%U}Jv@lXvr6&F* zZWU`*v9*}X>(DyM7_ur=SyuA=sx^wyvABD~QV%s!!4kYw9^vg_9tf|YG}afljw|w! zvXo_oak@A@n4CbGZY+ngEEMHL(igHUVp+X9OWGE%yUk07CQg#{M4zt5?sAp_qy(P^>;n# z+U+WJ9d;da{p`B#GP%>;cep#dySw|iA9as+Pj+w0cHg26)^fFJnxSpdwrVG|kF_tg zYua_qp?A=G=>7F!`ZM|>eT#lVuherq3q0#Q2R*-dnt6M9AM+0Nj`QYwr+HuX?(!Nl z)}#lIdhuU#5S9xPPom~|?^#}F8Jkp% zdS?=~Bg!7uBqjZbn$)DED1~eNMlbU~`*1@8 zSPo`+h4mx2JQ}++7OdS9Tn?#tx~xE{!b(WPauG@uR^iXJ3amz{;_sxlVEHwaDy)H4 zSYC@##V1x}6~CUe#qws9D!dKtu)GDO3MJ4U%kQ96VJqB@e{xV@7fKcOLnkaBK&iq(=z`@#C{;Ly|Cv(ow$&BOC*UqDpG2wR<){ai%TcO$ z;pv6tGbmL!3%#*?4yB5}GG}A?JW3Ux;C--s0i}u$Wy@a>J~jrt(Y|X!Y~$Fp*!SWt z#9fYS>}chfssGJ$$@7(`i`QI84}r*60sfYZ2Xg4u&v(Rl_l>lt`uTRNq^xZ_jott@ z67uz!&*z|Gq~8eNC+rug>*ou)$xp>!uFc@!JHt5NHznEYyoz(7ay4$D@(aFgj)jV| zWZe3_?v{c4r$^>O?~(Zfhm9>5d4F!tkxvdQ7@H5hCKe1En@5IwhUGooBQRp5(Q?l# z*6h6gxdkIjcJJwJiOnXT{9#Xw9XYgJiE?1QV&O_9YY#3^O1d02>8?}F$LIHdc0jMa zxvN_YwXEM(l5?R?jK!R+s11#!pI@}wKvmuNDw$OIgJLn`@6Kw;sH$|!?G|*=TF2Wg zs@EN-MAs1xo7o;#*==6!xn~ruwXyi?`+{6EeT>a})0*L0wM*Pw9pQG9PkqS^M~F;Y zY>mu~wvF##F~ delta 7275 zcma)>3tSX+yT^Ys?6M0Bdzsk_3#K4KWT<$_yoZ-Gql=;WmYG3mg{G^EhQ2C`riNxE zj%g|0?Nt;3UGvIGK*CHk?P8gk^uEfmEX}mrTiSX4|M|B|=XB2J%;z%?&-eK~|J(DQ zof*fX#fGAb5ldFbeghzqPC8z(lx!Vo&9q3!Vwfnw98r>_YDv-)(aSEe2%X<(i=^A- z%h2{nsq**G&Phq$$<%}$_s}WBh+WHodCvoq*7^54gTv%5Pqj8mh|C`iL>H})U?}9~ zb@DnmoHrvQgX_kn8?>fp-CFkv1EikXj0wq7FKzXNAyRMc0@;;Xhv!nHQtk1)cx~cy z7HN$p{XIUWlMR!7E2vL7ZJoB35;kZ}GhEtdl(0!_e(nJ+aY{F-kM{7CAyQv$^^|0( zpH@3%f>fq;@TauhM$7i?rpEq-v7(#QNdHl5sLSoVvxR<(RH?n@Pt>ygZtbYwqUHPD zODA^YlU+XTX=yJ_Dn;7QlK%*wD)^DsaBTVz=^&qRrx_NhmiIPnhDB@pygO!yJv7Wa zOo+)12M+VVv~b`E54;)<9Hl^_bc|~7;HU@W#9_As<7amS400OnLv(vJ!+?Xd6?Xv+ z6o4=Hd#nh(9`277^zrwaz2Pi)#e-A}t zqgr;ck0Me2-VSOeC6zq*;l1)D@<}_vMD+9 z9TW@CN&B+UGra#_DQvchlxs2hXhG32X8(2?GOZJEJDtRD zXjy^yzzzzyeRZs-z2q)70ttEpHhann>r@=QFSDG7-XHIjG_?P-(Lj0oJMzXSei{aR8{ zLg3F!G=-OF;*9j&$%Vn}l@(5d{=AF}xel1Bw&VZg4uHS!Ojz2(^HMQ8`Rh&aR{Qq07*cCCS z7PGa}KI$7_V80X$)UM8HLsN6ib-UTmgw~xx%V>`TntK5y4AT0}jUU8*5f-|v6G)4J z*;h}j8hTJF6hqoOM6rl!ahbBqGAg`hEU7_THMfJKb&FqX4z<2pn=&u8C-2^WhE_^r zD7nWrfS=xztY5j(E1(FMaYWmw4PyXC;4%7vfX3P ziFk_LO@A$PrqY>3XQEaz-zB{j+&o{B2Oe;oaI{4ew^z886c&jm8;LuW19Bt=ll9Vz|#>S!I)q)eRUbc54FILE1Tim6MOt@3@8loA)A) zcIgK$?&6dr{lw`kr!LYjoPOdoNcxqNLY18+jgW3|%HT9k`khl2rvgcm*a*F2SY|Q# zFAyc!KvjD~GD%X>NTXs2s#ET>(n+Ni}=SBToH%dBx2mdFAN;$|AwTNChnh$>92@RCmGr3NZY zx1dzuV6}iQ#A=<)+3GfHYn&34qpl}v;?yj$s(gxXQn0@ikzo}#C+vZbJj{pLtyWlKfktva!?-HNI-osLn}((s)iR<+wu z++NpM)za~)AXc?b7@MwZtZJQ6E{Ihv&=sRQ>LM#!cjnU3V4SWlu=Uh|XuhhopcU$- z7PLX#X6qHo+^O!i^$yWNwc6GvL?_h>Q{NDsRU2&mVsMJxp7edvdN20|dQnn;B(ggY z7JzNZ0A%XKw`2fD31V9^0Ao2dOKideQ9hWpYnIrA2jaXSHsOKjc8{*H2@k?lL2SZz zowwrji#pcM8*z$qPO$SvoRXc> z?Dvt!jt1iZ((c!R=rPjhzRiyY;|ymYDeA!xzThmfKNO;+&TI@1(Q0Q^3)=2nWDjcx zoJ;H@LYc>%EA0=5=(Kaa{cj=q%2{E0G(^{(4OZJIbR5Yd{HLRxTcK~spJl*8H1gI*p`ezHK%5YRp<$P!$)hDScP(s{s`;4Sz;B+#b`cuv&1U&BuWLb3O$9! zQF`WM0TRa|h8~ct;S6U|)HoE=zcd)J3O$1pf>?#}@ZICO#wwJDv@trd3gw~n37uGl z#^ZBAtU?oznX7B8LK9Ie=qo4PBYgP$NnNB8*(PI60V7tS3eyxc>SQ*!3gAbxAcw2M z@hx9otb2)~)Pb(WyD(DHy+?0UKxlAlUp8E&oO^g;) zK%~90GJZ&ex*49h4r=a!j)aY_l3#xQqGH=HzPIJsPZo776 zr8jWW?T)I1G@tdh-28>xrB)(F&?VBUkRs@3(yEXl$mnrL?Z8k$E{{vyff0gINZX0Y zf_jj)6HPiHi?kpXEnwr7#68-}6R!qQts`DU>OPDTbS&VRN;p>FXEd4pC=_(TQ(@YVVnN?|3e^MHAn1nY z6{2!Z4OkshfNIn)ZE=}!ij1bf=ZnJt2lLU2%+e0*6P-a|>T7#v6hQ@tBR4Ry;8$c~~ z3uNo9MGYr?O?9Y$DZHjSH0i|GRELW?@io;!Ui`YM-FhQ()uk1AdC>?pY;gvQx2!P)%4GJ~*}-i($d5QrwuZhcGrNz+ zYq`A+o6;fTh@7OHjy)oGR4!0XU*&r2d2U!P8*W5*i1-a%EaxSI#Co_&ZC`Ur z5o{DIx?w`Jf{C~v3T`l~eY?F)^uWkcXGdg3zUkE56}#m_M(ub-y9cu@Psu7qB2V6E zoML%_`wPimX<5hp_1tdcwv6J3EH&J(74{IW$%nXqgw(IK{*}F@RBd);Z|{RKxe=`A z+z6KQ6!-HYHX3JWCo7YsL)s6O1@wV>VwFcatj(`V_Fj$2rSC43Z{Ydd&ogW^#%r~t zX2!1Pk@Z~N$o(=>^RydP$;#8gKPOZmV8G+tTU<|_ces3m4UXTWn9qAoPcC0s> ztdIKv?l1I?q{wpbD6(t0-NNlIZV!3KP`rWnqx(mBjAWMyne zSMn>!%BaL0*IKzcWC8WCYQZU>8{#d(oTxePm^NG3-nJ0kSgvkH%f(*N~Oz z1*$*!b!26F)fq^BJz1IFN$w`Ufvk+f7()KLWMz7F7)t(oWMv$sPnHrrPP52A2IKt% z$2HU5u6L+0-k8Lg{jo=5KZtc$y;egJyUVsb(&_W0p+%tH8PI0zO$pRH56CS1XRVmB z0TVOgIOcR)ncFh&lye!+YZ;?{9V}0#kD&%w`9t}f^G%+oAOb3#PC8w5x)Gt>vhRj% zj?@%8N4iAkzv+~Nx9xx1p(%|e!L5yhjlmly%cNk{hb2-l^J9Z*zcc67^Or__(|>DW zZu!=%`E!FKE@oM@P1nu@U%Y-z3I=}6Fly(2eL%bL+uhn5H->4}n?7l_R(Lbp4m>OV qvyV-%(4u{DGhUu-(f)mN(_2>QT0|6;GlrBUz4tf_(iN#B!}MQ17I9|) diff --git a/samples/client/petstore/csharp/SwaggerClientTest/bin/Debug/SwaggerClientTest.dll.mdb b/samples/client/petstore/csharp/SwaggerClientTest/bin/Debug/SwaggerClientTest.dll.mdb index 5c1092d07fca586d960495ae792c0d8c2f9a8e0f..915a29526545d08d305da895ba140ded4178cc07 100644 GIT binary patch literal 21049 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 K4rcXufd3Ehs4epV literal 19469 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 delta 7275 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 diff --git a/samples/client/petstore/csharp/SwaggerClientTest/obj/Debug/SwaggerClientTest.dll.mdb b/samples/client/petstore/csharp/SwaggerClientTest/obj/Debug/SwaggerClientTest.dll.mdb index 5c1092d07fca586d960495ae792c0d8c2f9a8e0f..915a29526545d08d305da895ba140ded4178cc07 100644 GIT binary patch literal 21049 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 K4rcXufd3Ehs4epV literal 19469 zcmdUX30M=?`u;bW00|-01W*YG2qK6eny6?3R-w?UwQ3a?a7!R6$Yv5;>w;FRxG%Nt z)z)3>T6e8`+iMqFt*ut;)~nU)R$JG){oXT^Oi2Z8?{okE2gNteeB;8{8NCH!V%G2E-uY(wb|naWas8)oAWaJSo3?wB^P8_<1+1i%(lWf z`v7zA-d0;|CTzW}`Eho0USY1)9+#P$ZOwPY6}b?YqoFQor_&)eg*WtJ&Q)!{=c+lZ(IJ|k>ls?%?%HF>);5QR{{NJ=}@-&+^!b8 zH|>gBoj^gGX0U?i%#q z(fIsh_Sde^`xUGotugE6#wD8_*4_oSL1m1@feoL}_m#c(b^81kft5Pn>{;Q?X|V@w zY*|)Y8SbC_a!RuN!0}%B+qSfs*J|w*no}VM0GEU^oX^PmV1X?$wQ#|q@k`pR&Wx>~ z&UY~PF2i}-9dq+0OGkd5r-;tGHCg^ug}W4siNh`jWq3a;tLK{HGmn}aDXKKDq_XD| z>ihqE9l;h8W#>WV2^pyqcho6vx-sYe$Np_*QNRB$&OGZn6K%bc@L=%S#j7hDW7f7C z=1UxrjEE4v{OGLTIcMQ@jzd8N_t1|X`8{?sMsrjBX`26Zf0C)lqtNW=(}Or~#%;|ubDkaM zennQ>Am3k&k?Ru-PS9Os{4GMSQ-BfiomB_}5( z=^I(%wZ_zm+BvzpQM#NQy-AnBC_xNTa7buyuv)FIZBT1s8U?GXsjG#l)s32|LpAX^ zZ&lSsfQq@QY9+VSpY~TdP(>I9M2cHkl~z?>h7?a+EgqZXm#zL~aD*aIH zcr_^`y8`HwfZYKVKO{T&GD6b8m}J!RUNR5v>15GPn=YI-Pp3-_Q%bBWVfu~Ygy{4e zi;M}4R&rkj(0_DSbW(s$2hy3qvw;;qK=b7PvjBy}H?QLgPytRQc1jhDaR%smAdRm+ zp}G{HC)H_0aB*cgQ*(_WC&{Ac70*nf&|2!J^C+}&k`$)CLxm{y9f>IE zYAU(O!L&N$qYx=dOG0UB=(5m?AEgT(oWHTGD6vzmk+G#wZ(uL+PoHq&>|B1NLK-!T zR@X4T65~oO+uLGl*~SU8^`=ldQsZb1DP+gP=tS6$VHH1QM?IgBSPfa+8vpZX)ku7` zt}9UPSG7xFG`i-Pno^ubL{M?W$cTy`r`=x9h?6U|EdNbv#lG3Kv0BJ4=Q^PD>8RwU zM9@dI*3^Mt&SA9Lr^VP8mx$*}h2HA9+Bk)Bi7PIN8NW`X%y`R9@`9ij$3r zqIaUkM!A|OabL&DmPFCgsAW>|G;t*-I}k+&qdxtMIa+oyicUrS1ak#n%ORF?%394m zXL5adW_6BY-f&@3&BHvQj%%Wn{T4-&qo+i>#!>c1G(CuZh~tVMmwRQ!g{^X1Kefs& zf8p}yI=6Iw2h~!_O6t(EnB_52WM;(DyRkE4Uxdi8wQji=93gYc4^dcD8JFd-gj8vH zS2}}OoEFE@-n#qhN^#m5N4w%aiF*;^v>OZHe;Oz8lKk8#BDFM`iE?ahW-IDobyEYePEL==(-e zSa!$Lp7_1-FG5&0mURzY_C@6RVHq@D49lP?LRb#R)78e;8cSjMz6t%%{hbghrX(Hc7D>nLwiw-cEQCVs*c)Se0{? zEiZ@4T4VFm5@>DWx+TO=mTI5n^)uS+~69#Kx69;kCA0eJ* z`J-`~1x6_OrA=x7%LiVT0=2st?P<2R*^3aU-MG;$cM0;Wd8qs-mA#}@@`szz)#lfl zOHsOzL>H5ONqP~Yv;w!e(9p;~OiVn@aOi=SwB=>{DvUH>J|%)GhAT zy7Dhl>C4owBx?ezn`RWpk4Yfv#&J>oUZ?Uhb zR+q!1(J7OiR&9>XB~igm>XU>Yyg4!X&4gA6j8YwlQH_rFkJi+GB_KLl9Tw&vriqCU z2n!Qs?FN#ppCHLn6(VDsyxh8dW;QF+1Ry&mzDnP`y6QEO$x6kv^fMcDW&r0~lAtx3 z@LWqLd)ZrWNOt-X6sfMQR!7xSKeGRx|YUJODVtAl5V%W zgQ~nt-7DAZa9H!(J8XFH#PLeIm1P1p{cv(|%w=*;81s5dIT@FTuVG|ub2z?BHXE;l ztdYT)7GIM|Ys}Fl`G)o7AF~9J@tmTyF3IY2PZOoBsnKZa*45QD_{V7KYD~2>p-TDt zt>{3jldVXmBzczEVJ6NivmhVdIFPL3Q!_is72?A+M;~OT4STi*@}3@fW=Ccp-b*NY z!<=W8D?IHEo7J2rQ*u^?LiD(fLFCu2!Ra=qkf!f(coljxQZ`2>sspkkPIW|f)~U|Q zZp&EzPO=D_*pDT{Hw7^H>N7Hu^~quSWL<`D^vIEY!wg|rzS`v0+Vl+Hq=^;_NY~p} zmlf!nq)!kAyrw!*U0AVw39ap4!@psqe~5oTLQ;o-;DAt#CRn4c5~$YHP;2Tn zRBNiKH8s_0O0R+-a1PA9sqi)BtumvMf+Ni%$Xjm`!&dgq%D zy+McHIQs_6QkA(dyOniNM{{nGl{g>qsIAS~D|;ZGFyd1d%Q#Wswp-gWj}#8;Ku6Lb2YXJ6)_=x(j3zPb>Niq{E9Ga}(v`MX zQCF;R0~KUNDtull&c5;OXhOS*?QkNHr=_S@FRP6>S)QGf$&pK0NMa#ZeA;lFHi?r} z3u8_EfltUZ`5Anp4g4c#w~YO@{Cz=daSF*i#V*!TYc&4VG@4qPz#2;V@^u$QmsKzKcoQ-&}HCgBzbd6=jj<*T)7 zlT1MdUu}*l?3FORDJZ)o@kh*awWVIKOpPR) z@g{9~^P4waF?x&BB0fp4$k(=~b?w);FJ;%GpiR3@^3U4S=k5RHEb-v0a7Ol)m#PPQ zoNG_#+y5+;ROga#eMMP9OI2krj|c7PVf#l?X{1mply~W^s?2K4?m%-o%A|a5 zD1$wAbfBFbcDY-_J-+QgM>-sptQuA~!sC|?bg9E-cdOpxQ3rb5;fZKPHP7j3G$ZZZ zG_f5|K7_ruw&#awv^Z^vyS1+8wlvzFwnMT;h; zqK;m#AKy3Ed79T#SFKvrl-vr5q4a#zk>2Svwv)@F0FJLFtHkx}igr+|n&-Aow7t^~ zsoczI(@_*wv!>^XPV{4^lVS->UcYyuTb*t@YkFa&#XiDoRA+j-^XSgv=R2)IUb8#X zoX&G4Yapwu^IF@P)^%R*ZVmA|*qJ`<{28nqvC{}W^WwwNGh>3$n4XRoJzm5aAgZ#L zx0iQVU@b52n$@GBH6C6kJJY$&=cNxdV8OvAmmn{lhu54gG`GvVE`oEgDK>YZEnT*X z$8v?U3yM#>&}Usfcee&9PIaN5x}27*Viy#@b)nz8+;X>uD8{DKxb%{AF$fAijCD6i zu^^q^PhaS6t)cihoi?R!maMf|-5QER>GVbVm+sbDinHl-F8#b@tuKD=opidJe$U-n zLop$PCT2{^aQV=f)vd1hAcH>4SnO^MQ*6zkZ5i8Pl|ruIo0Sf^5cfY{*a!$?@zgLx z1jl%JN7c|fUuuQabt(*v;_D3hF5{Tgc;`|>quA7yHh109)ipHAZ@bcwu1CdVxzaf_ z%5z=meAl1dtwGAWUFlxe`;t`{no#A$ZZxUeDhut1Y)_Ov?l~cRZwC>ZpyL=F= zVajFQX?gb*l2sU*Amy&^^hx*K?$#R0quuGd?#E!2hDPZ=G{RVv@$%Hr2%{pLCbh#F zI8PX1d@wZ1%iZZl_g|&POAn3mn;!ISk0U)?L*sq52VLuNT|Ab1JBP;mVGnxL8KlVH+eQ4MP_2RKyWZ1Jny za#FGic@(I+VWD3wH{GqFs?nJ=Ci9(4mk+{SX0U2*Ce6#7?`{oOtT@Ly%Kyl2OgE(p>92t61j4zr?!W z?X%fRTdZ4Q^(3y4I7Oy&^EB>S3i}i|3es%3cH()5xi=PPc(s#tW zGvyeJ24e%$o1no7!cls1m;v8AG{mh$12n_?$UWIlHMtr;)nAe;@Z&Gq-UZ;BrYg%VT4u0ADlFaP})rW7$ZfJW7(UZ395>fF$ZU7HhgX;SXwTvr#k-*f3!?rrf{!H?(v*R5j9 zC|VtrM{nni&XZcboJar3yCNPd_-oH-wSfg)7WQS9>T!Z`gJS%%`Yi6tWW8p)GKJlk z_w(qFya#`}a5bN<_4~DGW&AT2j~|4% zN^N)04#!ThCA2JCTtrKXmKI4ZuYAr#mG|dF_1uQpBOF(s*&dsZi)d5PX0a{S_QL+O zsQ(B3rM4%riQ_q`D)hcgC$O2NoKr^J_v4BJ^JHCrTHk+z*fR5EVz?X1S+4aCzmgwD8*3mly4;XTUM{A0{sL!7B1*tLliI3I};cZ`x z;J$Re8x`bZi#Zxs%$0z|59DX!t9_K<%kH@_&MW5TyO+7X@ZJLR)?#iOE7jol-2(7i zZakocZVavk_(G?FQvg3`8`uK)L%#za4pf1j2c7{`gzzeF?<2!{5kL?i=3paUxtt$_}Ot^*wf)PQ~i zo%jwq47xjX1`rP2A06@nYC?|zj{+i~m!orWKrQI4;7#lp`V{yeP!IYc_%cu*IuHR+ z0(xj8I0`U8w*$WlG=S~{?hZ7BE<}(tKqKf8;GsY~bO{1h8)ytY2mBt;1bPF4mkb!8 z_kniAF#0>B^T@T>z42Jpp(XLE34AP2e= z_zj>hbRIYh$b}vS9t`9`|A2&w0rH_kkx=)c3!v*k#{z}Wt-*;vKj<8AI$(o-7d!y4 zLsv%vo`QBjH;W|NiQ^*Zq0nZaKlFa^GGG97Occ=#=z-8_&`p3r(8b_9U@-Io@FZXe zw0CWyZ=m0TUIN_?7z(`$ya5;n{R8+AFdX_O_}{q7?tBcWdfHw8vP zcLR3--iEe=bAZv%?;G0?NYGl6%Y*MgSfb# z?H7yRDh3unM}uns??X2O#{&zYJAzvSi=cDC_zimc0D2^N5bz=NEbwGtG4vYn5(el4 z;2pqH=sIZ~NSHo2*U(@(%hp=tj^6;CJW+;AG$y^cwIg;5KyCMC32@9q35tn!sJ?Dc}acJ?Mqt z`M`bX;HGE``VZ*3&~<{?k z0~~a0Gvqil`?@|6+6eH_L%^*8IrJp(c)$aCC3pdVts|bFgSP`5iGLhR2Cj<(9()}v z2Y&>k2e==Mp5VqXdV!fy0on&vf{Rh;4Q`4;75D+z2fPiH)ZkQ9V(pv&vvy8_SvzOI stex{<*3JbmYv&S}wQ~i`+PMzKf4Yem*3K<3Yv(SQwets Date: Sat, 21 Nov 2015 15:06:00 +0800 Subject: [PATCH 016/211] add upload & downlod progress for Java okhttp --- .../codegen/languages/JavaClientCodegen.java | 2 + .../okhttp-gson/ApiCallback.mustache | 18 +++++ .../libraries/okhttp-gson/ApiClient.mustache | 12 +++- .../okhttp-gson/ProgressRequestBody.mustache | 70 +++++++++++++++++++ .../okhttp-gson/ProgressResponseBody.mustache | 63 +++++++++++++++++ .../Java/libraries/okhttp-gson/api.mustache | 48 +++++++++++-- 6 files changed, 206 insertions(+), 7 deletions(-) create mode 100644 modules/swagger-codegen/src/main/resources/Java/libraries/okhttp-gson/ProgressRequestBody.mustache create mode 100644 modules/swagger-codegen/src/main/resources/Java/libraries/okhttp-gson/ProgressResponseBody.mustache 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 636f0157a52..0aba8c2c9d1 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 @@ -232,6 +232,8 @@ public class JavaClientCodegen extends DefaultCodegen implements CodegenConfig { if ("okhttp-gson".equals(getLibrary())) { // the "okhttp-gson" library template requires "ApiCallback.mustache" for async call supportingFiles.add(new SupportingFile("ApiCallback.mustache", invokerFolder, "ApiCallback.java")); + supportingFiles.add(new SupportingFile("ProgressRequestBody.mustache", invokerFolder, "ProgressRequestBody.java")); + supportingFiles.add(new SupportingFile("ProgressResponseBody.mustache", invokerFolder, "ProgressResponseBody.java")); // "build.sbt" is for development with SBT supportingFiles.add(new SupportingFile("build.sbt.mustache", "", "build.sbt")); } else if ("retrofit".equals(getLibrary()) || "retrofit2".equals(getLibrary())) { diff --git a/modules/swagger-codegen/src/main/resources/Java/libraries/okhttp-gson/ApiCallback.mustache b/modules/swagger-codegen/src/main/resources/Java/libraries/okhttp-gson/ApiCallback.mustache index 6eee875bdcc..bfc1aedbc11 100644 --- a/modules/swagger-codegen/src/main/resources/Java/libraries/okhttp-gson/ApiCallback.mustache +++ b/modules/swagger-codegen/src/main/resources/Java/libraries/okhttp-gson/ApiCallback.mustache @@ -28,4 +28,22 @@ public interface ApiCallback { * @param responseHeaders Headers of the response */ void onSuccess(T result, int statusCode, Map> responseHeaders); + + /** + * This is called when the API upload processing. + * + * @param bytesWritten bytes Written + * @param contentLength content length of request body + * @param done write end + */ + void onUploadProgress(long bytesWritten, long contentLength, boolean done); + + /** + * This is called when the API downlond processing. + * + * @param bytesRead bytes Read + * @param contentLength content lenngth of the response + * @param done Read end + */ + void onDownloadProgress(long bytesRead, long contentLength, boolean done); } 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 8ce2407cbe3..bbd2ac4661e 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 @@ -821,7 +821,7 @@ public class ApiClient { * @param authNames The authentications to apply * @return The HTTP call */ - public Call buildCall(String path, String method, List queryParams, Object body, Map headerParams, Map formParams, String[] authNames) throws ApiException { + public Call buildCall(String path, String method, List queryParams, Object body, Map headerParams, Map formParams, String[] authNames, ProgressRequestBody.ProgressRequestListener progressRequestListener) throws ApiException { updateParamsForAuth(authNames, queryParams, headerParams); final String url = buildUrl(path, queryParams); @@ -851,7 +851,15 @@ public class ApiClient { reqBody = RequestBody.create(MediaType.parse(contentType), serialize(body, contentType)); } - Request request = reqBuilder.method(method, reqBody).build(); + Request request = null; + + if(progressRequestListener != null) { + ProgressRequestBody progressRequestBody = new ProgressRequestBody(reqBody, progressRequestListener); + request = reqBuilder.method(method, progressRequestBody).build(); + } else { + request = reqBuilder.method(method, reqBody).build(); + } + return httpClient.newCall(request); } diff --git a/modules/swagger-codegen/src/main/resources/Java/libraries/okhttp-gson/ProgressRequestBody.mustache b/modules/swagger-codegen/src/main/resources/Java/libraries/okhttp-gson/ProgressRequestBody.mustache new file mode 100644 index 00000000000..57931ef4cfc --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/Java/libraries/okhttp-gson/ProgressRequestBody.mustache @@ -0,0 +1,70 @@ +package {{invokerPackage}}; + +import com.squareup.okhttp.MediaType; +import com.squareup.okhttp.RequestBody; + +import java.io.IOException; + +import okio.Buffer; +import okio.BufferedSink; +import okio.ForwardingSink; +import okio.Okio; +import okio.Sink; + +public class ProgressRequestBody extends RequestBody { + + public interface ProgressRequestListener { + void onRequestProgress(long bytesWritten, long contentLength, boolean done); + } + + private final RequestBody requestBody; + + private final ProgressRequestListener progressListener; + + private BufferedSink bufferedSink; + + public ProgressRequestBody(RequestBody requestBody, ProgressRequestListener progressListener) { + this.requestBody = requestBody; + this.progressListener = progressListener; + } + + @Override + public MediaType contentType() { + return requestBody.contentType(); + } + + @Override + public long contentLength() throws IOException { + return requestBody.contentLength(); + } + + @Override + public void writeTo(BufferedSink sink) throws IOException { + if (bufferedSink == null) { + bufferedSink = Okio.buffer(sink(sink)); + } + + requestBody.writeTo(bufferedSink); + bufferedSink.flush(); + + } + + private Sink sink(Sink sink) { + return new ForwardingSink(sink) { + + long bytesWritten = 0L; + long contentLength = 0L; + + @Override + public void write(Buffer source, long byteCount) throws IOException { + super.write(source, byteCount); + if (contentLength == 0) { + contentLength = contentLength(); + } + + bytesWritten += byteCount; + progressListener.onRequestProgress(bytesWritten, contentLength, bytesWritten == contentLength); + } + }; + } +} diff --git a/modules/swagger-codegen/src/main/resources/Java/libraries/okhttp-gson/ProgressResponseBody.mustache b/modules/swagger-codegen/src/main/resources/Java/libraries/okhttp-gson/ProgressResponseBody.mustache new file mode 100644 index 00000000000..061a95ac299 --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/Java/libraries/okhttp-gson/ProgressResponseBody.mustache @@ -0,0 +1,63 @@ +package {{invokerPackage}}; + +import com.squareup.okhttp.MediaType; +import com.squareup.okhttp.ResponseBody; + +import java.io.IOException; + +import okio.Buffer; +import okio.BufferedSource; +import okio.ForwardingSource; +import okio.Okio; +import okio.Source; + +public class ProgressResponseBody extends ResponseBody { + + public interface ProgressListener { + void update(long bytesRead, long contentLength, boolean done); + } + + private final ResponseBody responseBody; + private final ProgressListener progressListener; + private BufferedSource bufferedSource; + + public ProgressResponseBody(ResponseBody responseBody, ProgressListener progressListener) { + this.responseBody = responseBody; + this.progressListener = progressListener; + } + + @Override + public MediaType contentType() { + return responseBody.contentType(); + } + + @Override + public long contentLength() throws IOException { + return responseBody.contentLength(); + } + + @Override + public BufferedSource source() throws IOException { + if (bufferedSource == null) { + bufferedSource = Okio.buffer(source(responseBody.source())); + } + return bufferedSource; + } + + private Source source(Source source) { + return new ForwardingSource(source) { + long totalBytesRead = 0L; + + @Override + public long read(Buffer sink, long byteCount) throws IOException { + long bytesRead = super.read(sink, byteCount); + // read() returns the number of bytes read, or -1 if this source is exhausted. + totalBytesRead += bytesRead != -1 ? bytesRead : 0; + progressListener.update(totalBytesRead, responseBody.contentLength(), bytesRead == -1); + return bytesRead; + } + }; + } +} + + diff --git a/modules/swagger-codegen/src/main/resources/Java/libraries/okhttp-gson/api.mustache b/modules/swagger-codegen/src/main/resources/Java/libraries/okhttp-gson/api.mustache index efb1a14f27d..060de47c0d6 100644 --- a/modules/swagger-codegen/src/main/resources/Java/libraries/okhttp-gson/api.mustache +++ b/modules/swagger-codegen/src/main/resources/Java/libraries/okhttp-gson/api.mustache @@ -5,10 +5,16 @@ import {{invokerPackage}}.ApiClient; import {{invokerPackage}}.ApiException; import {{invokerPackage}}.Configuration; import {{invokerPackage}}.Pair; +import {{invokerPackage}}.ProgressRequestBody; +import {{invokerPackage}}.ProgressResponseBody; import com.google.gson.reflect.TypeToken; import com.squareup.okhttp.Call; +import com.squareup.okhttp.Interceptor; +import com.squareup.okhttp.Response; + +import java.io.IOException; {{#imports}}import {{import}}; {{/imports}} @@ -40,7 +46,7 @@ public class {{classname}} { {{#operation}} /* Build call for {{nickname}} */ - private Call {{nickname}}Call({{#allParams}}{{{dataType}}} {{paramName}}{{#hasMore}}, {{/hasMore}}{{/allParams}}) throws ApiException { + private Call {{nickname}}Call({{#allParams}}{{{dataType}}} {{paramName}}{{#hasMore}}, {{/hasMore}}{{/allParams}}, final ProgressResponseBody.ProgressListener progressListener, final ProgressRequestBody.ProgressRequestListener progressRequestListener) throws ApiException { Object {{localVariablePrefix}}postBody = {{#bodyParam}}{{paramName}}{{/bodyParam}}{{^bodyParam}}null{{/bodyParam}}; {{#allParams}}{{#required}} // verify the required parameter '{{paramName}}' is set @@ -77,8 +83,20 @@ public class {{classname}} { final String {{localVariablePrefix}}contentType = {{localVariablePrefix}}apiClient.selectHeaderContentType({{localVariablePrefix}}contentTypes); {{localVariablePrefix}}headerParams.put("Content-Type", {{localVariablePrefix}}contentType); + if(progressListener != null) { + apiClient.getHttpClient().networkInterceptors().add(new Interceptor() { + @Override + public Response intercept(Interceptor.Chain chain) throws IOException { + Response originalResponse = chain.proceed(chain.request()); + return originalResponse.newBuilder() + .body(new ProgressResponseBody(originalResponse.body(), progressListener)) + .build(); + } + }); + } + String[] {{localVariablePrefix}}authNames = new String[] { {{#authMethods}}"{{name}}"{{#hasMore}}, {{/hasMore}}{{/authMethods}} }; - return {{localVariablePrefix}}apiClient.buildCall({{localVariablePrefix}}path, "{{httpMethod}}", {{localVariablePrefix}}queryParams, {{localVariablePrefix}}postBody, {{localVariablePrefix}}headerParams, {{localVariablePrefix}}formParams, {{localVariablePrefix}}authNames); + return {{localVariablePrefix}}apiClient.buildCall({{localVariablePrefix}}path, "{{httpMethod}}", {{localVariablePrefix}}queryParams, {{localVariablePrefix}}postBody, {{localVariablePrefix}}headerParams, {{localVariablePrefix}}formParams, {{localVariablePrefix}}authNames, progressRequestListener); } /** @@ -88,7 +106,7 @@ public class {{classname}} { * @return {{{returnType}}}{{/returnType}} */ public {{#returnType}}{{{returnType}}} {{/returnType}}{{^returnType}}void {{/returnType}}{{nickname}}({{#allParams}}{{{dataType}}} {{paramName}}{{#hasMore}}, {{/hasMore}}{{/allParams}}) throws ApiException { - Call {{localVariablePrefix}}call = {{nickname}}Call({{#allParams}}{{paramName}}{{#hasMore}}, {{/hasMore}}{{/allParams}}); + Call {{localVariablePrefix}}call = {{nickname}}Call({{#allParams}}{{paramName}}{{#hasMore}}, {{/hasMore}}{{/allParams}}, null, null); {{#returnType}}Type {{localVariablePrefix}}returnType = new TypeToken<{{{returnType}}}>(){}.getType(); return {{localVariablePrefix}}apiClient.execute({{localVariablePrefix}}call, {{localVariablePrefix}}returnType);{{/returnType}}{{^returnType}}{{localVariablePrefix}}apiClient.execute({{localVariablePrefix}}call);{{/returnType}} } @@ -100,8 +118,28 @@ public class {{classname}} { * @param callback The callback to be executed when the API call finishes * @return The request call */ - public Call {{nickname}}Async({{#allParams}}{{{dataType}}} {{paramName}}, {{/allParams}}ApiCallback<{{#returnType}}{{{returnType}}}{{/returnType}}{{^returnType}}Void{{/returnType}}> {{localVariablePrefix}}callback) throws ApiException { - Call {{localVariablePrefix}}call = {{nickname}}Call({{#allParams}}{{paramName}}{{#hasMore}}, {{/hasMore}}{{/allParams}}); + public Call {{nickname}}Async({{#allParams}}{{{dataType}}} {{paramName}}, {{/allParams}}final ApiCallback<{{#returnType}}{{{returnType}}}{{/returnType}}{{^returnType}}Void{{/returnType}}> {{localVariablePrefix}}callback) throws ApiException { + + ProgressResponseBody.ProgressListener progressListener = null; + ProgressRequestBody.ProgressRequestListener progressRequestListener = null; + + if(callback != null) { + progressListener = new ProgressResponseBody.ProgressListener() { + @Override + public void update(long bytesRead, long contentLength, boolean done) { + callback.onDownloadProgress(bytesRead, contentLength, done); + } + }; + + progressRequestListener = new ProgressRequestBody.ProgressRequestListener() { + @Override + public void onRequestProgress(long bytesWritten, long contentLength, boolean done) { + callback.onUploadProgress(bytesWritten, contentLength, done); + } + }; + } + + Call {{localVariablePrefix}}call = {{nickname}}Call({{#allParams}}{{paramName}}{{#hasMore}}, {{/hasMore}}{{/allParams}}, progressListener, progressRequestListener); {{#returnType}}Type {{localVariablePrefix}}returnType = new TypeToken<{{{returnType}}}>(){}.getType(); {{localVariablePrefix}}apiClient.executeAsync({{localVariablePrefix}}call, {{localVariablePrefix}}returnType, {{localVariablePrefix}}callback);{{/returnType}}{{^returnType}}{{localVariablePrefix}}apiClient.executeAsync({{localVariablePrefix}}call, {{localVariablePrefix}}callback);{{/returnType}} return {{localVariablePrefix}}call; From a8119049ad7ecc8fd55f98b6dfee231a502ffd4e Mon Sep 17 00:00:00 2001 From: wing328 Date: Sat, 21 Nov 2015 15:16:38 +0800 Subject: [PATCH 017/211] add test case for pet equal --- .../src/main/resources/csharp/model.mustache | 10 ++++++-- .../main/csharp/IO/Swagger/Model/Category.cs | 1 + .../src/main/csharp/IO/Swagger/Model/Order.cs | 1 + .../src/main/csharp/IO/Swagger/Model/Pet.cs | 13 +++++----- .../src/main/csharp/IO/Swagger/Model/Tag.cs | 1 + .../src/main/csharp/IO/Swagger/Model/User.cs | 1 + .../SwaggerClientTest.userprefs | 19 ++++++++++++++- .../csharp/SwaggerClientTest/TestPet.cs | 23 +++++++++++++++--- .../bin/Debug/SwaggerClientTest.dll | Bin 67072 -> 67584 bytes .../bin/Debug/SwaggerClientTest.dll.mdb | Bin 21049 -> 21107 bytes .../obj/Debug/SwaggerClientTest.dll | Bin 67072 -> 67584 bytes .../obj/Debug/SwaggerClientTest.dll.mdb | Bin 21049 -> 21107 bytes 12 files changed, 57 insertions(+), 12 deletions(-) diff --git a/modules/swagger-codegen/src/main/resources/csharp/model.mustache b/modules/swagger-codegen/src/main/resources/csharp/model.mustache index c95d2f1a1b9..7ab48dc56e2 100644 --- a/modules/swagger-codegen/src/main/resources/csharp/model.mustache +++ b/modules/swagger-codegen/src/main/resources/csharp/model.mustache @@ -1,4 +1,5 @@ using System; +using System.Linq; using System.IO; using System.Text; using System.Collections; @@ -72,12 +73,17 @@ namespace {{packageName}}.Model if (other == null) return false; - return {{#vars}} + return {{#vars}}{{#isNotContainer}} ( this.{{name}} == other.{{name}} || this.{{name}} != null && this.{{name}}.Equals(other.{{name}}) - ){{#hasMore}} && {{/hasMore}}{{/vars}}; + ){{#hasMore}} && {{/hasMore}}{{/isNotContainer}}{{^isNotContainer}} + ( + this.{{name}} == other.{{name}} || + this.{{name}} != null && + this.{{name}}.SequenceEqual(other.{{name}}) + ){{#hasMore}} && {{/hasMore}}{{/isNotContainer}}{{/vars}}; } /// diff --git a/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Model/Category.cs b/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Model/Category.cs index 6b39196b2b7..7d3f0936dce 100644 --- a/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Model/Category.cs +++ b/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Model/Category.cs @@ -1,4 +1,5 @@ using System; +using System.Linq; using System.IO; using System.Text; using System.Collections; diff --git a/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Model/Order.cs b/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Model/Order.cs index 8346e1cc6d8..1f786769d55 100644 --- a/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Model/Order.cs +++ b/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Model/Order.cs @@ -1,4 +1,5 @@ using System; +using System.Linq; using System.IO; using System.Text; using System.Collections; diff --git a/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Model/Pet.cs b/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Model/Pet.cs index 3c5264fe8c8..d85d8a8be7e 100644 --- a/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Model/Pet.cs +++ b/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Model/Pet.cs @@ -1,4 +1,5 @@ using System; +using System.Linq; using System.IO; using System.Text; using System.Collections; @@ -126,15 +127,15 @@ namespace IO.Swagger.Model this.Name != null && this.Name.Equals(other.Name) ) && -// ( -// this.PhotoUrls == other.PhotoUrls || -// this.PhotoUrls != null && -// this.PhotoUrls.Equals(other.PhotoUrls) -// ) && + ( + this.PhotoUrls == other.PhotoUrls || + this.PhotoUrls != null && + this.PhotoUrls.SequenceEqual(other.PhotoUrls) + ) && ( this.Tags == other.Tags || this.Tags != null && - this.Tags.Equals(other.Tags) + this.Tags.SequenceEqual(other.Tags) ) && ( this.Status == other.Status || diff --git a/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Model/Tag.cs b/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Model/Tag.cs index 6e8f84b89e9..8b2cbe08474 100644 --- a/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Model/Tag.cs +++ b/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Model/Tag.cs @@ -1,4 +1,5 @@ using System; +using System.Linq; using System.IO; using System.Text; using System.Collections; diff --git a/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Model/User.cs b/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Model/User.cs index aff43555136..d2c1e3a46eb 100644 --- a/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Model/User.cs +++ b/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Model/User.cs @@ -1,4 +1,5 @@ using System; +using System.Linq; using System.IO; using System.Text; using System.Collections; diff --git a/samples/client/petstore/csharp/SwaggerClientTest/SwaggerClientTest.userprefs b/samples/client/petstore/csharp/SwaggerClientTest/SwaggerClientTest.userprefs index 31e5cba141b..05585bff932 100644 --- a/samples/client/petstore/csharp/SwaggerClientTest/SwaggerClientTest.userprefs +++ b/samples/client/petstore/csharp/SwaggerClientTest/SwaggerClientTest.userprefs @@ -2,8 +2,25 @@ - + + + + + + + + + + + + + + + + + + diff --git a/samples/client/petstore/csharp/SwaggerClientTest/TestPet.cs b/samples/client/petstore/csharp/SwaggerClientTest/TestPet.cs index 6fe0de92cac..0227a2d9113 100644 --- a/samples/client/petstore/csharp/SwaggerClientTest/TestPet.cs +++ b/samples/client/petstore/csharp/SwaggerClientTest/TestPet.cs @@ -1,5 +1,6 @@ using NUnit.Framework; using System; +using System.Linq; using System.IO; using System.Collections.Generic; using IO.Swagger.Api; @@ -166,7 +167,7 @@ namespace SwaggerClient.TestPet p1.Category = category1; p1.PhotoUrls = photoUrls1; - // create pet + // create pet 2 Pet p2 = new Pet(); p2.Id = petId; p2.Name = "Csharp test"; @@ -185,9 +186,25 @@ namespace SwaggerClient.TestPet p2.Category = category2; p2.PhotoUrls = photoUrls2; + // p1 and p2 should be equal (both object and attribute level) Assert.IsTrue (category1.Equals (category2)); - Assert.IsTrue (tag1.Equals (tag2)); - Assert.IsTrue (p1.Equals(p2)); + Assert.IsTrue (tags1.SequenceEqual (tags2)); + Assert.IsTrue (p1.PhotoUrls.SequenceEqual(p2.PhotoUrls)); + + Assert.IsTrue (p1.Equals (p2)); + + // update attribute to that p1 and p2 are not equal + category2.Name = "new category name"; + Assert.IsFalse(category1.Equals (category2)); + + tags2 = new List (); + Assert.IsFalse (tags1.SequenceEqual (tags2)); + + // photoUrls has not changed so it should be equal + Assert.IsTrue (p1.PhotoUrls.SequenceEqual(p2.PhotoUrls)); + + Assert.IsFalse (p1.Equals (p2)); + } } diff --git a/samples/client/petstore/csharp/SwaggerClientTest/bin/Debug/SwaggerClientTest.dll b/samples/client/petstore/csharp/SwaggerClientTest/bin/Debug/SwaggerClientTest.dll index 5e020c8b222027bde45f4a7a71a9cde3f078339b..924934c46233779ca4dd6c58049f0518ece993b2 100755 GIT binary patch delta 5639 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 OuYAqxxm#Rzg7M#yM;ccE delta 5375 zcmbuDd2|$27RJBoq|=?Py1S~ny3-*T2#~OcWn`CKRuvJDO?DR$X-p!)Vd;d;C@>HU z0U@%gGi-s-?3*AE0wh4#h7krbPRzs+6d4Ypvdn$29?dfP*VH+6^M3ccZ@KrqD!Ry; zAD%TQeEuh~_W(rDO;^=~+_nAWQ&lANV3;Vu9+q28HL6KNqift{9=h+rm@U?+{)yMXjjd#PElm*w_&bs$Bw09*)bX`?7Ts(E)~P zAfu}V2wuu~JyJSsbedY5?6|4bn-r25lfIvN#70^sH2}iX50lIPC3zy#TDdUZe~6l% zxiZaNQ;%Gge#AI9^*QS83e*ko&_vRsZT@3yBzxKh>XOnBsGD}ciSc$nTTDtZX=#7s zOsg^3?%z($v{DwIO7Z6Ga|TjjOiA~bu$3I3s5w?3-W-K3>4Dy!2ONAj;#M|dm_j2q zVk?N_vCOIaPtaI=1Us)?T3Z&?*tipj*ZJzM@zwFNe#8ef>SraH2|h&}ZF?d!+Y_1D zSe?zxY`>qGDgAzCkLd@|GBo0EWM=a}k(uqW%p$WN$;_1eBD0p+9eeYwdor`fMxY8l znMqoJs`hB+OF5gF8z-}M^*6T6h{^U!#fEEILpn9>r|D$-PixqToxJD>n?Ih)76ZHg zB(WOaye1uFB|PO6Q7j@KDLOkokq?W^f=Z3!(;9i_(8EJdqzmc!G*nc?gJb-Eo^oS) zU0UfE)9aJHHa$ryG+Z;>)J~p}C>=4n&ZwPyn${TUvipnJ#xsa;S^fJSK%J_V6k1tS z9V2{Z?Y5;fkxh(w*`C`(3W>Iz#WsIGf z(&lPYAZaSl{||shWlMS~BW?7!*J&JJY%h9rRr2+H3FAisPVyyn>D#Rn{mmktXq3)u zE1ff3v+CL#vktiDTit1vrCWvTS66jJE6n=1t;cO=vJn`e?6ySUZL%JeN6~_@LS>#q z9%kS34YmfPr9S3g8=RYSFgh?*X(UtD{3^8OD9vPg?Fd>#T3Cpdkrp1JwaPOxJ>>i< zwC+}V%HpkyLTf2$?6t_QLTedmb`ywhDnsPR5ZwI6ADMAg(OGQGuw z)?A$_yF%1KohMWEg!ZDkM0SU0u==^|MXyBWnB|=m9+cxTAw>DMDwu5&#;SpQTLSU~ zPE<2d6?;sw&rtWuRdHU>hiZ_hj8lcgs`eDT)j?N<#HyBv{(@N5s$qVTsj;e6$0_o-$Q~g=R<@cbt7Q@^TP-9eo5aeNj7=#f-KVOh;JP4Iwc5z3V`{8w z^>9HDt6D>hs%L7fYK^d75UX0C2?jSXMOL<_S(C0p>socOqlF1X+ttq=p`+@yN9e4& z*U>T*S*{j2T7~FG^@O8!h{CjdTbmF$vX-_{<9 zg4i~7Ks%H8Hg&*2L2R2kU=*hci6zky>z`$#R7fm|jwlzzlIVy))2^n-vgm{iK`e{T zsO)BHEQ@E6(%mGMMHfuwzbPstmId!bVxcur8}Hdt+Xjl-icFR?LB8t zAV9!6W{~(CZ!?-p;`1R|r&Wu5Aw*lX51lWD=#bVMFNNr&w&@YNqUAXsYS*+?&OV_? zxYs-T5;b9-LTj`;=zKXO#=G-v142~GeZesh4f-($f1Hd-i{k=pOJ2c5(+jpGL$KH+ zz9mDjSrFTjA=tyILShvfimQCG3W-%{80z(BV^>J5Lc=kbPhBCg3XMRXAXcD}D5hT< zEOKsu#8HT$_b@|Np;wVJ*d$h=*KtY^tI%j%f5p^Tg+?P~h)JwMqmeh%Bvzp@xFm>G z=uNa6ZfdMRZy`reyxWm)^W)M8Q=|$RD?g44Jnhaz8Y(iGcb2^)RWS|M1@&_Gb)_R} zqNxpa4<*tBjdQ>1%0Q~18{xO?8R*U_+n(jF6_tTLLYqgC?_iwJR=Xz=O*9GH1MZow z3Ap}8J_QQhPy)!BWYP(DBP9o6lTEtl9;M_$6Li&GW;c*3=x6sBWdUXgiqtceh3GTI z>=&=kRu-X>{z;<*kxbghXv&Z9EHu&sW%eb=5!hMZtt>@qmKi!gKdUT57N><6tDm+n z$6o}!tCuM&P%oQBF2qdzJ7qQU1m#lXr)W2gX}MUc+tkl6SkM}x&oOca)7ZJ}Z8TdN z+r_Q^8B;>Ocy$dHn`A$%-?FdAWR8{hF;y6y)-Tm=FuZJ zLYm2DSZH^8lGTlf5tKmMCe##EhqO&d71WHh0(2A9g|q_n5%e-?n=xL{7}7SQ%p^=9 zEr<_hvH5bnvs-%VsX^>95g&R|iOM+fbg>1MCfPstv{JXg@*e9r%f7+W!+0exuGJP# zzHKW~xwjCX#AIR{HkmQl>tR$Zv@@7+`L;c{ zB(S0Pu(}tw1hw{_Bf$4R0qr<$1DeOm2LEXH$ z+5x;KsGoPKAuWsR%Zm0T76|W1?@H|;@&&!^Eg;$_(S|Dmc+k6aTITeDoIS_pe^EtA8F4vA@@JA09Q;aV-ndhq*MJDmZ z6ys|_Y%#^SDkzMmC_%(RJ|R6M`L+@`1?5s1PN0sU<+P!J6KE=M1BoZ`yr5kqo>@z15aAK$|BxNQ<*<9g#f4&|9+ zDxBWDF3`s@e3>aW;N)CxQX5W{f?nd(bcLyn;8Y}N0;gfCxF)85!z5${9V-V|wC%c0 z{SKY@t1TD%h_1p&{WLG={q$<&n`J8J2v zRKy;&3{Y-R%o~a%mvdVMKSXKr9o&toA9e?gqsyhEmQ1CV94@iZex?zUjO_dtk*g!> z=nb$gqKR=Zf4dYPoV0Pd6t^y>8hr}&L$&aO_>U!tw`+&5ww^Vb6ePvniy6*6!?`+= zw?~tjZ1_oiE_NmNtmNuy-d;oM1Y=!6l9U%bSx{nWloZhq?W%MnJFH3%vRT}&;C4T^ zW!xfxsqGSa7$sY>13Tp}sSeVng3cRTkx4?B-Le{$Y+hPhH*PrF*XI=Fhc2D-+%GF=;8wUr@Cnlf22l#R+( zr9}Bk`ImA-xvR)(Gqt1IM;)%dt1ebIt0ii=+DlvL)z)YSwcA<^cW3t?_b~Tc?hN;2 z_ebts#y49V1&+EwzqlUSg>fgyGhI4Oc6r=i$!>@%BfEpQi+KBVTse8J#8r~5hd}Phg{~h!S zUuX|LP+x9`a9hd!qj-A^O&Pqk?Y5*IiMs%yVi(Mq$rrRbjk{ojI>s^&D<3jP`;KY(e_Mq$h zDaEjU+r)XY*0_v5Q~P$_m$oW-n04*8VApTg#Tff;#s)Kdq#?-z+d-BoM2#$>9$eT2qPBvFdU`seU8ZO_Z4g5e5CLIO5R3|< z0g%(Rw=mE1yIpiM5`!PZCzTmDmdRu$eS{p^X2>fzyE#j-Fvx7 zptg!VsA5yxtF4`W13Jcqkp1W4-u+iC&yL5fNlExFVpM}i)*D0_XbEvduA-wh!$n>{ z+0MU$=b}GQ0CfLkZJ+Yq3vQa;CvOK$$}81Wy#DrulbcV_+KS9_K2_1z?cwX?UE5Ci zENcn)#@}83dk3u+JKoM3H|OTmP0NDTd|KF6vT^*oX>07A^Uj)=I-h(V;B4uGR_&Oqs`q`@ixFc!&gJn`5x+d1oG@p(v&@!iovY(%WBev5?JJJ$>%1?X_Q!wQ zGxc+Bil^rIGe{XZWlgi+CXibLO8;Tc)KB?^p1#y?k#p1FfagiBDfU-8N~=RQ+%|J(~X5 zUdz??Q|+TJHqv6_5~F=--Kkc+#z!j3v0M%a^X@~Lao~fVuh>?yOk0F&7rIrP< z-aIELaH9H>k**orrAtPz-rh-=jLKE3Qm;*>b;*^%PMtkGVMv;EA_;8 z%0R99Y%-loZb8aOZcfZHGsd3d=SB85VMXE_slQeIfr(a`Dou`c3#UwU+SF*Tc^w9K3N^R@*6-v!iW`5snpQvCzgMq@QX8O#$UP^7J%}=oIGShBz zZO?e1aKcO{&8MW)cHDf0t7f`pZts}}3V)jEiTSCN+Rj-&VVQ->Efp5WBy6d_u)#vr zmW@)XV^-|0udvrb`z-ta5+e;18ZFdhX_nGx@c{P|Zdj`A4)srynLH_iOZIS|gJQcLQ2sh7|1h39MUr_zJe-x2=*F(`K;{D!yVE%2VEYX%jk zm8aS7>LPnlT!7l8GmW~^o^xe{j=Ay4x<1?xF=!Z{N%b=uW{USyWEiufGc4jKwu@{C zb9WoLJQNqo8oDAz{8D;W44UAz@<&hlF zYne^wXJ6noXx*4i9kXxFmRcv~(8)Qc_<&Jqo~?7}(ww$AQtNasHRd+)&1hZDr7O8V z=Sr>SJUWwimIsZV<#{!auI07oNv(@>>8H7^{Oi$H&s%fp_S`#jrPkeix|e^SPkbfY zbAACWC|Fn^wVo8v(}HKb`IUKICG)6sUfDdU^?{X^S<9{5{AyCbIxAILKe0M`PD|!9 zS~{PVz-(XcPD=POC9w&3v}Ddn7i`sbm48(gmz+ z0XK}v)~rRfZUL)=iMJ95e7um+>V<60LVkBlhGq+@tqa*Um}5Y7A)}3jY*Qi6kDjKf zMYX4p?S*v@kX02i+EB!*i};i1B+V{VyNg&Y%rRj7B1Tn<*oH+sHzrB56Vz>x)@cF@GF0NAnG;oyBYy%rRi+VqCMB?Ox2w#u_w7Q5{>%j>8-SzFNX)#}fAS z60VH>w@*E)h9&GU%rT&DDWmU~vU>iX*esuOC|Z`X^Dsxhv4l}m32Wv9#%20kL(yKs zuEQMt)>1~7N?9BKYTSs3yD09Jviq>^zIyJQ->NFM{Vo&EVBxR-)x7&Y;*1 z-vpfnABKMmoddVR&p<8U2k>8@^I%mtwi&tr?g#gTegucZgP@Dx8u)nVC-4vO{ZK2o z1AYOzgy$==M-csiq7D22TmfAMt0M3K=nA+TJ|6lRTnn#;u7cwt(Fb1x9|4=7cJS~h zqMP9B;F;hzp&Q^k@a<3sSUr-+`j!p@QFx>9f_?#;;IYsx@CkS}bQ|0X{}H+a9yJ_$BBMaPlj- zIrt$s2b={x0^fxfLXW}pDp4o+PjC^~6?y_*0k43bg1g|KLeIdx#^7Hrs1sZO?>ojy z)P`q!I_gBOx_-AG{V4zyYy%2Y_9`k>GI16}%HZ0qO-l3U7e$ zg{_DkhrH3weTP!VNrm Ha`S%yPU&#W delta 3869 zcmZ9P2Ut{B8ixPFjKj=aj06EAMF`z276z22f(Wj=*?khSnkB-TLD~$cAY!8ph>C!T z%86J}V~aIvjG7{-No?39f)R>^T$M0XRh_ucH6Qy_#>hWl+HyFbr(IFNCy{L-^usE!$%VN z2!PJ7;9Z}5+RY}@uFvT4qbu9nA{WH@u8)YJ%0-hG^0A6OHq}cT#<~?R?fZ|L4db$w zf80td#EOHZlTE@}Z{hr%y~8~0w-@`>{h={cE?PQS-(6&PB0smbb<+=?`=Sgk&WqB^ zd4W{V`M(Q{6Rnw>%$1wK2aU zWn?jByy-Sxyh+oSSNdABLHui9M;69w@cK_4=kLSc>gU4ZdH;UHnLW?wXJ;@yQrR(< z3StXmO^qmJrbj9l$5KV?lCG({a%(JYi`_1z9%6g0%0sdAQ|!-OQ%_}mEM1KKO-lbJ z&h=Eb#?t-R2V&}kbt`4Y_&sG&9L5Fw z5_hy~>ZNRmqswuPNToed%0}?K{_*T%ex<)7)AE;iP2;@=$3e^HF zEz~a3nz~S#w!%ZTK}#F8Uv*9Us(#ecer=VM8n>d4>YSF&Yiqlv?y5Ulx~sh>rN%Y) zRlU|yyS772#jQ}8wxYj^$I}<_i{s5rX!y>7cB3@nqPzZ0e|Rg|F*A#!$5Zj9|s2qUl-AQ`E$R%>I%l}dV1Qd&}8$08ap1Y>1QZPq_V`t ziN^NPv-*A_JxFXbjpb_7Id@dICsIdZL6T{aovEw(izHf{R3W9Nqp04JL|c=#bxqyX z2b1Vf(oaaG<*8*}tS4{L_>8JcqRUB*(iMYPPlp8bqU!FdQZG)XisU89<|l_S+Xz#w zw@SS$nZ8NhE!D(do4zimlIe8v8H9}Fy7(zN##jfwdayBs^@zVv?;6x|Q|R-QB`M}r z3rADvSjutJST1y~TBuKFf(9t-GtqG`c}W^jTou7a9mF{`V&$bE*@kT;fkKF>aTT8 zJ%lHEda8dWrK7~TZbDfq%}@O-)!c+J^%lNNrM0Q+kmBdBGX41zWYIX^ZhYdP$Wi-J zsVcQvx+wXLBOrW}M!VC#O*7vxXK-)z&i_C0 z-Eiu=@v6arPERLL`-FKDO}Dj@y(M<9wt6y=o=$wmtph{Y+x-2&kps#mQPrgCNn+!Q zjHImL8G7+gx0TG7+1iAb`{N>++!klXsyv-mrdRTVfgVbnV4Kj?P#c~RG=Mt>`C9&% zPW9;*)A`vTC-!fi7Bo(AEQ1;|e&=U`oLM4o4T@CMOr|T7ukyfP7nfM6R6Xs$H1jmJ zZaS@>zG1p?tdy1Uum~4!H6+M>_jLMp`W{n`+p%RcX!(p4eC&{k_M2zWmKj@TNVixy zlPYJf;*BV6n@QVeemzqvt`GLyo-5K=~6y5pSYG(@=ohxAH3;6QzETE**r$`=dsUV=J_Qhj7m#b8O+?lQ{#LV73sJVX=Mpp z)mao9SW?PpX(?OAwNaBDw_vcflx>5V@3*du(fTsBfwx2r9 zX!t1T95@9&4muCcgJ(gtU>;x~D#hSe3^v2pKo`IV;CrDu@CEous2!)Cj%`KL`De=PM=*CThjt3b+|u0$l~OKs*3^ z4LlDV23-g5g0F&ZfQJR40q{-mLGY*0EwE28t^?l&CxhRI?tpK>H$!*9bs}j6QNh&OYnN=HF#t=b|lO|)Q-W&82kt70N28kA;LT0ZTJm{fj=FN zX29Y*VLOW_USd1#XAGgt~)sBXQ_NffvB%Lp{K1d>&m5wgx+c9iX?t74UwL4R|wrqd4w~ g!5zT&kS+L6_%p~3Y(EmsK=>%82!MO>HPN+y0k5`lDgXcg diff --git a/samples/client/petstore/csharp/SwaggerClientTest/obj/Debug/SwaggerClientTest.dll b/samples/client/petstore/csharp/SwaggerClientTest/obj/Debug/SwaggerClientTest.dll index 5e020c8b222027bde45f4a7a71a9cde3f078339b..924934c46233779ca4dd6c58049f0518ece993b2 100755 GIT binary patch delta 5639 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 OuYAqxxm#Rzg7M#yM;ccE delta 5375 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 Ha`S%yPU&#W delta 3869 zcmZ9P2Ut{B8ixPFjKj=aj06EAMF`z276z22f(Wj=*?khSnkB-TLD~$cAY!8ph>C!T z%86J}V~aIvjG7{-No?39f)R>^T$M0XRh_ucH6Qy_#>hWl+HyFbr(IFNCy{L-^usE!$%VN z2!PJ7;9Z}5+RY}@uFvT4qbu9nA{WH@u8)YJ%0-hG^0A6OHq}cT#<~?R?fZ|L4db$w zf80td#EOHZlTE@}Z{hr%y~8~0w-@`>{h={cE?PQS-(6&PB0smbb<+=?`=Sgk&WqB^ zd4W{V`M(Q{6Rnw>%$1wK2aU zWn?jByy-Sxyh+oSSNdABLHui9M;69w@cK_4=kLSc>gU4ZdH;UHnLW?wXJ;@yQrR(< z3StXmO^qmJrbj9l$5KV?lCG({a%(JYi`_1z9%6g0%0sdAQ|!-OQ%_}mEM1KKO-lbJ z&h=Eb#?t-R2V&}kbt`4Y_&sG&9L5Fw z5_hy~>ZNRmqswuPNToed%0}?K{_*T%ex<)7)AE;iP2;@=$3e^HF zEz~a3nz~S#w!%ZTK}#F8Uv*9Us(#ecer=VM8n>d4>YSF&Yiqlv?y5Ulx~sh>rN%Y) zRlU|yyS772#jQ}8wxYj^$I}<_i{s5rX!y>7cB3@nqPzZ0e|Rg|F*A#!$5Zj9|s2qUl-AQ`E$R%>I%l}dV1Qd&}8$08ap1Y>1QZPq_V`t ziN^NPv-*A_JxFXbjpb_7Id@dICsIdZL6T{aovEw(izHf{R3W9Nqp04JL|c=#bxqyX z2b1Vf(oaaG<*8*}tS4{L_>8JcqRUB*(iMYPPlp8bqU!FdQZG)XisU89<|l_S+Xz#w zw@SS$nZ8NhE!D(do4zimlIe8v8H9}Fy7(zN##jfwdayBs^@zVv?;6x|Q|R-QB`M}r z3rADvSjutJST1y~TBuKFf(9t-GtqG`c}W^jTou7a9mF{`V&$bE*@kT;fkKF>aTT8 zJ%lHEda8dWrK7~TZbDfq%}@O-)!c+J^%lNNrM0Q+kmBdBGX41zWYIX^ZhYdP$Wi-J zsVcQvx+wXLBOrW}M!VC#O*7vxXK-)z&i_C0 z-Eiu=@v6arPERLL`-FKDO}Dj@y(M<9wt6y=o=$wmtph{Y+x-2&kps#mQPrgCNn+!Q zjHImL8G7+gx0TG7+1iAb`{N>++!klXsyv-mrdRTVfgVbnV4Kj?P#c~RG=Mt>`C9&% zPW9;*)A`vTC-!fi7Bo(AEQ1;|e&=U`oLM4o4T@CMOr|T7ukyfP7nfM6R6Xs$H1jmJ zZaS@>zG1p?tdy1Uum~4!H6+M>_jLMp`W{n`+p%RcX!(p4eC&{k_M2zWmKj@TNVixy zlPYJf;*BV6n@QVeemzqvt`GLyo-5K=~6y5pSYG(@=ohxAH3;6QzETE**r$`=dsUV=J_Qhj7m#b8O+?lQ{#LV73sJVX=Mpp z)mao9SW?PpX(?OAwNaBDw_vcflx>5V@3*du(fTsBfwx2r9 zX!t1T95@9&4muCcgJ(gtU>;x~D#hSe3^v2pKo`IV;CrDu@CEous2!)Cj%`KL`De=PM=*CThjt3b+|u0$l~OKs*3^ z4LlDV23-g5g0F&ZfQJR40q{-mLGY*0EwE28t^?l&CxhRI?tpK>H$!*9bs}j6QNh&OYnN=HF#t=b|lO|)Q-W&82kt70N28kA;LT0ZTJm{fj=FN zX29Y*VLOW_USd1#XAGgt~)sBXQ_NffvB%Lp{K1d>&m5wgx+c9iX?t74UwL4R|wrqd4w~ g!5zT&kS+L6_%p~3Y(EmsK=>%82!MO>HPN+y0k5`lDgXcg From dc65b5647fe2d97e4a645b6905ded266ce4e7855 Mon Sep 17 00:00:00 2001 From: Alvin Date: Sat, 21 Nov 2015 19:42:01 +0800 Subject: [PATCH 018/211] update okhttp-gson samples --- .../java/io/swagger/client/ApiCallback.java | 18 + .../java/io/swagger/client/ApiClient.java | 14 +- .../java/io/swagger/client/ApiException.java | 2 +- .../java/io/swagger/client/Configuration.java | 2 +- .../src/main/java/io/swagger/client/Pair.java | 2 +- .../swagger/client/ProgressRequestBody.java | 70 ++++ .../swagger/client/ProgressResponseBody.java | 63 ++++ .../java/io/swagger/client/StringUtil.java | 2 +- .../java/io/swagger/client/api/PetApi.java | 342 ++++++++++++++++-- .../java/io/swagger/client/api/StoreApi.java | 174 ++++++++- .../java/io/swagger/client/api/UserApi.java | 342 ++++++++++++++++-- .../io/swagger/client/auth/ApiKeyAuth.java | 2 +- .../swagger/client/auth/Authentication.java | 2 +- .../java/io/swagger/client/auth/OAuth.java | 2 +- 14 files changed, 927 insertions(+), 110 deletions(-) create mode 100644 samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/ProgressRequestBody.java create mode 100644 samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/ProgressResponseBody.java diff --git a/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/ApiCallback.java b/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/ApiCallback.java index d75713c9a01..fcf2d289fbf 100644 --- a/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/ApiCallback.java +++ b/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/ApiCallback.java @@ -28,4 +28,22 @@ public interface ApiCallback { * @param responseHeaders Headers of the response */ void onSuccess(T result, int statusCode, Map> responseHeaders); + + /** + * This is called when the API upload processing. + * + * @param bytesWritten bytes Written + * @param contentLength content length of request body + * @param done write end + */ + void onUploadProgress(long bytesWritten, long contentLength, boolean done); + + /** + * This is called when the API downlond processing. + * + * @param bytesRead bytes Read + * @param contentLength content lenngth of the response + * @param done Read end + */ + void onDownloadProgress(long bytesRead, long contentLength, boolean done); } 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 6e4e299ad3a..43df2643cd3 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 @@ -143,8 +143,8 @@ public class ApiClient { // Setup authentications (key: authentication name, value: authentication). authentications = new HashMap(); - authentications.put("petstore_auth", new OAuth()); authentications.put("api_key", new ApiKeyAuth("header", "api_key")); + authentications.put("petstore_auth", new OAuth()); // Prevent the authentications from being modified. authentications = Collections.unmodifiableMap(authentications); } @@ -820,7 +820,7 @@ public class ApiClient { * @param authNames The authentications to apply * @return The HTTP call */ - public Call buildCall(String path, String method, List queryParams, Object body, Map headerParams, Map formParams, String[] authNames) throws ApiException { + public Call buildCall(String path, String method, List queryParams, Object body, Map headerParams, Map formParams, String[] authNames, ProgressRequestBody.ProgressRequestListener progressRequestListener) throws ApiException { updateParamsForAuth(authNames, queryParams, headerParams); final String url = buildUrl(path, queryParams); @@ -850,7 +850,15 @@ public class ApiClient { reqBody = RequestBody.create(MediaType.parse(contentType), serialize(body, contentType)); } - Request request = reqBuilder.method(method, reqBody).build(); + Request request = null; + + if(progressRequestListener != null) { + ProgressRequestBody progressRequestBody = new ProgressRequestBody(reqBody, progressRequestListener); + request = reqBuilder.method(method, progressRequestBody).build(); + } else { + request = reqBuilder.method(method, reqBody).build(); + } + return httpClient.newCall(request); } diff --git a/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/ApiException.java b/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/ApiException.java index 0bdd5bd17c6..3df58b0b4d1 100644 --- a/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/ApiException.java +++ b/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/ApiException.java @@ -3,7 +3,7 @@ package io.swagger.client; import java.util.Map; import java.util.List; -@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-10-20T11:42:25.339-07:00") +@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-11-21T19:41:14.431+08:00") public class ApiException extends Exception { private int code = 0; private Map> responseHeaders = null; diff --git a/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/Configuration.java b/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/Configuration.java index a63382fc05b..084020d501a 100644 --- a/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/Configuration.java +++ b/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/Configuration.java @@ -1,6 +1,6 @@ package io.swagger.client; -@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-10-20T11:42:25.339-07:00") +@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-11-21T19:41:14.431+08:00") public class Configuration { private static ApiClient defaultApiClient = new ApiClient(); diff --git a/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/Pair.java b/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/Pair.java index 533d318cb5c..91ae60aa14b 100644 --- a/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/Pair.java +++ b/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/Pair.java @@ -1,6 +1,6 @@ package io.swagger.client; -@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-10-20T11:42:25.339-07:00") +@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-11-21T19:41:14.431+08:00") public class Pair { private String name = ""; private String value = ""; diff --git a/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/ProgressRequestBody.java b/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/ProgressRequestBody.java new file mode 100644 index 00000000000..71f34ed1140 --- /dev/null +++ b/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/ProgressRequestBody.java @@ -0,0 +1,70 @@ +package io.swagger.client; + +import com.squareup.okhttp.MediaType; +import com.squareup.okhttp.RequestBody; + +import java.io.IOException; + +import okio.Buffer; +import okio.BufferedSink; +import okio.ForwardingSink; +import okio.Okio; +import okio.Sink; + +public class ProgressRequestBody extends RequestBody { + + public interface ProgressRequestListener { + void onRequestProgress(long bytesWritten, long contentLength, boolean done); + } + + private final RequestBody requestBody; + + private final ProgressRequestListener progressListener; + + private BufferedSink bufferedSink; + + public ProgressRequestBody(RequestBody requestBody, ProgressRequestListener progressListener) { + this.requestBody = requestBody; + this.progressListener = progressListener; + } + + @Override + public MediaType contentType() { + return requestBody.contentType(); + } + + @Override + public long contentLength() throws IOException { + return requestBody.contentLength(); + } + + @Override + public void writeTo(BufferedSink sink) throws IOException { + if (bufferedSink == null) { + bufferedSink = Okio.buffer(sink(sink)); + } + + requestBody.writeTo(bufferedSink); + bufferedSink.flush(); + + } + + private Sink sink(Sink sink) { + return new ForwardingSink(sink) { + + long bytesWritten = 0L; + long contentLength = 0L; + + @Override + public void write(Buffer source, long byteCount) throws IOException { + super.write(source, byteCount); + if (contentLength == 0) { + contentLength = contentLength(); + } + + bytesWritten += byteCount; + progressListener.onRequestProgress(bytesWritten, contentLength, bytesWritten == contentLength); + } + }; + } +} diff --git a/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/ProgressResponseBody.java b/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/ProgressResponseBody.java new file mode 100644 index 00000000000..138da3f2106 --- /dev/null +++ b/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/ProgressResponseBody.java @@ -0,0 +1,63 @@ +package io.swagger.client; + +import com.squareup.okhttp.MediaType; +import com.squareup.okhttp.ResponseBody; + +import java.io.IOException; + +import okio.Buffer; +import okio.BufferedSource; +import okio.ForwardingSource; +import okio.Okio; +import okio.Source; + +public class ProgressResponseBody extends ResponseBody { + + public interface ProgressListener { + void update(long bytesRead, long contentLength, boolean done); + } + + private final ResponseBody responseBody; + private final ProgressListener progressListener; + private BufferedSource bufferedSource; + + public ProgressResponseBody(ResponseBody responseBody, ProgressListener progressListener) { + this.responseBody = responseBody; + this.progressListener = progressListener; + } + + @Override + public MediaType contentType() { + return responseBody.contentType(); + } + + @Override + public long contentLength() throws IOException { + return responseBody.contentLength(); + } + + @Override + public BufferedSource source() throws IOException { + if (bufferedSource == null) { + bufferedSource = Okio.buffer(source(responseBody.source())); + } + return bufferedSource; + } + + private Source source(Source source) { + return new ForwardingSource(source) { + long totalBytesRead = 0L; + + @Override + public long read(Buffer sink, long byteCount) throws IOException { + long bytesRead = super.read(sink, byteCount); + // read() returns the number of bytes read, or -1 if this source is exhausted. + totalBytesRead += bytesRead != -1 ? bytesRead : 0; + progressListener.update(totalBytesRead, responseBody.contentLength(), bytesRead == -1); + return bytesRead; + } + }; + } +} + + diff --git a/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/StringUtil.java b/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/StringUtil.java index 42d453c31ef..bd4fefc651a 100644 --- a/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/StringUtil.java +++ b/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/StringUtil.java @@ -1,6 +1,6 @@ package io.swagger.client; -@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-10-20T11:42:25.339-07:00") +@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-11-21T19:41:14.431+08:00") public class StringUtil { /** * Check if the given array contains the given value (with case-insensitive comparison). diff --git a/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/api/PetApi.java b/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/api/PetApi.java index 39154cf855e..d1982566bf9 100644 --- a/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/api/PetApi.java +++ b/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/api/PetApi.java @@ -5,10 +5,16 @@ import io.swagger.client.ApiClient; import io.swagger.client.ApiException; import io.swagger.client.Configuration; import io.swagger.client.Pair; +import io.swagger.client.ProgressRequestBody; +import io.swagger.client.ProgressResponseBody; import com.google.gson.reflect.TypeToken; import com.squareup.okhttp.Call; +import com.squareup.okhttp.Interceptor; +import com.squareup.okhttp.Response; + +import java.io.IOException; import io.swagger.client.model.Pet; import java.io.File; @@ -37,7 +43,7 @@ public class PetApi { /* Build call for updatePet */ - private Call updatePetCall(Pet body) throws ApiException { + private Call updatePetCall(Pet body, final ProgressResponseBody.ProgressListener progressListener, final ProgressRequestBody.ProgressRequestListener progressRequestListener) throws ApiException { Object postBody = body; @@ -62,8 +68,20 @@ public class PetApi { final String contentType = apiClient.selectHeaderContentType(contentTypes); headerParams.put("Content-Type", contentType); + if(progressListener != null) { + apiClient.getHttpClient().networkInterceptors().add(new Interceptor() { + @Override + public Response intercept(Interceptor.Chain chain) throws IOException { + Response originalResponse = chain.proceed(chain.request()); + return originalResponse.newBuilder() + .body(new ProgressResponseBody(originalResponse.body(), progressListener)) + .build(); + } + }); + } + String[] authNames = new String[] { "petstore_auth" }; - return apiClient.buildCall(path, "PUT", queryParams, postBody, headerParams, formParams, authNames); + return apiClient.buildCall(path, "PUT", queryParams, postBody, headerParams, formParams, authNames, progressRequestListener); } /** @@ -72,7 +90,7 @@ public class PetApi { * @param body Pet object that needs to be added to the store */ public void updatePet(Pet body) throws ApiException { - Call call = updatePetCall(body); + Call call = updatePetCall(body, null, null); apiClient.execute(call); } @@ -83,14 +101,34 @@ public class PetApi { * @param callback The callback to be executed when the API call finishes * @return The request call */ - public Call updatePetAsync(Pet body, ApiCallback callback) throws ApiException { - Call call = updatePetCall(body); + public Call updatePetAsync(Pet body, final ApiCallback callback) throws ApiException { + + ProgressResponseBody.ProgressListener progressListener = null; + ProgressRequestBody.ProgressRequestListener progressRequestListener = null; + + if(callback != null) { + progressListener = new ProgressResponseBody.ProgressListener() { + @Override + public void update(long bytesRead, long contentLength, boolean done) { + callback.onDownloadProgress(bytesRead, contentLength, done); + } + }; + + progressRequestListener = new ProgressRequestBody.ProgressRequestListener() { + @Override + public void onRequestProgress(long bytesWritten, long contentLength, boolean done) { + callback.onUploadProgress(bytesWritten, contentLength, done); + } + }; + } + + Call call = updatePetCall(body, progressListener, progressRequestListener); apiClient.executeAsync(call, callback); return call; } /* Build call for addPet */ - private Call addPetCall(Pet body) throws ApiException { + private Call addPetCall(Pet body, final ProgressResponseBody.ProgressListener progressListener, final ProgressRequestBody.ProgressRequestListener progressRequestListener) throws ApiException { Object postBody = body; @@ -115,8 +153,20 @@ public class PetApi { final String contentType = apiClient.selectHeaderContentType(contentTypes); headerParams.put("Content-Type", contentType); + if(progressListener != null) { + apiClient.getHttpClient().networkInterceptors().add(new Interceptor() { + @Override + public Response intercept(Interceptor.Chain chain) throws IOException { + Response originalResponse = chain.proceed(chain.request()); + return originalResponse.newBuilder() + .body(new ProgressResponseBody(originalResponse.body(), progressListener)) + .build(); + } + }); + } + String[] authNames = new String[] { "petstore_auth" }; - return apiClient.buildCall(path, "POST", queryParams, postBody, headerParams, formParams, authNames); + return apiClient.buildCall(path, "POST", queryParams, postBody, headerParams, formParams, authNames, progressRequestListener); } /** @@ -125,7 +175,7 @@ public class PetApi { * @param body Pet object that needs to be added to the store */ public void addPet(Pet body) throws ApiException { - Call call = addPetCall(body); + Call call = addPetCall(body, null, null); apiClient.execute(call); } @@ -136,14 +186,34 @@ public class PetApi { * @param callback The callback to be executed when the API call finishes * @return The request call */ - public Call addPetAsync(Pet body, ApiCallback callback) throws ApiException { - Call call = addPetCall(body); + public Call addPetAsync(Pet body, final ApiCallback callback) throws ApiException { + + ProgressResponseBody.ProgressListener progressListener = null; + ProgressRequestBody.ProgressRequestListener progressRequestListener = null; + + if(callback != null) { + progressListener = new ProgressResponseBody.ProgressListener() { + @Override + public void update(long bytesRead, long contentLength, boolean done) { + callback.onDownloadProgress(bytesRead, contentLength, done); + } + }; + + progressRequestListener = new ProgressRequestBody.ProgressRequestListener() { + @Override + public void onRequestProgress(long bytesWritten, long contentLength, boolean done) { + callback.onUploadProgress(bytesWritten, contentLength, done); + } + }; + } + + Call call = addPetCall(body, progressListener, progressRequestListener); apiClient.executeAsync(call, callback); return call; } /* Build call for findPetsByStatus */ - private Call findPetsByStatusCall(List status) throws ApiException { + private Call findPetsByStatusCall(List status, final ProgressResponseBody.ProgressListener progressListener, final ProgressRequestBody.ProgressRequestListener progressRequestListener) throws ApiException { Object postBody = null; @@ -170,8 +240,20 @@ public class PetApi { final String contentType = apiClient.selectHeaderContentType(contentTypes); headerParams.put("Content-Type", contentType); + if(progressListener != null) { + apiClient.getHttpClient().networkInterceptors().add(new Interceptor() { + @Override + public Response intercept(Interceptor.Chain chain) throws IOException { + Response originalResponse = chain.proceed(chain.request()); + return originalResponse.newBuilder() + .body(new ProgressResponseBody(originalResponse.body(), progressListener)) + .build(); + } + }); + } + String[] authNames = new String[] { "petstore_auth" }; - return apiClient.buildCall(path, "GET", queryParams, postBody, headerParams, formParams, authNames); + return apiClient.buildCall(path, "GET", queryParams, postBody, headerParams, formParams, authNames, progressRequestListener); } /** @@ -181,7 +263,7 @@ public class PetApi { * @return List */ public List findPetsByStatus(List status) throws ApiException { - Call call = findPetsByStatusCall(status); + Call call = findPetsByStatusCall(status, null, null); Type returnType = new TypeToken>(){}.getType(); return apiClient.execute(call, returnType); } @@ -193,15 +275,35 @@ public class PetApi { * @param callback The callback to be executed when the API call finishes * @return The request call */ - public Call findPetsByStatusAsync(List status, ApiCallback> callback) throws ApiException { - Call call = findPetsByStatusCall(status); + public Call findPetsByStatusAsync(List status, final ApiCallback> callback) throws ApiException { + + ProgressResponseBody.ProgressListener progressListener = null; + ProgressRequestBody.ProgressRequestListener progressRequestListener = null; + + if(callback != null) { + progressListener = new ProgressResponseBody.ProgressListener() { + @Override + public void update(long bytesRead, long contentLength, boolean done) { + callback.onDownloadProgress(bytesRead, contentLength, done); + } + }; + + progressRequestListener = new ProgressRequestBody.ProgressRequestListener() { + @Override + public void onRequestProgress(long bytesWritten, long contentLength, boolean done) { + callback.onUploadProgress(bytesWritten, contentLength, done); + } + }; + } + + Call call = findPetsByStatusCall(status, progressListener, progressRequestListener); Type returnType = new TypeToken>(){}.getType(); apiClient.executeAsync(call, returnType, callback); return call; } /* Build call for findPetsByTags */ - private Call findPetsByTagsCall(List tags) throws ApiException { + private Call findPetsByTagsCall(List tags, final ProgressResponseBody.ProgressListener progressListener, final ProgressRequestBody.ProgressRequestListener progressRequestListener) throws ApiException { Object postBody = null; @@ -228,8 +330,20 @@ public class PetApi { final String contentType = apiClient.selectHeaderContentType(contentTypes); headerParams.put("Content-Type", contentType); + if(progressListener != null) { + apiClient.getHttpClient().networkInterceptors().add(new Interceptor() { + @Override + public Response intercept(Interceptor.Chain chain) throws IOException { + Response originalResponse = chain.proceed(chain.request()); + return originalResponse.newBuilder() + .body(new ProgressResponseBody(originalResponse.body(), progressListener)) + .build(); + } + }); + } + String[] authNames = new String[] { "petstore_auth" }; - return apiClient.buildCall(path, "GET", queryParams, postBody, headerParams, formParams, authNames); + return apiClient.buildCall(path, "GET", queryParams, postBody, headerParams, formParams, authNames, progressRequestListener); } /** @@ -239,7 +353,7 @@ public class PetApi { * @return List */ public List findPetsByTags(List tags) throws ApiException { - Call call = findPetsByTagsCall(tags); + Call call = findPetsByTagsCall(tags, null, null); Type returnType = new TypeToken>(){}.getType(); return apiClient.execute(call, returnType); } @@ -251,15 +365,35 @@ public class PetApi { * @param callback The callback to be executed when the API call finishes * @return The request call */ - public Call findPetsByTagsAsync(List tags, ApiCallback> callback) throws ApiException { - Call call = findPetsByTagsCall(tags); + public Call findPetsByTagsAsync(List tags, final ApiCallback> callback) throws ApiException { + + ProgressResponseBody.ProgressListener progressListener = null; + ProgressRequestBody.ProgressRequestListener progressRequestListener = null; + + if(callback != null) { + progressListener = new ProgressResponseBody.ProgressListener() { + @Override + public void update(long bytesRead, long contentLength, boolean done) { + callback.onDownloadProgress(bytesRead, contentLength, done); + } + }; + + progressRequestListener = new ProgressRequestBody.ProgressRequestListener() { + @Override + public void onRequestProgress(long bytesWritten, long contentLength, boolean done) { + callback.onUploadProgress(bytesWritten, contentLength, done); + } + }; + } + + Call call = findPetsByTagsCall(tags, progressListener, progressRequestListener); Type returnType = new TypeToken>(){}.getType(); apiClient.executeAsync(call, returnType, callback); return call; } /* Build call for getPetById */ - private Call getPetByIdCall(Long petId) throws ApiException { + private Call getPetByIdCall(Long petId, final ProgressResponseBody.ProgressListener progressListener, final ProgressRequestBody.ProgressRequestListener progressRequestListener) throws ApiException { Object postBody = null; // verify the required parameter 'petId' is set @@ -290,8 +424,20 @@ public class PetApi { final String contentType = apiClient.selectHeaderContentType(contentTypes); headerParams.put("Content-Type", contentType); + if(progressListener != null) { + apiClient.getHttpClient().networkInterceptors().add(new Interceptor() { + @Override + public Response intercept(Interceptor.Chain chain) throws IOException { + Response originalResponse = chain.proceed(chain.request()); + return originalResponse.newBuilder() + .body(new ProgressResponseBody(originalResponse.body(), progressListener)) + .build(); + } + }); + } + String[] authNames = new String[] { "api_key" }; - return apiClient.buildCall(path, "GET", queryParams, postBody, headerParams, formParams, authNames); + return apiClient.buildCall(path, "GET", queryParams, postBody, headerParams, formParams, authNames, progressRequestListener); } /** @@ -301,7 +447,7 @@ public class PetApi { * @return Pet */ public Pet getPetById(Long petId) throws ApiException { - Call call = getPetByIdCall(petId); + Call call = getPetByIdCall(petId, null, null); Type returnType = new TypeToken(){}.getType(); return apiClient.execute(call, returnType); } @@ -313,15 +459,35 @@ public class PetApi { * @param callback The callback to be executed when the API call finishes * @return The request call */ - public Call getPetByIdAsync(Long petId, ApiCallback callback) throws ApiException { - Call call = getPetByIdCall(petId); + public Call getPetByIdAsync(Long petId, final ApiCallback callback) throws ApiException { + + ProgressResponseBody.ProgressListener progressListener = null; + ProgressRequestBody.ProgressRequestListener progressRequestListener = null; + + if(callback != null) { + progressListener = new ProgressResponseBody.ProgressListener() { + @Override + public void update(long bytesRead, long contentLength, boolean done) { + callback.onDownloadProgress(bytesRead, contentLength, done); + } + }; + + progressRequestListener = new ProgressRequestBody.ProgressRequestListener() { + @Override + public void onRequestProgress(long bytesWritten, long contentLength, boolean done) { + callback.onUploadProgress(bytesWritten, contentLength, done); + } + }; + } + + Call call = getPetByIdCall(petId, progressListener, progressRequestListener); Type returnType = new TypeToken(){}.getType(); apiClient.executeAsync(call, returnType, callback); return call; } /* Build call for updatePetWithForm */ - private Call updatePetWithFormCall(String petId, String name, String status) throws ApiException { + private Call updatePetWithFormCall(String petId, String name, String status, final ProgressResponseBody.ProgressListener progressListener, final ProgressRequestBody.ProgressRequestListener progressRequestListener) throws ApiException { Object postBody = null; // verify the required parameter 'petId' is set @@ -356,8 +522,20 @@ public class PetApi { final String contentType = apiClient.selectHeaderContentType(contentTypes); headerParams.put("Content-Type", contentType); + if(progressListener != null) { + apiClient.getHttpClient().networkInterceptors().add(new Interceptor() { + @Override + public Response intercept(Interceptor.Chain chain) throws IOException { + Response originalResponse = chain.proceed(chain.request()); + return originalResponse.newBuilder() + .body(new ProgressResponseBody(originalResponse.body(), progressListener)) + .build(); + } + }); + } + String[] authNames = new String[] { "petstore_auth" }; - return apiClient.buildCall(path, "POST", queryParams, postBody, headerParams, formParams, authNames); + return apiClient.buildCall(path, "POST", queryParams, postBody, headerParams, formParams, authNames, progressRequestListener); } /** @@ -368,7 +546,7 @@ public class PetApi { * @param status Updated status of the pet */ public void updatePetWithForm(String petId, String name, String status) throws ApiException { - Call call = updatePetWithFormCall(petId, name, status); + Call call = updatePetWithFormCall(petId, name, status, null, null); apiClient.execute(call); } @@ -381,14 +559,34 @@ public class PetApi { * @param callback The callback to be executed when the API call finishes * @return The request call */ - public Call updatePetWithFormAsync(String petId, String name, String status, ApiCallback callback) throws ApiException { - Call call = updatePetWithFormCall(petId, name, status); + public Call updatePetWithFormAsync(String petId, String name, String status, final ApiCallback callback) throws ApiException { + + ProgressResponseBody.ProgressListener progressListener = null; + ProgressRequestBody.ProgressRequestListener progressRequestListener = null; + + if(callback != null) { + progressListener = new ProgressResponseBody.ProgressListener() { + @Override + public void update(long bytesRead, long contentLength, boolean done) { + callback.onDownloadProgress(bytesRead, contentLength, done); + } + }; + + progressRequestListener = new ProgressRequestBody.ProgressRequestListener() { + @Override + public void onRequestProgress(long bytesWritten, long contentLength, boolean done) { + callback.onUploadProgress(bytesWritten, contentLength, done); + } + }; + } + + Call call = updatePetWithFormCall(petId, name, status, progressListener, progressRequestListener); apiClient.executeAsync(call, callback); return call; } /* Build call for deletePet */ - private Call deletePetCall(Long petId, String apiKey) throws ApiException { + private Call deletePetCall(Long petId, String apiKey, final ProgressResponseBody.ProgressListener progressListener, final ProgressRequestBody.ProgressRequestListener progressRequestListener) throws ApiException { Object postBody = null; // verify the required parameter 'petId' is set @@ -421,8 +619,20 @@ public class PetApi { final String contentType = apiClient.selectHeaderContentType(contentTypes); headerParams.put("Content-Type", contentType); + if(progressListener != null) { + apiClient.getHttpClient().networkInterceptors().add(new Interceptor() { + @Override + public Response intercept(Interceptor.Chain chain) throws IOException { + Response originalResponse = chain.proceed(chain.request()); + return originalResponse.newBuilder() + .body(new ProgressResponseBody(originalResponse.body(), progressListener)) + .build(); + } + }); + } + String[] authNames = new String[] { "petstore_auth" }; - return apiClient.buildCall(path, "DELETE", queryParams, postBody, headerParams, formParams, authNames); + return apiClient.buildCall(path, "DELETE", queryParams, postBody, headerParams, formParams, authNames, progressRequestListener); } /** @@ -432,7 +642,7 @@ public class PetApi { * @param apiKey */ public void deletePet(Long petId, String apiKey) throws ApiException { - Call call = deletePetCall(petId, apiKey); + Call call = deletePetCall(petId, apiKey, null, null); apiClient.execute(call); } @@ -444,14 +654,34 @@ public class PetApi { * @param callback The callback to be executed when the API call finishes * @return The request call */ - public Call deletePetAsync(Long petId, String apiKey, ApiCallback callback) throws ApiException { - Call call = deletePetCall(petId, apiKey); + public Call deletePetAsync(Long petId, String apiKey, final ApiCallback callback) throws ApiException { + + ProgressResponseBody.ProgressListener progressListener = null; + ProgressRequestBody.ProgressRequestListener progressRequestListener = null; + + if(callback != null) { + progressListener = new ProgressResponseBody.ProgressListener() { + @Override + public void update(long bytesRead, long contentLength, boolean done) { + callback.onDownloadProgress(bytesRead, contentLength, done); + } + }; + + progressRequestListener = new ProgressRequestBody.ProgressRequestListener() { + @Override + public void onRequestProgress(long bytesWritten, long contentLength, boolean done) { + callback.onUploadProgress(bytesWritten, contentLength, done); + } + }; + } + + Call call = deletePetCall(petId, apiKey, progressListener, progressRequestListener); apiClient.executeAsync(call, callback); return call; } /* Build call for uploadFile */ - private Call uploadFileCall(Long petId, String additionalMetadata, File file) throws ApiException { + private Call uploadFileCall(Long petId, String additionalMetadata, File file, final ProgressResponseBody.ProgressListener progressListener, final ProgressRequestBody.ProgressRequestListener progressRequestListener) throws ApiException { Object postBody = null; // verify the required parameter 'petId' is set @@ -486,8 +716,20 @@ public class PetApi { final String contentType = apiClient.selectHeaderContentType(contentTypes); headerParams.put("Content-Type", contentType); + if(progressListener != null) { + apiClient.getHttpClient().networkInterceptors().add(new Interceptor() { + @Override + public Response intercept(Interceptor.Chain chain) throws IOException { + Response originalResponse = chain.proceed(chain.request()); + return originalResponse.newBuilder() + .body(new ProgressResponseBody(originalResponse.body(), progressListener)) + .build(); + } + }); + } + String[] authNames = new String[] { "petstore_auth" }; - return apiClient.buildCall(path, "POST", queryParams, postBody, headerParams, formParams, authNames); + return apiClient.buildCall(path, "POST", queryParams, postBody, headerParams, formParams, authNames, progressRequestListener); } /** @@ -498,7 +740,7 @@ public class PetApi { * @param file file to upload */ public void uploadFile(Long petId, String additionalMetadata, File file) throws ApiException { - Call call = uploadFileCall(petId, additionalMetadata, file); + Call call = uploadFileCall(petId, additionalMetadata, file, null, null); apiClient.execute(call); } @@ -511,8 +753,28 @@ public class PetApi { * @param callback The callback to be executed when the API call finishes * @return The request call */ - public Call uploadFileAsync(Long petId, String additionalMetadata, File file, ApiCallback callback) throws ApiException { - Call call = uploadFileCall(petId, additionalMetadata, file); + public Call uploadFileAsync(Long petId, String additionalMetadata, File file, final ApiCallback callback) throws ApiException { + + ProgressResponseBody.ProgressListener progressListener = null; + ProgressRequestBody.ProgressRequestListener progressRequestListener = null; + + if(callback != null) { + progressListener = new ProgressResponseBody.ProgressListener() { + @Override + public void update(long bytesRead, long contentLength, boolean done) { + callback.onDownloadProgress(bytesRead, contentLength, done); + } + }; + + progressRequestListener = new ProgressRequestBody.ProgressRequestListener() { + @Override + public void onRequestProgress(long bytesWritten, long contentLength, boolean done) { + callback.onUploadProgress(bytesWritten, contentLength, done); + } + }; + } + + Call call = uploadFileCall(petId, additionalMetadata, file, progressListener, progressRequestListener); apiClient.executeAsync(call, callback); return call; } diff --git a/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/api/StoreApi.java b/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/api/StoreApi.java index cb780538e18..2235a73e0c3 100644 --- a/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/api/StoreApi.java +++ b/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/api/StoreApi.java @@ -5,10 +5,16 @@ import io.swagger.client.ApiClient; import io.swagger.client.ApiException; import io.swagger.client.Configuration; import io.swagger.client.Pair; +import io.swagger.client.ProgressRequestBody; +import io.swagger.client.ProgressResponseBody; import com.google.gson.reflect.TypeToken; import com.squareup.okhttp.Call; +import com.squareup.okhttp.Interceptor; +import com.squareup.okhttp.Response; + +import java.io.IOException; import java.util.Map; import io.swagger.client.model.Order; @@ -37,7 +43,7 @@ public class StoreApi { /* Build call for getInventory */ - private Call getInventoryCall() throws ApiException { + private Call getInventoryCall(, final ProgressResponseBody.ProgressListener progressListener, final ProgressRequestBody.ProgressRequestListener progressRequestListener) throws ApiException { Object postBody = null; @@ -62,8 +68,20 @@ public class StoreApi { final String contentType = apiClient.selectHeaderContentType(contentTypes); headerParams.put("Content-Type", contentType); + if(progressListener != null) { + apiClient.getHttpClient().networkInterceptors().add(new Interceptor() { + @Override + public Response intercept(Interceptor.Chain chain) throws IOException { + Response originalResponse = chain.proceed(chain.request()); + return originalResponse.newBuilder() + .body(new ProgressResponseBody(originalResponse.body(), progressListener)) + .build(); + } + }); + } + String[] authNames = new String[] { "api_key" }; - return apiClient.buildCall(path, "GET", queryParams, postBody, headerParams, formParams, authNames); + return apiClient.buildCall(path, "GET", queryParams, postBody, headerParams, formParams, authNames, progressRequestListener); } /** @@ -72,7 +90,7 @@ public class StoreApi { * @return Map */ public Map getInventory() throws ApiException { - Call call = getInventoryCall(); + Call call = getInventoryCall(, null, null); Type returnType = new TypeToken>(){}.getType(); return apiClient.execute(call, returnType); } @@ -83,15 +101,35 @@ public class StoreApi { * @param callback The callback to be executed when the API call finishes * @return The request call */ - public Call getInventoryAsync(ApiCallback> callback) throws ApiException { - Call call = getInventoryCall(); + public Call getInventoryAsync(final ApiCallback> callback) throws ApiException { + + ProgressResponseBody.ProgressListener progressListener = null; + ProgressRequestBody.ProgressRequestListener progressRequestListener = null; + + if(callback != null) { + progressListener = new ProgressResponseBody.ProgressListener() { + @Override + public void update(long bytesRead, long contentLength, boolean done) { + callback.onDownloadProgress(bytesRead, contentLength, done); + } + }; + + progressRequestListener = new ProgressRequestBody.ProgressRequestListener() { + @Override + public void onRequestProgress(long bytesWritten, long contentLength, boolean done) { + callback.onUploadProgress(bytesWritten, contentLength, done); + } + }; + } + + Call call = getInventoryCall(, progressListener, progressRequestListener); Type returnType = new TypeToken>(){}.getType(); apiClient.executeAsync(call, returnType, callback); return call; } /* Build call for placeOrder */ - private Call placeOrderCall(Order body) throws ApiException { + private Call placeOrderCall(Order body, final ProgressResponseBody.ProgressListener progressListener, final ProgressRequestBody.ProgressRequestListener progressRequestListener) throws ApiException { Object postBody = body; @@ -116,8 +154,20 @@ public class StoreApi { final String contentType = apiClient.selectHeaderContentType(contentTypes); headerParams.put("Content-Type", contentType); + if(progressListener != null) { + apiClient.getHttpClient().networkInterceptors().add(new Interceptor() { + @Override + public Response intercept(Interceptor.Chain chain) throws IOException { + Response originalResponse = chain.proceed(chain.request()); + return originalResponse.newBuilder() + .body(new ProgressResponseBody(originalResponse.body(), progressListener)) + .build(); + } + }); + } + String[] authNames = new String[] { }; - return apiClient.buildCall(path, "POST", queryParams, postBody, headerParams, formParams, authNames); + return apiClient.buildCall(path, "POST", queryParams, postBody, headerParams, formParams, authNames, progressRequestListener); } /** @@ -127,7 +177,7 @@ public class StoreApi { * @return Order */ public Order placeOrder(Order body) throws ApiException { - Call call = placeOrderCall(body); + Call call = placeOrderCall(body, null, null); Type returnType = new TypeToken(){}.getType(); return apiClient.execute(call, returnType); } @@ -139,15 +189,35 @@ public class StoreApi { * @param callback The callback to be executed when the API call finishes * @return The request call */ - public Call placeOrderAsync(Order body, ApiCallback callback) throws ApiException { - Call call = placeOrderCall(body); + public Call placeOrderAsync(Order body, final ApiCallback callback) throws ApiException { + + ProgressResponseBody.ProgressListener progressListener = null; + ProgressRequestBody.ProgressRequestListener progressRequestListener = null; + + if(callback != null) { + progressListener = new ProgressResponseBody.ProgressListener() { + @Override + public void update(long bytesRead, long contentLength, boolean done) { + callback.onDownloadProgress(bytesRead, contentLength, done); + } + }; + + progressRequestListener = new ProgressRequestBody.ProgressRequestListener() { + @Override + public void onRequestProgress(long bytesWritten, long contentLength, boolean done) { + callback.onUploadProgress(bytesWritten, contentLength, done); + } + }; + } + + Call call = placeOrderCall(body, progressListener, progressRequestListener); Type returnType = new TypeToken(){}.getType(); apiClient.executeAsync(call, returnType, callback); return call; } /* Build call for getOrderById */ - private Call getOrderByIdCall(String orderId) throws ApiException { + private Call getOrderByIdCall(String orderId, final ProgressResponseBody.ProgressListener progressListener, final ProgressRequestBody.ProgressRequestListener progressRequestListener) throws ApiException { Object postBody = null; // verify the required parameter 'orderId' is set @@ -178,8 +248,20 @@ public class StoreApi { final String contentType = apiClient.selectHeaderContentType(contentTypes); headerParams.put("Content-Type", contentType); + if(progressListener != null) { + apiClient.getHttpClient().networkInterceptors().add(new Interceptor() { + @Override + public Response intercept(Interceptor.Chain chain) throws IOException { + Response originalResponse = chain.proceed(chain.request()); + return originalResponse.newBuilder() + .body(new ProgressResponseBody(originalResponse.body(), progressListener)) + .build(); + } + }); + } + String[] authNames = new String[] { }; - return apiClient.buildCall(path, "GET", queryParams, postBody, headerParams, formParams, authNames); + return apiClient.buildCall(path, "GET", queryParams, postBody, headerParams, formParams, authNames, progressRequestListener); } /** @@ -189,7 +271,7 @@ public class StoreApi { * @return Order */ public Order getOrderById(String orderId) throws ApiException { - Call call = getOrderByIdCall(orderId); + Call call = getOrderByIdCall(orderId, null, null); Type returnType = new TypeToken(){}.getType(); return apiClient.execute(call, returnType); } @@ -201,15 +283,35 @@ public class StoreApi { * @param callback The callback to be executed when the API call finishes * @return The request call */ - public Call getOrderByIdAsync(String orderId, ApiCallback callback) throws ApiException { - Call call = getOrderByIdCall(orderId); + public Call getOrderByIdAsync(String orderId, final ApiCallback callback) throws ApiException { + + ProgressResponseBody.ProgressListener progressListener = null; + ProgressRequestBody.ProgressRequestListener progressRequestListener = null; + + if(callback != null) { + progressListener = new ProgressResponseBody.ProgressListener() { + @Override + public void update(long bytesRead, long contentLength, boolean done) { + callback.onDownloadProgress(bytesRead, contentLength, done); + } + }; + + progressRequestListener = new ProgressRequestBody.ProgressRequestListener() { + @Override + public void onRequestProgress(long bytesWritten, long contentLength, boolean done) { + callback.onUploadProgress(bytesWritten, contentLength, done); + } + }; + } + + Call call = getOrderByIdCall(orderId, progressListener, progressRequestListener); Type returnType = new TypeToken(){}.getType(); apiClient.executeAsync(call, returnType, callback); return call; } /* Build call for deleteOrder */ - private Call deleteOrderCall(String orderId) throws ApiException { + private Call deleteOrderCall(String orderId, final ProgressResponseBody.ProgressListener progressListener, final ProgressRequestBody.ProgressRequestListener progressRequestListener) throws ApiException { Object postBody = null; // verify the required parameter 'orderId' is set @@ -240,8 +342,20 @@ public class StoreApi { final String contentType = apiClient.selectHeaderContentType(contentTypes); headerParams.put("Content-Type", contentType); + if(progressListener != null) { + apiClient.getHttpClient().networkInterceptors().add(new Interceptor() { + @Override + public Response intercept(Interceptor.Chain chain) throws IOException { + Response originalResponse = chain.proceed(chain.request()); + return originalResponse.newBuilder() + .body(new ProgressResponseBody(originalResponse.body(), progressListener)) + .build(); + } + }); + } + String[] authNames = new String[] { }; - return apiClient.buildCall(path, "DELETE", queryParams, postBody, headerParams, formParams, authNames); + return apiClient.buildCall(path, "DELETE", queryParams, postBody, headerParams, formParams, authNames, progressRequestListener); } /** @@ -250,7 +364,7 @@ public class StoreApi { * @param orderId ID of the order that needs to be deleted */ public void deleteOrder(String orderId) throws ApiException { - Call call = deleteOrderCall(orderId); + Call call = deleteOrderCall(orderId, null, null); apiClient.execute(call); } @@ -261,8 +375,28 @@ public class StoreApi { * @param callback The callback to be executed when the API call finishes * @return The request call */ - public Call deleteOrderAsync(String orderId, ApiCallback callback) throws ApiException { - Call call = deleteOrderCall(orderId); + public Call deleteOrderAsync(String orderId, final ApiCallback callback) throws ApiException { + + ProgressResponseBody.ProgressListener progressListener = null; + ProgressRequestBody.ProgressRequestListener progressRequestListener = null; + + if(callback != null) { + progressListener = new ProgressResponseBody.ProgressListener() { + @Override + public void update(long bytesRead, long contentLength, boolean done) { + callback.onDownloadProgress(bytesRead, contentLength, done); + } + }; + + progressRequestListener = new ProgressRequestBody.ProgressRequestListener() { + @Override + public void onRequestProgress(long bytesWritten, long contentLength, boolean done) { + callback.onUploadProgress(bytesWritten, contentLength, done); + } + }; + } + + Call call = deleteOrderCall(orderId, progressListener, progressRequestListener); apiClient.executeAsync(call, callback); return call; } diff --git a/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/api/UserApi.java b/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/api/UserApi.java index a04470b3b40..4f364db4b12 100644 --- a/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/api/UserApi.java +++ b/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/api/UserApi.java @@ -5,10 +5,16 @@ import io.swagger.client.ApiClient; import io.swagger.client.ApiException; import io.swagger.client.Configuration; import io.swagger.client.Pair; +import io.swagger.client.ProgressRequestBody; +import io.swagger.client.ProgressResponseBody; import com.google.gson.reflect.TypeToken; import com.squareup.okhttp.Call; +import com.squareup.okhttp.Interceptor; +import com.squareup.okhttp.Response; + +import java.io.IOException; import io.swagger.client.model.User; import java.util.*; @@ -37,7 +43,7 @@ public class UserApi { /* Build call for createUser */ - private Call createUserCall(User body) throws ApiException { + private Call createUserCall(User body, final ProgressResponseBody.ProgressListener progressListener, final ProgressRequestBody.ProgressRequestListener progressRequestListener) throws ApiException { Object postBody = body; @@ -62,8 +68,20 @@ public class UserApi { final String contentType = apiClient.selectHeaderContentType(contentTypes); headerParams.put("Content-Type", contentType); + if(progressListener != null) { + apiClient.getHttpClient().networkInterceptors().add(new Interceptor() { + @Override + public Response intercept(Interceptor.Chain chain) throws IOException { + Response originalResponse = chain.proceed(chain.request()); + return originalResponse.newBuilder() + .body(new ProgressResponseBody(originalResponse.body(), progressListener)) + .build(); + } + }); + } + String[] authNames = new String[] { }; - return apiClient.buildCall(path, "POST", queryParams, postBody, headerParams, formParams, authNames); + return apiClient.buildCall(path, "POST", queryParams, postBody, headerParams, formParams, authNames, progressRequestListener); } /** @@ -72,7 +90,7 @@ public class UserApi { * @param body Created user object */ public void createUser(User body) throws ApiException { - Call call = createUserCall(body); + Call call = createUserCall(body, null, null); apiClient.execute(call); } @@ -83,14 +101,34 @@ public class UserApi { * @param callback The callback to be executed when the API call finishes * @return The request call */ - public Call createUserAsync(User body, ApiCallback callback) throws ApiException { - Call call = createUserCall(body); + public Call createUserAsync(User body, final ApiCallback callback) throws ApiException { + + ProgressResponseBody.ProgressListener progressListener = null; + ProgressRequestBody.ProgressRequestListener progressRequestListener = null; + + if(callback != null) { + progressListener = new ProgressResponseBody.ProgressListener() { + @Override + public void update(long bytesRead, long contentLength, boolean done) { + callback.onDownloadProgress(bytesRead, contentLength, done); + } + }; + + progressRequestListener = new ProgressRequestBody.ProgressRequestListener() { + @Override + public void onRequestProgress(long bytesWritten, long contentLength, boolean done) { + callback.onUploadProgress(bytesWritten, contentLength, done); + } + }; + } + + Call call = createUserCall(body, progressListener, progressRequestListener); apiClient.executeAsync(call, callback); return call; } /* Build call for createUsersWithArrayInput */ - private Call createUsersWithArrayInputCall(List body) throws ApiException { + private Call createUsersWithArrayInputCall(List body, final ProgressResponseBody.ProgressListener progressListener, final ProgressRequestBody.ProgressRequestListener progressRequestListener) throws ApiException { Object postBody = body; @@ -115,8 +153,20 @@ public class UserApi { final String contentType = apiClient.selectHeaderContentType(contentTypes); headerParams.put("Content-Type", contentType); + if(progressListener != null) { + apiClient.getHttpClient().networkInterceptors().add(new Interceptor() { + @Override + public Response intercept(Interceptor.Chain chain) throws IOException { + Response originalResponse = chain.proceed(chain.request()); + return originalResponse.newBuilder() + .body(new ProgressResponseBody(originalResponse.body(), progressListener)) + .build(); + } + }); + } + String[] authNames = new String[] { }; - return apiClient.buildCall(path, "POST", queryParams, postBody, headerParams, formParams, authNames); + return apiClient.buildCall(path, "POST", queryParams, postBody, headerParams, formParams, authNames, progressRequestListener); } /** @@ -125,7 +175,7 @@ public class UserApi { * @param body List of user object */ public void createUsersWithArrayInput(List body) throws ApiException { - Call call = createUsersWithArrayInputCall(body); + Call call = createUsersWithArrayInputCall(body, null, null); apiClient.execute(call); } @@ -136,14 +186,34 @@ public class UserApi { * @param callback The callback to be executed when the API call finishes * @return The request call */ - public Call createUsersWithArrayInputAsync(List body, ApiCallback callback) throws ApiException { - Call call = createUsersWithArrayInputCall(body); + public Call createUsersWithArrayInputAsync(List body, final ApiCallback callback) throws ApiException { + + ProgressResponseBody.ProgressListener progressListener = null; + ProgressRequestBody.ProgressRequestListener progressRequestListener = null; + + if(callback != null) { + progressListener = new ProgressResponseBody.ProgressListener() { + @Override + public void update(long bytesRead, long contentLength, boolean done) { + callback.onDownloadProgress(bytesRead, contentLength, done); + } + }; + + progressRequestListener = new ProgressRequestBody.ProgressRequestListener() { + @Override + public void onRequestProgress(long bytesWritten, long contentLength, boolean done) { + callback.onUploadProgress(bytesWritten, contentLength, done); + } + }; + } + + Call call = createUsersWithArrayInputCall(body, progressListener, progressRequestListener); apiClient.executeAsync(call, callback); return call; } /* Build call for createUsersWithListInput */ - private Call createUsersWithListInputCall(List body) throws ApiException { + private Call createUsersWithListInputCall(List body, final ProgressResponseBody.ProgressListener progressListener, final ProgressRequestBody.ProgressRequestListener progressRequestListener) throws ApiException { Object postBody = body; @@ -168,8 +238,20 @@ public class UserApi { final String contentType = apiClient.selectHeaderContentType(contentTypes); headerParams.put("Content-Type", contentType); + if(progressListener != null) { + apiClient.getHttpClient().networkInterceptors().add(new Interceptor() { + @Override + public Response intercept(Interceptor.Chain chain) throws IOException { + Response originalResponse = chain.proceed(chain.request()); + return originalResponse.newBuilder() + .body(new ProgressResponseBody(originalResponse.body(), progressListener)) + .build(); + } + }); + } + String[] authNames = new String[] { }; - return apiClient.buildCall(path, "POST", queryParams, postBody, headerParams, formParams, authNames); + return apiClient.buildCall(path, "POST", queryParams, postBody, headerParams, formParams, authNames, progressRequestListener); } /** @@ -178,7 +260,7 @@ public class UserApi { * @param body List of user object */ public void createUsersWithListInput(List body) throws ApiException { - Call call = createUsersWithListInputCall(body); + Call call = createUsersWithListInputCall(body, null, null); apiClient.execute(call); } @@ -189,14 +271,34 @@ public class UserApi { * @param callback The callback to be executed when the API call finishes * @return The request call */ - public Call createUsersWithListInputAsync(List body, ApiCallback callback) throws ApiException { - Call call = createUsersWithListInputCall(body); + public Call createUsersWithListInputAsync(List body, final ApiCallback callback) throws ApiException { + + ProgressResponseBody.ProgressListener progressListener = null; + ProgressRequestBody.ProgressRequestListener progressRequestListener = null; + + if(callback != null) { + progressListener = new ProgressResponseBody.ProgressListener() { + @Override + public void update(long bytesRead, long contentLength, boolean done) { + callback.onDownloadProgress(bytesRead, contentLength, done); + } + }; + + progressRequestListener = new ProgressRequestBody.ProgressRequestListener() { + @Override + public void onRequestProgress(long bytesWritten, long contentLength, boolean done) { + callback.onUploadProgress(bytesWritten, contentLength, done); + } + }; + } + + Call call = createUsersWithListInputCall(body, progressListener, progressRequestListener); apiClient.executeAsync(call, callback); return call; } /* Build call for loginUser */ - private Call loginUserCall(String username, String password) throws ApiException { + private Call loginUserCall(String username, String password, final ProgressResponseBody.ProgressListener progressListener, final ProgressRequestBody.ProgressRequestListener progressRequestListener) throws ApiException { Object postBody = null; @@ -225,8 +327,20 @@ public class UserApi { final String contentType = apiClient.selectHeaderContentType(contentTypes); headerParams.put("Content-Type", contentType); + if(progressListener != null) { + apiClient.getHttpClient().networkInterceptors().add(new Interceptor() { + @Override + public Response intercept(Interceptor.Chain chain) throws IOException { + Response originalResponse = chain.proceed(chain.request()); + return originalResponse.newBuilder() + .body(new ProgressResponseBody(originalResponse.body(), progressListener)) + .build(); + } + }); + } + String[] authNames = new String[] { }; - return apiClient.buildCall(path, "GET", queryParams, postBody, headerParams, formParams, authNames); + return apiClient.buildCall(path, "GET", queryParams, postBody, headerParams, formParams, authNames, progressRequestListener); } /** @@ -237,7 +351,7 @@ public class UserApi { * @return String */ public String loginUser(String username, String password) throws ApiException { - Call call = loginUserCall(username, password); + Call call = loginUserCall(username, password, null, null); Type returnType = new TypeToken(){}.getType(); return apiClient.execute(call, returnType); } @@ -250,15 +364,35 @@ public class UserApi { * @param callback The callback to be executed when the API call finishes * @return The request call */ - public Call loginUserAsync(String username, String password, ApiCallback callback) throws ApiException { - Call call = loginUserCall(username, password); + public Call loginUserAsync(String username, String password, final ApiCallback callback) throws ApiException { + + ProgressResponseBody.ProgressListener progressListener = null; + ProgressRequestBody.ProgressRequestListener progressRequestListener = null; + + if(callback != null) { + progressListener = new ProgressResponseBody.ProgressListener() { + @Override + public void update(long bytesRead, long contentLength, boolean done) { + callback.onDownloadProgress(bytesRead, contentLength, done); + } + }; + + progressRequestListener = new ProgressRequestBody.ProgressRequestListener() { + @Override + public void onRequestProgress(long bytesWritten, long contentLength, boolean done) { + callback.onUploadProgress(bytesWritten, contentLength, done); + } + }; + } + + Call call = loginUserCall(username, password, progressListener, progressRequestListener); Type returnType = new TypeToken(){}.getType(); apiClient.executeAsync(call, returnType, callback); return call; } /* Build call for logoutUser */ - private Call logoutUserCall() throws ApiException { + private Call logoutUserCall(, final ProgressResponseBody.ProgressListener progressListener, final ProgressRequestBody.ProgressRequestListener progressRequestListener) throws ApiException { Object postBody = null; @@ -283,8 +417,20 @@ public class UserApi { final String contentType = apiClient.selectHeaderContentType(contentTypes); headerParams.put("Content-Type", contentType); + if(progressListener != null) { + apiClient.getHttpClient().networkInterceptors().add(new Interceptor() { + @Override + public Response intercept(Interceptor.Chain chain) throws IOException { + Response originalResponse = chain.proceed(chain.request()); + return originalResponse.newBuilder() + .body(new ProgressResponseBody(originalResponse.body(), progressListener)) + .build(); + } + }); + } + String[] authNames = new String[] { }; - return apiClient.buildCall(path, "GET", queryParams, postBody, headerParams, formParams, authNames); + return apiClient.buildCall(path, "GET", queryParams, postBody, headerParams, formParams, authNames, progressRequestListener); } /** @@ -292,7 +438,7 @@ public class UserApi { * */ public void logoutUser() throws ApiException { - Call call = logoutUserCall(); + Call call = logoutUserCall(, null, null); apiClient.execute(call); } @@ -302,14 +448,34 @@ public class UserApi { * @param callback The callback to be executed when the API call finishes * @return The request call */ - public Call logoutUserAsync(ApiCallback callback) throws ApiException { - Call call = logoutUserCall(); + public Call logoutUserAsync(final ApiCallback callback) throws ApiException { + + ProgressResponseBody.ProgressListener progressListener = null; + ProgressRequestBody.ProgressRequestListener progressRequestListener = null; + + if(callback != null) { + progressListener = new ProgressResponseBody.ProgressListener() { + @Override + public void update(long bytesRead, long contentLength, boolean done) { + callback.onDownloadProgress(bytesRead, contentLength, done); + } + }; + + progressRequestListener = new ProgressRequestBody.ProgressRequestListener() { + @Override + public void onRequestProgress(long bytesWritten, long contentLength, boolean done) { + callback.onUploadProgress(bytesWritten, contentLength, done); + } + }; + } + + Call call = logoutUserCall(, progressListener, progressRequestListener); apiClient.executeAsync(call, callback); return call; } /* Build call for getUserByName */ - private Call getUserByNameCall(String username) throws ApiException { + private Call getUserByNameCall(String username, final ProgressResponseBody.ProgressListener progressListener, final ProgressRequestBody.ProgressRequestListener progressRequestListener) throws ApiException { Object postBody = null; // verify the required parameter 'username' is set @@ -340,8 +506,20 @@ public class UserApi { final String contentType = apiClient.selectHeaderContentType(contentTypes); headerParams.put("Content-Type", contentType); + if(progressListener != null) { + apiClient.getHttpClient().networkInterceptors().add(new Interceptor() { + @Override + public Response intercept(Interceptor.Chain chain) throws IOException { + Response originalResponse = chain.proceed(chain.request()); + return originalResponse.newBuilder() + .body(new ProgressResponseBody(originalResponse.body(), progressListener)) + .build(); + } + }); + } + String[] authNames = new String[] { }; - return apiClient.buildCall(path, "GET", queryParams, postBody, headerParams, formParams, authNames); + return apiClient.buildCall(path, "GET", queryParams, postBody, headerParams, formParams, authNames, progressRequestListener); } /** @@ -351,7 +529,7 @@ public class UserApi { * @return User */ public User getUserByName(String username) throws ApiException { - Call call = getUserByNameCall(username); + Call call = getUserByNameCall(username, null, null); Type returnType = new TypeToken(){}.getType(); return apiClient.execute(call, returnType); } @@ -363,15 +541,35 @@ public class UserApi { * @param callback The callback to be executed when the API call finishes * @return The request call */ - public Call getUserByNameAsync(String username, ApiCallback callback) throws ApiException { - Call call = getUserByNameCall(username); + public Call getUserByNameAsync(String username, final ApiCallback callback) throws ApiException { + + ProgressResponseBody.ProgressListener progressListener = null; + ProgressRequestBody.ProgressRequestListener progressRequestListener = null; + + if(callback != null) { + progressListener = new ProgressResponseBody.ProgressListener() { + @Override + public void update(long bytesRead, long contentLength, boolean done) { + callback.onDownloadProgress(bytesRead, contentLength, done); + } + }; + + progressRequestListener = new ProgressRequestBody.ProgressRequestListener() { + @Override + public void onRequestProgress(long bytesWritten, long contentLength, boolean done) { + callback.onUploadProgress(bytesWritten, contentLength, done); + } + }; + } + + Call call = getUserByNameCall(username, progressListener, progressRequestListener); Type returnType = new TypeToken(){}.getType(); apiClient.executeAsync(call, returnType, callback); return call; } /* Build call for updateUser */ - private Call updateUserCall(String username, User body) throws ApiException { + private Call updateUserCall(String username, User body, final ProgressResponseBody.ProgressListener progressListener, final ProgressRequestBody.ProgressRequestListener progressRequestListener) throws ApiException { Object postBody = body; // verify the required parameter 'username' is set @@ -402,8 +600,20 @@ public class UserApi { final String contentType = apiClient.selectHeaderContentType(contentTypes); headerParams.put("Content-Type", contentType); + if(progressListener != null) { + apiClient.getHttpClient().networkInterceptors().add(new Interceptor() { + @Override + public Response intercept(Interceptor.Chain chain) throws IOException { + Response originalResponse = chain.proceed(chain.request()); + return originalResponse.newBuilder() + .body(new ProgressResponseBody(originalResponse.body(), progressListener)) + .build(); + } + }); + } + String[] authNames = new String[] { }; - return apiClient.buildCall(path, "PUT", queryParams, postBody, headerParams, formParams, authNames); + return apiClient.buildCall(path, "PUT", queryParams, postBody, headerParams, formParams, authNames, progressRequestListener); } /** @@ -413,7 +623,7 @@ public class UserApi { * @param body Updated user object */ public void updateUser(String username, User body) throws ApiException { - Call call = updateUserCall(username, body); + Call call = updateUserCall(username, body, null, null); apiClient.execute(call); } @@ -425,14 +635,34 @@ public class UserApi { * @param callback The callback to be executed when the API call finishes * @return The request call */ - public Call updateUserAsync(String username, User body, ApiCallback callback) throws ApiException { - Call call = updateUserCall(username, body); + public Call updateUserAsync(String username, User body, final ApiCallback callback) throws ApiException { + + ProgressResponseBody.ProgressListener progressListener = null; + ProgressRequestBody.ProgressRequestListener progressRequestListener = null; + + if(callback != null) { + progressListener = new ProgressResponseBody.ProgressListener() { + @Override + public void update(long bytesRead, long contentLength, boolean done) { + callback.onDownloadProgress(bytesRead, contentLength, done); + } + }; + + progressRequestListener = new ProgressRequestBody.ProgressRequestListener() { + @Override + public void onRequestProgress(long bytesWritten, long contentLength, boolean done) { + callback.onUploadProgress(bytesWritten, contentLength, done); + } + }; + } + + Call call = updateUserCall(username, body, progressListener, progressRequestListener); apiClient.executeAsync(call, callback); return call; } /* Build call for deleteUser */ - private Call deleteUserCall(String username) throws ApiException { + private Call deleteUserCall(String username, final ProgressResponseBody.ProgressListener progressListener, final ProgressRequestBody.ProgressRequestListener progressRequestListener) throws ApiException { Object postBody = null; // verify the required parameter 'username' is set @@ -463,8 +693,20 @@ public class UserApi { final String contentType = apiClient.selectHeaderContentType(contentTypes); headerParams.put("Content-Type", contentType); + if(progressListener != null) { + apiClient.getHttpClient().networkInterceptors().add(new Interceptor() { + @Override + public Response intercept(Interceptor.Chain chain) throws IOException { + Response originalResponse = chain.proceed(chain.request()); + return originalResponse.newBuilder() + .body(new ProgressResponseBody(originalResponse.body(), progressListener)) + .build(); + } + }); + } + String[] authNames = new String[] { }; - return apiClient.buildCall(path, "DELETE", queryParams, postBody, headerParams, formParams, authNames); + return apiClient.buildCall(path, "DELETE", queryParams, postBody, headerParams, formParams, authNames, progressRequestListener); } /** @@ -473,7 +715,7 @@ public class UserApi { * @param username The name that needs to be deleted */ public void deleteUser(String username) throws ApiException { - Call call = deleteUserCall(username); + Call call = deleteUserCall(username, null, null); apiClient.execute(call); } @@ -484,8 +726,28 @@ public class UserApi { * @param callback The callback to be executed when the API call finishes * @return The request call */ - public Call deleteUserAsync(String username, ApiCallback callback) throws ApiException { - Call call = deleteUserCall(username); + public Call deleteUserAsync(String username, final ApiCallback callback) throws ApiException { + + ProgressResponseBody.ProgressListener progressListener = null; + ProgressRequestBody.ProgressRequestListener progressRequestListener = null; + + if(callback != null) { + progressListener = new ProgressResponseBody.ProgressListener() { + @Override + public void update(long bytesRead, long contentLength, boolean done) { + callback.onDownloadProgress(bytesRead, contentLength, done); + } + }; + + progressRequestListener = new ProgressRequestBody.ProgressRequestListener() { + @Override + public void onRequestProgress(long bytesWritten, long contentLength, boolean done) { + callback.onUploadProgress(bytesWritten, contentLength, done); + } + }; + } + + Call call = deleteUserCall(username, progressListener, progressRequestListener); apiClient.executeAsync(call, callback); return call; } diff --git a/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/auth/ApiKeyAuth.java b/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/auth/ApiKeyAuth.java index c072321f457..600455b7592 100644 --- a/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/auth/ApiKeyAuth.java +++ b/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/auth/ApiKeyAuth.java @@ -5,7 +5,7 @@ import io.swagger.client.Pair; import java.util.Map; import java.util.List; -@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-10-20T11:42:25.339-07:00") +@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-11-21T19:41:14.431+08:00") public class ApiKeyAuth implements Authentication { private final String location; private final String paramName; diff --git a/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/auth/Authentication.java b/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/auth/Authentication.java index 18ca4080c2e..aa2efcd7e9b 100644 --- a/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/auth/Authentication.java +++ b/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/auth/Authentication.java @@ -5,7 +5,7 @@ import io.swagger.client.Pair; import java.util.Map; import java.util.List; -@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-10-20T11:42:25.339-07:00") +@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-11-21T19:41:14.431+08:00") public interface Authentication { /** Apply authentication settings to header and query params. */ void applyToParams(List queryParams, Map headerParams); diff --git a/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/auth/OAuth.java b/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/auth/OAuth.java index bc6473d110f..8463a8bbd28 100644 --- a/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/auth/OAuth.java +++ b/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/auth/OAuth.java @@ -5,7 +5,7 @@ import io.swagger.client.Pair; import java.util.Map; import java.util.List; -@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-11-02T22:14:00.422+08:00") +@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-11-21T19:41:14.431+08:00") public class OAuth implements Authentication { private String accessToken; From 98396d04a785ba8aa5d42befe49733b376a8b446 Mon Sep 17 00:00:00 2001 From: Alvin Date: Sat, 21 Nov 2015 20:12:11 +0800 Subject: [PATCH 019/211] update sample & test --- .../libraries/okhttp-gson/ApiClient.mustache | 2 +- .../Java/libraries/okhttp-gson/api.mustache | 6 +++--- .../java/io/swagger/client/ApiClient.java | 2 +- .../java/io/swagger/client/ApiException.java | 2 +- .../java/io/swagger/client/Configuration.java | 2 +- .../src/main/java/io/swagger/client/Pair.java | 2 +- .../java/io/swagger/client/StringUtil.java | 2 +- .../java/io/swagger/client/api/PetApi.java | 18 ++++++++--------- .../java/io/swagger/client/api/StoreApi.java | 6 +++--- .../java/io/swagger/client/api/UserApi.java | 18 ++++++++--------- .../io/swagger/client/auth/ApiKeyAuth.java | 2 +- .../swagger/client/auth/Authentication.java | 2 +- .../java/io/swagger/client/auth/OAuth.java | 2 +- .../io/swagger/petstore/test/PetApiTest.java | 20 +++++++++++++++++++ 14 files changed, 53 insertions(+), 33 deletions(-) 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 bbd2ac4661e..cef9a843347 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 @@ -853,7 +853,7 @@ public class ApiClient { Request request = null; - if(progressRequestListener != null) { + if(progressRequestListener != null && reqBody != null) { ProgressRequestBody progressRequestBody = new ProgressRequestBody(reqBody, progressRequestListener); request = reqBuilder.method(method, progressRequestBody).build(); } else { diff --git a/modules/swagger-codegen/src/main/resources/Java/libraries/okhttp-gson/api.mustache b/modules/swagger-codegen/src/main/resources/Java/libraries/okhttp-gson/api.mustache index 060de47c0d6..c5ddb428e59 100644 --- a/modules/swagger-codegen/src/main/resources/Java/libraries/okhttp-gson/api.mustache +++ b/modules/swagger-codegen/src/main/resources/Java/libraries/okhttp-gson/api.mustache @@ -46,7 +46,7 @@ public class {{classname}} { {{#operation}} /* Build call for {{nickname}} */ - private Call {{nickname}}Call({{#allParams}}{{{dataType}}} {{paramName}}{{#hasMore}}, {{/hasMore}}{{/allParams}}, final ProgressResponseBody.ProgressListener progressListener, final ProgressRequestBody.ProgressRequestListener progressRequestListener) throws ApiException { + private Call {{nickname}}Call({{#allParams}}{{{dataType}}} {{paramName}},{{/allParams}} final ProgressResponseBody.ProgressListener progressListener, final ProgressRequestBody.ProgressRequestListener progressRequestListener) throws ApiException { Object {{localVariablePrefix}}postBody = {{#bodyParam}}{{paramName}}{{/bodyParam}}{{^bodyParam}}null{{/bodyParam}}; {{#allParams}}{{#required}} // verify the required parameter '{{paramName}}' is set @@ -106,7 +106,7 @@ public class {{classname}} { * @return {{{returnType}}}{{/returnType}} */ public {{#returnType}}{{{returnType}}} {{/returnType}}{{^returnType}}void {{/returnType}}{{nickname}}({{#allParams}}{{{dataType}}} {{paramName}}{{#hasMore}}, {{/hasMore}}{{/allParams}}) throws ApiException { - Call {{localVariablePrefix}}call = {{nickname}}Call({{#allParams}}{{paramName}}{{#hasMore}}, {{/hasMore}}{{/allParams}}, null, null); + Call {{localVariablePrefix}}call = {{nickname}}Call({{#allParams}}{{paramName}},{{/allParams}} null, null); {{#returnType}}Type {{localVariablePrefix}}returnType = new TypeToken<{{{returnType}}}>(){}.getType(); return {{localVariablePrefix}}apiClient.execute({{localVariablePrefix}}call, {{localVariablePrefix}}returnType);{{/returnType}}{{^returnType}}{{localVariablePrefix}}apiClient.execute({{localVariablePrefix}}call);{{/returnType}} } @@ -139,7 +139,7 @@ public class {{classname}} { }; } - Call {{localVariablePrefix}}call = {{nickname}}Call({{#allParams}}{{paramName}}{{#hasMore}}, {{/hasMore}}{{/allParams}}, progressListener, progressRequestListener); + Call {{localVariablePrefix}}call = {{nickname}}Call({{#allParams}}{{paramName}},{{/allParams}} progressListener, progressRequestListener); {{#returnType}}Type {{localVariablePrefix}}returnType = new TypeToken<{{{returnType}}}>(){}.getType(); {{localVariablePrefix}}apiClient.executeAsync({{localVariablePrefix}}call, {{localVariablePrefix}}returnType, {{localVariablePrefix}}callback);{{/returnType}}{{^returnType}}{{localVariablePrefix}}apiClient.executeAsync({{localVariablePrefix}}call, {{localVariablePrefix}}callback);{{/returnType}} return {{localVariablePrefix}}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 43df2643cd3..8d38c18e907 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 @@ -852,7 +852,7 @@ public class ApiClient { Request request = null; - if(progressRequestListener != null) { + if(progressRequestListener != null && reqBody != null) { ProgressRequestBody progressRequestBody = new ProgressRequestBody(reqBody, progressRequestListener); request = reqBuilder.method(method, progressRequestBody).build(); } else { diff --git a/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/ApiException.java b/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/ApiException.java index 3df58b0b4d1..6d4b388a623 100644 --- a/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/ApiException.java +++ b/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/ApiException.java @@ -3,7 +3,7 @@ package io.swagger.client; import java.util.Map; import java.util.List; -@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-11-21T19:41:14.431+08:00") +@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-11-21T20:11:09.490+08:00") public class ApiException extends Exception { private int code = 0; private Map> responseHeaders = null; diff --git a/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/Configuration.java b/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/Configuration.java index 084020d501a..9399e3bed44 100644 --- a/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/Configuration.java +++ b/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/Configuration.java @@ -1,6 +1,6 @@ package io.swagger.client; -@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-11-21T19:41:14.431+08:00") +@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-11-21T20:11:09.490+08:00") public class Configuration { private static ApiClient defaultApiClient = new ApiClient(); diff --git a/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/Pair.java b/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/Pair.java index 91ae60aa14b..b1b4a5565a6 100644 --- a/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/Pair.java +++ b/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/Pair.java @@ -1,6 +1,6 @@ package io.swagger.client; -@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-11-21T19:41:14.431+08:00") +@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-11-21T20:11:09.490+08:00") public class Pair { private String name = ""; private String value = ""; diff --git a/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/StringUtil.java b/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/StringUtil.java index bd4fefc651a..f5cb2680b10 100644 --- a/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/StringUtil.java +++ b/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/StringUtil.java @@ -1,6 +1,6 @@ package io.swagger.client; -@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-11-21T19:41:14.431+08:00") +@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-11-21T20:11:09.490+08:00") public class StringUtil { /** * Check if the given array contains the given value (with case-insensitive comparison). diff --git a/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/api/PetApi.java b/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/api/PetApi.java index d1982566bf9..cce05b29a3a 100644 --- a/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/api/PetApi.java +++ b/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/api/PetApi.java @@ -487,7 +487,7 @@ public class PetApi { } /* Build call for updatePetWithForm */ - private Call updatePetWithFormCall(String petId, String name, String status, final ProgressResponseBody.ProgressListener progressListener, final ProgressRequestBody.ProgressRequestListener progressRequestListener) throws ApiException { + private Call updatePetWithFormCall(String petId,String name,String status, final ProgressResponseBody.ProgressListener progressListener, final ProgressRequestBody.ProgressRequestListener progressRequestListener) throws ApiException { Object postBody = null; // verify the required parameter 'petId' is set @@ -546,7 +546,7 @@ public class PetApi { * @param status Updated status of the pet */ public void updatePetWithForm(String petId, String name, String status) throws ApiException { - Call call = updatePetWithFormCall(petId, name, status, null, null); + Call call = updatePetWithFormCall(petId,name,status, null, null); apiClient.execute(call); } @@ -580,13 +580,13 @@ public class PetApi { }; } - Call call = updatePetWithFormCall(petId, name, status, progressListener, progressRequestListener); + Call call = updatePetWithFormCall(petId,name,status, progressListener, progressRequestListener); apiClient.executeAsync(call, callback); return call; } /* Build call for deletePet */ - private Call deletePetCall(Long petId, String apiKey, final ProgressResponseBody.ProgressListener progressListener, final ProgressRequestBody.ProgressRequestListener progressRequestListener) throws ApiException { + private Call deletePetCall(Long petId,String apiKey, final ProgressResponseBody.ProgressListener progressListener, final ProgressRequestBody.ProgressRequestListener progressRequestListener) throws ApiException { Object postBody = null; // verify the required parameter 'petId' is set @@ -642,7 +642,7 @@ public class PetApi { * @param apiKey */ public void deletePet(Long petId, String apiKey) throws ApiException { - Call call = deletePetCall(petId, apiKey, null, null); + Call call = deletePetCall(petId,apiKey, null, null); apiClient.execute(call); } @@ -675,13 +675,13 @@ public class PetApi { }; } - Call call = deletePetCall(petId, apiKey, progressListener, progressRequestListener); + Call call = deletePetCall(petId,apiKey, progressListener, progressRequestListener); apiClient.executeAsync(call, callback); return call; } /* Build call for uploadFile */ - private Call uploadFileCall(Long petId, String additionalMetadata, File file, final ProgressResponseBody.ProgressListener progressListener, final ProgressRequestBody.ProgressRequestListener progressRequestListener) throws ApiException { + private Call uploadFileCall(Long petId,String additionalMetadata,File file, final ProgressResponseBody.ProgressListener progressListener, final ProgressRequestBody.ProgressRequestListener progressRequestListener) throws ApiException { Object postBody = null; // verify the required parameter 'petId' is set @@ -740,7 +740,7 @@ public class PetApi { * @param file file to upload */ public void uploadFile(Long petId, String additionalMetadata, File file) throws ApiException { - Call call = uploadFileCall(petId, additionalMetadata, file, null, null); + Call call = uploadFileCall(petId,additionalMetadata,file, null, null); apiClient.execute(call); } @@ -774,7 +774,7 @@ public class PetApi { }; } - Call call = uploadFileCall(petId, additionalMetadata, file, progressListener, progressRequestListener); + Call call = uploadFileCall(petId,additionalMetadata,file, progressListener, progressRequestListener); apiClient.executeAsync(call, callback); return call; } diff --git a/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/api/StoreApi.java b/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/api/StoreApi.java index 2235a73e0c3..551fe0fbfc2 100644 --- a/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/api/StoreApi.java +++ b/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/api/StoreApi.java @@ -43,7 +43,7 @@ public class StoreApi { /* Build call for getInventory */ - private Call getInventoryCall(, final ProgressResponseBody.ProgressListener progressListener, final ProgressRequestBody.ProgressRequestListener progressRequestListener) throws ApiException { + private Call getInventoryCall( final ProgressResponseBody.ProgressListener progressListener, final ProgressRequestBody.ProgressRequestListener progressRequestListener) throws ApiException { Object postBody = null; @@ -90,7 +90,7 @@ public class StoreApi { * @return Map */ public Map getInventory() throws ApiException { - Call call = getInventoryCall(, null, null); + Call call = getInventoryCall( null, null); Type returnType = new TypeToken>(){}.getType(); return apiClient.execute(call, returnType); } @@ -122,7 +122,7 @@ public class StoreApi { }; } - Call call = getInventoryCall(, progressListener, progressRequestListener); + Call call = getInventoryCall( progressListener, progressRequestListener); Type returnType = new TypeToken>(){}.getType(); apiClient.executeAsync(call, returnType, callback); return call; diff --git a/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/api/UserApi.java b/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/api/UserApi.java index 4f364db4b12..57aebd4a4d1 100644 --- a/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/api/UserApi.java +++ b/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/api/UserApi.java @@ -298,7 +298,7 @@ public class UserApi { } /* Build call for loginUser */ - private Call loginUserCall(String username, String password, final ProgressResponseBody.ProgressListener progressListener, final ProgressRequestBody.ProgressRequestListener progressRequestListener) throws ApiException { + private Call loginUserCall(String username,String password, final ProgressResponseBody.ProgressListener progressListener, final ProgressRequestBody.ProgressRequestListener progressRequestListener) throws ApiException { Object postBody = null; @@ -351,7 +351,7 @@ public class UserApi { * @return String */ public String loginUser(String username, String password) throws ApiException { - Call call = loginUserCall(username, password, null, null); + Call call = loginUserCall(username,password, null, null); Type returnType = new TypeToken(){}.getType(); return apiClient.execute(call, returnType); } @@ -385,14 +385,14 @@ public class UserApi { }; } - Call call = loginUserCall(username, password, progressListener, progressRequestListener); + Call call = loginUserCall(username,password, progressListener, progressRequestListener); Type returnType = new TypeToken(){}.getType(); apiClient.executeAsync(call, returnType, callback); return call; } /* Build call for logoutUser */ - private Call logoutUserCall(, final ProgressResponseBody.ProgressListener progressListener, final ProgressRequestBody.ProgressRequestListener progressRequestListener) throws ApiException { + private Call logoutUserCall( final ProgressResponseBody.ProgressListener progressListener, final ProgressRequestBody.ProgressRequestListener progressRequestListener) throws ApiException { Object postBody = null; @@ -438,7 +438,7 @@ public class UserApi { * */ public void logoutUser() throws ApiException { - Call call = logoutUserCall(, null, null); + Call call = logoutUserCall( null, null); apiClient.execute(call); } @@ -469,7 +469,7 @@ public class UserApi { }; } - Call call = logoutUserCall(, progressListener, progressRequestListener); + Call call = logoutUserCall( progressListener, progressRequestListener); apiClient.executeAsync(call, callback); return call; } @@ -569,7 +569,7 @@ public class UserApi { } /* Build call for updateUser */ - private Call updateUserCall(String username, User body, final ProgressResponseBody.ProgressListener progressListener, final ProgressRequestBody.ProgressRequestListener progressRequestListener) throws ApiException { + private Call updateUserCall(String username,User body, final ProgressResponseBody.ProgressListener progressListener, final ProgressRequestBody.ProgressRequestListener progressRequestListener) throws ApiException { Object postBody = body; // verify the required parameter 'username' is set @@ -623,7 +623,7 @@ public class UserApi { * @param body Updated user object */ public void updateUser(String username, User body) throws ApiException { - Call call = updateUserCall(username, body, null, null); + Call call = updateUserCall(username,body, null, null); apiClient.execute(call); } @@ -656,7 +656,7 @@ public class UserApi { }; } - Call call = updateUserCall(username, body, progressListener, progressRequestListener); + Call call = updateUserCall(username,body, progressListener, progressRequestListener); apiClient.executeAsync(call, callback); return call; } diff --git a/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/auth/ApiKeyAuth.java b/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/auth/ApiKeyAuth.java index 600455b7592..ee2b2fe13ed 100644 --- a/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/auth/ApiKeyAuth.java +++ b/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/auth/ApiKeyAuth.java @@ -5,7 +5,7 @@ import io.swagger.client.Pair; import java.util.Map; import java.util.List; -@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-11-21T19:41:14.431+08:00") +@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-11-21T20:11:09.490+08:00") public class ApiKeyAuth implements Authentication { private final String location; private final String paramName; diff --git a/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/auth/Authentication.java b/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/auth/Authentication.java index aa2efcd7e9b..fccf3057d4b 100644 --- a/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/auth/Authentication.java +++ b/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/auth/Authentication.java @@ -5,7 +5,7 @@ import io.swagger.client.Pair; import java.util.Map; import java.util.List; -@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-11-21T19:41:14.431+08:00") +@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-11-21T20:11:09.490+08:00") public interface Authentication { /** Apply authentication settings to header and query params. */ void applyToParams(List queryParams, Map headerParams); diff --git a/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/auth/OAuth.java b/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/auth/OAuth.java index 8463a8bbd28..dc224c2e050 100644 --- a/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/auth/OAuth.java +++ b/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/auth/OAuth.java @@ -5,7 +5,7 @@ import io.swagger.client.Pair; import java.util.Map; import java.util.List; -@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-11-21T19:41:14.431+08:00") +@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-11-21T20:11:09.490+08:00") public class OAuth implements Authentication { private String accessToken; diff --git a/samples/client/petstore/java/okhttp-gson/src/test/java/io/swagger/petstore/test/PetApiTest.java b/samples/client/petstore/java/okhttp-gson/src/test/java/io/swagger/petstore/test/PetApiTest.java index c9586343025..cab122649c7 100644 --- a/samples/client/petstore/java/okhttp-gson/src/test/java/io/swagger/petstore/test/PetApiTest.java +++ b/samples/client/petstore/java/okhttp-gson/src/test/java/io/swagger/petstore/test/PetApiTest.java @@ -88,6 +88,16 @@ public class PetApiTest { public void onSuccess(Pet pet, int statusCode, Map> responseHeaders) { result.put("pet", pet); } + + @Override + public void onUploadProgress(long bytesWritten, long contentLength, boolean done) { + //empty + } + + @Override + public void onDownloadProgress(long bytesRead, long contentLength, boolean done) { + //empty + } }); // the API call should be executed asynchronously, so result should be empty at the moment assertTrue(result.isEmpty()); @@ -123,6 +133,16 @@ public class PetApiTest { public void onSuccess(Pet pet, int statusCode, Map> responseHeaders) { result.put("pet", pet); } + + @Override + public void onUploadProgress(long bytesWritten, long contentLength, boolean done) { + //empty + } + + @Override + public void onDownloadProgress(long bytesRead, long contentLength, boolean done) { + //empty + } }); // the API call should be executed asynchronously, so result should be empty at the moment assertTrue(result.isEmpty()); From 6f27a8512d78eb460a7d5bf683daa90d90e22728 Mon Sep 17 00:00:00 2001 From: wing328 Date: Sun, 22 Nov 2015 00:06:12 +0800 Subject: [PATCH 020/211] Add python flask --- README.md | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/README.md b/README.md index 0eeb2a3065e..ef321e4bb59 100644 --- a/README.md +++ b/README.md @@ -36,6 +36,7 @@ Check out [Swagger-Spec](https://github.com/swagger-api/swagger-spec) for additi - [To build a server stub](#to-build-a-server-stub) - [Node.js](#nodejs) - [PHP Silex](#php-silex) + - [Python Flask (Connexion)](#python-flask-connexion) - [Ruby Sinatra](#ruby-sinatra) - [Scala Scalatra](#scala-scalatra) - [Java JAX-RS](#java-jax-rs) @@ -268,9 +269,11 @@ AkkaScalaClientCodegen.java AndroidClientCodegen.java AsyncScalaClientCodegen.java CSharpClientCodegen.java +ClojureClientCodegen.java CsharpDotNet2ClientCodegen.java DartClientCodegen.java FlashClientCodegen.java +FlaskConnexionCodegen.java JavaClientCodegen.java JavaInflectorServerCodegen.java JaxRSServerCodegen.java @@ -441,6 +444,15 @@ java -jar modules/swagger-codegen-cli/target/swagger-codegen-cli.jar generate \ -o samples/server/petstore/silex ``` +### Python Flask (Connexion) + +``` +java -jar modules/swagger-codegen-cli/target/swagger-codegen-cli.jar generate \ + -i http://petstore.swagger.io/v2/swagger.json \ + -l flaskConnexion \ + -o samples/server/petstore/flaskConnexion +``` + ### Ruby Sinatra ``` From a9da01a45107521f9cdad1bff3051342f402c8dd Mon Sep 17 00:00:00 2001 From: wing328 Date: Fri, 20 Nov 2015 15:54:42 +0800 Subject: [PATCH 021/211] better auth for C#, format change --- .../main/resources/csharp/ApiClient.mustache | 39 +++++++++++++++---- .../csharp/IO/Swagger/Client/ApiClient.cs | 32 ++++++++++----- ...ClientTest.csproj.FilesWrittenAbsolute.txt | 10 ++++- 3 files changed, 62 insertions(+), 19 deletions(-) diff --git a/modules/swagger-codegen/src/main/resources/csharp/ApiClient.mustache b/modules/swagger-codegen/src/main/resources/csharp/ApiClient.mustache index 87d55ab3f6e..8af5250c471 100644 --- a/modules/swagger-codegen/src/main/resources/csharp/ApiClient.mustache +++ b/modules/swagger-codegen/src/main/resources/csharp/ApiClient.mustache @@ -198,10 +198,12 @@ namespace {{packageName}}.Client { if (obj is DateTime) return ((DateTime)obj).ToString ("u"); - else if (obj is IList) { + else if (obj is IList) + { string flattenString = ""; string separator = ","; - foreach (var param in (IList)obj) { + foreach (var param in (IList)obj) + { flattenString += param.ToString() + separator; } return flattenString.Remove(flattenString.Length - 1);; @@ -318,11 +320,29 @@ namespace {{packageName}}.Client { {{#authMethods}} case "{{name}}": - {{#isApiKey}}{{#isKeyInHeader}}headerParams["{{keyParamName}}"] = GetApiKeyWithPrefix("{{keyParamName}}");{{/isKeyInHeader}}{{#isKeyInQuery}}queryParams["{{keyParamName}}"] = GetApiKeyWithPrefix("{{keyParamName}}");{{/isKeyInQuery}}{{/isApiKey}}{{#isBasic}}headerParams["Authorization"] = "Basic " + Base64Encode(Configuration.Username + ":" + Configuration.Password);{{/isBasic}}{{#isOAuth}}headerParams["Authorization"] = "Bearer " + Configuration.AccessToken;{{/isOAuth}} + {{#isApiKey}}{{#isKeyInHeader}} + var apiKeyValue = GetApiKeyWithPrefix("{{keyParamName}}"); + if (!String.IsNullOrEmpty(apiKeyValue)) + { + headerParams["{{keyParamName}}"] = apiKeyValue; + }{{/isKeyInHeader}}{{#isKeyInQuery}} + var apiKeyValue = GetApiKeyWithPrefix("{{keyParamName}}"); + if (!String.IsNullOrEmpty(apiKeyValue)) + { + queryParams["{{keyParamName}}"] = apiKeyValue; + }{{/isKeyInQuery}}{{/isApiKey}}{{#isBasic}} + if (!String.IsNullOrEmpty(Configuration.Username) && !String.IsNullOrEmpty(Configuration.Password)) + { + headerParams["Authorization"] = "Basic " + Base64Encode(Configuration.Username + ":" + Configuration.Password); + }{{/isBasic}}{{#isOAuth}} + if (!String.IsNullOrEmpty(Configuration.AccessToken)) + { + headerParams["Authorization"] = "Bearer " + Configuration.AccessToken; + }{{/isOAuth}} break; {{/authMethods}} default: - //TODO show warning about security definition not found + //show warning about security definition not found break; } } @@ -335,11 +355,14 @@ namespace {{packageName}}.Client /// /// The accepts array to select from. /// The Accept header to use. - public String SelectHeaderAccept(String[] accepts) { + public String SelectHeaderAccept(String[] accepts) + { if (accepts.Length == 0) return null; + if (accepts.Contains("application/json", StringComparer.OrdinalIgnoreCase)) return "application/json"; + return String.Join(",", accepts); } @@ -350,8 +373,7 @@ namespace {{packageName}}.Client /// Encoded string. public static string Base64Encode(string text) { - var textByte = System.Text.Encoding.UTF8.GetBytes(text); - return System.Convert.ToBase64String(textByte); + return System.Convert.ToBase64String(System.Text.Encoding.UTF8.GetBytes(text)); } /// @@ -361,7 +383,8 @@ namespace {{packageName}}.Client /// Object to be casted /// Target type /// Casted object - public static dynamic ConvertType(dynamic source, Type dest) { + public static dynamic ConvertType(dynamic source, Type dest) + { return Convert.ChangeType(source, dest); } diff --git a/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Client/ApiClient.cs b/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Client/ApiClient.cs index 36217fde02d..a4f9276c882 100644 --- a/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Client/ApiClient.cs +++ b/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Client/ApiClient.cs @@ -198,10 +198,12 @@ namespace IO.Swagger.Client { if (obj is DateTime) return ((DateTime)obj).ToString ("u"); - else if (obj is IList) { + else if (obj is IList) + { string flattenString = ""; string separator = ","; - foreach (var param in (IList)obj) { + foreach (var param in (IList)obj) + { flattenString += param.ToString() + separator; } return flattenString.Remove(flattenString.Length - 1);; @@ -318,15 +320,24 @@ namespace IO.Swagger.Client { case "api_key": - headerParams["api_key"] = GetApiKeyWithPrefix("api_key"); + + var apiKeyValue = GetApiKeyWithPrefix("api_key"); + if (!String.IsNullOrEmpty(apiKeyValue)) + { + headerParams["api_key"] = apiKeyValue; + } break; case "petstore_auth": - headerParams["Authorization"] = "Bearer " + Configuration.AccessToken; + + if (!String.IsNullOrEmpty(Configuration.AccessToken)) + { + headerParams["Authorization"] = "Bearer " + Configuration.AccessToken; + } break; default: - //TODO show warning about security definition not found + //show warning about security definition not found break; } } @@ -339,11 +350,14 @@ namespace IO.Swagger.Client /// /// The accepts array to select from. /// The Accept header to use. - public String SelectHeaderAccept(String[] accepts) { + public String SelectHeaderAccept(String[] accepts) + { if (accepts.Length == 0) return null; + if (accepts.Contains("application/json", StringComparer.OrdinalIgnoreCase)) return "application/json"; + return String.Join(",", accepts); } @@ -354,8 +368,7 @@ namespace IO.Swagger.Client /// Encoded string. public static string Base64Encode(string text) { - var textByte = System.Text.Encoding.UTF8.GetBytes(text); - return System.Convert.ToBase64String(textByte); + return System.Convert.ToBase64String(System.Text.Encoding.UTF8.GetBytes(text)); } /// @@ -365,7 +378,8 @@ namespace IO.Swagger.Client /// Object to be casted /// Target type /// Casted object - public static dynamic ConvertType(dynamic source, Type dest) { + public static dynamic ConvertType(dynamic source, Type dest) + { return Convert.ChangeType(source, dest); } diff --git a/samples/client/petstore/csharp/SwaggerClientTest/obj/Debug/SwaggerClientTest.csproj.FilesWrittenAbsolute.txt b/samples/client/petstore/csharp/SwaggerClientTest/obj/Debug/SwaggerClientTest.csproj.FilesWrittenAbsolute.txt index b46eed9f9d6..6b370d8d490 100644 --- a/samples/client/petstore/csharp/SwaggerClientTest/obj/Debug/SwaggerClientTest.csproj.FilesWrittenAbsolute.txt +++ b/samples/client/petstore/csharp/SwaggerClientTest/obj/Debug/SwaggerClientTest.csproj.FilesWrittenAbsolute.txt @@ -1,6 +1,12 @@ +/Users/williamcheng/Code/csharp/swagger-codegen/samples/client/petstore/csharp/SwaggerClientTest/obj/Debug/.NETFramework,Version=v4.5.AssemblyAttribute.cs +/Users/williamcheng/Code/csharp/swagger-codegen/samples/client/petstore/csharp/SwaggerClientTest/bin/Debug/SwaggerClientTest.dll.mdb +/Users/williamcheng/Code/csharp/swagger-codegen/samples/client/petstore/csharp/SwaggerClientTest/bin/Debug/SwaggerClientTest.dll +/Users/williamcheng/Code/csharp/swagger-codegen/samples/client/petstore/csharp/SwaggerClientTest/obj/Debug/SwaggerClientTest.dll +/Users/williamcheng/Code/csharp/swagger-codegen/samples/client/petstore/csharp/SwaggerClientTest/obj/Debug/SwaggerClientTest.dll.mdb +/Users/williamcheng/Code/csharp/swagger-codegen/samples/client/petstore/csharp/SwaggerClientTest/bin/Debug/Newtonsoft.Json.dll +/Users/williamcheng/Code/csharp/swagger-codegen/samples/client/petstore/csharp/SwaggerClientTest/bin/Debug/nunit.framework.dll +/Users/williamcheng/Code/csharp/swagger-codegen/samples/client/petstore/csharp/SwaggerClientTest/bin/Debug/RestSharp.dll /Users/williamcheng/Code/wing328/swagger-codegen/samples/client/petstore/csharp/SwaggerClientTest/obj/Debug/.NETFramework,Version=v4.5.AssemblyAttribute.cs -/Users/williamcheng/Code/wing328/swagger-codegen/samples/client/petstore/csharp/SwaggerClientTest/bin/Debug/SwaggerClientTest.dll.mdb -/Users/williamcheng/Code/wing328/swagger-codegen/samples/client/petstore/csharp/SwaggerClientTest/bin/Debug/SwaggerClientTest.dll /Users/williamcheng/Code/wing328/swagger-codegen/samples/client/petstore/csharp/SwaggerClientTest/obj/Debug/SwaggerClientTest.dll /Users/williamcheng/Code/wing328/swagger-codegen/samples/client/petstore/csharp/SwaggerClientTest/obj/Debug/SwaggerClientTest.dll.mdb /Users/williamcheng/Code/wing328/swagger-codegen/samples/client/petstore/csharp/SwaggerClientTest/bin/Debug/Newtonsoft.Json.dll From 9d76d39c006554ca8150fbd8c5e26c6e11108b5a Mon Sep 17 00:00:00 2001 From: wing328 Date: Fri, 20 Nov 2015 16:15:19 +0800 Subject: [PATCH 022/211] update basic auth to allow only username/password --- .../src/main/resources/csharp/ApiClient.mustache | 2 +- .../csharp/SwaggerClientTest/SwaggerClientTest.userprefs | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/modules/swagger-codegen/src/main/resources/csharp/ApiClient.mustache b/modules/swagger-codegen/src/main/resources/csharp/ApiClient.mustache index 8af5250c471..bac6fd02a69 100644 --- a/modules/swagger-codegen/src/main/resources/csharp/ApiClient.mustache +++ b/modules/swagger-codegen/src/main/resources/csharp/ApiClient.mustache @@ -331,7 +331,7 @@ namespace {{packageName}}.Client { queryParams["{{keyParamName}}"] = apiKeyValue; }{{/isKeyInQuery}}{{/isApiKey}}{{#isBasic}} - if (!String.IsNullOrEmpty(Configuration.Username) && !String.IsNullOrEmpty(Configuration.Password)) + if (!String.IsNullOrEmpty(Configuration.Username) || !String.IsNullOrEmpty(Configuration.Password)) { headerParams["Authorization"] = "Basic " + Base64Encode(Configuration.Username + ":" + Configuration.Password); }{{/isBasic}}{{#isOAuth}} diff --git a/samples/client/petstore/csharp/SwaggerClientTest/SwaggerClientTest.userprefs b/samples/client/petstore/csharp/SwaggerClientTest/SwaggerClientTest.userprefs index 05585bff932..5f6ec1cf979 100644 --- a/samples/client/petstore/csharp/SwaggerClientTest/SwaggerClientTest.userprefs +++ b/samples/client/petstore/csharp/SwaggerClientTest/SwaggerClientTest.userprefs @@ -2,7 +2,7 @@ - + @@ -26,4 +26,4 @@ - \ No newline at end of file + From 11daa87e44a7b492b086555d6924c0e2d57da51c Mon Sep 17 00:00:00 2001 From: wing328 Date: Sun, 22 Nov 2015 16:14:16 +0800 Subject: [PATCH 023/211] add documentation to test cases in C# --- .../SwaggerClientTest.userprefs | 21 ++---------------- .../csharp/SwaggerClientTest/TestPet.cs | 20 +++++++++++++++-- .../bin/Debug/SwaggerClientTest.dll | Bin 67584 -> 67584 bytes .../bin/Debug/SwaggerClientTest.dll.mdb | Bin 21107 -> 21137 bytes ...ClientTest.csproj.FilesWrittenAbsolute.txt | 2 ++ .../obj/Debug/SwaggerClientTest.dll | Bin 67584 -> 67584 bytes .../obj/Debug/SwaggerClientTest.dll.mdb | Bin 21107 -> 21137 bytes 7 files changed, 22 insertions(+), 21 deletions(-) diff --git a/samples/client/petstore/csharp/SwaggerClientTest/SwaggerClientTest.userprefs b/samples/client/petstore/csharp/SwaggerClientTest/SwaggerClientTest.userprefs index 5f6ec1cf979..0a2248522b9 100644 --- a/samples/client/petstore/csharp/SwaggerClientTest/SwaggerClientTest.userprefs +++ b/samples/client/petstore/csharp/SwaggerClientTest/SwaggerClientTest.userprefs @@ -2,28 +2,11 @@ - + - - - - - - - - - - - - - - - - - - + \ No newline at end of file diff --git a/samples/client/petstore/csharp/SwaggerClientTest/TestPet.cs b/samples/client/petstore/csharp/SwaggerClientTest/TestPet.cs index 0227a2d9113..19a14c592f4 100644 --- a/samples/client/petstore/csharp/SwaggerClientTest/TestPet.cs +++ b/samples/client/petstore/csharp/SwaggerClientTest/TestPet.cs @@ -49,7 +49,9 @@ namespace SwaggerClient.TestPet petApi.DeletePet(petId, "test key"); } - + /// + /// Test GetPetByIdAsync + /// [Test ()] public void TestGetPetByIdAsync () { @@ -74,6 +76,9 @@ namespace SwaggerClient.TestPet } + /// + /// Test GetPetById + /// [Test ()] public void TestGetPetById () { @@ -97,6 +102,9 @@ namespace SwaggerClient.TestPet } + /// + /// Test UpdatePetWithForm + /// [Test ()] public void TestUpdatePetWithForm () { @@ -115,6 +123,9 @@ namespace SwaggerClient.TestPet Assert.AreEqual (56, response.Category.Id); } + /// + /// Test UploadFile + /// [Test ()] public void TestUploadFile () { @@ -129,7 +140,9 @@ namespace SwaggerClient.TestPet } - + /// + /// Test FindPetByStatus + /// [Test ()] public void TestFindPetByStatus () { @@ -145,6 +158,9 @@ namespace SwaggerClient.TestPet } + /// + /// Test Equal + /// [Test ()] public void TestEqual() { diff --git a/samples/client/petstore/csharp/SwaggerClientTest/bin/Debug/SwaggerClientTest.dll b/samples/client/petstore/csharp/SwaggerClientTest/bin/Debug/SwaggerClientTest.dll index 924934c46233779ca4dd6c58049f0518ece993b2..cb328f9bb0767ff59711234a803eedb72bf52baf 100755 GIT binary patch delta 2800 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 Date: Sun, 22 Nov 2015 16:27:14 +0800 Subject: [PATCH 024/211] Use separate library to do base64 encoding in Java default and jersey2 clients to make it work in both JVM and Android --- .../src/main/resources/Java/auth/HttpBasicAuth.mustache | 5 +++-- .../src/main/resources/Java/libraries/jersey2/pom.mustache | 7 +++++++ .../swagger-codegen/src/main/resources/Java/pom.mustache | 7 +++++++ samples/client/petstore/java/default/pom.xml | 7 +++++++ .../main/java/io/swagger/client/auth/HttpBasicAuth.java | 7 ++++--- samples/client/petstore/java/jersey2/pom.xml | 7 +++++++ .../main/java/io/swagger/client/auth/HttpBasicAuth.java | 7 ++++--- 7 files changed, 39 insertions(+), 8 deletions(-) diff --git a/modules/swagger-codegen/src/main/resources/Java/auth/HttpBasicAuth.mustache b/modules/swagger-codegen/src/main/resources/Java/auth/HttpBasicAuth.mustache index 509f4742b61..febabe33d64 100644 --- a/modules/swagger-codegen/src/main/resources/Java/auth/HttpBasicAuth.mustache +++ b/modules/swagger-codegen/src/main/resources/Java/auth/HttpBasicAuth.mustache @@ -2,11 +2,12 @@ package {{invokerPackage}}.auth; import {{invokerPackage}}.Pair; +import com.migcomponents.migbase64.Base64; + import java.util.Map; import java.util.List; import java.io.UnsupportedEncodingException; -import javax.xml.bind.DatatypeConverter; {{>generatedAnnotation}} public class HttpBasicAuth implements Authentication { @@ -36,7 +37,7 @@ public class HttpBasicAuth implements Authentication { } String str = (username == null ? "" : username) + ":" + (password == null ? "" : password); try { - headerParams.put("Authorization", "Basic " + DatatypeConverter.printBase64Binary(str.getBytes("UTF-8"))); + headerParams.put("Authorization", "Basic " + Base64.encodeToString(str.getBytes("UTF-8"), false)); } catch (UnsupportedEncodingException e) { throw new RuntimeException(e); } diff --git a/modules/swagger-codegen/src/main/resources/Java/libraries/jersey2/pom.mustache b/modules/swagger-codegen/src/main/resources/Java/libraries/jersey2/pom.mustache index c8d2145bc6e..dbe0138aa54 100644 --- a/modules/swagger-codegen/src/main/resources/Java/libraries/jersey2/pom.mustache +++ b/modules/swagger-codegen/src/main/resources/Java/libraries/jersey2/pom.mustache @@ -152,6 +152,13 @@ ${jodatime-version} + + + com.brsanthu + migbase64 + 2.2 + + junit diff --git a/modules/swagger-codegen/src/main/resources/Java/pom.mustache b/modules/swagger-codegen/src/main/resources/Java/pom.mustache index 3f4d9d9a55b..c5bfbc65b74 100644 --- a/modules/swagger-codegen/src/main/resources/Java/pom.mustache +++ b/modules/swagger-codegen/src/main/resources/Java/pom.mustache @@ -148,6 +148,13 @@ ${jodatime-version} + + + com.brsanthu + migbase64 + 2.2 + + junit diff --git a/samples/client/petstore/java/default/pom.xml b/samples/client/petstore/java/default/pom.xml index 894e318b5f3..8a939b9dc34 100644 --- a/samples/client/petstore/java/default/pom.xml +++ b/samples/client/petstore/java/default/pom.xml @@ -148,6 +148,13 @@ ${jodatime-version} + + + com.brsanthu + migbase64 + 2.2 + + junit diff --git a/samples/client/petstore/java/default/src/main/java/io/swagger/client/auth/HttpBasicAuth.java b/samples/client/petstore/java/default/src/main/java/io/swagger/client/auth/HttpBasicAuth.java index 074f1833542..8c2aa444678 100644 --- a/samples/client/petstore/java/default/src/main/java/io/swagger/client/auth/HttpBasicAuth.java +++ b/samples/client/petstore/java/default/src/main/java/io/swagger/client/auth/HttpBasicAuth.java @@ -2,13 +2,14 @@ package io.swagger.client.auth; import io.swagger.client.Pair; +import com.migcomponents.migbase64.Base64; + import java.util.Map; import java.util.List; import java.io.UnsupportedEncodingException; -import javax.xml.bind.DatatypeConverter; -@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-11-20T17:28:23.285+08:00") +@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-11-22T13:15:32.345+08:00") public class HttpBasicAuth implements Authentication { private String username; private String password; @@ -36,7 +37,7 @@ public class HttpBasicAuth implements Authentication { } String str = (username == null ? "" : username) + ":" + (password == null ? "" : password); try { - headerParams.put("Authorization", "Basic " + DatatypeConverter.printBase64Binary(str.getBytes("UTF-8"))); + headerParams.put("Authorization", "Basic " + Base64.encodeToString(str.getBytes("UTF-8"), false)); } catch (UnsupportedEncodingException e) { throw new RuntimeException(e); } diff --git a/samples/client/petstore/java/jersey2/pom.xml b/samples/client/petstore/java/jersey2/pom.xml index e5353a66ea5..0881cc29374 100644 --- a/samples/client/petstore/java/jersey2/pom.xml +++ b/samples/client/petstore/java/jersey2/pom.xml @@ -152,6 +152,13 @@ ${jodatime-version} + + + com.brsanthu + migbase64 + 2.2 + + junit diff --git a/samples/client/petstore/java/jersey2/src/main/java/io/swagger/client/auth/HttpBasicAuth.java b/samples/client/petstore/java/jersey2/src/main/java/io/swagger/client/auth/HttpBasicAuth.java index 0abfc056e1d..071139d656a 100644 --- a/samples/client/petstore/java/jersey2/src/main/java/io/swagger/client/auth/HttpBasicAuth.java +++ b/samples/client/petstore/java/jersey2/src/main/java/io/swagger/client/auth/HttpBasicAuth.java @@ -2,13 +2,14 @@ package io.swagger.client.auth; import io.swagger.client.Pair; +import com.migcomponents.migbase64.Base64; + import java.util.Map; import java.util.List; import java.io.UnsupportedEncodingException; -import javax.xml.bind.DatatypeConverter; -@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-11-20T17:28:47.318+08:00") +@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-11-22T13:15:27.225+08:00") public class HttpBasicAuth implements Authentication { private String username; private String password; @@ -36,7 +37,7 @@ public class HttpBasicAuth implements Authentication { } String str = (username == null ? "" : username) + ":" + (password == null ? "" : password); try { - headerParams.put("Authorization", "Basic " + DatatypeConverter.printBase64Binary(str.getBytes("UTF-8"))); + headerParams.put("Authorization", "Basic " + Base64.encodeToString(str.getBytes("UTF-8"), false)); } catch (UnsupportedEncodingException e) { throw new RuntimeException(e); } From e11a3d468e59749101e6cb0df71217869a40448d Mon Sep 17 00:00:00 2001 From: wing328 Date: Sun, 22 Nov 2015 18:35:45 +0800 Subject: [PATCH 025/211] update auth for php to skip empty apikey/username,password --- .../src/main/resources/php/api.mustache | 12 +++-- .../php/SwaggerClient-php/lib/Api/PetApi.php | 46 ++++++++++++------- .../SwaggerClient-php/lib/Api/StoreApi.php | 4 +- .../php/SwaggerClient-php/lib/ApiClient.php | 2 +- .../lib/ObjectSerializer.php | 2 +- 5 files changed, 43 insertions(+), 23 deletions(-) diff --git a/modules/swagger-codegen/src/main/resources/php/api.mustache b/modules/swagger-codegen/src/main/resources/php/api.mustache index e3a9749c423..53a81030813 100644 --- a/modules/swagger-codegen/src/main/resources/php/api.mustache +++ b/modules/swagger-codegen/src/main/resources/php/api.mustache @@ -166,12 +166,18 @@ use \{{invokerPackage}}\ObjectSerializer; $httpBody = $formParams; // for HTTP post (form) } {{#authMethods}}{{#isApiKey}} + // this endpoint requires API key authentication $apiKey = $this->apiClient->getApiKeyWithPrefix('{{keyParamName}}'); - if (isset($apiKey)) { + if ($apiKey !== null) { {{#isKeyInHeader}}$headerParams['{{keyParamName}}'] = $apiKey;{{/isKeyInHeader}}{{#isKeyInQuery}}$queryParams['{{keyParamName}}'] = $apiKey;{{/isKeyInQuery}} }{{/isApiKey}} - {{#isBasic}}$headerParams['Authorization'] = 'Basic ' . base64_encode($this->apiClient->getConfig()->getUsername() . ":" . $this->apiClient->getConfig()->getPassword());{{/isBasic}} - {{#isOAuth}}$headerParams['Authorization'] = 'Bearer ' . $this->apiClient->getConfig()->getAccessToken();{{/isOAuth}} + {{#isBasic}}// this endpoint requires HTTP basic authentication + if ($this->apiClient->getConfig()->getUsername() !== null or $this->apiClient->getConfig()->getPassword() !== null) { + $headerParams['Authorization'] = 'Basic ' . base64_encode($this->apiClient->getConfig()->getUsername() . ":" . $this->apiClient->getConfig()->getPassword()); + }{{/isBasic}}{{#isOAuth}}// this endpoint requires OAuth (access token) + if ($this->apiClient->getConfig()->getAccessToken() !== null) { + $headerParams['Authorization'] = 'Bearer ' . $this->apiClient->getConfig()->getAccessToken(); + }{{/isOAuth}} {{/authMethods}} // make the API Call try diff --git a/samples/client/petstore/php/SwaggerClient-php/lib/Api/PetApi.php b/samples/client/petstore/php/SwaggerClient-php/lib/Api/PetApi.php index a418ac90b43..bc03a7974d3 100644 --- a/samples/client/petstore/php/SwaggerClient-php/lib/Api/PetApi.php +++ b/samples/client/petstore/php/SwaggerClient-php/lib/Api/PetApi.php @@ -135,8 +135,10 @@ class PetApi $httpBody = $formParams; // for HTTP post (form) } - - $headerParams['Authorization'] = 'Bearer ' . $this->apiClient->getConfig()->getAccessToken(); + // this endpoint requires OAuth (access token) + if ($this->apiClient->getConfig()->getAccessToken() !== null) { + $headerParams['Authorization'] = 'Bearer ' . $this->apiClient->getConfig()->getAccessToken(); + } // make the API Call try @@ -200,8 +202,10 @@ class PetApi $httpBody = $formParams; // for HTTP post (form) } - - $headerParams['Authorization'] = 'Bearer ' . $this->apiClient->getConfig()->getAccessToken(); + // this endpoint requires OAuth (access token) + if ($this->apiClient->getConfig()->getAccessToken() !== null) { + $headerParams['Authorization'] = 'Bearer ' . $this->apiClient->getConfig()->getAccessToken(); + } // make the API Call try @@ -264,8 +268,10 @@ class PetApi $httpBody = $formParams; // for HTTP post (form) } - - $headerParams['Authorization'] = 'Bearer ' . $this->apiClient->getConfig()->getAccessToken(); + // this endpoint requires OAuth (access token) + if ($this->apiClient->getConfig()->getAccessToken() !== null) { + $headerParams['Authorization'] = 'Bearer ' . $this->apiClient->getConfig()->getAccessToken(); + } // make the API Call try @@ -340,8 +346,10 @@ class PetApi $httpBody = $formParams; // for HTTP post (form) } - - $headerParams['Authorization'] = 'Bearer ' . $this->apiClient->getConfig()->getAccessToken(); + // this endpoint requires OAuth (access token) + if ($this->apiClient->getConfig()->getAccessToken() !== null) { + $headerParams['Authorization'] = 'Bearer ' . $this->apiClient->getConfig()->getAccessToken(); + } // make the API Call try @@ -424,13 +432,13 @@ class PetApi $httpBody = $formParams; // for HTTP post (form) } + // this endpoint requires API key authentication $apiKey = $this->apiClient->getApiKeyWithPrefix('api_key'); - if (isset($apiKey)) { + if ($apiKey !== null) { $headerParams['api_key'] = $apiKey; } - // make the API Call try { @@ -526,8 +534,10 @@ class PetApi $httpBody = $formParams; // for HTTP post (form) } - - $headerParams['Authorization'] = 'Bearer ' . $this->apiClient->getConfig()->getAccessToken(); + // this endpoint requires OAuth (access token) + if ($this->apiClient->getConfig()->getAccessToken() !== null) { + $headerParams['Authorization'] = 'Bearer ' . $this->apiClient->getConfig()->getAccessToken(); + } // make the API Call try @@ -602,8 +612,10 @@ class PetApi $httpBody = $formParams; // for HTTP post (form) } - - $headerParams['Authorization'] = 'Bearer ' . $this->apiClient->getConfig()->getAccessToken(); + // this endpoint requires OAuth (access token) + if ($this->apiClient->getConfig()->getAccessToken() !== null) { + $headerParams['Authorization'] = 'Bearer ' . $this->apiClient->getConfig()->getAccessToken(); + } // make the API Call try @@ -694,8 +706,10 @@ class PetApi $httpBody = $formParams; // for HTTP post (form) } - - $headerParams['Authorization'] = 'Bearer ' . $this->apiClient->getConfig()->getAccessToken(); + // this endpoint requires OAuth (access token) + if ($this->apiClient->getConfig()->getAccessToken() !== null) { + $headerParams['Authorization'] = 'Bearer ' . $this->apiClient->getConfig()->getAccessToken(); + } // make the API Call try diff --git a/samples/client/petstore/php/SwaggerClient-php/lib/Api/StoreApi.php b/samples/client/petstore/php/SwaggerClient-php/lib/Api/StoreApi.php index b64b52d2225..d709330b056 100644 --- a/samples/client/petstore/php/SwaggerClient-php/lib/Api/StoreApi.php +++ b/samples/client/petstore/php/SwaggerClient-php/lib/Api/StoreApi.php @@ -130,13 +130,13 @@ class StoreApi $httpBody = $formParams; // for HTTP post (form) } + // this endpoint requires API key authentication $apiKey = $this->apiClient->getApiKeyWithPrefix('api_key'); - if (isset($apiKey)) { + if ($apiKey !== null) { $headerParams['api_key'] = $apiKey; } - // make the API Call try { diff --git a/samples/client/petstore/php/SwaggerClient-php/lib/ApiClient.php b/samples/client/petstore/php/SwaggerClient-php/lib/ApiClient.php index 982b8955a15..a0bb07273e4 100644 --- a/samples/client/petstore/php/SwaggerClient-php/lib/ApiClient.php +++ b/samples/client/petstore/php/SwaggerClient-php/lib/ApiClient.php @@ -69,7 +69,7 @@ class ApiClient * Constructor of the class * @param Configuration $config config for this ApiClient */ - function __construct(Configuration $config = null) + public function __construct(Configuration $config = null) { if ($config == null) { $config = Configuration::getDefaultConfiguration(); diff --git a/samples/client/petstore/php/SwaggerClient-php/lib/ObjectSerializer.php b/samples/client/petstore/php/SwaggerClient-php/lib/ObjectSerializer.php index efdc1c896ab..0d281b9d1fa 100644 --- a/samples/client/petstore/php/SwaggerClient-php/lib/ObjectSerializer.php +++ b/samples/client/petstore/php/SwaggerClient-php/lib/ObjectSerializer.php @@ -193,7 +193,7 @@ class ObjectSerializer $deserialized = $values; } elseif ($class === '\DateTime') { $deserialized = new \DateTime($data); - } elseif (in_array($class, array('void', 'bool', 'string', 'double', 'byte', 'mixed', 'integer', 'float', 'int', 'DateTime', 'number', 'boolean', 'object'))) { + } elseif (in_array($class, array('integer', 'int', 'void', 'number', 'object', 'double', 'float', 'byte', 'DateTime', 'string', 'mixed', 'boolean', 'bool'))) { settype($data, $class); $deserialized = $data; } elseif ($class === '\SplFileObject') { From 2e51aa5076c0c4be8d1697c5d23e5988e06e0100 Mon Sep 17 00:00:00 2001 From: xhh Date: Mon, 23 Nov 2015 15:57:14 +0800 Subject: [PATCH 026/211] Add "equals" and "hashCode" methods to Java clients Added for the default, "jersey2" and "okhttp-gson" clients --- .../Java/libraries/okhttp-gson/model.mustache | 16 +++++++++++++ .../src/main/resources/Java/model.mustache | 16 +++++++++++++ .../io/swagger/client/model/Category.java | 17 +++++++++++++- .../java/io/swagger/client/model/Order.java | 21 ++++++++++++++++- .../java/io/swagger/client/model/Pet.java | 23 +++++++++++++++++-- .../java/io/swagger/client/model/Tag.java | 17 +++++++++++++- .../java/io/swagger/client/model/User.java | 23 ++++++++++++++++++- .../io/swagger/petstore/test/PetApiTest.java | 21 +++++++++++++++++ .../io/swagger/client/model/Category.java | 17 +++++++++++++- .../java/io/swagger/client/model/Order.java | 21 ++++++++++++++++- .../java/io/swagger/client/model/Pet.java | 21 ++++++++++++++++- .../java/io/swagger/client/model/Tag.java | 17 +++++++++++++- .../java/io/swagger/client/model/User.java | 23 ++++++++++++++++++- .../io/swagger/petstore/test/PetApiTest.java | 21 +++++++++++++++++ .../io/swagger/client/model/Category.java | 15 ++++++++++++ .../java/io/swagger/client/model/Order.java | 19 +++++++++++++++ .../java/io/swagger/client/model/Pet.java | 21 ++++++++++++++++- .../java/io/swagger/client/model/Tag.java | 15 ++++++++++++ .../java/io/swagger/client/model/User.java | 21 +++++++++++++++++ .../io/swagger/petstore/test/PetApiTest.java | 21 +++++++++++++++++ 20 files changed, 374 insertions(+), 12 deletions(-) diff --git a/modules/swagger-codegen/src/main/resources/Java/libraries/okhttp-gson/model.mustache b/modules/swagger-codegen/src/main/resources/Java/libraries/okhttp-gson/model.mustache index 0987aa68f34..677b29762c3 100644 --- a/modules/swagger-codegen/src/main/resources/Java/libraries/okhttp-gson/model.mustache +++ b/modules/swagger-codegen/src/main/resources/Java/libraries/okhttp-gson/model.mustache @@ -8,6 +8,7 @@ import com.google.gson.annotations.SerializedName; {{#serializableModel}} import java.io.Serializable;{{/serializableModel}} +import java.util.Objects; import io.swagger.annotations.*; @@ -44,6 +45,21 @@ public class {{classname}} {{#parent}}extends {{{parent}}}{{/parent}} {{#seriali {{/vars}} + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + {{classname}} {{classVarName}} = ({{classname}}) o;{{#hasVars}} + return {{#vars}}Objects.equals({{name}}, {{classVarName}}.{{name}}){{#hasMore}} && + {{/hasMore}}{{^hasMore}};{{/hasMore}}{{/vars}}{{/hasVars}}{{^hasVars}} + return true;{{/hasVars}} + } + + @Override + public int hashCode() { + return Objects.hash({{#vars}}{{name}}{{#hasMore}}, {{/hasMore}}{{/vars}}); + } + @Override public String toString() { StringBuilder sb = new StringBuilder(); diff --git a/modules/swagger-codegen/src/main/resources/Java/model.mustache b/modules/swagger-codegen/src/main/resources/Java/model.mustache index f5e48ba997f..a6973c649f7 100644 --- a/modules/swagger-codegen/src/main/resources/Java/model.mustache +++ b/modules/swagger-codegen/src/main/resources/Java/model.mustache @@ -6,6 +6,7 @@ import {{invokerPackage}}.StringUtil; {{#serializableModel}} import java.io.Serializable;{{/serializableModel}} +import java.util.Objects; import io.swagger.annotations.*; import com.fasterxml.jackson.annotation.JsonProperty; @@ -42,6 +43,21 @@ public class {{classname}} {{#parent}}extends {{{parent}}}{{/parent}} {{#seriali {{/vars}} + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + {{classname}} {{classVarName}} = ({{classname}}) o;{{#hasVars}} + return {{#vars}}Objects.equals({{name}}, {{classVarName}}.{{name}}){{#hasMore}} && + {{/hasMore}}{{^hasMore}};{{/hasMore}}{{/vars}}{{/hasVars}}{{^hasVars}} + return true;{{/hasVars}} + } + + @Override + public int hashCode() { + return Objects.hash({{#vars}}{{name}}{{#hasMore}}, {{/hasMore}}{{/vars}}); + } + @Override public String toString() { StringBuilder sb = new StringBuilder(); diff --git a/samples/client/petstore/java/default/src/main/java/io/swagger/client/model/Category.java b/samples/client/petstore/java/default/src/main/java/io/swagger/client/model/Category.java index 1d1d9e1d1b5..1eaf71f9f71 100644 --- a/samples/client/petstore/java/default/src/main/java/io/swagger/client/model/Category.java +++ b/samples/client/petstore/java/default/src/main/java/io/swagger/client/model/Category.java @@ -3,13 +3,14 @@ package io.swagger.client.model; import io.swagger.client.StringUtil; +import java.util.Objects; import io.swagger.annotations.*; import com.fasterxml.jackson.annotation.JsonProperty; @ApiModel(description = "") -@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-10-30T16:36:47.681+08:00") +@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-11-23T15:47:53.879+08:00") public class Category { private Long id = null; @@ -41,6 +42,20 @@ public class Category { + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + Category category = (Category) o; + return Objects.equals(id, category.id) && + Objects.equals(name, category.name); + } + + @Override + public int hashCode() { + return Objects.hash(id, name); + } + @Override public String toString() { StringBuilder sb = new StringBuilder(); 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 9c6094aefbf..4ef600ccf55 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 @@ -4,13 +4,14 @@ import io.swagger.client.StringUtil; import java.util.Date; +import java.util.Objects; import io.swagger.annotations.*; import com.fasterxml.jackson.annotation.JsonProperty; @ApiModel(description = "") -@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-10-30T16:36:47.681+08:00") +@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-11-23T15:47:53.879+08:00") public class Order { private Long id = null; @@ -113,6 +114,24 @@ public enum StatusEnum { + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + Order order = (Order) o; + return Objects.equals(id, order.id) && + Objects.equals(petId, order.petId) && + Objects.equals(quantity, order.quantity) && + Objects.equals(shipDate, order.shipDate) && + Objects.equals(status, order.status) && + Objects.equals(complete, order.complete); + } + + @Override + public int hashCode() { + return Objects.hash(id, petId, quantity, shipDate, status, complete); + } + @Override public String toString() { StringBuilder sb = new StringBuilder(); 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 b842a7800de..c5101f0f7ec 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 @@ -2,17 +2,18 @@ package io.swagger.client.model; import io.swagger.client.StringUtil; import io.swagger.client.model.Category; -import io.swagger.client.model.Tag; import java.util.*; +import io.swagger.client.model.Tag; +import java.util.Objects; import io.swagger.annotations.*; import com.fasterxml.jackson.annotation.JsonProperty; @ApiModel(description = "") -@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-10-30T16:36:47.681+08:00") +@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-11-23T15:47:53.879+08:00") public class Pet { private Long id = null; @@ -115,6 +116,24 @@ public enum StatusEnum { + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + Pet pet = (Pet) o; + return Objects.equals(id, pet.id) && + Objects.equals(category, pet.category) && + Objects.equals(name, pet.name) && + Objects.equals(photoUrls, pet.photoUrls) && + Objects.equals(tags, pet.tags) && + Objects.equals(status, pet.status); + } + + @Override + public int hashCode() { + return Objects.hash(id, category, name, photoUrls, tags, status); + } + @Override public String toString() { StringBuilder sb = new StringBuilder(); diff --git a/samples/client/petstore/java/default/src/main/java/io/swagger/client/model/Tag.java b/samples/client/petstore/java/default/src/main/java/io/swagger/client/model/Tag.java index d52ef12d01c..be612525c65 100644 --- a/samples/client/petstore/java/default/src/main/java/io/swagger/client/model/Tag.java +++ b/samples/client/petstore/java/default/src/main/java/io/swagger/client/model/Tag.java @@ -3,13 +3,14 @@ package io.swagger.client.model; import io.swagger.client.StringUtil; +import java.util.Objects; import io.swagger.annotations.*; import com.fasterxml.jackson.annotation.JsonProperty; @ApiModel(description = "") -@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-10-30T16:36:47.681+08:00") +@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-11-23T15:47:53.879+08:00") public class Tag { private Long id = null; @@ -41,6 +42,20 @@ public class Tag { + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + Tag tag = (Tag) o; + return Objects.equals(id, tag.id) && + Objects.equals(name, tag.name); + } + + @Override + public int hashCode() { + return Objects.hash(id, name); + } + @Override public String toString() { StringBuilder sb = new StringBuilder(); diff --git a/samples/client/petstore/java/default/src/main/java/io/swagger/client/model/User.java b/samples/client/petstore/java/default/src/main/java/io/swagger/client/model/User.java index 8aa9e34283f..73e2686efb0 100644 --- a/samples/client/petstore/java/default/src/main/java/io/swagger/client/model/User.java +++ b/samples/client/petstore/java/default/src/main/java/io/swagger/client/model/User.java @@ -3,13 +3,14 @@ package io.swagger.client.model; import io.swagger.client.StringUtil; +import java.util.Objects; import io.swagger.annotations.*; import com.fasterxml.jackson.annotation.JsonProperty; @ApiModel(description = "") -@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-10-30T16:36:47.681+08:00") +@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-11-23T15:47:53.879+08:00") public class User { private Long id = null; @@ -120,6 +121,26 @@ public class User { + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + User user = (User) o; + return Objects.equals(id, user.id) && + Objects.equals(username, user.username) && + Objects.equals(firstName, user.firstName) && + Objects.equals(lastName, user.lastName) && + Objects.equals(email, user.email) && + Objects.equals(password, user.password) && + Objects.equals(phone, user.phone) && + Objects.equals(userStatus, user.userStatus); + } + + @Override + public int hashCode() { + return Objects.hash(id, username, firstName, lastName, email, password, phone, userStatus); + } + @Override public String toString() { StringBuilder sb = new StringBuilder(); 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 0a8f8a1665d..0dd8b310df9 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 @@ -174,6 +174,27 @@ public class PetApiTest { api.uploadFile(pet.getId(), "a test file", new File(file.getAbsolutePath())); } + @Test + public void testEqualsAndHashCode() { + Pet pet1 = new Pet(); + Pet pet2 = new Pet(); + assertTrue(pet1.equals(pet2)); + assertTrue(pet1.equals(pet2)); + assertTrue(pet1.hashCode() == pet1.hashCode()); + + pet2.setName("really-happy"); + pet2.setPhotoUrls(Arrays.asList(new String[]{"http://foo.bar.com/1", "http://foo.bar.com/2"})); + assertFalse(pet1.equals(pet2)); + assertFalse(pet1.equals(pet2)); + assertFalse(pet1.hashCode() == (pet2.hashCode())); + + pet1.setName("really-happy"); + pet1.setPhotoUrls(Arrays.asList(new String[]{"http://foo.bar.com/1", "http://foo.bar.com/2"})); + assertTrue(pet1.equals(pet2)); + assertTrue(pet1.equals(pet2)); + assertTrue(pet1.hashCode() == pet1.hashCode()); + } + private Pet createRandomPet() { Pet pet = new Pet(); pet.setId(System.currentTimeMillis()); diff --git a/samples/client/petstore/java/jersey2/src/main/java/io/swagger/client/model/Category.java b/samples/client/petstore/java/jersey2/src/main/java/io/swagger/client/model/Category.java index 26e1b89bba7..46ecec0daf5 100644 --- a/samples/client/petstore/java/jersey2/src/main/java/io/swagger/client/model/Category.java +++ b/samples/client/petstore/java/jersey2/src/main/java/io/swagger/client/model/Category.java @@ -3,13 +3,14 @@ package io.swagger.client.model; import io.swagger.client.StringUtil; +import java.util.Objects; import io.swagger.annotations.*; import com.fasterxml.jackson.annotation.JsonProperty; @ApiModel(description = "") -@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-11-17T11:17:50.535-05:00") +@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-11-23T15:52:25.446+08:00") public class Category { private Long id = null; @@ -41,6 +42,20 @@ public class Category { + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + Category category = (Category) o; + return Objects.equals(id, category.id) && + Objects.equals(name, category.name); + } + + @Override + public int hashCode() { + return Objects.hash(id, name); + } + @Override public String toString() { StringBuilder sb = new StringBuilder(); 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 6efc0786703..9570fe22827 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 @@ -4,13 +4,14 @@ import io.swagger.client.StringUtil; import java.util.Date; +import java.util.Objects; import io.swagger.annotations.*; import com.fasterxml.jackson.annotation.JsonProperty; @ApiModel(description = "") -@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-11-17T11:17:50.535-05:00") +@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-11-23T15:52:25.446+08:00") public class Order { private Long id = null; @@ -113,6 +114,24 @@ public enum StatusEnum { + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + Order order = (Order) o; + return Objects.equals(id, order.id) && + Objects.equals(petId, order.petId) && + Objects.equals(quantity, order.quantity) && + Objects.equals(shipDate, order.shipDate) && + Objects.equals(status, order.status) && + Objects.equals(complete, order.complete); + } + + @Override + public int hashCode() { + return Objects.hash(id, petId, quantity, shipDate, status, complete); + } + @Override public String toString() { StringBuilder sb = new StringBuilder(); 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 02f0b88d6f5..a066ee8b251 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 @@ -6,13 +6,14 @@ import java.util.*; import io.swagger.client.model.Tag; +import java.util.Objects; import io.swagger.annotations.*; import com.fasterxml.jackson.annotation.JsonProperty; @ApiModel(description = "") -@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-11-17T11:17:50.535-05:00") +@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-11-23T15:52:25.446+08:00") public class Pet { private Long id = null; @@ -115,6 +116,24 @@ public enum StatusEnum { + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + Pet pet = (Pet) o; + return Objects.equals(id, pet.id) && + Objects.equals(category, pet.category) && + Objects.equals(name, pet.name) && + Objects.equals(photoUrls, pet.photoUrls) && + Objects.equals(tags, pet.tags) && + Objects.equals(status, pet.status); + } + + @Override + public int hashCode() { + return Objects.hash(id, category, name, photoUrls, tags, status); + } + @Override public String toString() { StringBuilder sb = new StringBuilder(); diff --git a/samples/client/petstore/java/jersey2/src/main/java/io/swagger/client/model/Tag.java b/samples/client/petstore/java/jersey2/src/main/java/io/swagger/client/model/Tag.java index 9dc8e017f9f..2d64dbe4351 100644 --- a/samples/client/petstore/java/jersey2/src/main/java/io/swagger/client/model/Tag.java +++ b/samples/client/petstore/java/jersey2/src/main/java/io/swagger/client/model/Tag.java @@ -3,13 +3,14 @@ package io.swagger.client.model; import io.swagger.client.StringUtil; +import java.util.Objects; import io.swagger.annotations.*; import com.fasterxml.jackson.annotation.JsonProperty; @ApiModel(description = "") -@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-11-17T11:17:50.535-05:00") +@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-11-23T15:52:25.446+08:00") public class Tag { private Long id = null; @@ -41,6 +42,20 @@ public class Tag { + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + Tag tag = (Tag) o; + return Objects.equals(id, tag.id) && + Objects.equals(name, tag.name); + } + + @Override + public int hashCode() { + return Objects.hash(id, name); + } + @Override public String toString() { StringBuilder sb = new StringBuilder(); diff --git a/samples/client/petstore/java/jersey2/src/main/java/io/swagger/client/model/User.java b/samples/client/petstore/java/jersey2/src/main/java/io/swagger/client/model/User.java index 8ad399fcc6b..8712e66e386 100644 --- a/samples/client/petstore/java/jersey2/src/main/java/io/swagger/client/model/User.java +++ b/samples/client/petstore/java/jersey2/src/main/java/io/swagger/client/model/User.java @@ -3,13 +3,14 @@ package io.swagger.client.model; import io.swagger.client.StringUtil; +import java.util.Objects; import io.swagger.annotations.*; import com.fasterxml.jackson.annotation.JsonProperty; @ApiModel(description = "") -@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-11-17T11:17:50.535-05:00") +@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-11-23T15:52:25.446+08:00") public class User { private Long id = null; @@ -120,6 +121,26 @@ public class User { + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + User user = (User) o; + return Objects.equals(id, user.id) && + Objects.equals(username, user.username) && + Objects.equals(firstName, user.firstName) && + Objects.equals(lastName, user.lastName) && + Objects.equals(email, user.email) && + Objects.equals(password, user.password) && + Objects.equals(phone, user.phone) && + Objects.equals(userStatus, user.userStatus); + } + + @Override + public int hashCode() { + return Objects.hash(id, username, firstName, lastName, email, password, phone, userStatus); + } + @Override public String toString() { StringBuilder sb = new StringBuilder(); 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 0a8f8a1665d..0dd8b310df9 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 @@ -174,6 +174,27 @@ public class PetApiTest { api.uploadFile(pet.getId(), "a test file", new File(file.getAbsolutePath())); } + @Test + public void testEqualsAndHashCode() { + Pet pet1 = new Pet(); + Pet pet2 = new Pet(); + assertTrue(pet1.equals(pet2)); + assertTrue(pet1.equals(pet2)); + assertTrue(pet1.hashCode() == pet1.hashCode()); + + pet2.setName("really-happy"); + pet2.setPhotoUrls(Arrays.asList(new String[]{"http://foo.bar.com/1", "http://foo.bar.com/2"})); + assertFalse(pet1.equals(pet2)); + assertFalse(pet1.equals(pet2)); + assertFalse(pet1.hashCode() == (pet2.hashCode())); + + pet1.setName("really-happy"); + pet1.setPhotoUrls(Arrays.asList(new String[]{"http://foo.bar.com/1", "http://foo.bar.com/2"})); + assertTrue(pet1.equals(pet2)); + assertTrue(pet1.equals(pet2)); + assertTrue(pet1.hashCode() == pet1.hashCode()); + } + private Pet createRandomPet() { Pet pet = new Pet(); pet.setId(System.currentTimeMillis()); diff --git a/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/model/Category.java b/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/model/Category.java index 0a7023ac7a5..1edddf2d7ff 100644 --- a/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/model/Category.java +++ b/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/model/Category.java @@ -5,6 +5,7 @@ import io.swagger.client.StringUtil; import com.google.gson.annotations.SerializedName; +import java.util.Objects; import io.swagger.annotations.*; @@ -44,6 +45,20 @@ public class Category { + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + Category category = (Category) o; + return Objects.equals(id, category.id) && + Objects.equals(name, category.name); + } + + @Override + public int hashCode() { + return Objects.hash(id, name); + } + @Override public String toString() { StringBuilder sb = new StringBuilder(); diff --git a/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/model/Order.java b/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/model/Order.java index df8e77b6fb3..d6053ceb783 100644 --- a/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/model/Order.java +++ b/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/model/Order.java @@ -6,6 +6,7 @@ import java.util.Date; import com.google.gson.annotations.SerializedName; +import java.util.Objects; import io.swagger.annotations.*; @@ -125,6 +126,24 @@ public enum StatusEnum { + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + Order order = (Order) o; + return Objects.equals(id, order.id) && + Objects.equals(petId, order.petId) && + Objects.equals(quantity, order.quantity) && + Objects.equals(shipDate, order.shipDate) && + Objects.equals(status, order.status) && + Objects.equals(complete, order.complete); + } + + @Override + public int hashCode() { + return Objects.hash(id, petId, quantity, shipDate, status, complete); + } + @Override public String toString() { StringBuilder sb = new StringBuilder(); diff --git a/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/model/Pet.java b/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/model/Pet.java index d1310e10ded..6cd9e1c7b77 100644 --- a/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/model/Pet.java +++ b/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/model/Pet.java @@ -2,12 +2,13 @@ package io.swagger.client.model; import io.swagger.client.StringUtil; import io.swagger.client.model.Category; -import io.swagger.client.model.Tag; import java.util.*; +import io.swagger.client.model.Tag; import com.google.gson.annotations.SerializedName; +import java.util.Objects; import io.swagger.annotations.*; @@ -127,6 +128,24 @@ public enum StatusEnum { + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + Pet pet = (Pet) o; + return Objects.equals(id, pet.id) && + Objects.equals(category, pet.category) && + Objects.equals(name, pet.name) && + Objects.equals(photoUrls, pet.photoUrls) && + Objects.equals(tags, pet.tags) && + Objects.equals(status, pet.status); + } + + @Override + public int hashCode() { + return Objects.hash(id, category, name, photoUrls, tags, status); + } + @Override public String toString() { StringBuilder sb = new StringBuilder(); diff --git a/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/model/Tag.java b/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/model/Tag.java index 9935b744f2d..d9240a03990 100644 --- a/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/model/Tag.java +++ b/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/model/Tag.java @@ -5,6 +5,7 @@ import io.swagger.client.StringUtil; import com.google.gson.annotations.SerializedName; +import java.util.Objects; import io.swagger.annotations.*; @@ -44,6 +45,20 @@ public class Tag { + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + Tag tag = (Tag) o; + return Objects.equals(id, tag.id) && + Objects.equals(name, tag.name); + } + + @Override + public int hashCode() { + return Objects.hash(id, name); + } + @Override public String toString() { StringBuilder sb = new StringBuilder(); diff --git a/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/model/User.java b/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/model/User.java index cba6abef8dd..9587082fd7d 100644 --- a/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/model/User.java +++ b/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/model/User.java @@ -5,6 +5,7 @@ import io.swagger.client.StringUtil; import com.google.gson.annotations.SerializedName; +import java.util.Objects; import io.swagger.annotations.*; @@ -129,6 +130,26 @@ public class User { + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + User user = (User) o; + return Objects.equals(id, user.id) && + Objects.equals(username, user.username) && + Objects.equals(firstName, user.firstName) && + Objects.equals(lastName, user.lastName) && + Objects.equals(email, user.email) && + Objects.equals(password, user.password) && + Objects.equals(phone, user.phone) && + Objects.equals(userStatus, user.userStatus); + } + + @Override + public int hashCode() { + return Objects.hash(id, username, firstName, lastName, email, password, phone, userStatus); + } + @Override public String toString() { StringBuilder sb = new StringBuilder(); diff --git a/samples/client/petstore/java/okhttp-gson/src/test/java/io/swagger/petstore/test/PetApiTest.java b/samples/client/petstore/java/okhttp-gson/src/test/java/io/swagger/petstore/test/PetApiTest.java index c9586343025..c87defe6ae5 100644 --- a/samples/client/petstore/java/okhttp-gson/src/test/java/io/swagger/petstore/test/PetApiTest.java +++ b/samples/client/petstore/java/okhttp-gson/src/test/java/io/swagger/petstore/test/PetApiTest.java @@ -252,6 +252,27 @@ public class PetApiTest { api.uploadFile(pet.getId(), "a test file", new File(file.getAbsolutePath())); } + @Test + public void testEqualsAndHashCode() { + Pet pet1 = new Pet(); + Pet pet2 = new Pet(); + assertTrue(pet1.equals(pet2)); + assertTrue(pet1.equals(pet2)); + assertTrue(pet1.hashCode() == pet1.hashCode()); + + pet2.setName("really-happy"); + pet2.setPhotoUrls(Arrays.asList(new String[]{"http://foo.bar.com/1", "http://foo.bar.com/2"})); + assertFalse(pet1.equals(pet2)); + assertFalse(pet1.equals(pet2)); + assertFalse(pet1.hashCode() == (pet2.hashCode())); + + pet1.setName("really-happy"); + pet1.setPhotoUrls(Arrays.asList(new String[]{"http://foo.bar.com/1", "http://foo.bar.com/2"})); + assertTrue(pet1.equals(pet2)); + assertTrue(pet1.equals(pet2)); + assertTrue(pet1.hashCode() == pet1.hashCode()); + } + private Pet createRandomPet() { Pet pet = new Pet(); pet.setId(System.currentTimeMillis()); From f2a8955926217bbabd64c7d76544bd2e5442b56c Mon Sep 17 00:00:00 2001 From: xhh Date: Mon, 23 Nov 2015 19:59:44 +0800 Subject: [PATCH 027/211] Add "equals" and "hashCode" methods to Java clients for the "retrofit" and "retrofit2" libraries --- .../Java/libraries/okhttp-gson/model.mustache | 8 ++++-- .../Java/libraries/retrofit/model.mustache | 20 +++++++++++++++ .../Java/libraries/retrofit2/model.mustache | 20 +++++++++++++++ .../src/main/resources/Java/model.mustache | 8 ++++-- .../io/swagger/client/model/Category.java | 10 +++++--- .../java/io/swagger/client/model/Order.java | 10 +++++--- .../java/io/swagger/client/model/Pet.java | 10 +++++--- .../java/io/swagger/client/model/Tag.java | 10 +++++--- .../java/io/swagger/client/model/User.java | 10 +++++--- .../io/swagger/client/model/Category.java | 8 ++++-- .../java/io/swagger/client/model/Order.java | 8 ++++-- .../java/io/swagger/client/model/Pet.java | 8 ++++-- .../java/io/swagger/client/model/Tag.java | 8 ++++-- .../java/io/swagger/client/model/User.java | 8 ++++-- .../io/swagger/client/model/Category.java | 19 ++++++++++++++ .../java/io/swagger/client/model/Order.java | 23 +++++++++++++++++ .../java/io/swagger/client/model/Pet.java | 25 ++++++++++++++++++- .../java/io/swagger/client/model/Tag.java | 19 ++++++++++++++ .../java/io/swagger/client/model/User.java | 25 +++++++++++++++++++ .../io/swagger/petstore/test/PetApiTest.java | 21 ++++++++++++++++ .../io/swagger/client/model/Category.java | 19 ++++++++++++++ .../java/io/swagger/client/model/Order.java | 23 +++++++++++++++++ .../java/io/swagger/client/model/Pet.java | 23 +++++++++++++++++ .../java/io/swagger/client/model/Tag.java | 19 ++++++++++++++ .../java/io/swagger/client/model/User.java | 25 +++++++++++++++++++ .../io/swagger/petstore/test/PetApiTest.java | 21 ++++++++++++++++ 26 files changed, 378 insertions(+), 30 deletions(-) diff --git a/modules/swagger-codegen/src/main/resources/Java/libraries/okhttp-gson/model.mustache b/modules/swagger-codegen/src/main/resources/Java/libraries/okhttp-gson/model.mustache index 677b29762c3..b7b4ea2cf3f 100644 --- a/modules/swagger-codegen/src/main/resources/Java/libraries/okhttp-gson/model.mustache +++ b/modules/swagger-codegen/src/main/resources/Java/libraries/okhttp-gson/model.mustache @@ -47,8 +47,12 @@ public class {{classname}} {{#parent}}extends {{{parent}}}{{/parent}} {{#seriali @Override public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } {{classname}} {{classVarName}} = ({{classname}}) o;{{#hasVars}} return {{#vars}}Objects.equals({{name}}, {{classVarName}}.{{name}}){{#hasMore}} && {{/hasMore}}{{^hasMore}};{{/hasMore}}{{/vars}}{{/hasVars}}{{^hasVars}} diff --git a/modules/swagger-codegen/src/main/resources/Java/libraries/retrofit/model.mustache b/modules/swagger-codegen/src/main/resources/Java/libraries/retrofit/model.mustache index 0987aa68f34..b7b4ea2cf3f 100644 --- a/modules/swagger-codegen/src/main/resources/Java/libraries/retrofit/model.mustache +++ b/modules/swagger-codegen/src/main/resources/Java/libraries/retrofit/model.mustache @@ -8,6 +8,7 @@ import com.google.gson.annotations.SerializedName; {{#serializableModel}} import java.io.Serializable;{{/serializableModel}} +import java.util.Objects; import io.swagger.annotations.*; @@ -44,6 +45,25 @@ public class {{classname}} {{#parent}}extends {{{parent}}}{{/parent}} {{#seriali {{/vars}} + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + {{classname}} {{classVarName}} = ({{classname}}) o;{{#hasVars}} + return {{#vars}}Objects.equals({{name}}, {{classVarName}}.{{name}}){{#hasMore}} && + {{/hasMore}}{{^hasMore}};{{/hasMore}}{{/vars}}{{/hasVars}}{{^hasVars}} + return true;{{/hasVars}} + } + + @Override + public int hashCode() { + return Objects.hash({{#vars}}{{name}}{{#hasMore}}, {{/hasMore}}{{/vars}}); + } + @Override public String toString() { StringBuilder sb = new StringBuilder(); diff --git a/modules/swagger-codegen/src/main/resources/Java/libraries/retrofit2/model.mustache b/modules/swagger-codegen/src/main/resources/Java/libraries/retrofit2/model.mustache index 0987aa68f34..b7b4ea2cf3f 100644 --- a/modules/swagger-codegen/src/main/resources/Java/libraries/retrofit2/model.mustache +++ b/modules/swagger-codegen/src/main/resources/Java/libraries/retrofit2/model.mustache @@ -8,6 +8,7 @@ import com.google.gson.annotations.SerializedName; {{#serializableModel}} import java.io.Serializable;{{/serializableModel}} +import java.util.Objects; import io.swagger.annotations.*; @@ -44,6 +45,25 @@ public class {{classname}} {{#parent}}extends {{{parent}}}{{/parent}} {{#seriali {{/vars}} + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + {{classname}} {{classVarName}} = ({{classname}}) o;{{#hasVars}} + return {{#vars}}Objects.equals({{name}}, {{classVarName}}.{{name}}){{#hasMore}} && + {{/hasMore}}{{^hasMore}};{{/hasMore}}{{/vars}}{{/hasVars}}{{^hasVars}} + return true;{{/hasVars}} + } + + @Override + public int hashCode() { + return Objects.hash({{#vars}}{{name}}{{#hasMore}}, {{/hasMore}}{{/vars}}); + } + @Override public String toString() { StringBuilder sb = new StringBuilder(); diff --git a/modules/swagger-codegen/src/main/resources/Java/model.mustache b/modules/swagger-codegen/src/main/resources/Java/model.mustache index a6973c649f7..55aa77e30f0 100644 --- a/modules/swagger-codegen/src/main/resources/Java/model.mustache +++ b/modules/swagger-codegen/src/main/resources/Java/model.mustache @@ -45,8 +45,12 @@ public class {{classname}} {{#parent}}extends {{{parent}}}{{/parent}} {{#seriali @Override public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } {{classname}} {{classVarName}} = ({{classname}}) o;{{#hasVars}} return {{#vars}}Objects.equals({{name}}, {{classVarName}}.{{name}}){{#hasMore}} && {{/hasMore}}{{^hasMore}};{{/hasMore}}{{/vars}}{{/hasVars}}{{^hasVars}} diff --git a/samples/client/petstore/java/default/src/main/java/io/swagger/client/model/Category.java b/samples/client/petstore/java/default/src/main/java/io/swagger/client/model/Category.java index 1eaf71f9f71..07bd79cd8a3 100644 --- a/samples/client/petstore/java/default/src/main/java/io/swagger/client/model/Category.java +++ b/samples/client/petstore/java/default/src/main/java/io/swagger/client/model/Category.java @@ -10,7 +10,7 @@ import com.fasterxml.jackson.annotation.JsonProperty; @ApiModel(description = "") -@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-11-23T15:47:53.879+08:00") +@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-11-23T19:53:03.542+08:00") public class Category { private Long id = null; @@ -44,8 +44,12 @@ public class Category { @Override public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } Category category = (Category) o; return Objects.equals(id, category.id) && Objects.equals(name, category.name); 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 4ef600ccf55..8cbcad11dc5 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 @@ -11,7 +11,7 @@ import com.fasterxml.jackson.annotation.JsonProperty; @ApiModel(description = "") -@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-11-23T15:47:53.879+08:00") +@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-11-23T19:53:03.542+08:00") public class Order { private Long id = null; @@ -116,8 +116,12 @@ public enum StatusEnum { @Override public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } Order order = (Order) o; return Objects.equals(id, order.id) && Objects.equals(petId, order.petId) && 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 c5101f0f7ec..ec78248b840 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 @@ -13,7 +13,7 @@ import com.fasterxml.jackson.annotation.JsonProperty; @ApiModel(description = "") -@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-11-23T15:47:53.879+08:00") +@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-11-23T19:53:03.542+08:00") public class Pet { private Long id = null; @@ -118,8 +118,12 @@ public enum StatusEnum { @Override public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } Pet pet = (Pet) o; return Objects.equals(id, pet.id) && Objects.equals(category, pet.category) && diff --git a/samples/client/petstore/java/default/src/main/java/io/swagger/client/model/Tag.java b/samples/client/petstore/java/default/src/main/java/io/swagger/client/model/Tag.java index be612525c65..3c2278b5e4f 100644 --- a/samples/client/petstore/java/default/src/main/java/io/swagger/client/model/Tag.java +++ b/samples/client/petstore/java/default/src/main/java/io/swagger/client/model/Tag.java @@ -10,7 +10,7 @@ import com.fasterxml.jackson.annotation.JsonProperty; @ApiModel(description = "") -@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-11-23T15:47:53.879+08:00") +@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-11-23T19:53:03.542+08:00") public class Tag { private Long id = null; @@ -44,8 +44,12 @@ public class Tag { @Override public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } Tag tag = (Tag) o; return Objects.equals(id, tag.id) && Objects.equals(name, tag.name); diff --git a/samples/client/petstore/java/default/src/main/java/io/swagger/client/model/User.java b/samples/client/petstore/java/default/src/main/java/io/swagger/client/model/User.java index 73e2686efb0..ec20b37c378 100644 --- a/samples/client/petstore/java/default/src/main/java/io/swagger/client/model/User.java +++ b/samples/client/petstore/java/default/src/main/java/io/swagger/client/model/User.java @@ -10,7 +10,7 @@ import com.fasterxml.jackson.annotation.JsonProperty; @ApiModel(description = "") -@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-11-23T15:47:53.879+08:00") +@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-11-23T19:53:03.542+08:00") public class User { private Long id = null; @@ -123,8 +123,12 @@ public class User { @Override public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } User user = (User) o; return Objects.equals(id, user.id) && Objects.equals(username, user.username) && diff --git a/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/model/Category.java b/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/model/Category.java index 1edddf2d7ff..4f15da15c65 100644 --- a/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/model/Category.java +++ b/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/model/Category.java @@ -47,8 +47,12 @@ public class Category { @Override public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } Category category = (Category) o; return Objects.equals(id, category.id) && Objects.equals(name, category.name); diff --git a/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/model/Order.java b/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/model/Order.java index d6053ceb783..18c51201ad4 100644 --- a/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/model/Order.java +++ b/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/model/Order.java @@ -128,8 +128,12 @@ public enum StatusEnum { @Override public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } Order order = (Order) o; return Objects.equals(id, order.id) && Objects.equals(petId, order.petId) && diff --git a/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/model/Pet.java b/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/model/Pet.java index 6cd9e1c7b77..7e771866b39 100644 --- a/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/model/Pet.java +++ b/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/model/Pet.java @@ -130,8 +130,12 @@ public enum StatusEnum { @Override public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } Pet pet = (Pet) o; return Objects.equals(id, pet.id) && Objects.equals(category, pet.category) && diff --git a/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/model/Tag.java b/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/model/Tag.java index d9240a03990..474904011f7 100644 --- a/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/model/Tag.java +++ b/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/model/Tag.java @@ -47,8 +47,12 @@ public class Tag { @Override public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } Tag tag = (Tag) o; return Objects.equals(id, tag.id) && Objects.equals(name, tag.name); diff --git a/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/model/User.java b/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/model/User.java index 9587082fd7d..82f1a0822db 100644 --- a/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/model/User.java +++ b/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/model/User.java @@ -132,8 +132,12 @@ public class User { @Override public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } User user = (User) o; return Objects.equals(id, user.id) && Objects.equals(username, user.username) && diff --git a/samples/client/petstore/java/retrofit/src/main/java/io/swagger/client/model/Category.java b/samples/client/petstore/java/retrofit/src/main/java/io/swagger/client/model/Category.java index 0a7023ac7a5..4f15da15c65 100644 --- a/samples/client/petstore/java/retrofit/src/main/java/io/swagger/client/model/Category.java +++ b/samples/client/petstore/java/retrofit/src/main/java/io/swagger/client/model/Category.java @@ -5,6 +5,7 @@ import io.swagger.client.StringUtil; import com.google.gson.annotations.SerializedName; +import java.util.Objects; import io.swagger.annotations.*; @@ -44,6 +45,24 @@ public class Category { + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + Category category = (Category) o; + return Objects.equals(id, category.id) && + Objects.equals(name, category.name); + } + + @Override + public int hashCode() { + return Objects.hash(id, name); + } + @Override public String toString() { StringBuilder sb = new StringBuilder(); diff --git a/samples/client/petstore/java/retrofit/src/main/java/io/swagger/client/model/Order.java b/samples/client/petstore/java/retrofit/src/main/java/io/swagger/client/model/Order.java index df8e77b6fb3..18c51201ad4 100644 --- a/samples/client/petstore/java/retrofit/src/main/java/io/swagger/client/model/Order.java +++ b/samples/client/petstore/java/retrofit/src/main/java/io/swagger/client/model/Order.java @@ -6,6 +6,7 @@ import java.util.Date; import com.google.gson.annotations.SerializedName; +import java.util.Objects; import io.swagger.annotations.*; @@ -125,6 +126,28 @@ public enum StatusEnum { + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + Order order = (Order) o; + return Objects.equals(id, order.id) && + Objects.equals(petId, order.petId) && + Objects.equals(quantity, order.quantity) && + Objects.equals(shipDate, order.shipDate) && + Objects.equals(status, order.status) && + Objects.equals(complete, order.complete); + } + + @Override + public int hashCode() { + return Objects.hash(id, petId, quantity, shipDate, status, complete); + } + @Override public String toString() { StringBuilder sb = new StringBuilder(); diff --git a/samples/client/petstore/java/retrofit/src/main/java/io/swagger/client/model/Pet.java b/samples/client/petstore/java/retrofit/src/main/java/io/swagger/client/model/Pet.java index d1310e10ded..7e771866b39 100644 --- a/samples/client/petstore/java/retrofit/src/main/java/io/swagger/client/model/Pet.java +++ b/samples/client/petstore/java/retrofit/src/main/java/io/swagger/client/model/Pet.java @@ -2,12 +2,13 @@ package io.swagger.client.model; import io.swagger.client.StringUtil; import io.swagger.client.model.Category; -import io.swagger.client.model.Tag; import java.util.*; +import io.swagger.client.model.Tag; import com.google.gson.annotations.SerializedName; +import java.util.Objects; import io.swagger.annotations.*; @@ -127,6 +128,28 @@ public enum StatusEnum { + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + Pet pet = (Pet) o; + return Objects.equals(id, pet.id) && + Objects.equals(category, pet.category) && + Objects.equals(name, pet.name) && + Objects.equals(photoUrls, pet.photoUrls) && + Objects.equals(tags, pet.tags) && + Objects.equals(status, pet.status); + } + + @Override + public int hashCode() { + return Objects.hash(id, category, name, photoUrls, tags, status); + } + @Override public String toString() { StringBuilder sb = new StringBuilder(); diff --git a/samples/client/petstore/java/retrofit/src/main/java/io/swagger/client/model/Tag.java b/samples/client/petstore/java/retrofit/src/main/java/io/swagger/client/model/Tag.java index 9935b744f2d..474904011f7 100644 --- a/samples/client/petstore/java/retrofit/src/main/java/io/swagger/client/model/Tag.java +++ b/samples/client/petstore/java/retrofit/src/main/java/io/swagger/client/model/Tag.java @@ -5,6 +5,7 @@ import io.swagger.client.StringUtil; import com.google.gson.annotations.SerializedName; +import java.util.Objects; import io.swagger.annotations.*; @@ -44,6 +45,24 @@ public class Tag { + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + Tag tag = (Tag) o; + return Objects.equals(id, tag.id) && + Objects.equals(name, tag.name); + } + + @Override + public int hashCode() { + return Objects.hash(id, name); + } + @Override public String toString() { StringBuilder sb = new StringBuilder(); diff --git a/samples/client/petstore/java/retrofit/src/main/java/io/swagger/client/model/User.java b/samples/client/petstore/java/retrofit/src/main/java/io/swagger/client/model/User.java index cba6abef8dd..82f1a0822db 100644 --- a/samples/client/petstore/java/retrofit/src/main/java/io/swagger/client/model/User.java +++ b/samples/client/petstore/java/retrofit/src/main/java/io/swagger/client/model/User.java @@ -5,6 +5,7 @@ import io.swagger.client.StringUtil; import com.google.gson.annotations.SerializedName; +import java.util.Objects; import io.swagger.annotations.*; @@ -129,6 +130,30 @@ public class User { + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + User user = (User) o; + return Objects.equals(id, user.id) && + Objects.equals(username, user.username) && + Objects.equals(firstName, user.firstName) && + Objects.equals(lastName, user.lastName) && + Objects.equals(email, user.email) && + Objects.equals(password, user.password) && + Objects.equals(phone, user.phone) && + Objects.equals(userStatus, user.userStatus); + } + + @Override + public int hashCode() { + return Objects.hash(id, username, firstName, lastName, email, password, phone, userStatus); + } + @Override public String toString() { StringBuilder sb = new StringBuilder(); diff --git a/samples/client/petstore/java/retrofit/src/test/java/io/swagger/petstore/test/PetApiTest.java b/samples/client/petstore/java/retrofit/src/test/java/io/swagger/petstore/test/PetApiTest.java index ec93912b1f6..51d84c5cff4 100644 --- a/samples/client/petstore/java/retrofit/src/test/java/io/swagger/petstore/test/PetApiTest.java +++ b/samples/client/petstore/java/retrofit/src/test/java/io/swagger/petstore/test/PetApiTest.java @@ -143,6 +143,27 @@ public class PetApiTest { api.uploadFile(pet.getId(), "a test file", new TypedFile("text/plain", file)); } + @Test + public void testEqualsAndHashCode() { + Pet pet1 = new Pet(); + Pet pet2 = new Pet(); + assertTrue(pet1.equals(pet2)); + assertTrue(pet1.equals(pet2)); + assertTrue(pet1.hashCode() == pet1.hashCode()); + + pet2.setName("really-happy"); + pet2.setPhotoUrls(Arrays.asList(new String[]{"http://foo.bar.com/1", "http://foo.bar.com/2"})); + assertFalse(pet1.equals(pet2)); + assertFalse(pet1.equals(pet2)); + assertFalse(pet1.hashCode() == (pet2.hashCode())); + + pet1.setName("really-happy"); + pet1.setPhotoUrls(Arrays.asList(new String[]{"http://foo.bar.com/1", "http://foo.bar.com/2"})); + assertTrue(pet1.equals(pet2)); + assertTrue(pet1.equals(pet2)); + assertTrue(pet1.hashCode() == pet1.hashCode()); + } + private Pet createRandomPet() { Pet pet = new Pet(); pet.setId(System.currentTimeMillis()); diff --git a/samples/client/petstore/java/retrofit2/src/main/java/io/swagger/client/model/Category.java b/samples/client/petstore/java/retrofit2/src/main/java/io/swagger/client/model/Category.java index 0a7023ac7a5..4f15da15c65 100644 --- a/samples/client/petstore/java/retrofit2/src/main/java/io/swagger/client/model/Category.java +++ b/samples/client/petstore/java/retrofit2/src/main/java/io/swagger/client/model/Category.java @@ -5,6 +5,7 @@ import io.swagger.client.StringUtil; import com.google.gson.annotations.SerializedName; +import java.util.Objects; import io.swagger.annotations.*; @@ -44,6 +45,24 @@ public class Category { + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + Category category = (Category) o; + return Objects.equals(id, category.id) && + Objects.equals(name, category.name); + } + + @Override + public int hashCode() { + return Objects.hash(id, name); + } + @Override public String toString() { StringBuilder sb = new StringBuilder(); diff --git a/samples/client/petstore/java/retrofit2/src/main/java/io/swagger/client/model/Order.java b/samples/client/petstore/java/retrofit2/src/main/java/io/swagger/client/model/Order.java index df8e77b6fb3..18c51201ad4 100644 --- a/samples/client/petstore/java/retrofit2/src/main/java/io/swagger/client/model/Order.java +++ b/samples/client/petstore/java/retrofit2/src/main/java/io/swagger/client/model/Order.java @@ -6,6 +6,7 @@ import java.util.Date; import com.google.gson.annotations.SerializedName; +import java.util.Objects; import io.swagger.annotations.*; @@ -125,6 +126,28 @@ public enum StatusEnum { + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + Order order = (Order) o; + return Objects.equals(id, order.id) && + Objects.equals(petId, order.petId) && + Objects.equals(quantity, order.quantity) && + Objects.equals(shipDate, order.shipDate) && + Objects.equals(status, order.status) && + Objects.equals(complete, order.complete); + } + + @Override + public int hashCode() { + return Objects.hash(id, petId, quantity, shipDate, status, complete); + } + @Override public String toString() { StringBuilder sb = new StringBuilder(); diff --git a/samples/client/petstore/java/retrofit2/src/main/java/io/swagger/client/model/Pet.java b/samples/client/petstore/java/retrofit2/src/main/java/io/swagger/client/model/Pet.java index 9ab5457e26a..7e771866b39 100644 --- a/samples/client/petstore/java/retrofit2/src/main/java/io/swagger/client/model/Pet.java +++ b/samples/client/petstore/java/retrofit2/src/main/java/io/swagger/client/model/Pet.java @@ -8,6 +8,7 @@ import io.swagger.client.model.Tag; import com.google.gson.annotations.SerializedName; +import java.util.Objects; import io.swagger.annotations.*; @@ -127,6 +128,28 @@ public enum StatusEnum { + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + Pet pet = (Pet) o; + return Objects.equals(id, pet.id) && + Objects.equals(category, pet.category) && + Objects.equals(name, pet.name) && + Objects.equals(photoUrls, pet.photoUrls) && + Objects.equals(tags, pet.tags) && + Objects.equals(status, pet.status); + } + + @Override + public int hashCode() { + return Objects.hash(id, category, name, photoUrls, tags, status); + } + @Override public String toString() { StringBuilder sb = new StringBuilder(); diff --git a/samples/client/petstore/java/retrofit2/src/main/java/io/swagger/client/model/Tag.java b/samples/client/petstore/java/retrofit2/src/main/java/io/swagger/client/model/Tag.java index 9935b744f2d..474904011f7 100644 --- a/samples/client/petstore/java/retrofit2/src/main/java/io/swagger/client/model/Tag.java +++ b/samples/client/petstore/java/retrofit2/src/main/java/io/swagger/client/model/Tag.java @@ -5,6 +5,7 @@ import io.swagger.client.StringUtil; import com.google.gson.annotations.SerializedName; +import java.util.Objects; import io.swagger.annotations.*; @@ -44,6 +45,24 @@ public class Tag { + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + Tag tag = (Tag) o; + return Objects.equals(id, tag.id) && + Objects.equals(name, tag.name); + } + + @Override + public int hashCode() { + return Objects.hash(id, name); + } + @Override public String toString() { StringBuilder sb = new StringBuilder(); diff --git a/samples/client/petstore/java/retrofit2/src/main/java/io/swagger/client/model/User.java b/samples/client/petstore/java/retrofit2/src/main/java/io/swagger/client/model/User.java index cba6abef8dd..82f1a0822db 100644 --- a/samples/client/petstore/java/retrofit2/src/main/java/io/swagger/client/model/User.java +++ b/samples/client/petstore/java/retrofit2/src/main/java/io/swagger/client/model/User.java @@ -5,6 +5,7 @@ import io.swagger.client.StringUtil; import com.google.gson.annotations.SerializedName; +import java.util.Objects; import io.swagger.annotations.*; @@ -129,6 +130,30 @@ public class User { + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + User user = (User) o; + return Objects.equals(id, user.id) && + Objects.equals(username, user.username) && + Objects.equals(firstName, user.firstName) && + Objects.equals(lastName, user.lastName) && + Objects.equals(email, user.email) && + Objects.equals(password, user.password) && + Objects.equals(phone, user.phone) && + Objects.equals(userStatus, user.userStatus); + } + + @Override + public int hashCode() { + return Objects.hash(id, username, firstName, lastName, email, password, phone, userStatus); + } + @Override public String toString() { StringBuilder sb = new StringBuilder(); diff --git a/samples/client/petstore/java/retrofit2/src/test/java/io/swagger/petstore/test/PetApiTest.java b/samples/client/petstore/java/retrofit2/src/test/java/io/swagger/petstore/test/PetApiTest.java index 8522c4f30ad..309914b434e 100644 --- a/samples/client/petstore/java/retrofit2/src/test/java/io/swagger/petstore/test/PetApiTest.java +++ b/samples/client/petstore/java/retrofit2/src/test/java/io/swagger/petstore/test/PetApiTest.java @@ -142,6 +142,27 @@ public class PetApiTest { api.uploadFile(pet.getId(), "a test file", RequestBody.create(MediaType.parse("text/plain"), file)).execute(); } + @Test + public void testEqualsAndHashCode() { + Pet pet1 = new Pet(); + Pet pet2 = new Pet(); + assertTrue(pet1.equals(pet2)); + assertTrue(pet1.equals(pet2)); + assertTrue(pet1.hashCode() == pet1.hashCode()); + + pet2.setName("really-happy"); + pet2.setPhotoUrls(Arrays.asList(new String[]{"http://foo.bar.com/1", "http://foo.bar.com/2"})); + assertFalse(pet1.equals(pet2)); + assertFalse(pet1.equals(pet2)); + assertFalse(pet1.hashCode() == (pet2.hashCode())); + + pet1.setName("really-happy"); + pet1.setPhotoUrls(Arrays.asList(new String[]{"http://foo.bar.com/1", "http://foo.bar.com/2"})); + assertTrue(pet1.equals(pet2)); + assertTrue(pet1.equals(pet2)); + assertTrue(pet1.hashCode() == pet1.hashCode()); + } + private Pet createRandomPet() { Pet pet = new Pet(); pet.setId(System.currentTimeMillis()); From a81d8c56e3ff948e88ace18f0509746c7d53442d Mon Sep 17 00:00:00 2001 From: jfastnacht Date: Mon, 23 Nov 2015 15:34:36 +0100 Subject: [PATCH 028/211] Adjusted index.mustache to fit Slim Framework v3 Added composer support for Slim Framework v3 RC Updated samples --- .../src/main/resources/slim/composer.json | 1 + .../src/main/resources/slim/index.mustache | 30 ++- .../petstore/slim/SwaggerServer/composer.json | 1 + .../petstore/slim/SwaggerServer/index.php | 232 ++++++++++++------ 4 files changed, 172 insertions(+), 92 deletions(-) diff --git a/modules/swagger-codegen/src/main/resources/slim/composer.json b/modules/swagger-codegen/src/main/resources/slim/composer.json index a33f327440d..c55c8181765 100644 --- a/modules/swagger-codegen/src/main/resources/slim/composer.json +++ b/modules/swagger-codegen/src/main/resources/slim/composer.json @@ -1,4 +1,5 @@ { + "minimum-stability": "RC", "require": { "slim/slim": "3.*" } diff --git a/modules/swagger-codegen/src/main/resources/slim/index.mustache b/modules/swagger-codegen/src/main/resources/slim/index.mustache index ab91368063f..2f4a630909f 100644 --- a/modules/swagger-codegen/src/main/resources/slim/index.mustache +++ b/modules/swagger-codegen/src/main/resources/slim/index.mustache @@ -1,22 +1,26 @@ {{httpMethod}}('{{path}}', function(Application $app, Request $request{{#pathParams}}, ${{paramName}}{{/pathParams}}) { - {{#queryParams}}${{paramName}} = $request->get('{{paramName}}');{{newline}} {{/queryParams}} - {{#formParams}}${{paramName}} = $request->get('{{paramName}}');{{newline}} {{/formParams}} - return new Response('How about implementing {{nickname}} as a {{httpMethod}} method ?'); +{{#apis}}{{#operations}}{{#operation}} +/** + * {{httpMethod}} {{baseName}} + * {{summary}} + */ +$app->{{httpMethod}}('{{path}}', function($request, $response, $args) { + {{#hasQueryParams}}$queryParams = $request->getQueryParams(); + {{#queryParams}}${{paramName}} = $queryParams['{{paramName}}'];{{newline}} {{/queryParams}}{{/hasQueryParams}} + {{#hasFormParams}}{{#formParams}}${{paramName}} = $args['{{paramName}}'];{{newline}} {{/formParams}}{{/hasFormParams}} + $response->write('How about implementing {{nickname}} as a {{httpMethod}} method ?'); + return $response; }); - {{/operation}} - {{/operations}} - {{/apis}} -{{/apiInfo}} +{{/operation}}{{/operations}}{{/apis}}{{/apiInfo}} $app->run(); diff --git a/samples/server/petstore/slim/SwaggerServer/composer.json b/samples/server/petstore/slim/SwaggerServer/composer.json index a33f327440d..c55c8181765 100644 --- a/samples/server/petstore/slim/SwaggerServer/composer.json +++ b/samples/server/petstore/slim/SwaggerServer/composer.json @@ -1,4 +1,5 @@ { + "minimum-stability": "RC", "require": { "slim/slim": "3.*" } diff --git a/samples/server/petstore/slim/SwaggerServer/index.php b/samples/server/petstore/slim/SwaggerServer/index.php index c2b4741bb0c..49bd15930e2 100644 --- a/samples/server/petstore/slim/SwaggerServer/index.php +++ b/samples/server/petstore/slim/SwaggerServer/index.php @@ -1,182 +1,256 @@ POST('/user', function(Application $app, Request $request) { +/** + * POST User + * Create user + */ +$app->POST('/user', function($request, $response, $args) { - return new Response('How about implementing createUser as a POST method ?'); + $response->write('How about implementing createUser as a POST method ?'); + return $response; }); - -$app->POST('/user/createWithArray', function(Application $app, Request $request) { +/** + * POST User + * Creates list of users with given input array + */ +$app->POST('/user/createWithArray', function($request, $response, $args) { - return new Response('How about implementing createUsersWithArrayInput as a POST method ?'); + $response->write('How about implementing createUsersWithArrayInput as a POST method ?'); + return $response; }); - -$app->POST('/user/createWithList', function(Application $app, Request $request) { +/** + * POST User + * Creates list of users with given input array + */ +$app->POST('/user/createWithList', function($request, $response, $args) { - return new Response('How about implementing createUsersWithListInput as a POST method ?'); + $response->write('How about implementing createUsersWithListInput as a POST method ?'); + return $response; }); - -$app->GET('/user/login', function(Application $app, Request $request) { - $username = $request->get('username'); $password = $request->get('password'); +/** + * GET User + * Logs user into the system + */ +$app->GET('/user/login', function($request, $response, $args) { + $queryParams = $request->getQueryParams(); + $username = $queryParams['username']; $password = $queryParams['password']; - return new Response('How about implementing loginUser as a GET method ?'); + $response->write('How about implementing loginUser as a GET method ?'); + return $response; }); - -$app->GET('/user/logout', function(Application $app, Request $request) { +/** + * GET User + * Logs out current logged in user session + */ +$app->GET('/user/logout', function($request, $response, $args) { - return new Response('How about implementing logoutUser as a GET method ?'); + $response->write('How about implementing logoutUser as a GET method ?'); + return $response; }); - -$app->GET('/user/{username}', function(Application $app, Request $request, $username) { +/** + * GET User + * Get user by user name + */ +$app->GET('/user/{username}', function($request, $response, $args) { - return new Response('How about implementing getUserByName as a GET method ?'); + $response->write('How about implementing getUserByName as a GET method ?'); + return $response; }); - -$app->PUT('/user/{username}', function(Application $app, Request $request, $username) { +/** + * PUT User + * Updated user + */ +$app->PUT('/user/{username}', function($request, $response, $args) { - return new Response('How about implementing updateUser as a PUT method ?'); + $response->write('How about implementing updateUser as a PUT method ?'); + return $response; }); - -$app->DELETE('/user/{username}', function(Application $app, Request $request, $username) { +/** + * DELETE User + * Delete user + */ +$app->DELETE('/user/{username}', function($request, $response, $args) { - return new Response('How about implementing deleteUser as a DELETE method ?'); + $response->write('How about implementing deleteUser as a DELETE method ?'); + return $response; }); - - - - - -$app->GET('/store/inventory', function(Application $app, Request $request) { +/** + * GET Store + * Returns pet inventories by status + */ +$app->GET('/store/inventory', function($request, $response, $args) { - return new Response('How about implementing getInventory as a GET method ?'); + $response->write('How about implementing getInventory as a GET method ?'); + return $response; }); - -$app->POST('/store/order', function(Application $app, Request $request) { +/** + * POST Store + * Place an order for a pet + */ +$app->POST('/store/order', function($request, $response, $args) { - return new Response('How about implementing placeOrder as a POST method ?'); + $response->write('How about implementing placeOrder as a POST method ?'); + return $response; }); - -$app->GET('/store/order/{orderId}', function(Application $app, Request $request, $order_id) { +/** + * GET Store + * Find purchase order by ID + */ +$app->GET('/store/order/{orderId}', function($request, $response, $args) { - return new Response('How about implementing getOrderById as a GET method ?'); + $response->write('How about implementing getOrderById as a GET method ?'); + return $response; }); - -$app->DELETE('/store/order/{orderId}', function(Application $app, Request $request, $order_id) { +/** + * DELETE Store + * Delete purchase order by ID + */ +$app->DELETE('/store/order/{orderId}', function($request, $response, $args) { - return new Response('How about implementing deleteOrder as a DELETE method ?'); + $response->write('How about implementing deleteOrder as a DELETE method ?'); + return $response; }); - - - - - -$app->PUT('/pet', function(Application $app, Request $request) { +/** + * PUT Pet + * Update an existing pet + */ +$app->PUT('/pet', function($request, $response, $args) { - return new Response('How about implementing updatePet as a PUT method ?'); + $response->write('How about implementing updatePet as a PUT method ?'); + return $response; }); - -$app->POST('/pet', function(Application $app, Request $request) { +/** + * POST Pet + * Add a new pet to the store + */ +$app->POST('/pet', function($request, $response, $args) { - return new Response('How about implementing addPet as a POST method ?'); + $response->write('How about implementing addPet as a POST method ?'); + return $response; }); - -$app->GET('/pet/findByStatus', function(Application $app, Request $request) { - $status = $request->get('status'); +/** + * GET Pet + * Finds Pets by status + */ +$app->GET('/pet/findByStatus', function($request, $response, $args) { + $queryParams = $request->getQueryParams(); + $status = $queryParams['status']; - return new Response('How about implementing findPetsByStatus as a GET method ?'); + $response->write('How about implementing findPetsByStatus as a GET method ?'); + return $response; }); - -$app->GET('/pet/findByTags', function(Application $app, Request $request) { - $tags = $request->get('tags'); +/** + * GET Pet + * Finds Pets by tags + */ +$app->GET('/pet/findByTags', function($request, $response, $args) { + $queryParams = $request->getQueryParams(); + $tags = $queryParams['tags']; - return new Response('How about implementing findPetsByTags as a GET method ?'); + $response->write('How about implementing findPetsByTags as a GET method ?'); + return $response; }); - -$app->GET('/pet/{petId}', function(Application $app, Request $request, $pet_id) { +/** + * GET Pet + * Find pet by ID + */ +$app->GET('/pet/{petId}', function($request, $response, $args) { - return new Response('How about implementing getPetById as a GET method ?'); + $response->write('How about implementing getPetById as a GET method ?'); + return $response; }); - -$app->POST('/pet/{petId}', function(Application $app, Request $request, $pet_id) { +/** + * POST Pet + * Updates a pet in the store with form data + */ +$app->POST('/pet/{petId}', function($request, $response, $args) { - $name = $request->get('name'); $status = $request->get('status'); - return new Response('How about implementing updatePetWithForm as a POST method ?'); + $name = $args['name']; $status = $args['status']; + $response->write('How about implementing updatePetWithForm as a POST method ?'); + return $response; }); - -$app->DELETE('/pet/{petId}', function(Application $app, Request $request, $pet_id) { +/** + * DELETE Pet + * Deletes a pet + */ +$app->DELETE('/pet/{petId}', function($request, $response, $args) { - return new Response('How about implementing deletePet as a DELETE method ?'); + $response->write('How about implementing deletePet as a DELETE method ?'); + return $response; }); - -$app->POST('/pet/{petId}/uploadImage', function(Application $app, Request $request, $pet_id) { +/** + * POST Pet + * uploads an image + */ +$app->POST('/pet/{petId}/uploadImage', function($request, $response, $args) { - $additional_metadata = $request->get('additional_metadata'); $file = $request->get('file'); - return new Response('How about implementing uploadFile as a POST method ?'); + $additional_metadata = $args['additional_metadata']; $file = $args['file']; + $response->write('How about implementing uploadFile as a POST method ?'); + return $response; }); - - - $app->run(); From 70efc066b5505d95b2d2f5cabccc949e26d0de75 Mon Sep 17 00:00:00 2001 From: jfastnacht Date: Mon, 23 Nov 2015 16:43:13 +0100 Subject: [PATCH 029/211] Added notes, output formats, header params and body params --- .../src/main/resources/slim/index.mustache | 12 +- .../petstore/slim/SwaggerServer/index.php | 170 +++++++++++++----- 2 files changed, 133 insertions(+), 49 deletions(-) diff --git a/modules/swagger-codegen/src/main/resources/slim/index.mustache b/modules/swagger-codegen/src/main/resources/slim/index.mustache index 2f4a630909f..4e17aa6e523 100644 --- a/modules/swagger-codegen/src/main/resources/slim/index.mustache +++ b/modules/swagger-codegen/src/main/resources/slim/index.mustache @@ -10,13 +10,17 @@ $app = new Slim\App(); {{#apis}}{{#operations}}{{#operation}} /** - * {{httpMethod}} {{baseName}} - * {{summary}} + * {{httpMethod}} {{nickname}} + * Summary: {{summary}} + * Notes: {{notes}} +{{#hasProduces}} * Output-Formats: [{{#produces}}{{mediaType}}{{#hasMore}}, {{/hasMore}}{{/produces}}]{{/hasProduces}} */ $app->{{httpMethod}}('{{path}}', function($request, $response, $args) { + {{#hasHeaderParams}}$headers = $request->getHeaders();{{/hasHeaderParams}} {{#hasQueryParams}}$queryParams = $request->getQueryParams(); - {{#queryParams}}${{paramName}} = $queryParams['{{paramName}}'];{{newline}} {{/queryParams}}{{/hasQueryParams}} - {{#hasFormParams}}{{#formParams}}${{paramName}} = $args['{{paramName}}'];{{newline}} {{/formParams}}{{/hasFormParams}} + {{#queryParams}}$qp_{{paramName}} = $queryParams['{{paramName}}'];{{newline}} {{/queryParams}}{{/hasQueryParams}} + {{#hasFormParams}}{{#formParams}}$fp_{{paramName}} = $args['{{paramName}}'];{{newline}} {{/formParams}}{{/hasFormParams}} + {{#hasBodyParam}}$body = $request->getParsedBody();{{/hasBodyParam}} $response->write('How about implementing {{nickname}} as a {{httpMethod}} method ?'); return $response; }); diff --git a/samples/server/petstore/slim/SwaggerServer/index.php b/samples/server/petstore/slim/SwaggerServer/index.php index 49bd15930e2..f92530d90c1 100644 --- a/samples/server/petstore/slim/SwaggerServer/index.php +++ b/samples/server/petstore/slim/SwaggerServer/index.php @@ -10,48 +10,64 @@ $app = new Slim\App(); /** - * POST User - * Create user + * POST createUser + * Summary: Create user + * Notes: This can only be done by the logged in user. + * Output-Formats: [application/xml, application/json] */ $app->POST('/user', function($request, $response, $args) { + + $body = $request->getParsedBody(); $response->write('How about implementing createUser as a POST method ?'); return $response; }); /** - * POST User - * Creates list of users with given input array + * POST createUsersWithArrayInput + * Summary: Creates list of users with given input array + * Notes: + * Output-Formats: [application/xml, application/json] */ $app->POST('/user/createWithArray', function($request, $response, $args) { + + $body = $request->getParsedBody(); $response->write('How about implementing createUsersWithArrayInput as a POST method ?'); return $response; }); /** - * POST User - * Creates list of users with given input array + * POST createUsersWithListInput + * Summary: Creates list of users with given input array + * Notes: + * Output-Formats: [application/xml, application/json] */ $app->POST('/user/createWithList', function($request, $response, $args) { + + $body = $request->getParsedBody(); $response->write('How about implementing createUsersWithListInput as a POST method ?'); return $response; }); /** - * GET User - * Logs user into the system + * GET loginUser + * Summary: Logs user into the system + * Notes: + * Output-Formats: [application/xml, application/json] */ $app->GET('/user/login', function($request, $response, $args) { + $queryParams = $request->getQueryParams(); - $username = $queryParams['username']; $password = $queryParams['password']; + $qp_username = $queryParams['username']; $qp_password = $queryParams['password']; + $response->write('How about implementing loginUser as a GET method ?'); return $response; @@ -59,132 +75,176 @@ $app->GET('/user/login', function($request, $response, $args) { /** - * GET User - * Logs out current logged in user session + * GET logoutUser + * Summary: Logs out current logged in user session + * Notes: + * Output-Formats: [application/xml, application/json] */ $app->GET('/user/logout', function($request, $response, $args) { + + $response->write('How about implementing logoutUser as a GET method ?'); return $response; }); /** - * GET User - * Get user by user name + * GET getUserByName + * Summary: Get user by user name + * Notes: + * Output-Formats: [application/xml, application/json] */ $app->GET('/user/{username}', function($request, $response, $args) { + + $response->write('How about implementing getUserByName as a GET method ?'); return $response; }); /** - * PUT User - * Updated user + * PUT updateUser + * Summary: Updated user + * Notes: This can only be done by the logged in user. + * Output-Formats: [application/xml, application/json] */ $app->PUT('/user/{username}', function($request, $response, $args) { + + $body = $request->getParsedBody(); $response->write('How about implementing updateUser as a PUT method ?'); return $response; }); /** - * DELETE User - * Delete user + * DELETE deleteUser + * Summary: Delete user + * Notes: This can only be done by the logged in user. + * Output-Formats: [application/xml, application/json] */ $app->DELETE('/user/{username}', function($request, $response, $args) { + + $response->write('How about implementing deleteUser as a DELETE method ?'); return $response; }); /** - * GET Store - * Returns pet inventories by status + * GET getInventory + * Summary: Returns pet inventories by status + * Notes: Returns a map of status codes to quantities + * Output-Formats: [application/json] */ $app->GET('/store/inventory', function($request, $response, $args) { + + $response->write('How about implementing getInventory as a GET method ?'); return $response; }); /** - * POST Store - * Place an order for a pet + * POST placeOrder + * Summary: Place an order for a pet + * Notes: + * Output-Formats: [application/xml, application/json] */ $app->POST('/store/order', function($request, $response, $args) { + + $body = $request->getParsedBody(); $response->write('How about implementing placeOrder as a POST method ?'); return $response; }); /** - * GET Store - * Find purchase order by ID + * GET getOrderById + * Summary: Find purchase order by ID + * Notes: For valid response try integer IDs with value <= 5 or > 10. Other values will generated exceptions + * Output-Formats: [application/xml, application/json] */ $app->GET('/store/order/{orderId}', function($request, $response, $args) { + + $response->write('How about implementing getOrderById as a GET method ?'); return $response; }); /** - * DELETE Store - * Delete purchase order by ID + * DELETE deleteOrder + * Summary: Delete purchase order by ID + * Notes: For valid response try integer IDs with value < 1000. Anything above 1000 or nonintegers will generate API errors + * Output-Formats: [application/xml, application/json] */ $app->DELETE('/store/order/{orderId}', function($request, $response, $args) { + + $response->write('How about implementing deleteOrder as a DELETE method ?'); return $response; }); /** - * PUT Pet - * Update an existing pet + * PUT updatePet + * Summary: Update an existing pet + * Notes: + * Output-Formats: [application/xml, application/json] */ $app->PUT('/pet', function($request, $response, $args) { + + $body = $request->getParsedBody(); $response->write('How about implementing updatePet as a PUT method ?'); return $response; }); /** - * POST Pet - * Add a new pet to the store + * POST addPet + * Summary: Add a new pet to the store + * Notes: + * Output-Formats: [application/xml, application/json] */ $app->POST('/pet', function($request, $response, $args) { + + $body = $request->getParsedBody(); $response->write('How about implementing addPet as a POST method ?'); return $response; }); /** - * GET Pet - * Finds Pets by status + * GET findPetsByStatus + * Summary: Finds Pets by status + * Notes: Multiple status values can be provided with comma seperated strings + * Output-Formats: [application/xml, application/json] */ $app->GET('/pet/findByStatus', function($request, $response, $args) { + $queryParams = $request->getQueryParams(); - $status = $queryParams['status']; + $qp_status = $queryParams['status']; + $response->write('How about implementing findPetsByStatus as a GET method ?'); return $response; @@ -192,12 +252,16 @@ $app->GET('/pet/findByStatus', function($request, $response, $args) { /** - * GET Pet - * Finds Pets by tags + * GET findPetsByTags + * Summary: Finds Pets by tags + * Notes: Muliple tags can be provided with comma seperated strings. Use tag1, tag2, tag3 for testing. + * Output-Formats: [application/xml, application/json] */ $app->GET('/pet/findByTags', function($request, $response, $args) { + $queryParams = $request->getQueryParams(); - $tags = $queryParams['tags']; + $qp_tags = $queryParams['tags']; + $response->write('How about implementing findPetsByTags as a GET method ?'); return $response; @@ -205,34 +269,46 @@ $app->GET('/pet/findByTags', function($request, $response, $args) { /** - * GET Pet - * Find pet by ID + * GET getPetById + * Summary: Find pet by ID + * Notes: Returns a single pet + * Output-Formats: [application/xml, application/json] */ $app->GET('/pet/{petId}', function($request, $response, $args) { + + $response->write('How about implementing getPetById as a GET method ?'); return $response; }); /** - * POST Pet - * Updates a pet in the store with form data + * POST updatePetWithForm + * Summary: Updates a pet in the store with form data + * Notes: + * Output-Formats: [application/xml, application/json] */ $app->POST('/pet/{petId}', function($request, $response, $args) { - $name = $args['name']; $status = $args['status']; + + $fp_name = $args['name']; $fp_status = $args['status']; + $response->write('How about implementing updatePetWithForm as a POST method ?'); return $response; }); /** - * DELETE Pet - * Deletes a pet + * DELETE deletePet + * Summary: Deletes a pet + * Notes: + * Output-Formats: [application/xml, application/json] */ $app->DELETE('/pet/{petId}', function($request, $response, $args) { + $headers = $request->getHeaders(); + $response->write('How about implementing deletePet as a DELETE method ?'); @@ -241,12 +317,16 @@ $app->DELETE('/pet/{petId}', function($request, $response, $args) { /** - * POST Pet - * uploads an image + * POST uploadFile + * Summary: uploads an image + * Notes: + * Output-Formats: [application/json] */ $app->POST('/pet/{petId}/uploadImage', function($request, $response, $args) { - $additional_metadata = $args['additional_metadata']; $file = $args['file']; + + $fp_additional_metadata = $args['additional_metadata']; $fp_file = $args['file']; + $response->write('How about implementing uploadFile as a POST method ?'); return $response; }); From d38933f927e8914f60d2f791a4a58a2ec1fe3314 Mon Sep 17 00:00:00 2001 From: jfastnacht Date: Mon, 23 Nov 2015 17:49:19 +0100 Subject: [PATCH 030/211] Added model.mustache for basic class definitions. Added sample class files. --- .../languages/SlimFrameworkServerCodegen.java | 10 +++---- .../src/main/resources/slim/model.mustache | 15 ++++++++++ .../SwaggerServer/lib/models/ApiResponse.php | 18 ++++++++++++ .../SwaggerServer/lib/models/Category.php | 16 +++++++++++ .../slim/SwaggerServer/lib/models/Order.php | 24 ++++++++++++++++ .../slim/SwaggerServer/lib/models/Pet.php | 24 ++++++++++++++++ .../slim/SwaggerServer/lib/models/Tag.php | 16 +++++++++++ .../slim/SwaggerServer/lib/models/User.php | 28 +++++++++++++++++++ 8 files changed, 146 insertions(+), 5 deletions(-) create mode 100644 modules/swagger-codegen/src/main/resources/slim/model.mustache create mode 100644 samples/server/petstore/slim/SwaggerServer/lib/models/ApiResponse.php create mode 100644 samples/server/petstore/slim/SwaggerServer/lib/models/Category.php create mode 100644 samples/server/petstore/slim/SwaggerServer/lib/models/Order.php create mode 100644 samples/server/petstore/slim/SwaggerServer/lib/models/Pet.php create mode 100644 samples/server/petstore/slim/SwaggerServer/lib/models/Tag.php create mode 100644 samples/server/petstore/slim/SwaggerServer/lib/models/User.php diff --git a/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/SlimFrameworkServerCodegen.java b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/SlimFrameworkServerCodegen.java index 1b8680cab6e..847f1a5fdcd 100644 --- a/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/SlimFrameworkServerCodegen.java +++ b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/SlimFrameworkServerCodegen.java @@ -27,12 +27,12 @@ public class SlimFrameworkServerCodegen extends DefaultCodegen implements Codege String packagePath = "SwaggerServer"; - modelPackage = packagePath + "/lib/models"; - apiPackage = packagePath + "/lib"; - outputFolder = "generated-code/slim"; + modelPackage = packagePath + "\\lib\\Models"; + apiPackage = packagePath + "\\lib"; + outputFolder = "generated-code" + File.separator + "slim"; + modelTemplateFiles.put("model.mustache", ".php"); - // no model, api files - modelTemplateFiles.clear(); + // no api files apiTemplateFiles.clear(); embeddedTemplateDir = templateDir = "slim"; diff --git a/modules/swagger-codegen/src/main/resources/slim/model.mustache b/modules/swagger-codegen/src/main/resources/slim/model.mustache new file mode 100644 index 00000000000..48f586793ee --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/slim/model.mustache @@ -0,0 +1,15 @@ + Date: Mon, 23 Nov 2015 14:27:22 -1000 Subject: [PATCH 031/211] updated readme, base path --- .../codegen/languages/JaxRSServerCodegen.java | 15 +++------------ .../src/main/resources/JavaJaxRS/README.mustache | 9 +++++++++ 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/JaxRSServerCodegen.java b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/JaxRSServerCodegen.java index 375f5d72bff..6bc1a392414 100644 --- a/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/JaxRSServerCodegen.java +++ b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/JaxRSServerCodegen.java @@ -33,18 +33,6 @@ public class JaxRSServerCodegen extends JavaClientCodegen implements CodegenConf additionalProperties.put(CodegenConstants.ARTIFACT_ID, artifactId); additionalProperties.put(CodegenConstants.ARTIFACT_VERSION, artifactVersion); additionalProperties.put("title", title); - - - languageSpecificPrimitives = new HashSet( - Arrays.asList( - "String", - "boolean", - "Boolean", - "Double", - "Integer", - "Long", - "Float") - ); } public CodegenType getTag() { @@ -109,6 +97,9 @@ public class JaxRSServerCodegen extends JavaClientCodegen implements CodegenConf @Override public void preprocessSwagger(Swagger swagger) { + if("/".equals(swagger.getBasePath())) { + swagger.setBasePath(""); + } if(swagger != null && swagger.getPaths() != null) { for(String pathname : swagger.getPaths().keySet()) { Path path = swagger.getPath(pathname); diff --git a/modules/swagger-codegen/src/main/resources/JavaJaxRS/README.mustache b/modules/swagger-codegen/src/main/resources/JavaJaxRS/README.mustache index 00431f63dbc..f240464851d 100644 --- a/modules/swagger-codegen/src/main/resources/JavaJaxRS/README.mustache +++ b/modules/swagger-codegen/src/main/resources/JavaJaxRS/README.mustache @@ -12,3 +12,12 @@ To run the server, please execute the following: ``` mvn clean package jetty:run ``` + +You can then view the swagger listing here: + +``` +http://localhost:8080{{contextPath}}/swagger.json +``` + +Note that if you have configured the `host` to be something other than localhost, the calls through +swagger-ui will be directed to that host and not localhost! \ No newline at end of file From 76fe8357ce69cbb9786ed6d1ec9788f940a3a175 Mon Sep 17 00:00:00 2001 From: xhh Date: Tue, 24 Nov 2015 15:41:43 +0800 Subject: [PATCH 032/211] Add "equals" and "hashCode" methods to Java servers for "jaxrs" and "spring-mvc" --- .../main/resources/JavaJaxRS/model.mustache | 21 ++++++++++++++ .../resources/JavaSpringMVC/model.mustache | 21 ++++++++++++++ .../gen/java/io/swagger/model/Category.java | 22 ++++++++++++++- .../src/gen/java/io/swagger/model/Order.java | 26 ++++++++++++++++- .../src/gen/java/io/swagger/model/Pet.java | 28 +++++++++++++++++-- .../src/gen/java/io/swagger/model/Tag.java | 22 ++++++++++++++- .../src/gen/java/io/swagger/model/User.java | 28 ++++++++++++++++++- .../main/java/io/swagger/model/Category.java | 22 ++++++++++++++- .../src/main/java/io/swagger/model/Order.java | 26 ++++++++++++++++- .../src/main/java/io/swagger/model/Pet.java | 28 +++++++++++++++++-- .../src/main/java/io/swagger/model/Tag.java | 22 ++++++++++++++- .../src/main/java/io/swagger/model/User.java | 28 ++++++++++++++++++- 12 files changed, 282 insertions(+), 12 deletions(-) diff --git a/modules/swagger-codegen/src/main/resources/JavaJaxRS/model.mustache b/modules/swagger-codegen/src/main/resources/JavaJaxRS/model.mustache index 72a371280b3..63bba4a8dfb 100644 --- a/modules/swagger-codegen/src/main/resources/JavaJaxRS/model.mustache +++ b/modules/swagger-codegen/src/main/resources/JavaJaxRS/model.mustache @@ -5,6 +5,8 @@ package {{package}}; import io.swagger.annotations.*; import com.fasterxml.jackson.annotation.JsonProperty; + +import java.util.Objects; {{#models}} {{#model}}{{#unescapedDescription}} @@ -38,6 +40,25 @@ public class {{classname}} {{#parent}}extends {{{parent}}}{{/parent}} { {{/vars}} + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + {{classname}} {{classVarName}} = ({{classname}}) o;{{#hasVars}} + return {{#vars}}Objects.equals({{name}}, {{classVarName}}.{{name}}){{#hasMore}} && + {{/hasMore}}{{^hasMore}};{{/hasMore}}{{/vars}}{{/hasVars}}{{^hasVars}} + return true;{{/hasVars}} + } + + @Override + public int hashCode() { + return Objects.hash({{#vars}}{{name}}{{#hasMore}}, {{/hasMore}}{{/vars}}); + } + @Override public String toString() { StringBuilder sb = new StringBuilder(); diff --git a/modules/swagger-codegen/src/main/resources/JavaSpringMVC/model.mustache b/modules/swagger-codegen/src/main/resources/JavaSpringMVC/model.mustache index 39f0f0b6fa1..d1a5e396e13 100644 --- a/modules/swagger-codegen/src/main/resources/JavaSpringMVC/model.mustache +++ b/modules/swagger-codegen/src/main/resources/JavaSpringMVC/model.mustache @@ -5,6 +5,8 @@ package {{package}}; import io.swagger.annotations.*; import com.fasterxml.jackson.annotation.JsonProperty; + +import java.util.Objects; {{#models}} {{#model}}{{#description}} @@ -38,6 +40,25 @@ public class {{classname}} {{#parent}}extends {{{parent}}}{{/parent}} { {{/vars}} + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + {{classname}} {{classVarName}} = ({{classname}}) o;{{#hasVars}} + return {{#vars}}Objects.equals({{name}}, {{classVarName}}.{{name}}){{#hasMore}} && + {{/hasMore}}{{^hasMore}};{{/hasMore}}{{/vars}}{{/hasVars}}{{^hasVars}} + return true;{{/hasVars}} + } + + @Override + public int hashCode() { + return Objects.hash({{#vars}}{{name}}{{#hasMore}}, {{/hasMore}}{{/vars}}); + } + @Override public String toString() { StringBuilder sb = new StringBuilder(); diff --git a/samples/server/petstore/jaxrs/src/gen/java/io/swagger/model/Category.java b/samples/server/petstore/jaxrs/src/gen/java/io/swagger/model/Category.java index 0acf355555c..5db3559b5b6 100644 --- a/samples/server/petstore/jaxrs/src/gen/java/io/swagger/model/Category.java +++ b/samples/server/petstore/jaxrs/src/gen/java/io/swagger/model/Category.java @@ -4,9 +4,11 @@ package io.swagger.model; import io.swagger.annotations.*; import com.fasterxml.jackson.annotation.JsonProperty; +import java.util.Objects; + @ApiModel(description = "") -@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JaxRSServerCodegen", date = "2015-11-05T22:31:25.130-08:00") +@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JaxRSServerCodegen", date = "2015-11-24T12:32:47.191+08:00") public class Category { private Long id = null; @@ -38,6 +40,24 @@ public class Category { + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + Category category = (Category) o; + return Objects.equals(id, category.id) && + Objects.equals(name, category.name); + } + + @Override + public int hashCode() { + return Objects.hash(id, name); + } + @Override public String toString() { StringBuilder sb = new StringBuilder(); diff --git a/samples/server/petstore/jaxrs/src/gen/java/io/swagger/model/Order.java b/samples/server/petstore/jaxrs/src/gen/java/io/swagger/model/Order.java index 07b422a67f5..6c70f9086a0 100644 --- a/samples/server/petstore/jaxrs/src/gen/java/io/swagger/model/Order.java +++ b/samples/server/petstore/jaxrs/src/gen/java/io/swagger/model/Order.java @@ -5,9 +5,11 @@ import java.util.Date; import io.swagger.annotations.*; import com.fasterxml.jackson.annotation.JsonProperty; +import java.util.Objects; + @ApiModel(description = "") -@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JaxRSServerCodegen", date = "2015-11-05T22:31:25.130-08:00") +@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JaxRSServerCodegen", date = "2015-11-24T12:32:47.191+08:00") public class Order { private Long id = null; @@ -95,6 +97,28 @@ public class Order { + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + Order order = (Order) o; + return Objects.equals(id, order.id) && + Objects.equals(petId, order.petId) && + Objects.equals(quantity, order.quantity) && + Objects.equals(shipDate, order.shipDate) && + Objects.equals(status, order.status) && + Objects.equals(complete, order.complete); + } + + @Override + public int hashCode() { + return Objects.hash(id, petId, quantity, shipDate, status, complete); + } + @Override public String toString() { StringBuilder sb = new StringBuilder(); diff --git a/samples/server/petstore/jaxrs/src/gen/java/io/swagger/model/Pet.java b/samples/server/petstore/jaxrs/src/gen/java/io/swagger/model/Pet.java index af735dcc3b2..316831faf47 100644 --- a/samples/server/petstore/jaxrs/src/gen/java/io/swagger/model/Pet.java +++ b/samples/server/petstore/jaxrs/src/gen/java/io/swagger/model/Pet.java @@ -1,15 +1,17 @@ package io.swagger.model; import io.swagger.model.Category; -import io.swagger.model.Tag; import java.util.*; +import io.swagger.model.Tag; import io.swagger.annotations.*; import com.fasterxml.jackson.annotation.JsonProperty; +import java.util.Objects; + @ApiModel(description = "") -@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JaxRSServerCodegen", date = "2015-11-05T22:31:25.130-08:00") +@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JaxRSServerCodegen", date = "2015-11-24T12:32:47.191+08:00") public class Pet { private Long id = null; @@ -97,6 +99,28 @@ public class Pet { + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + Pet pet = (Pet) o; + return Objects.equals(id, pet.id) && + Objects.equals(category, pet.category) && + Objects.equals(name, pet.name) && + Objects.equals(photoUrls, pet.photoUrls) && + Objects.equals(tags, pet.tags) && + Objects.equals(status, pet.status); + } + + @Override + public int hashCode() { + return Objects.hash(id, category, name, photoUrls, tags, status); + } + @Override public String toString() { StringBuilder sb = new StringBuilder(); diff --git a/samples/server/petstore/jaxrs/src/gen/java/io/swagger/model/Tag.java b/samples/server/petstore/jaxrs/src/gen/java/io/swagger/model/Tag.java index 1102fa408bf..de35da0d91c 100644 --- a/samples/server/petstore/jaxrs/src/gen/java/io/swagger/model/Tag.java +++ b/samples/server/petstore/jaxrs/src/gen/java/io/swagger/model/Tag.java @@ -4,9 +4,11 @@ package io.swagger.model; import io.swagger.annotations.*; import com.fasterxml.jackson.annotation.JsonProperty; +import java.util.Objects; + @ApiModel(description = "") -@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JaxRSServerCodegen", date = "2015-11-05T22:31:25.130-08:00") +@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JaxRSServerCodegen", date = "2015-11-24T12:32:47.191+08:00") public class Tag { private Long id = null; @@ -38,6 +40,24 @@ public class Tag { + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + Tag tag = (Tag) o; + return Objects.equals(id, tag.id) && + Objects.equals(name, tag.name); + } + + @Override + public int hashCode() { + return Objects.hash(id, name); + } + @Override public String toString() { StringBuilder sb = new StringBuilder(); diff --git a/samples/server/petstore/jaxrs/src/gen/java/io/swagger/model/User.java b/samples/server/petstore/jaxrs/src/gen/java/io/swagger/model/User.java index d170b2c7df0..b30037a0d55 100644 --- a/samples/server/petstore/jaxrs/src/gen/java/io/swagger/model/User.java +++ b/samples/server/petstore/jaxrs/src/gen/java/io/swagger/model/User.java @@ -4,9 +4,11 @@ package io.swagger.model; import io.swagger.annotations.*; import com.fasterxml.jackson.annotation.JsonProperty; +import java.util.Objects; + @ApiModel(description = "") -@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JaxRSServerCodegen", date = "2015-11-05T22:31:25.130-08:00") +@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JaxRSServerCodegen", date = "2015-11-24T12:32:47.191+08:00") public class User { private Long id = null; @@ -117,6 +119,30 @@ public class User { + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + User user = (User) o; + return Objects.equals(id, user.id) && + Objects.equals(username, user.username) && + Objects.equals(firstName, user.firstName) && + Objects.equals(lastName, user.lastName) && + Objects.equals(email, user.email) && + Objects.equals(password, user.password) && + Objects.equals(phone, user.phone) && + Objects.equals(userStatus, user.userStatus); + } + + @Override + public int hashCode() { + return Objects.hash(id, username, firstName, lastName, email, password, phone, userStatus); + } + @Override public String toString() { StringBuilder sb = new StringBuilder(); diff --git a/samples/server/petstore/spring-mvc/src/main/java/io/swagger/model/Category.java b/samples/server/petstore/spring-mvc/src/main/java/io/swagger/model/Category.java index 132aa0a9b8c..59f0b8723d4 100644 --- a/samples/server/petstore/spring-mvc/src/main/java/io/swagger/model/Category.java +++ b/samples/server/petstore/spring-mvc/src/main/java/io/swagger/model/Category.java @@ -4,9 +4,11 @@ package io.swagger.model; import io.swagger.annotations.*; import com.fasterxml.jackson.annotation.JsonProperty; +import java.util.Objects; + @ApiModel(description = "") -@javax.annotation.Generated(value = "class io.swagger.codegen.languages.SpringMVCServerCodegen", date = "2015-10-20T10:58:42.063-07:00") +@javax.annotation.Generated(value = "class io.swagger.codegen.languages.SpringMVCServerCodegen", date = "2015-11-24T12:32:52.703+08:00") public class Category { private Long id = null; @@ -38,6 +40,24 @@ public class Category { + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + Category category = (Category) o; + return Objects.equals(id, category.id) && + Objects.equals(name, category.name); + } + + @Override + public int hashCode() { + return Objects.hash(id, name); + } + @Override public String toString() { StringBuilder sb = new StringBuilder(); diff --git a/samples/server/petstore/spring-mvc/src/main/java/io/swagger/model/Order.java b/samples/server/petstore/spring-mvc/src/main/java/io/swagger/model/Order.java index 4a1470a9a9a..e4619d58f12 100644 --- a/samples/server/petstore/spring-mvc/src/main/java/io/swagger/model/Order.java +++ b/samples/server/petstore/spring-mvc/src/main/java/io/swagger/model/Order.java @@ -5,9 +5,11 @@ import java.util.Date; import io.swagger.annotations.*; import com.fasterxml.jackson.annotation.JsonProperty; +import java.util.Objects; + @ApiModel(description = "") -@javax.annotation.Generated(value = "class io.swagger.codegen.languages.SpringMVCServerCodegen", date = "2015-10-20T10:58:42.063-07:00") +@javax.annotation.Generated(value = "class io.swagger.codegen.languages.SpringMVCServerCodegen", date = "2015-11-24T12:32:52.703+08:00") public class Order { private Long id = null; @@ -95,6 +97,28 @@ public class Order { + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + Order order = (Order) o; + return Objects.equals(id, order.id) && + Objects.equals(petId, order.petId) && + Objects.equals(quantity, order.quantity) && + Objects.equals(shipDate, order.shipDate) && + Objects.equals(status, order.status) && + Objects.equals(complete, order.complete); + } + + @Override + public int hashCode() { + return Objects.hash(id, petId, quantity, shipDate, status, complete); + } + @Override public String toString() { StringBuilder sb = new StringBuilder(); diff --git a/samples/server/petstore/spring-mvc/src/main/java/io/swagger/model/Pet.java b/samples/server/petstore/spring-mvc/src/main/java/io/swagger/model/Pet.java index 16d100faab4..081df138164 100644 --- a/samples/server/petstore/spring-mvc/src/main/java/io/swagger/model/Pet.java +++ b/samples/server/petstore/spring-mvc/src/main/java/io/swagger/model/Pet.java @@ -1,15 +1,17 @@ package io.swagger.model; import io.swagger.model.Category; -import io.swagger.model.Tag; import java.util.*; +import io.swagger.model.Tag; import io.swagger.annotations.*; import com.fasterxml.jackson.annotation.JsonProperty; +import java.util.Objects; + @ApiModel(description = "") -@javax.annotation.Generated(value = "class io.swagger.codegen.languages.SpringMVCServerCodegen", date = "2015-10-20T10:58:42.063-07:00") +@javax.annotation.Generated(value = "class io.swagger.codegen.languages.SpringMVCServerCodegen", date = "2015-11-24T12:32:52.703+08:00") public class Pet { private Long id = null; @@ -97,6 +99,28 @@ public class Pet { + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + Pet pet = (Pet) o; + return Objects.equals(id, pet.id) && + Objects.equals(category, pet.category) && + Objects.equals(name, pet.name) && + Objects.equals(photoUrls, pet.photoUrls) && + Objects.equals(tags, pet.tags) && + Objects.equals(status, pet.status); + } + + @Override + public int hashCode() { + return Objects.hash(id, category, name, photoUrls, tags, status); + } + @Override public String toString() { StringBuilder sb = new StringBuilder(); diff --git a/samples/server/petstore/spring-mvc/src/main/java/io/swagger/model/Tag.java b/samples/server/petstore/spring-mvc/src/main/java/io/swagger/model/Tag.java index d41ca620da4..681fe6da37a 100644 --- a/samples/server/petstore/spring-mvc/src/main/java/io/swagger/model/Tag.java +++ b/samples/server/petstore/spring-mvc/src/main/java/io/swagger/model/Tag.java @@ -4,9 +4,11 @@ package io.swagger.model; import io.swagger.annotations.*; import com.fasterxml.jackson.annotation.JsonProperty; +import java.util.Objects; + @ApiModel(description = "") -@javax.annotation.Generated(value = "class io.swagger.codegen.languages.SpringMVCServerCodegen", date = "2015-10-20T10:58:42.063-07:00") +@javax.annotation.Generated(value = "class io.swagger.codegen.languages.SpringMVCServerCodegen", date = "2015-11-24T12:32:52.703+08:00") public class Tag { private Long id = null; @@ -38,6 +40,24 @@ public class Tag { + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + Tag tag = (Tag) o; + return Objects.equals(id, tag.id) && + Objects.equals(name, tag.name); + } + + @Override + public int hashCode() { + return Objects.hash(id, name); + } + @Override public String toString() { StringBuilder sb = new StringBuilder(); diff --git a/samples/server/petstore/spring-mvc/src/main/java/io/swagger/model/User.java b/samples/server/petstore/spring-mvc/src/main/java/io/swagger/model/User.java index f805888214d..46047ce6855 100644 --- a/samples/server/petstore/spring-mvc/src/main/java/io/swagger/model/User.java +++ b/samples/server/petstore/spring-mvc/src/main/java/io/swagger/model/User.java @@ -4,9 +4,11 @@ package io.swagger.model; import io.swagger.annotations.*; import com.fasterxml.jackson.annotation.JsonProperty; +import java.util.Objects; + @ApiModel(description = "") -@javax.annotation.Generated(value = "class io.swagger.codegen.languages.SpringMVCServerCodegen", date = "2015-10-20T10:58:42.063-07:00") +@javax.annotation.Generated(value = "class io.swagger.codegen.languages.SpringMVCServerCodegen", date = "2015-11-24T12:32:52.703+08:00") public class User { private Long id = null; @@ -117,6 +119,30 @@ public class User { + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + User user = (User) o; + return Objects.equals(id, user.id) && + Objects.equals(username, user.username) && + Objects.equals(firstName, user.firstName) && + Objects.equals(lastName, user.lastName) && + Objects.equals(email, user.email) && + Objects.equals(password, user.password) && + Objects.equals(phone, user.phone) && + Objects.equals(userStatus, user.userStatus); + } + + @Override + public int hashCode() { + return Objects.hash(id, username, firstName, lastName, email, password, phone, userStatus); + } + @Override public String toString() { StringBuilder sb = new StringBuilder(); From b592819e3bbe4e121faeb35922f64dcec50a495b Mon Sep 17 00:00:00 2001 From: wing328 Date: Tue, 24 Nov 2015 17:36:38 +0800 Subject: [PATCH 033/211] add eq for python, update test case --- .../src/main/resources/python/model.mustache | 13 +++++++ samples/client/petstore/python/.coverage | 2 +- .../petstore/python/dev-requirements.txt.log | 35 +++++++++++++++++++ .../python/swagger_client/models/category.py | 13 +++++++ .../python/swagger_client/models/order.py | 13 +++++++ .../python/swagger_client/models/pet.py | 13 +++++++ .../python/swagger_client/models/tag.py | 13 +++++++ .../python/swagger_client/models/user.py | 13 +++++++ .../petstore/python/tests/test_pet_model.py | 33 +++++++++++++++++ 9 files changed, 147 insertions(+), 1 deletion(-) diff --git a/modules/swagger-codegen/src/main/resources/python/model.mustache b/modules/swagger-codegen/src/main/resources/python/model.mustache index 81e0b05849a..0dbe29add4f 100644 --- a/modules/swagger-codegen/src/main/resources/python/model.mustache +++ b/modules/swagger-codegen/src/main/resources/python/model.mustache @@ -113,5 +113,18 @@ class {{classname}}(object): For `print` and `pprint` """ return self.to_str() + + def __eq__(self, other): + """ + Returns true if both objects are equal + """ + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """ + Returns true if both objects are not equal + """ + return not self == other + {{/model}} {{/models}} diff --git a/samples/client/petstore/python/.coverage b/samples/client/petstore/python/.coverage index ddd00f77a03..98dd5627b87 100644 --- a/samples/client/petstore/python/.coverage +++ b/samples/client/petstore/python/.coverage @@ -1 +1 @@ -!coverage.py: This is a private format, don't read it directly!{"lines": {"/Users/williamcheng/Code/wing328/swagger-codegen/samples/client/petstore/python/swagger_client/apis/pet_api.py": [512, 513, 514, 516, 86, 18, 20, 22, 23, 26, 539, 28, 29, 542, 543, 32, 548, 37, 39, 40, 41, 42, 555, 556, 45, 558, 559, 560, 562, 564, 565, 566, 568, 569, 571, 574, 575, 576, 580, 581, 70, 584, 73, 586, 587, 588, 589, 590, 591, 592, 593, 594, 595, 596, 598, 88, 90, 92, 93, 95, 96, 97, 100, 101, 102, 106, 107, 621, 622, 624, 625, 626, 79, 116, 117, 118, 631, 632, 121, 122, 635, 124, 638, 639, 641, 642, 643, 645, 647, 649, 650, 651, 652, 653, 654, 656, 145, 146, 659, 148, 661, 150, 665, 666, 155, 156, 538, 159, 160, 673, 162, 675, 164, 677, 166, 679, 168, 169, 171, 172, 173, 541, 176, 177, 178, 115, 182, 183, 186, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 552, 200, 119, 120, 377, 221, 222, 549, 224, 225, 226, 231, 232, 431, 235, 236, 110, 238, 240, 241, 242, 244, 246, 247, 249, 383, 252, 253, 254, 258, 259, 262, 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 276, 46, 48, 297, 298, 300, 301, 302, 44, 307, 308, 311, 312, 314, 316, 317, 318, 320, 322, 323, 325, 113, 328, 329, 330, 334, 335, 338, 340, 341, 342, 343, 344, 345, 346, 347, 348, 349, 350, 485, 352, 84, 114, 373, 374, 376, 660, 378, 149, 384, 387, 390, 391, 393, 394, 395, 397, 399, 401, 402, 404, 407, 408, 409, 413, 414, 69, 417, 419, 420, 421, 422, 423, 424, 425, 426, 427, 428, 429, 669, 72, 671, 74, 672, 83, 454, 455, 457, 458, 459, 674, 112, 464, 465, 468, 471, 472, 676, 474, 475, 476, 478, 480, 80, 482, 483, 484, 678, 486, 487, 489, 492, 493, 494, 680, 498, 499, 502, 681, 504, 505, 506, 507, 508, 509, 510, 511], "/Users/williamcheng/Code/wing328/swagger-codegen/samples/client/petstore/python/swagger_client/apis/user_api.py": [32, 355, 37, 39, 200, 124, 428, 589, 48, 18, 20, 22, 23, 276, 26, 507, 28, 29], "/Users/williamcheng/Code/wing328/swagger-codegen/samples/client/petstore/python/swagger_client/api_client.py": [518, 525, 526, 527, 19, 21, 22, 23, 24, 537, 26, 27, 28, 29, 30, 31, 32, 33, 34, 547, 36, 37, 40, 42, 44, 558, 49, 52, 566, 568, 569, 570, 571, 572, 573, 575, 68, 69, 70, 75, 76, 77, 79, 80, 82, 84, 91, 96, 98, 102, 103, 104, 107, 108, 109, 111, 112, 115, 116, 117, 118, 119, 120, 123, 124, 125, 126, 129, 130, 131, 134, 137, 138, 141, 144, 145, 146, 147, 149, 152, 153, 155, 157, 158, 160, 162, 171, 172, 174, 176, 191, 192, 194, 195, 196, 197, 198, 199, 200, 201, 202, 204, 205, 212, 213, 214, 216, 217, 219, 231, 235, 236, 240, 242, 251, 252, 254, 255, 256, 257, 258, 260, 261, 262, 263, 267, 268, 269, 272, 274, 275, 276, 278, 279, 280, 281, 283, 286, 287, 288, 316, 317, 318, 319, 320, 322, 323, 324, 325, 326, 327, 328, 329, 330, 332, 333, 337, 338, 339, 340, 341, 345, 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, 369, 370, 371, 372, 379, 387, 389, 390, 392, 393, 394, 395, 548, 397, 398, 399, 400, 401, 402, 404, 406, 413, 414, 416, 418, 419, 421, 423, 430, 431, 433, 435, 436, 438, 440, 448, 450, 453, 454, 455, 456, 458, 459, 467, 546, 493, 502, 503, 508, 510], "/Users/williamcheng/Code/wing328/swagger-codegen/samples/client/petstore/python/swagger_client/models/category.py": [72, 74, 109, 19, 21, 22, 104, 25, 29, 30, 96, 100, 114, 102, 39, 40, 41, 103, 44, 45, 46, 112, 49, 50, 83, 116, 94, 52, 122, 61, 85, 63], "/Users/williamcheng/Code/wing328/swagger-codegen/samples/client/petstore/python/swagger_client/rest.py": [20, 21, 23, 24, 25, 26, 27, 28, 31, 33, 35, 36, 40, 42, 48, 51, 53, 54, 55, 56, 57, 59, 63, 65, 72, 74, 82, 83, 88, 92, 95, 98, 101, 102, 103, 104, 105, 106, 109, 110, 121, 122, 124, 129, 130, 132, 135, 137, 138, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 152, 153, 154, 155, 156, 159, 160, 161, 166, 170, 171, 174, 176, 177, 179, 181, 182, 183, 184, 186, 191, 198, 199, 200, 201, 203, 204, 205, 206, 207, 208, 210, 211, 212, 213, 214, 215, 217, 225, 227, 228, 229, 230, 231, 232, 239, 243, 244, 245, 246, 248, 249, 251], "/Users/williamcheng/Code/wing328/swagger-codegen/samples/client/petstore/python/swagger_client/models/__init__.py": [1, 4, 5, 6, 7, 8], "/Users/williamcheng/Code/wing328/swagger-codegen/samples/client/petstore/python/swagger_client/apis/store_api.py": [18, 276, 22, 23, 26, 28, 29, 197, 32, 37, 39, 40, 41, 44, 46, 48, 20, 68, 69, 71, 72, 79, 82, 83, 85, 87, 89, 91, 92, 94, 97, 98, 99, 103, 104, 107, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 121], "/Users/williamcheng/Code/wing328/swagger-codegen/samples/client/petstore/python/swagger_client/configuration.py": [135, 136, 137, 138, 139, 142, 19, 149, 22, 23, 25, 26, 27, 29, 158, 31, 32, 34, 36, 37, 39, 40, 41, 170, 43, 172, 46, 47, 189, 179, 52, 54, 59, 61, 190, 63, 192, 224, 67, 69, 71, 200, 73, 204, 80, 81, 82, 84, 213, 86, 199, 88, 90, 219, 92, 221, 222, 223, 96, 225, 98, 100, 102, 230, 104, 167, 111, 76, 168, 157, 122, 123, 42, 21], "/Users/williamcheng/Code/wing328/swagger-codegen/samples/client/petstore/python/swagger_client/__init__.py": [1, 4, 5, 6, 7, 8, 11, 12, 13, 16, 18, 20], "/Users/williamcheng/Code/wing328/swagger-codegen/samples/client/petstore/python/swagger_client/models/pet.py": [128, 130, 150, 172, 139, 141, 19, 215, 21, 22, 152, 25, 29, 30, 161, 163, 39, 40, 41, 42, 43, 44, 45, 174, 48, 49, 50, 51, 52, 53, 54, 183, 57, 58, 59, 60, 61, 62, 64, 194, 195, 200, 73, 202, 75, 206, 208, 209, 210, 211, 84, 213, 86, 185, 216, 218, 220, 222, 95, 97, 226, 228, 106, 108, 117, 119, 212], "/Users/williamcheng/Code/wing328/swagger-codegen/samples/client/petstore/python/swagger_client/models/user.py": [70, 136, 202, 272, 81, 147, 213, 22, 25, 92, 29, 158, 224, 103, 169, 235, 114, 19, 180, 30, 246, 266, 191, 125, 21], "/Users/williamcheng/Code/wing328/swagger-codegen/samples/client/petstore/python/swagger_client/apis/__init__.py": [1, 4, 5, 6], "/Users/williamcheng/Code/wing328/swagger-codegen/samples/client/petstore/python/swagger_client/models/order.py": [130, 44, 141, 45, 19, 21, 22, 152, 25, 29, 30, 52, 161, 163, 39, 40, 41, 42, 43, 172, 173, 174, 175, 48, 49, 50, 51, 180, 53, 54, 57, 58, 59, 60, 61, 62, 191, 64, 202, 75, 86, 176, 222, 97, 228, 178, 108, 119], "/Users/williamcheng/Code/wing328/swagger-codegen/samples/client/petstore/python/swagger_client/models/tag.py": [72, 74, 109, 19, 21, 22, 104, 25, 29, 30, 96, 100, 114, 102, 39, 40, 41, 103, 44, 45, 46, 112, 49, 50, 83, 116, 94, 52, 122, 61, 85, 63]}} \ No newline at end of file +!coverage.py: This is a private format, don't read it directly!{"lines": {"/Users/williamcheng/Code/wing328/swagger-codegen/samples/client/petstore/python/swagger_client/models/order.py": [130, 172, 141, 173, 19, 21, 22, 152, 25, 29, 30, 161, 163, 39, 40, 41, 42, 43, 44, 45, 174, 175, 48, 49, 50, 51, 180, 53, 54, 52, 58, 59, 60, 61, 62, 191, 64, 202, 75, 86, 57, 176, 222, 97, 228, 178, 234, 108, 240, 119], "/Users/williamcheng/Code/wing328/swagger-codegen/samples/client/petstore/python/swagger_client/models/tag.py": [128, 132, 134, 19, 21, 22, 25, 29, 30, 39, 40, 41, 44, 45, 46, 49, 50, 52, 61, 63, 72, 74, 83, 85, 94, 96, 100, 102, 103, 104, 109, 112, 114, 116, 122], "/Users/williamcheng/Code/wing328/swagger-codegen/samples/client/petstore/python/swagger_client/models/__init__.py": [1, 4, 5, 6, 7, 8], "/Users/williamcheng/Code/wing328/swagger-codegen/samples/client/petstore/python/swagger_client/apis/__init__.py": [1, 4, 5, 6], "/Users/williamcheng/Code/wing328/swagger-codegen/samples/client/petstore/python/swagger_client/models/pet.py": [128, 130, 150, 172, 139, 141, 19, 215, 21, 22, 152, 25, 29, 30, 161, 163, 39, 40, 41, 42, 43, 44, 45, 174, 48, 49, 50, 51, 52, 53, 54, 183, 185, 58, 59, 60, 61, 62, 64, 194, 195, 200, 73, 202, 75, 206, 208, 209, 210, 211, 84, 213, 86, 57, 216, 218, 220, 222, 95, 97, 226, 228, 234, 108, 238, 240, 117, 119, 212, 106], "/Users/williamcheng/Code/wing328/swagger-codegen/samples/client/petstore/python/swagger_client/configuration.py": [135, 136, 137, 138, 139, 142, 19, 149, 22, 23, 25, 26, 157, 158, 31, 32, 34, 36, 37, 39, 40, 41, 170, 43, 172, 46, 47, 189, 179, 52, 54, 59, 61, 190, 63, 192, 224, 67, 69, 71, 200, 73, 204, 80, 81, 82, 84, 213, 86, 199, 88, 90, 219, 92, 221, 222, 223, 96, 225, 98, 100, 102, 230, 104, 167, 111, 76, 168, 122, 123, 42, 21], "/Users/williamcheng/Code/wing328/swagger-codegen/samples/client/petstore/python/swagger_client/apis/store_api.py": [87, 18, 276, 22, 23, 26, 28, 29, 197, 32, 37, 39, 40, 41, 44, 46, 48, 68, 69, 71, 72, 79, 82, 83, 85, 121, 89, 91, 92, 94, 97, 98, 99, 103, 104, 107, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 20], "/Users/williamcheng/Code/wing328/swagger-codegen/samples/client/petstore/python/swagger_client/models/category.py": [128, 134, 19, 21, 22, 25, 29, 30, 39, 40, 41, 44, 45, 46, 49, 50, 52, 61, 63, 72, 74, 83, 85, 94, 96, 100, 102, 103, 104, 109, 112, 114, 116, 122], "/Users/williamcheng/Code/wing328/swagger-codegen/samples/client/petstore/python/swagger_client/api_client.py": [518, 525, 526, 527, 19, 21, 22, 23, 24, 537, 26, 27, 28, 29, 30, 31, 32, 33, 34, 547, 36, 37, 40, 42, 44, 45, 558, 47, 49, 52, 566, 568, 569, 570, 571, 572, 573, 575, 68, 69, 70, 75, 76, 77, 79, 80, 82, 84, 91, 96, 98, 102, 103, 104, 107, 108, 109, 111, 112, 115, 116, 117, 118, 119, 120, 123, 124, 125, 126, 129, 130, 131, 134, 137, 138, 141, 144, 145, 146, 147, 149, 152, 153, 155, 157, 158, 160, 162, 171, 172, 174, 176, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 204, 205, 212, 213, 214, 216, 217, 219, 231, 235, 236, 240, 242, 251, 252, 254, 255, 256, 257, 258, 260, 261, 262, 263, 267, 268, 269, 272, 274, 275, 276, 278, 279, 280, 281, 283, 286, 287, 288, 316, 317, 318, 319, 320, 322, 323, 324, 325, 326, 327, 328, 329, 330, 332, 333, 337, 338, 339, 340, 341, 345, 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, 369, 370, 371, 372, 379, 387, 389, 390, 392, 393, 394, 395, 548, 397, 398, 399, 400, 401, 402, 404, 406, 413, 414, 416, 418, 419, 421, 423, 430, 431, 433, 435, 436, 438, 440, 448, 450, 453, 454, 455, 456, 458, 459, 467, 546, 493, 502, 503, 508, 510], "/Users/williamcheng/Code/wing328/swagger-codegen/samples/client/petstore/python/swagger_client/apis/pet_api.py": [512, 513, 514, 516, 86, 18, 20, 22, 23, 26, 539, 28, 29, 542, 543, 32, 548, 37, 39, 40, 41, 42, 555, 556, 45, 558, 559, 48, 562, 564, 565, 566, 568, 569, 345, 571, 574, 575, 576, 580, 581, 70, 584, 73, 586, 587, 588, 589, 590, 591, 592, 593, 594, 595, 596, 598, 88, 90, 92, 93, 95, 96, 97, 100, 101, 102, 106, 107, 621, 622, 624, 625, 626, 79, 116, 117, 118, 631, 632, 121, 122, 635, 124, 638, 639, 641, 642, 643, 645, 647, 649, 650, 651, 652, 653, 654, 656, 145, 146, 659, 660, 149, 150, 665, 666, 155, 156, 669, 671, 160, 673, 162, 675, 164, 677, 166, 679, 168, 169, 171, 172, 173, 541, 176, 177, 178, 115, 182, 183, 186, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 200, 119, 120, 377, 221, 222, 549, 224, 225, 226, 231, 232, 235, 236, 110, 238, 240, 552, 242, 244, 246, 247, 249, 383, 252, 253, 254, 258, 259, 262, 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 276, 46, 560, 538, 297, 298, 300, 301, 302, 44, 307, 308, 311, 312, 314, 316, 317, 318, 320, 322, 323, 325, 113, 328, 329, 330, 334, 335, 338, 340, 341, 342, 343, 344, 241, 346, 347, 348, 349, 350, 485, 352, 84, 114, 373, 374, 376, 148, 378, 661, 384, 387, 390, 391, 393, 394, 395, 397, 399, 401, 402, 404, 407, 408, 409, 413, 414, 69, 417, 419, 420, 421, 422, 423, 424, 425, 426, 427, 428, 429, 431, 72, 159, 74, 672, 83, 454, 455, 457, 458, 459, 674, 112, 464, 465, 468, 471, 472, 676, 474, 475, 476, 478, 480, 80, 482, 483, 484, 678, 486, 487, 489, 492, 493, 494, 680, 498, 499, 502, 681, 504, 505, 506, 507, 508, 509, 510, 511], "/Users/williamcheng/Code/wing328/swagger-codegen/samples/client/petstore/python/swagger_client/apis/user_api.py": [32, 355, 37, 39, 200, 124, 428, 589, 48, 18, 20, 22, 23, 276, 26, 507, 28, 29], "/Users/williamcheng/Code/wing328/swagger-codegen/samples/client/petstore/python/swagger_client/models/user.py": [278, 136, 266, 272, 147, 21, 22, 25, 284, 29, 158, 169, 180, 30, 191, 70, 202, 81, 213, 92, 224, 103, 235, 114, 19, 246, 125], "/Users/williamcheng/Code/wing328/swagger-codegen/samples/client/petstore/python/swagger_client/__init__.py": [1, 4, 5, 6, 7, 8, 11, 12, 13, 16, 18, 20], "/Users/williamcheng/Code/wing328/swagger-codegen/samples/client/petstore/python/swagger_client/rest.py": [20, 21, 23, 24, 25, 26, 27, 28, 31, 33, 35, 36, 40, 42, 43, 45, 48, 51, 53, 54, 55, 56, 57, 59, 63, 65, 72, 74, 82, 83, 88, 92, 95, 98, 101, 102, 103, 104, 105, 106, 109, 110, 121, 122, 124, 129, 130, 132, 135, 137, 138, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 152, 153, 154, 155, 156, 159, 160, 161, 166, 170, 174, 176, 177, 179, 181, 182, 183, 184, 186, 191, 198, 199, 200, 201, 203, 204, 205, 206, 207, 208, 210, 211, 212, 213, 214, 215, 217, 225, 227, 228, 229, 230, 231, 232, 239, 243, 244, 245, 246, 248, 249, 251]}} \ No newline at end of file diff --git a/samples/client/petstore/python/dev-requirements.txt.log b/samples/client/petstore/python/dev-requirements.txt.log index 316a9394b50..382d1cf081d 100644 --- a/samples/client/petstore/python/dev-requirements.txt.log +++ b/samples/client/petstore/python/dev-requirements.txt.log @@ -34,3 +34,38 @@ Requirement already satisfied (use --upgrade to upgrade): randomize in ./venv/li Requirement already satisfied (use --upgrade to upgrade): virtualenv>=1.11.2 in ./venv/lib/python2.7/site-packages (from tox->-r dev-requirements.txt (line 2)) Requirement already satisfied (use --upgrade to upgrade): py>=1.4.17 in ./venv/lib/python2.7/site-packages (from tox->-r dev-requirements.txt (line 2)) Requirement already satisfied (use --upgrade to upgrade): pluggy<0.4.0,>=0.3.0 in ./venv/lib/python2.7/site-packages (from tox->-r dev-requirements.txt (line 2)) +Requirement already satisfied (use --upgrade to upgrade): nose in ./venv/lib/python2.7/site-packages (from -r dev-requirements.txt (line 1)) +Requirement already satisfied (use --upgrade to upgrade): tox in ./venv/lib/python2.7/site-packages (from -r dev-requirements.txt (line 2)) +Requirement already satisfied (use --upgrade to upgrade): coverage in ./venv/lib/python2.7/site-packages (from -r dev-requirements.txt (line 3)) +Requirement already satisfied (use --upgrade to upgrade): randomize in ./venv/lib/python2.7/site-packages (from -r dev-requirements.txt (line 4)) +Requirement already satisfied (use --upgrade to upgrade): virtualenv>=1.11.2 in ./venv/lib/python2.7/site-packages (from tox->-r dev-requirements.txt (line 2)) +Requirement already satisfied (use --upgrade to upgrade): py>=1.4.17 in ./venv/lib/python2.7/site-packages (from tox->-r dev-requirements.txt (line 2)) +Requirement already satisfied (use --upgrade to upgrade): pluggy<0.4.0,>=0.3.0 in ./venv/lib/python2.7/site-packages (from tox->-r dev-requirements.txt (line 2)) +Requirement already satisfied (use --upgrade to upgrade): nose in ./venv/lib/python2.7/site-packages (from -r dev-requirements.txt (line 1)) +Requirement already satisfied (use --upgrade to upgrade): tox in ./venv/lib/python2.7/site-packages (from -r dev-requirements.txt (line 2)) +Requirement already satisfied (use --upgrade to upgrade): coverage in ./venv/lib/python2.7/site-packages (from -r dev-requirements.txt (line 3)) +Requirement already satisfied (use --upgrade to upgrade): randomize in ./venv/lib/python2.7/site-packages (from -r dev-requirements.txt (line 4)) +Requirement already satisfied (use --upgrade to upgrade): virtualenv>=1.11.2 in ./venv/lib/python2.7/site-packages (from tox->-r dev-requirements.txt (line 2)) +Requirement already satisfied (use --upgrade to upgrade): py>=1.4.17 in ./venv/lib/python2.7/site-packages (from tox->-r dev-requirements.txt (line 2)) +Requirement already satisfied (use --upgrade to upgrade): pluggy<0.4.0,>=0.3.0 in ./venv/lib/python2.7/site-packages (from tox->-r dev-requirements.txt (line 2)) +Requirement already satisfied (use --upgrade to upgrade): nose in ./venv/lib/python2.7/site-packages (from -r dev-requirements.txt (line 1)) +Requirement already satisfied (use --upgrade to upgrade): tox in ./venv/lib/python2.7/site-packages (from -r dev-requirements.txt (line 2)) +Requirement already satisfied (use --upgrade to upgrade): coverage in ./venv/lib/python2.7/site-packages (from -r dev-requirements.txt (line 3)) +Requirement already satisfied (use --upgrade to upgrade): randomize in ./venv/lib/python2.7/site-packages (from -r dev-requirements.txt (line 4)) +Requirement already satisfied (use --upgrade to upgrade): virtualenv>=1.11.2 in ./venv/lib/python2.7/site-packages (from tox->-r dev-requirements.txt (line 2)) +Requirement already satisfied (use --upgrade to upgrade): py>=1.4.17 in ./venv/lib/python2.7/site-packages (from tox->-r dev-requirements.txt (line 2)) +Requirement already satisfied (use --upgrade to upgrade): pluggy<0.4.0,>=0.3.0 in ./venv/lib/python2.7/site-packages (from tox->-r dev-requirements.txt (line 2)) +Requirement already satisfied (use --upgrade to upgrade): nose in ./venv/lib/python2.7/site-packages (from -r dev-requirements.txt (line 1)) +Requirement already satisfied (use --upgrade to upgrade): tox in ./venv/lib/python2.7/site-packages (from -r dev-requirements.txt (line 2)) +Requirement already satisfied (use --upgrade to upgrade): coverage in ./venv/lib/python2.7/site-packages (from -r dev-requirements.txt (line 3)) +Requirement already satisfied (use --upgrade to upgrade): randomize in ./venv/lib/python2.7/site-packages (from -r dev-requirements.txt (line 4)) +Requirement already satisfied (use --upgrade to upgrade): virtualenv>=1.11.2 in ./venv/lib/python2.7/site-packages (from tox->-r dev-requirements.txt (line 2)) +Requirement already satisfied (use --upgrade to upgrade): py>=1.4.17 in ./venv/lib/python2.7/site-packages (from tox->-r dev-requirements.txt (line 2)) +Requirement already satisfied (use --upgrade to upgrade): pluggy<0.4.0,>=0.3.0 in ./venv/lib/python2.7/site-packages (from tox->-r dev-requirements.txt (line 2)) +Requirement already satisfied (use --upgrade to upgrade): nose in ./venv/lib/python2.7/site-packages (from -r dev-requirements.txt (line 1)) +Requirement already satisfied (use --upgrade to upgrade): tox in ./venv/lib/python2.7/site-packages (from -r dev-requirements.txt (line 2)) +Requirement already satisfied (use --upgrade to upgrade): coverage in ./venv/lib/python2.7/site-packages (from -r dev-requirements.txt (line 3)) +Requirement already satisfied (use --upgrade to upgrade): randomize in ./venv/lib/python2.7/site-packages (from -r dev-requirements.txt (line 4)) +Requirement already satisfied (use --upgrade to upgrade): virtualenv>=1.11.2 in ./venv/lib/python2.7/site-packages (from tox->-r dev-requirements.txt (line 2)) +Requirement already satisfied (use --upgrade to upgrade): py>=1.4.17 in ./venv/lib/python2.7/site-packages (from tox->-r dev-requirements.txt (line 2)) +Requirement already satisfied (use --upgrade to upgrade): pluggy<0.4.0,>=0.3.0 in ./venv/lib/python2.7/site-packages (from tox->-r dev-requirements.txt (line 2)) diff --git a/samples/client/petstore/python/swagger_client/models/category.py b/samples/client/petstore/python/swagger_client/models/category.py index 06ad3b8421f..7c36ea3ec47 100644 --- a/samples/client/petstore/python/swagger_client/models/category.py +++ b/samples/client/petstore/python/swagger_client/models/category.py @@ -124,3 +124,16 @@ class Category(object): For `print` and `pprint` """ return self.to_str() + + def __eq__(self, other): + """ + Returns true if both objects are equal + """ + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """ + Returns true if both objects are not equal + """ + return not self == other + diff --git a/samples/client/petstore/python/swagger_client/models/order.py b/samples/client/petstore/python/swagger_client/models/order.py index 40e4504de87..39081233b11 100644 --- a/samples/client/petstore/python/swagger_client/models/order.py +++ b/samples/client/petstore/python/swagger_client/models/order.py @@ -230,3 +230,16 @@ class Order(object): For `print` and `pprint` """ return self.to_str() + + def __eq__(self, other): + """ + Returns true if both objects are equal + """ + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """ + Returns true if both objects are not equal + """ + return not self == other + diff --git a/samples/client/petstore/python/swagger_client/models/pet.py b/samples/client/petstore/python/swagger_client/models/pet.py index d8700908eb7..eafb352f2d0 100644 --- a/samples/client/petstore/python/swagger_client/models/pet.py +++ b/samples/client/petstore/python/swagger_client/models/pet.py @@ -230,3 +230,16 @@ class Pet(object): For `print` and `pprint` """ return self.to_str() + + def __eq__(self, other): + """ + Returns true if both objects are equal + """ + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """ + Returns true if both objects are not equal + """ + return not self == other + diff --git a/samples/client/petstore/python/swagger_client/models/tag.py b/samples/client/petstore/python/swagger_client/models/tag.py index 262fc10f338..2041940dadf 100644 --- a/samples/client/petstore/python/swagger_client/models/tag.py +++ b/samples/client/petstore/python/swagger_client/models/tag.py @@ -124,3 +124,16 @@ class Tag(object): For `print` and `pprint` """ return self.to_str() + + def __eq__(self, other): + """ + Returns true if both objects are equal + """ + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """ + Returns true if both objects are not equal + """ + return not self == other + diff --git a/samples/client/petstore/python/swagger_client/models/user.py b/samples/client/petstore/python/swagger_client/models/user.py index 7f74d20f3d3..a3ad99fa4c5 100644 --- a/samples/client/petstore/python/swagger_client/models/user.py +++ b/samples/client/petstore/python/swagger_client/models/user.py @@ -274,3 +274,16 @@ class User(object): For `print` and `pprint` """ return self.to_str() + + def __eq__(self, other): + """ + Returns true if both objects are equal + """ + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """ + Returns true if both objects are not equal + """ + return not self == other + diff --git a/samples/client/petstore/python/tests/test_pet_model.py b/samples/client/petstore/python/tests/test_pet_model.py index 0b0df18a8d0..d2bd3c9ca3d 100644 --- a/samples/client/petstore/python/tests/test_pet_model.py +++ b/samples/client/petstore/python/tests/test_pet_model.py @@ -38,3 +38,36 @@ class PetModelTests(unittest.TestCase): " 'status': 'available',\n" " 'tags': [{'id': 1, 'name': None}]}") self.assertEqual(data, self.pet.to_str()) + + def test_equal(self): + self.pet1 = swagger_client.Pet() + self.pet1.name = "test name" + self.pet1.id = 1 + self.pet1.photo_urls = ["string"] + self.pet1.status = "available" + cate1 = swagger_client.Category() + cate1.id = 1 + cate1.name = "dog" + self.pet.category = cate1 + tag1 = swagger_client.Tag() + tag1.id = 1 + self.pet1.tags = [tag1] + + self.pet2 = swagger_client.Pet() + self.pet2.name = "test name" + self.pet2.id = 1 + self.pet2.photo_urls = ["string"] + self.pet2.status = "available" + cate2 = swagger_client.Category() + cate2.id = 1 + cate2.name = "dog" + self.pet.category = cate2 + tag2 = swagger_client.Tag() + tag2.id = 1 + self.pet2.tags = [tag2] + + self.assertTrue(self.pet1 == self.pet2) + + # reset pet1 tags to empty array so that object comparison returns false + self.pet1.tags = [] + self.assertFalse(self.pet1 == self.pet2) From ddc4d8460d504d271b02d061c3319fd2950f5891 Mon Sep 17 00:00:00 2001 From: wing328 Date: Wed, 25 Nov 2015 00:00:26 +0800 Subject: [PATCH 034/211] fix php access token setter --- .../src/main/resources/php/configuration.mustache | 2 +- .../petstore/php/SwaggerClient-php/lib/Configuration.php | 2 +- .../petstore/php/SwaggerClient-php/tests/PetApiTest.php | 4 ++++ 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/modules/swagger-codegen/src/main/resources/php/configuration.mustache b/modules/swagger-codegen/src/main/resources/php/configuration.mustache index 14d7957fe54..28082851c00 100644 --- a/modules/swagger-codegen/src/main/resources/php/configuration.mustache +++ b/modules/swagger-codegen/src/main/resources/php/configuration.mustache @@ -211,7 +211,7 @@ class Configuration */ public function setAccessToken($accessToken) { - $this->$accessToken = $accessToken; + $this->accessToken = $accessToken; return $this; } diff --git a/samples/client/petstore/php/SwaggerClient-php/lib/Configuration.php b/samples/client/petstore/php/SwaggerClient-php/lib/Configuration.php index 1fdac785bfd..033f2da7a22 100644 --- a/samples/client/petstore/php/SwaggerClient-php/lib/Configuration.php +++ b/samples/client/petstore/php/SwaggerClient-php/lib/Configuration.php @@ -211,7 +211,7 @@ class Configuration */ public function setAccessToken($accessToken) { - $this->$accessToken = $accessToken; + $this->accessToken = $accessToken; return $this; } diff --git a/samples/client/petstore/php/SwaggerClient-php/tests/PetApiTest.php b/samples/client/petstore/php/SwaggerClient-php/tests/PetApiTest.php index fe818069dac..58d5cd661f4 100644 --- a/samples/client/petstore/php/SwaggerClient-php/tests/PetApiTest.php +++ b/samples/client/petstore/php/SwaggerClient-php/tests/PetApiTest.php @@ -82,6 +82,10 @@ class PetApiTest extends \PHPUnit_Framework_TestCase $this->assertNotEquals($apiClient3, $apiClient4); // customied pet api not using the old pet api's api client $this->assertNotEquals($pet_api2->getApiClient(), $pet_api3->getApiClient()); + + // test access token + $api_client->getConfig()->setAccessToken("testing_only"); + $this->assertSame('testing_only', $api_client->getConfig()->getAccessToken()); } // test getPetById with a Pet object (id 10005) From 0dac326230483bd098b9603ad16a346f143e286f Mon Sep 17 00:00:00 2001 From: xhh Date: Wed, 25 Nov 2015 11:46:43 +0800 Subject: [PATCH 035/211] Add "==", "eql?" and "hash" methods to Ruby client --- .../src/main/resources/ruby/model.mustache | 13 +++++++ .../io/swagger/petstore/test/PetApiTest.java | 12 +++++-- .../io/swagger/petstore/test/PetApiTest.java | 12 +++++-- .../io/swagger/petstore/test/PetApiTest.java | 12 +++++-- .../io/swagger/petstore/test/PetApiTest.java | 12 +++++-- .../io/swagger/petstore/test/PetApiTest.java | 12 +++++-- .../ruby/lib/petstore/models/category.rb | 14 ++++++++ .../ruby/lib/petstore/models/order.rb | 18 ++++++++++ .../petstore/ruby/lib/petstore/models/pet.rb | 18 ++++++++++ .../petstore/ruby/lib/petstore/models/tag.rb | 14 ++++++++ .../petstore/ruby/lib/petstore/models/user.rb | 20 +++++++++++ samples/client/petstore/ruby/spec/pet_spec.rb | 35 +++++++++++++++++++ 12 files changed, 177 insertions(+), 15 deletions(-) diff --git a/modules/swagger-codegen/src/main/resources/ruby/model.mustache b/modules/swagger-codegen/src/main/resources/ruby/model.mustache index 1091ab5174a..35742384c26 100644 --- a/modules/swagger-codegen/src/main/resources/ruby/model.mustache +++ b/modules/swagger-codegen/src/main/resources/ruby/model.mustache @@ -43,6 +43,19 @@ module {{moduleName}} @{{{name}}} = {{{name}}} end {{/isEnum}}{{/vars}} + def ==(o) + return true if self.equal?(o) + self.class == o.class{{#vars}} && + {{name}} == o.{{name}}{{/vars}} + end + + def eql?(o) + self == o + end + + def hash + [{{#vars}}{{name}}{{#hasMore}}, {{/hasMore}}{{/vars}}].hash + end end {{/model}} {{/models}} 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 0dd8b310df9..c0bee9328d5 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 @@ -179,19 +179,25 @@ public class PetApiTest { Pet pet1 = new Pet(); Pet pet2 = new Pet(); assertTrue(pet1.equals(pet2)); - assertTrue(pet1.equals(pet2)); + assertTrue(pet2.equals(pet1)); + assertTrue(pet1.hashCode() == pet2.hashCode()); + assertTrue(pet1.equals(pet1)); assertTrue(pet1.hashCode() == pet1.hashCode()); pet2.setName("really-happy"); pet2.setPhotoUrls(Arrays.asList(new String[]{"http://foo.bar.com/1", "http://foo.bar.com/2"})); assertFalse(pet1.equals(pet2)); - assertFalse(pet1.equals(pet2)); + assertFalse(pet2.equals(pet1)); assertFalse(pet1.hashCode() == (pet2.hashCode())); + assertTrue(pet2.equals(pet2)); + assertTrue(pet2.hashCode() == pet2.hashCode()); pet1.setName("really-happy"); pet1.setPhotoUrls(Arrays.asList(new String[]{"http://foo.bar.com/1", "http://foo.bar.com/2"})); assertTrue(pet1.equals(pet2)); - assertTrue(pet1.equals(pet2)); + assertTrue(pet2.equals(pet1)); + assertTrue(pet1.hashCode() == pet2.hashCode()); + assertTrue(pet1.equals(pet1)); assertTrue(pet1.hashCode() == pet1.hashCode()); } 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 0dd8b310df9..c0bee9328d5 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 @@ -179,19 +179,25 @@ public class PetApiTest { Pet pet1 = new Pet(); Pet pet2 = new Pet(); assertTrue(pet1.equals(pet2)); - assertTrue(pet1.equals(pet2)); + assertTrue(pet2.equals(pet1)); + assertTrue(pet1.hashCode() == pet2.hashCode()); + assertTrue(pet1.equals(pet1)); assertTrue(pet1.hashCode() == pet1.hashCode()); pet2.setName("really-happy"); pet2.setPhotoUrls(Arrays.asList(new String[]{"http://foo.bar.com/1", "http://foo.bar.com/2"})); assertFalse(pet1.equals(pet2)); - assertFalse(pet1.equals(pet2)); + assertFalse(pet2.equals(pet1)); assertFalse(pet1.hashCode() == (pet2.hashCode())); + assertTrue(pet2.equals(pet2)); + assertTrue(pet2.hashCode() == pet2.hashCode()); pet1.setName("really-happy"); pet1.setPhotoUrls(Arrays.asList(new String[]{"http://foo.bar.com/1", "http://foo.bar.com/2"})); assertTrue(pet1.equals(pet2)); - assertTrue(pet1.equals(pet2)); + assertTrue(pet2.equals(pet1)); + assertTrue(pet1.hashCode() == pet2.hashCode()); + assertTrue(pet1.equals(pet1)); assertTrue(pet1.hashCode() == pet1.hashCode()); } diff --git a/samples/client/petstore/java/okhttp-gson/src/test/java/io/swagger/petstore/test/PetApiTest.java b/samples/client/petstore/java/okhttp-gson/src/test/java/io/swagger/petstore/test/PetApiTest.java index c87defe6ae5..349690b9e93 100644 --- a/samples/client/petstore/java/okhttp-gson/src/test/java/io/swagger/petstore/test/PetApiTest.java +++ b/samples/client/petstore/java/okhttp-gson/src/test/java/io/swagger/petstore/test/PetApiTest.java @@ -257,19 +257,25 @@ public class PetApiTest { Pet pet1 = new Pet(); Pet pet2 = new Pet(); assertTrue(pet1.equals(pet2)); - assertTrue(pet1.equals(pet2)); + assertTrue(pet2.equals(pet1)); + assertTrue(pet1.hashCode() == pet2.hashCode()); + assertTrue(pet1.equals(pet1)); assertTrue(pet1.hashCode() == pet1.hashCode()); pet2.setName("really-happy"); pet2.setPhotoUrls(Arrays.asList(new String[]{"http://foo.bar.com/1", "http://foo.bar.com/2"})); assertFalse(pet1.equals(pet2)); - assertFalse(pet1.equals(pet2)); + assertFalse(pet2.equals(pet1)); assertFalse(pet1.hashCode() == (pet2.hashCode())); + assertTrue(pet2.equals(pet2)); + assertTrue(pet2.hashCode() == pet2.hashCode()); pet1.setName("really-happy"); pet1.setPhotoUrls(Arrays.asList(new String[]{"http://foo.bar.com/1", "http://foo.bar.com/2"})); assertTrue(pet1.equals(pet2)); - assertTrue(pet1.equals(pet2)); + assertTrue(pet2.equals(pet1)); + assertTrue(pet1.hashCode() == pet2.hashCode()); + assertTrue(pet1.equals(pet1)); assertTrue(pet1.hashCode() == pet1.hashCode()); } diff --git a/samples/client/petstore/java/retrofit/src/test/java/io/swagger/petstore/test/PetApiTest.java b/samples/client/petstore/java/retrofit/src/test/java/io/swagger/petstore/test/PetApiTest.java index 51d84c5cff4..1ff1dbb10e2 100644 --- a/samples/client/petstore/java/retrofit/src/test/java/io/swagger/petstore/test/PetApiTest.java +++ b/samples/client/petstore/java/retrofit/src/test/java/io/swagger/petstore/test/PetApiTest.java @@ -148,19 +148,25 @@ public class PetApiTest { Pet pet1 = new Pet(); Pet pet2 = new Pet(); assertTrue(pet1.equals(pet2)); - assertTrue(pet1.equals(pet2)); + assertTrue(pet2.equals(pet1)); + assertTrue(pet1.hashCode() == pet2.hashCode()); + assertTrue(pet1.equals(pet1)); assertTrue(pet1.hashCode() == pet1.hashCode()); pet2.setName("really-happy"); pet2.setPhotoUrls(Arrays.asList(new String[]{"http://foo.bar.com/1", "http://foo.bar.com/2"})); assertFalse(pet1.equals(pet2)); - assertFalse(pet1.equals(pet2)); + assertFalse(pet2.equals(pet1)); assertFalse(pet1.hashCode() == (pet2.hashCode())); + assertTrue(pet2.equals(pet2)); + assertTrue(pet2.hashCode() == pet2.hashCode()); pet1.setName("really-happy"); pet1.setPhotoUrls(Arrays.asList(new String[]{"http://foo.bar.com/1", "http://foo.bar.com/2"})); assertTrue(pet1.equals(pet2)); - assertTrue(pet1.equals(pet2)); + assertTrue(pet2.equals(pet1)); + assertTrue(pet1.hashCode() == pet2.hashCode()); + assertTrue(pet1.equals(pet1)); assertTrue(pet1.hashCode() == pet1.hashCode()); } diff --git a/samples/client/petstore/java/retrofit2/src/test/java/io/swagger/petstore/test/PetApiTest.java b/samples/client/petstore/java/retrofit2/src/test/java/io/swagger/petstore/test/PetApiTest.java index 309914b434e..8506fc08f5c 100644 --- a/samples/client/petstore/java/retrofit2/src/test/java/io/swagger/petstore/test/PetApiTest.java +++ b/samples/client/petstore/java/retrofit2/src/test/java/io/swagger/petstore/test/PetApiTest.java @@ -147,19 +147,25 @@ public class PetApiTest { Pet pet1 = new Pet(); Pet pet2 = new Pet(); assertTrue(pet1.equals(pet2)); - assertTrue(pet1.equals(pet2)); + assertTrue(pet2.equals(pet1)); + assertTrue(pet1.hashCode() == pet2.hashCode()); + assertTrue(pet1.equals(pet1)); assertTrue(pet1.hashCode() == pet1.hashCode()); pet2.setName("really-happy"); pet2.setPhotoUrls(Arrays.asList(new String[]{"http://foo.bar.com/1", "http://foo.bar.com/2"})); assertFalse(pet1.equals(pet2)); - assertFalse(pet1.equals(pet2)); + assertFalse(pet2.equals(pet1)); assertFalse(pet1.hashCode() == (pet2.hashCode())); + assertTrue(pet2.equals(pet2)); + assertTrue(pet2.hashCode() == pet2.hashCode()); pet1.setName("really-happy"); pet1.setPhotoUrls(Arrays.asList(new String[]{"http://foo.bar.com/1", "http://foo.bar.com/2"})); assertTrue(pet1.equals(pet2)); - assertTrue(pet1.equals(pet2)); + assertTrue(pet2.equals(pet1)); + assertTrue(pet1.hashCode() == pet2.hashCode()); + assertTrue(pet1.equals(pet1)); assertTrue(pet1.hashCode() == pet1.hashCode()); } diff --git a/samples/client/petstore/ruby/lib/petstore/models/category.rb b/samples/client/petstore/ruby/lib/petstore/models/category.rb index 1e36eac4147..ab5b9cabbaa 100644 --- a/samples/client/petstore/ruby/lib/petstore/models/category.rb +++ b/samples/client/petstore/ruby/lib/petstore/models/category.rb @@ -41,5 +41,19 @@ module Petstore end + def ==(o) + return true if self.equal?(o) + self.class == o.class && + id == o.id && + name == o.name + end + + def eql?(o) + self == o + end + + def hash + [id, name].hash + end end end diff --git a/samples/client/petstore/ruby/lib/petstore/models/order.rb b/samples/client/petstore/ruby/lib/petstore/models/order.rb index ab6f8f00189..74eab3436e3 100644 --- a/samples/client/petstore/ruby/lib/petstore/models/order.rb +++ b/samples/client/petstore/ruby/lib/petstore/models/order.rb @@ -81,5 +81,23 @@ module Petstore @status = status end + def ==(o) + return true if self.equal?(o) + self.class == o.class && + id == o.id && + pet_id == o.pet_id && + quantity == o.quantity && + ship_date == o.ship_date && + status == o.status && + complete == o.complete + end + + def eql?(o) + self == o + end + + def hash + [id, pet_id, quantity, ship_date, status, complete].hash + end end end diff --git a/samples/client/petstore/ruby/lib/petstore/models/pet.rb b/samples/client/petstore/ruby/lib/petstore/models/pet.rb index a208cf3f87c..8c5fe6e17e7 100644 --- a/samples/client/petstore/ruby/lib/petstore/models/pet.rb +++ b/samples/client/petstore/ruby/lib/petstore/models/pet.rb @@ -85,5 +85,23 @@ module Petstore @status = status end + def ==(o) + return true if self.equal?(o) + self.class == o.class && + id == o.id && + category == o.category && + name == o.name && + photo_urls == o.photo_urls && + tags == o.tags && + status == o.status + end + + def eql?(o) + self == o + end + + def hash + [id, category, name, photo_urls, tags, status].hash + end end end diff --git a/samples/client/petstore/ruby/lib/petstore/models/tag.rb b/samples/client/petstore/ruby/lib/petstore/models/tag.rb index 3fb5e1f969c..51439de5846 100644 --- a/samples/client/petstore/ruby/lib/petstore/models/tag.rb +++ b/samples/client/petstore/ruby/lib/petstore/models/tag.rb @@ -41,5 +41,19 @@ module Petstore end + def ==(o) + return true if self.equal?(o) + self.class == o.class && + id == o.id && + name == o.name + end + + def eql?(o) + self == o + end + + def hash + [id, name].hash + end end end diff --git a/samples/client/petstore/ruby/lib/petstore/models/user.rb b/samples/client/petstore/ruby/lib/petstore/models/user.rb index 3a6d5f354e0..3d20ab95c4f 100644 --- a/samples/client/petstore/ruby/lib/petstore/models/user.rb +++ b/samples/client/petstore/ruby/lib/petstore/models/user.rb @@ -89,5 +89,25 @@ module Petstore end + def ==(o) + return true if self.equal?(o) + self.class == o.class && + id == o.id && + username == o.username && + first_name == o.first_name && + last_name == o.last_name && + email == o.email && + password == o.password && + phone == o.phone && + user_status == o.user_status + end + + def eql?(o) + self == o + end + + def hash + [id, username, first_name, last_name, email, password, phone, user_status].hash + end end end diff --git a/samples/client/petstore/ruby/spec/pet_spec.rb b/samples/client/petstore/ruby/spec/pet_spec.rb index c9858eca37a..612fc536147 100644 --- a/samples/client/petstore/ruby/spec/pet_spec.rb +++ b/samples/client/petstore/ruby/spec/pet_spec.rb @@ -125,5 +125,40 @@ describe "Pet" do result = @pet_api.upload_file(10002, file: File.new('hello.txt'), additional_metadata: 'metadata') result.should be_nil end + + it "should implement eql? and hash" do + pet1 = Petstore::Pet.new + pet2 = Petstore::Pet.new + pet1.should == pet2 + pet2.should == pet1 + pet1.eql?(pet2).should == true + pet2.eql?(pet1).should == true + pet1.hash.should == pet2.hash + pet1.should == pet1 + pet1.eql?(pet1).should == true + pet1.hash.should == pet1.hash + + pet1.name = 'really-happy' + pet1.photo_urls = ['http://foo.bar.com/1', 'http://foo.bar.com/2'] + pet1.should_not == pet2 + pet2.should_not == pet1 + pet1.eql?(pet2).should == false + pet2.eql?(pet1).should == false + pet1.hash.should_not == pet2.hash + pet1.should == pet1 + pet1.eql?(pet1).should == true + pet1.hash.should == pet1.hash + + pet2.name = 'really-happy' + pet2.photo_urls = ['http://foo.bar.com/1', 'http://foo.bar.com/2'] + pet1.should == pet2 + pet2.should == pet1 + pet1.eql?(pet2).should == true + pet2.eql?(pet1).should == true + pet1.hash.should == pet2.hash + pet2.should == pet2 + pet2.eql?(pet2).should == true + pet2.hash.should == pet2.hash + end end end From 5a5a716bfdc00df98a43fa6a42de83ec3a72c282 Mon Sep 17 00:00:00 2001 From: Testo Nakada Date: Fri, 16 Oct 2015 09:18:48 -0700 Subject: [PATCH 036/211] - make Meta generator take the swagger code gen version - generate the class name correctly if the name contains hyphen --- .../src/main/java/io/swagger/codegen/cmd/Meta.java | 13 ++++++++++--- .../src/main/resources/codegen/pom.mustache | 4 ++-- 2 files changed, 12 insertions(+), 5 deletions(-) diff --git a/modules/swagger-codegen-cli/src/main/java/io/swagger/codegen/cmd/Meta.java b/modules/swagger-codegen-cli/src/main/java/io/swagger/codegen/cmd/Meta.java index c75181c51cd..ca06652b942 100644 --- a/modules/swagger-codegen-cli/src/main/java/io/swagger/codegen/cmd/Meta.java +++ b/modules/swagger-codegen-cli/src/main/java/io/swagger/codegen/cmd/Meta.java @@ -1,6 +1,7 @@ package io.swagger.codegen.cmd; import ch.lambdaj.function.convert.Converter; +import com.google.common.base.CaseFormat; import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableMap; import com.samskivert.mustache.Mustache; @@ -9,7 +10,6 @@ import io.airlift.airline.Option; import io.swagger.codegen.DefaultGenerator; import io.swagger.codegen.SupportingFile; import org.apache.commons.io.FileUtils; -import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -55,7 +55,7 @@ public class Meta implements Runnable { final File targetDir = new File(outputFolder); LOG.info("writing to folder [{}]", targetDir.getAbsolutePath()); - String mainClass = StringUtils.capitalize(name) + "Generator"; + String mainClass = CaseFormat.LOWER_HYPHEN.to(CaseFormat.UPPER_CAMEL, name) + "Generator"; List supportingFiles = ImmutableList.of( new SupportingFile("pom.mustache", "", "pom.xml"), @@ -68,11 +68,18 @@ public class Meta implements Runnable { "src/main/resources/META-INF/services", "io.swagger.codegen.CodegenConfig") ); + String swaggerVersion = this.getClass().getPackage().getImplementationVersion(); + // if the code is running outside of the jar (i.e. from the IDE), it will not have the version available. + // let's default it with something. + if (swaggerVersion==null) { + swaggerVersion = "2.1.3"; + } Map data = new ImmutableMap.Builder() .put("generatorPackage", targetPackage) .put("generatorClass", mainClass) .put("name", name) - .put("fullyQualifiedGeneratorClass", targetPackage + "." + mainClass).build(); + .put("fullyQualifiedGeneratorClass", targetPackage + "." + mainClass) + .put("swaggerCodegenVersion", swaggerVersion).build(); with(supportingFiles).convert(processFiles(targetDir, data)); diff --git a/modules/swagger-codegen/src/main/resources/codegen/pom.mustache b/modules/swagger-codegen/src/main/resources/codegen/pom.mustache index 29a980a5091..30f1b14872c 100644 --- a/modules/swagger-codegen/src/main/resources/codegen/pom.mustache +++ b/modules/swagger-codegen/src/main/resources/codegen/pom.mustache @@ -95,8 +95,8 @@ - 2.1.3 + {{swaggerCodegenVersion}} 1.0.0 4.8.1 - \ No newline at end of file + From 7c0fd4b85f43a82613bd6b9dcb8fb4761a7b333d Mon Sep 17 00:00:00 2001 From: wing328 Date: Fri, 20 Nov 2015 17:01:21 +0800 Subject: [PATCH 037/211] update python auth to skip empty token/username,password --- .../main/resources/python/api_client.mustache | 4 ++- samples/client/petstore/python/.coverage | 2 +- .../petstore/python/dev-requirements.txt.log | 14 ++++++++ .../python/swagger_client/api_client.py | 4 ++- .../python/swagger_client/apis/pet_api.py | 32 ++++++++++++------- .../python/swagger_client/apis/store_api.py | 16 ++++++---- .../python/swagger_client/apis/user_api.py | 26 +++++++++------ 7 files changed, 68 insertions(+), 30 deletions(-) diff --git a/modules/swagger-codegen/src/main/resources/python/api_client.mustache b/modules/swagger-codegen/src/main/resources/python/api_client.mustache index 969eb4e7992..d097ec4536d 100644 --- a/modules/swagger-codegen/src/main/resources/python/api_client.mustache +++ b/modules/swagger-codegen/src/main/resources/python/api_client.mustache @@ -453,7 +453,9 @@ class ApiClient(object): for auth in auth_settings: auth_setting = config.auth_settings().get(auth) if auth_setting: - if auth_setting['in'] == 'header': + if not auth_setting['value']: + continue + elif auth_setting['in'] == 'header': headers[auth_setting['key']] = auth_setting['value'] elif auth_setting['in'] == 'query': querys[auth_setting['key']] = auth_setting['value'] diff --git a/samples/client/petstore/python/.coverage b/samples/client/petstore/python/.coverage index 03f8b2a2d03..ddd00f77a03 100644 --- a/samples/client/petstore/python/.coverage +++ b/samples/client/petstore/python/.coverage @@ -1 +1 @@ -!coverage.py: This is a private format, don't read it directly!{"runs": [{"brief_sys": "CPython 3.4.3 Darwin"}], "lines": {"/Users/williamcheng/Code/swagger-codegen/samples/client/petstore/python/swagger_client/models/user.py": [70, 136, 202, 272, 81, 147, 213, 22, 25, 92, 29, 158, 224, 103, 169, 235, 114, 19, 180, 30, 246, 266, 191, 125, 21], "/Users/williamcheng/Code/swagger-codegen/samples/client/petstore/python/swagger_client/rest.py": [20, 21, 23, 24, 25, 26, 27, 28, 31, 33, 35, 36, 40, 42, 48, 51, 53, 54, 55, 56, 57, 59, 63, 65, 72, 74, 82, 83, 88, 92, 95, 98, 101, 102, 103, 104, 105, 106, 109, 110, 121, 122, 124, 129, 130, 132, 135, 137, 138, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 152, 153, 154, 155, 156, 159, 160, 161, 166, 170, 171, 174, 176, 177, 179, 181, 182, 183, 184, 186, 191, 198, 199, 200, 201, 203, 204, 205, 206, 207, 208, 210, 211, 212, 213, 214, 215, 217, 225, 227, 228, 229, 230, 231, 232, 239, 243, 244, 245, 246, 248, 249, 251], "/Users/williamcheng/Code/swagger-codegen/samples/client/petstore/python/swagger_client/models/__init__.py": [1, 4, 5, 6, 7, 8], "/Users/williamcheng/Code/swagger-codegen/samples/client/petstore/python/swagger_client/apis/__init__.py": [1, 4, 5, 6], "/Users/williamcheng/Code/swagger-codegen/samples/client/petstore/python/swagger_client/models/tag.py": [72, 74, 109, 19, 21, 22, 104, 25, 29, 30, 96, 100, 114, 102, 39, 40, 41, 103, 44, 45, 46, 112, 49, 50, 83, 116, 94, 52, 122, 61, 85, 63], "/Users/williamcheng/Code/swagger-codegen/samples/client/petstore/python/swagger_client/models/pet.py": [128, 130, 150, 172, 139, 141, 19, 215, 21, 22, 152, 25, 29, 30, 161, 163, 39, 40, 41, 42, 43, 44, 45, 174, 48, 49, 50, 51, 52, 53, 54, 183, 57, 58, 59, 60, 61, 62, 64, 194, 195, 200, 73, 202, 75, 206, 208, 209, 210, 211, 84, 213, 86, 185, 216, 218, 220, 222, 95, 97, 226, 228, 106, 108, 117, 119, 212], "/Users/williamcheng/Code/swagger-codegen/samples/client/petstore/python/swagger_client/apis/pet_api.py": [469, 18, 20, 22, 23, 536, 26, 539, 28, 29, 69, 32, 545, 546, 548, 37, 39, 40, 41, 42, 555, 44, 557, 558, 559, 48, 561, 562, 564, 567, 568, 569, 70, 573, 574, 577, 579, 580, 581, 582, 583, 584, 585, 586, 587, 588, 589, 591, 80, 82, 83, 85, 87, 89, 91, 92, 94, 95, 96, 99, 100, 101, 614, 617, 618, 620, 621, 622, 111, 157, 113, 114, 627, 628, 106, 630, 631, 120, 633, 634, 635, 637, 639, 641, 642, 643, 644, 645, 646, 449, 648, 651, 652, 653, 109, 144, 657, 658, 147, 148, 661, 73, 663, 664, 665, 666, 155, 668, 538, 670, 671, 160, 112, 162, 164, 166, 167, 169, 170, 171, 174, 175, 176, 115, 180, 181, 184, 116, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 118, 198, 535, 119, 121, 219, 220, 222, 549, 224, 123, 229, 230, 232, 233, 551, 237, 238, 239, 552, 243, 244, 246, 553, 249, 250, 383, 255, 256, 259, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 673, 273, 46, 294, 295, 297, 298, 299, 304, 305, 307, 308, 310, 312, 313, 314, 223, 316, 318, 319, 321, 324, 325, 326, 330, 331, 45, 334, 336, 337, 338, 339, 340, 667, 342, 343, 344, 345, 346, 348, 540, 145, 483, 369, 372, 373, 375, 376, 377, 382, 149, 385, 386, 235, 388, 389, 390, 392, 394, 396, 397, 399, 402, 403, 404, 408, 409, 412, 154, 414, 415, 416, 417, 418, 419, 420, 421, 422, 423, 424, 426, 669, 72, 105, 158, 241, 74, 117, 672, 452, 453, 455, 456, 457, 462, 463, 465, 466, 468, 532, 470, 472, 474, 79, 476, 477, 478, 479, 480, 481, 251, 486, 487, 488, 492, 493, 496, 498, 499, 500, 501, 502, 503, 504, 505, 506, 507, 508, 510, 341], "/Users/williamcheng/Code/swagger-codegen/samples/client/petstore/python/swagger_client/__init__.py": [1, 4, 5, 6, 7, 8, 11, 12, 13, 16, 18, 20], "/Users/williamcheng/Code/swagger-codegen/samples/client/petstore/python/swagger_client/apis/store_api.py": [273, 18, 20, 22, 23, 26, 28, 29, 32, 37, 39, 40, 41, 44, 46, 48, 195, 68, 69, 71, 72, 79, 81, 82, 84, 86, 88, 90, 91, 93, 96, 97, 98, 102, 103, 106, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 120], "/Users/williamcheng/Code/swagger-codegen/samples/client/petstore/python/swagger_client/models/category.py": [72, 74, 109, 19, 21, 22, 104, 25, 29, 30, 96, 100, 114, 102, 39, 40, 41, 103, 44, 45, 46, 112, 49, 50, 83, 116, 94, 52, 122, 61, 85, 63], "/Users/williamcheng/Code/swagger-codegen/samples/client/petstore/python/swagger_client/models/order.py": [130, 44, 141, 45, 19, 21, 22, 152, 25, 29, 30, 52, 161, 163, 39, 40, 41, 42, 43, 172, 173, 174, 175, 48, 49, 50, 51, 180, 53, 54, 57, 58, 59, 60, 61, 62, 191, 64, 202, 75, 86, 176, 222, 97, 228, 178, 108, 119], "/Users/williamcheng/Code/swagger-codegen/samples/client/petstore/python/swagger_client/api_client.py": [516, 523, 524, 525, 19, 21, 22, 535, 24, 26, 27, 28, 29, 30, 31, 32, 33, 34, 36, 37, 40, 42, 44, 49, 52, 566, 567, 568, 569, 570, 571, 573, 68, 69, 70, 75, 76, 77, 79, 80, 82, 84, 91, 96, 98, 102, 103, 104, 107, 108, 109, 111, 112, 115, 116, 117, 118, 119, 120, 123, 124, 125, 126, 129, 130, 131, 134, 137, 138, 23, 141, 144, 145, 146, 147, 149, 152, 153, 155, 157, 158, 160, 162, 171, 172, 174, 176, 191, 192, 544, 194, 195, 196, 197, 198, 199, 200, 201, 202, 204, 205, 212, 213, 214, 216, 217, 219, 231, 235, 236, 240, 242, 251, 252, 254, 255, 256, 257, 258, 260, 261, 262, 263, 556, 267, 268, 269, 272, 274, 275, 276, 278, 279, 280, 281, 283, 286, 287, 288, 564, 316, 317, 318, 319, 320, 322, 323, 324, 325, 326, 327, 328, 329, 330, 332, 333, 337, 338, 339, 340, 341, 345, 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, 369, 370, 371, 372, 379, 387, 389, 390, 392, 393, 394, 395, 397, 398, 399, 400, 401, 402, 404, 406, 413, 414, 416, 418, 419, 421, 423, 430, 431, 433, 435, 436, 438, 440, 501, 448, 450, 453, 454, 455, 456, 457, 465, 546, 491, 500, 545, 506, 508], "/Users/williamcheng/Code/swagger-codegen/samples/client/petstore/python/swagger_client/configuration.py": [135, 136, 137, 138, 139, 142, 19, 149, 22, 23, 25, 26, 27, 29, 158, 31, 32, 34, 36, 37, 39, 40, 41, 170, 43, 172, 46, 47, 189, 179, 52, 54, 59, 61, 190, 63, 192, 224, 67, 69, 71, 200, 73, 204, 80, 81, 82, 84, 213, 86, 199, 88, 90, 219, 92, 221, 222, 223, 96, 225, 98, 100, 102, 230, 104, 167, 111, 76, 168, 157, 122, 123, 42, 21], "/Users/williamcheng/Code/swagger-codegen/samples/client/petstore/python/swagger_client/apis/user_api.py": [32, 37, 198, 39, 423, 582, 48, 273, 18, 20, 501, 22, 23, 26, 123, 28, 29, 351]}} \ No newline at end of file +!coverage.py: This is a private format, don't read it directly!{"lines": {"/Users/williamcheng/Code/wing328/swagger-codegen/samples/client/petstore/python/swagger_client/apis/pet_api.py": [512, 513, 514, 516, 86, 18, 20, 22, 23, 26, 539, 28, 29, 542, 543, 32, 548, 37, 39, 40, 41, 42, 555, 556, 45, 558, 559, 560, 562, 564, 565, 566, 568, 569, 571, 574, 575, 576, 580, 581, 70, 584, 73, 586, 587, 588, 589, 590, 591, 592, 593, 594, 595, 596, 598, 88, 90, 92, 93, 95, 96, 97, 100, 101, 102, 106, 107, 621, 622, 624, 625, 626, 79, 116, 117, 118, 631, 632, 121, 122, 635, 124, 638, 639, 641, 642, 643, 645, 647, 649, 650, 651, 652, 653, 654, 656, 145, 146, 659, 148, 661, 150, 665, 666, 155, 156, 538, 159, 160, 673, 162, 675, 164, 677, 166, 679, 168, 169, 171, 172, 173, 541, 176, 177, 178, 115, 182, 183, 186, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 552, 200, 119, 120, 377, 221, 222, 549, 224, 225, 226, 231, 232, 431, 235, 236, 110, 238, 240, 241, 242, 244, 246, 247, 249, 383, 252, 253, 254, 258, 259, 262, 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 276, 46, 48, 297, 298, 300, 301, 302, 44, 307, 308, 311, 312, 314, 316, 317, 318, 320, 322, 323, 325, 113, 328, 329, 330, 334, 335, 338, 340, 341, 342, 343, 344, 345, 346, 347, 348, 349, 350, 485, 352, 84, 114, 373, 374, 376, 660, 378, 149, 384, 387, 390, 391, 393, 394, 395, 397, 399, 401, 402, 404, 407, 408, 409, 413, 414, 69, 417, 419, 420, 421, 422, 423, 424, 425, 426, 427, 428, 429, 669, 72, 671, 74, 672, 83, 454, 455, 457, 458, 459, 674, 112, 464, 465, 468, 471, 472, 676, 474, 475, 476, 478, 480, 80, 482, 483, 484, 678, 486, 487, 489, 492, 493, 494, 680, 498, 499, 502, 681, 504, 505, 506, 507, 508, 509, 510, 511], "/Users/williamcheng/Code/wing328/swagger-codegen/samples/client/petstore/python/swagger_client/apis/user_api.py": [32, 355, 37, 39, 200, 124, 428, 589, 48, 18, 20, 22, 23, 276, 26, 507, 28, 29], "/Users/williamcheng/Code/wing328/swagger-codegen/samples/client/petstore/python/swagger_client/api_client.py": [518, 525, 526, 527, 19, 21, 22, 23, 24, 537, 26, 27, 28, 29, 30, 31, 32, 33, 34, 547, 36, 37, 40, 42, 44, 558, 49, 52, 566, 568, 569, 570, 571, 572, 573, 575, 68, 69, 70, 75, 76, 77, 79, 80, 82, 84, 91, 96, 98, 102, 103, 104, 107, 108, 109, 111, 112, 115, 116, 117, 118, 119, 120, 123, 124, 125, 126, 129, 130, 131, 134, 137, 138, 141, 144, 145, 146, 147, 149, 152, 153, 155, 157, 158, 160, 162, 171, 172, 174, 176, 191, 192, 194, 195, 196, 197, 198, 199, 200, 201, 202, 204, 205, 212, 213, 214, 216, 217, 219, 231, 235, 236, 240, 242, 251, 252, 254, 255, 256, 257, 258, 260, 261, 262, 263, 267, 268, 269, 272, 274, 275, 276, 278, 279, 280, 281, 283, 286, 287, 288, 316, 317, 318, 319, 320, 322, 323, 324, 325, 326, 327, 328, 329, 330, 332, 333, 337, 338, 339, 340, 341, 345, 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, 369, 370, 371, 372, 379, 387, 389, 390, 392, 393, 394, 395, 548, 397, 398, 399, 400, 401, 402, 404, 406, 413, 414, 416, 418, 419, 421, 423, 430, 431, 433, 435, 436, 438, 440, 448, 450, 453, 454, 455, 456, 458, 459, 467, 546, 493, 502, 503, 508, 510], "/Users/williamcheng/Code/wing328/swagger-codegen/samples/client/petstore/python/swagger_client/models/category.py": [72, 74, 109, 19, 21, 22, 104, 25, 29, 30, 96, 100, 114, 102, 39, 40, 41, 103, 44, 45, 46, 112, 49, 50, 83, 116, 94, 52, 122, 61, 85, 63], "/Users/williamcheng/Code/wing328/swagger-codegen/samples/client/petstore/python/swagger_client/rest.py": [20, 21, 23, 24, 25, 26, 27, 28, 31, 33, 35, 36, 40, 42, 48, 51, 53, 54, 55, 56, 57, 59, 63, 65, 72, 74, 82, 83, 88, 92, 95, 98, 101, 102, 103, 104, 105, 106, 109, 110, 121, 122, 124, 129, 130, 132, 135, 137, 138, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 152, 153, 154, 155, 156, 159, 160, 161, 166, 170, 171, 174, 176, 177, 179, 181, 182, 183, 184, 186, 191, 198, 199, 200, 201, 203, 204, 205, 206, 207, 208, 210, 211, 212, 213, 214, 215, 217, 225, 227, 228, 229, 230, 231, 232, 239, 243, 244, 245, 246, 248, 249, 251], "/Users/williamcheng/Code/wing328/swagger-codegen/samples/client/petstore/python/swagger_client/models/__init__.py": [1, 4, 5, 6, 7, 8], "/Users/williamcheng/Code/wing328/swagger-codegen/samples/client/petstore/python/swagger_client/apis/store_api.py": [18, 276, 22, 23, 26, 28, 29, 197, 32, 37, 39, 40, 41, 44, 46, 48, 20, 68, 69, 71, 72, 79, 82, 83, 85, 87, 89, 91, 92, 94, 97, 98, 99, 103, 104, 107, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 121], "/Users/williamcheng/Code/wing328/swagger-codegen/samples/client/petstore/python/swagger_client/configuration.py": [135, 136, 137, 138, 139, 142, 19, 149, 22, 23, 25, 26, 27, 29, 158, 31, 32, 34, 36, 37, 39, 40, 41, 170, 43, 172, 46, 47, 189, 179, 52, 54, 59, 61, 190, 63, 192, 224, 67, 69, 71, 200, 73, 204, 80, 81, 82, 84, 213, 86, 199, 88, 90, 219, 92, 221, 222, 223, 96, 225, 98, 100, 102, 230, 104, 167, 111, 76, 168, 157, 122, 123, 42, 21], "/Users/williamcheng/Code/wing328/swagger-codegen/samples/client/petstore/python/swagger_client/__init__.py": [1, 4, 5, 6, 7, 8, 11, 12, 13, 16, 18, 20], "/Users/williamcheng/Code/wing328/swagger-codegen/samples/client/petstore/python/swagger_client/models/pet.py": [128, 130, 150, 172, 139, 141, 19, 215, 21, 22, 152, 25, 29, 30, 161, 163, 39, 40, 41, 42, 43, 44, 45, 174, 48, 49, 50, 51, 52, 53, 54, 183, 57, 58, 59, 60, 61, 62, 64, 194, 195, 200, 73, 202, 75, 206, 208, 209, 210, 211, 84, 213, 86, 185, 216, 218, 220, 222, 95, 97, 226, 228, 106, 108, 117, 119, 212], "/Users/williamcheng/Code/wing328/swagger-codegen/samples/client/petstore/python/swagger_client/models/user.py": [70, 136, 202, 272, 81, 147, 213, 22, 25, 92, 29, 158, 224, 103, 169, 235, 114, 19, 180, 30, 246, 266, 191, 125, 21], "/Users/williamcheng/Code/wing328/swagger-codegen/samples/client/petstore/python/swagger_client/apis/__init__.py": [1, 4, 5, 6], "/Users/williamcheng/Code/wing328/swagger-codegen/samples/client/petstore/python/swagger_client/models/order.py": [130, 44, 141, 45, 19, 21, 22, 152, 25, 29, 30, 52, 161, 163, 39, 40, 41, 42, 43, 172, 173, 174, 175, 48, 49, 50, 51, 180, 53, 54, 57, 58, 59, 60, 61, 62, 191, 64, 202, 75, 86, 176, 222, 97, 228, 178, 108, 119], "/Users/williamcheng/Code/wing328/swagger-codegen/samples/client/petstore/python/swagger_client/models/tag.py": [72, 74, 109, 19, 21, 22, 104, 25, 29, 30, 96, 100, 114, 102, 39, 40, 41, 103, 44, 45, 46, 112, 49, 50, 83, 116, 94, 52, 122, 61, 85, 63]}} \ No newline at end of file diff --git a/samples/client/petstore/python/dev-requirements.txt.log b/samples/client/petstore/python/dev-requirements.txt.log index 0d8dcbb5831..316a9394b50 100644 --- a/samples/client/petstore/python/dev-requirements.txt.log +++ b/samples/client/petstore/python/dev-requirements.txt.log @@ -20,3 +20,17 @@ Requirement already satisfied (use --upgrade to upgrade): randomize in ./.venv/l Requirement already satisfied (use --upgrade to upgrade): virtualenv>=1.11.2 in ./.venv/lib/python2.7/site-packages (from tox->-r dev-requirements.txt (line 2)) Requirement already satisfied (use --upgrade to upgrade): py>=1.4.17 in ./.venv/lib/python2.7/site-packages (from tox->-r dev-requirements.txt (line 2)) Requirement already satisfied (use --upgrade to upgrade): pluggy<0.4.0,>=0.3.0 in ./.venv/lib/python2.7/site-packages (from tox->-r dev-requirements.txt (line 2)) +Requirement already satisfied (use --upgrade to upgrade): nose in ./venv/lib/python2.7/site-packages (from -r dev-requirements.txt (line 1)) +Requirement already satisfied (use --upgrade to upgrade): tox in ./venv/lib/python2.7/site-packages (from -r dev-requirements.txt (line 2)) +Requirement already satisfied (use --upgrade to upgrade): coverage in ./venv/lib/python2.7/site-packages (from -r dev-requirements.txt (line 3)) +Requirement already satisfied (use --upgrade to upgrade): randomize in ./venv/lib/python2.7/site-packages (from -r dev-requirements.txt (line 4)) +Requirement already satisfied (use --upgrade to upgrade): virtualenv>=1.11.2 in ./venv/lib/python2.7/site-packages (from tox->-r dev-requirements.txt (line 2)) +Requirement already satisfied (use --upgrade to upgrade): py>=1.4.17 in ./venv/lib/python2.7/site-packages (from tox->-r dev-requirements.txt (line 2)) +Requirement already satisfied (use --upgrade to upgrade): pluggy<0.4.0,>=0.3.0 in ./venv/lib/python2.7/site-packages (from tox->-r dev-requirements.txt (line 2)) +Requirement already satisfied (use --upgrade to upgrade): nose in ./venv/lib/python2.7/site-packages (from -r dev-requirements.txt (line 1)) +Requirement already satisfied (use --upgrade to upgrade): tox in ./venv/lib/python2.7/site-packages (from -r dev-requirements.txt (line 2)) +Requirement already satisfied (use --upgrade to upgrade): coverage in ./venv/lib/python2.7/site-packages (from -r dev-requirements.txt (line 3)) +Requirement already satisfied (use --upgrade to upgrade): randomize in ./venv/lib/python2.7/site-packages (from -r dev-requirements.txt (line 4)) +Requirement already satisfied (use --upgrade to upgrade): virtualenv>=1.11.2 in ./venv/lib/python2.7/site-packages (from tox->-r dev-requirements.txt (line 2)) +Requirement already satisfied (use --upgrade to upgrade): py>=1.4.17 in ./venv/lib/python2.7/site-packages (from tox->-r dev-requirements.txt (line 2)) +Requirement already satisfied (use --upgrade to upgrade): pluggy<0.4.0,>=0.3.0 in ./venv/lib/python2.7/site-packages (from tox->-r dev-requirements.txt (line 2)) diff --git a/samples/client/petstore/python/swagger_client/api_client.py b/samples/client/petstore/python/swagger_client/api_client.py index fdc92cae77f..f3c66bd3706 100644 --- a/samples/client/petstore/python/swagger_client/api_client.py +++ b/samples/client/petstore/python/swagger_client/api_client.py @@ -453,7 +453,9 @@ class ApiClient(object): for auth in auth_settings: auth_setting = config.auth_settings().get(auth) if auth_setting: - if auth_setting['in'] == 'header': + if not auth_setting['value']: + continue + elif auth_setting['in'] == 'header': headers[auth_setting['key']] = auth_setting['value'] elif auth_setting['in'] == 'query': querys[auth_setting['key']] = auth_setting['value'] diff --git a/samples/client/petstore/python/swagger_client/apis/pet_api.py b/samples/client/petstore/python/swagger_client/apis/pet_api.py index d68d34e6774..d7bc11daaaf 100644 --- a/samples/client/petstore/python/swagger_client/apis/pet_api.py +++ b/samples/client/petstore/python/swagger_client/apis/pet_api.py @@ -79,6 +79,7 @@ class PetApi(object): params[key] = val del params['kwargs'] + resource_path = '/pet'.replace('{format}', 'json') method = 'PUT' @@ -154,6 +155,7 @@ class PetApi(object): params[key] = val del params['kwargs'] + resource_path = '/pet'.replace('{format}', 'json') method = 'POST' @@ -229,6 +231,7 @@ class PetApi(object): params[key] = val del params['kwargs'] + resource_path = '/pet/findByStatus'.replace('{format}', 'json') method = 'GET' @@ -304,6 +307,7 @@ class PetApi(object): params[key] = val del params['kwargs'] + resource_path = '/pet/findByTags'.replace('{format}', 'json') method = 'GET' @@ -365,9 +369,6 @@ class PetApi(object): If the method is called asynchronously, returns the request thread. """ - # verify the required parameter 'pet_id' is set - if pet_id is None: - raise ValueError("Missing the required parameter `pet_id` when calling `get_pet_by_id`") all_params = ['pet_id'] all_params.append('callback') @@ -382,6 +383,10 @@ class PetApi(object): params[key] = val del params['kwargs'] + # verify the required parameter 'pet_id' is set + if ('pet_id' not in params) or (params['pet_id'] is None): + raise ValueError("Missing the required parameter `pet_id` when calling `get_pet_by_id`") + resource_path = '/pet/{petId}'.replace('{format}', 'json') method = 'GET' @@ -445,9 +450,6 @@ class PetApi(object): If the method is called asynchronously, returns the request thread. """ - # verify the required parameter 'pet_id' is set - if pet_id is None: - raise ValueError("Missing the required parameter `pet_id` when calling `update_pet_with_form`") all_params = ['pet_id', 'name', 'status'] all_params.append('callback') @@ -462,6 +464,10 @@ class PetApi(object): params[key] = val del params['kwargs'] + # verify the required parameter 'pet_id' is set + if ('pet_id' not in params) or (params['pet_id'] is None): + raise ValueError("Missing the required parameter `pet_id` when calling `update_pet_with_form`") + resource_path = '/pet/{petId}'.replace('{format}', 'json') method = 'POST' @@ -528,9 +534,6 @@ class PetApi(object): If the method is called asynchronously, returns the request thread. """ - # verify the required parameter 'pet_id' is set - if pet_id is None: - raise ValueError("Missing the required parameter `pet_id` when calling `delete_pet`") all_params = ['pet_id', 'api_key'] all_params.append('callback') @@ -545,6 +548,10 @@ class PetApi(object): params[key] = val del params['kwargs'] + # verify the required parameter 'pet_id' is set + if ('pet_id' not in params) or (params['pet_id'] is None): + raise ValueError("Missing the required parameter `pet_id` when calling `delete_pet`") + resource_path = '/pet/{petId}'.replace('{format}', 'json') method = 'DELETE' @@ -610,9 +617,6 @@ class PetApi(object): If the method is called asynchronously, returns the request thread. """ - # verify the required parameter 'pet_id' is set - if pet_id is None: - raise ValueError("Missing the required parameter `pet_id` when calling `upload_file`") all_params = ['pet_id', 'additional_metadata', 'file'] all_params.append('callback') @@ -627,6 +631,10 @@ class PetApi(object): params[key] = val del params['kwargs'] + # verify the required parameter 'pet_id' is set + if ('pet_id' not in params) or (params['pet_id'] is None): + raise ValueError("Missing the required parameter `pet_id` when calling `upload_file`") + resource_path = '/pet/{petId}/uploadImage'.replace('{format}', 'json') method = 'POST' diff --git a/samples/client/petstore/python/swagger_client/apis/store_api.py b/samples/client/petstore/python/swagger_client/apis/store_api.py index 9e08a0b2f47..e3835990a30 100644 --- a/samples/client/petstore/python/swagger_client/apis/store_api.py +++ b/samples/client/petstore/python/swagger_client/apis/store_api.py @@ -78,6 +78,7 @@ class StoreApi(object): params[key] = val del params['kwargs'] + resource_path = '/store/inventory'.replace('{format}', 'json') method = 'GET' @@ -151,6 +152,7 @@ class StoreApi(object): params[key] = val del params['kwargs'] + resource_path = '/store/order'.replace('{format}', 'json') method = 'POST' @@ -212,9 +214,6 @@ class StoreApi(object): If the method is called asynchronously, returns the request thread. """ - # verify the required parameter 'order_id' is set - if order_id is None: - raise ValueError("Missing the required parameter `order_id` when calling `get_order_by_id`") all_params = ['order_id'] all_params.append('callback') @@ -229,6 +228,10 @@ class StoreApi(object): params[key] = val del params['kwargs'] + # verify the required parameter 'order_id' is set + if ('order_id' not in params) or (params['order_id'] is None): + raise ValueError("Missing the required parameter `order_id` when calling `get_order_by_id`") + resource_path = '/store/order/{orderId}'.replace('{format}', 'json') method = 'GET' @@ -290,9 +293,6 @@ class StoreApi(object): If the method is called asynchronously, returns the request thread. """ - # verify the required parameter 'order_id' is set - if order_id is None: - raise ValueError("Missing the required parameter `order_id` when calling `delete_order`") all_params = ['order_id'] all_params.append('callback') @@ -307,6 +307,10 @@ class StoreApi(object): params[key] = val del params['kwargs'] + # verify the required parameter 'order_id' is set + if ('order_id' not in params) or (params['order_id'] is None): + raise ValueError("Missing the required parameter `order_id` when calling `delete_order`") + resource_path = '/store/order/{orderId}'.replace('{format}', 'json') method = 'DELETE' diff --git a/samples/client/petstore/python/swagger_client/apis/user_api.py b/samples/client/petstore/python/swagger_client/apis/user_api.py index aa35e6db53a..4394941b1d5 100644 --- a/samples/client/petstore/python/swagger_client/apis/user_api.py +++ b/samples/client/petstore/python/swagger_client/apis/user_api.py @@ -79,6 +79,7 @@ class UserApi(object): params[key] = val del params['kwargs'] + resource_path = '/user'.replace('{format}', 'json') method = 'POST' @@ -154,6 +155,7 @@ class UserApi(object): params[key] = val del params['kwargs'] + resource_path = '/user/createWithArray'.replace('{format}', 'json') method = 'POST' @@ -229,6 +231,7 @@ class UserApi(object): params[key] = val del params['kwargs'] + resource_path = '/user/createWithList'.replace('{format}', 'json') method = 'POST' @@ -305,6 +308,7 @@ class UserApi(object): params[key] = val del params['kwargs'] + resource_path = '/user/login'.replace('{format}', 'json') method = 'GET' @@ -381,6 +385,7 @@ class UserApi(object): params[key] = val del params['kwargs'] + resource_path = '/user/logout'.replace('{format}', 'json') method = 'GET' @@ -440,9 +445,6 @@ class UserApi(object): If the method is called asynchronously, returns the request thread. """ - # verify the required parameter 'username' is set - if username is None: - raise ValueError("Missing the required parameter `username` when calling `get_user_by_name`") all_params = ['username'] all_params.append('callback') @@ -457,6 +459,10 @@ class UserApi(object): params[key] = val del params['kwargs'] + # verify the required parameter 'username' is set + if ('username' not in params) or (params['username'] is None): + raise ValueError("Missing the required parameter `username` when calling `get_user_by_name`") + resource_path = '/user/{username}'.replace('{format}', 'json') method = 'GET' @@ -519,9 +525,6 @@ class UserApi(object): If the method is called asynchronously, returns the request thread. """ - # verify the required parameter 'username' is set - if username is None: - raise ValueError("Missing the required parameter `username` when calling `update_user`") all_params = ['username', 'body'] all_params.append('callback') @@ -536,6 +539,10 @@ class UserApi(object): params[key] = val del params['kwargs'] + # verify the required parameter 'username' is set + if ('username' not in params) or (params['username'] is None): + raise ValueError("Missing the required parameter `username` when calling `update_user`") + resource_path = '/user/{username}'.replace('{format}', 'json') method = 'PUT' @@ -599,9 +606,6 @@ class UserApi(object): If the method is called asynchronously, returns the request thread. """ - # verify the required parameter 'username' is set - if username is None: - raise ValueError("Missing the required parameter `username` when calling `delete_user`") all_params = ['username'] all_params.append('callback') @@ -616,6 +620,10 @@ class UserApi(object): params[key] = val del params['kwargs'] + # verify the required parameter 'username' is set + if ('username' not in params) or (params['username'] is None): + raise ValueError("Missing the required parameter `username` when calling `delete_user`") + resource_path = '/user/{username}'.replace('{format}', 'json') method = 'DELETE' From e4ac6ef033f852c03e1ff73b26ec074691d57f51 Mon Sep 17 00:00:00 2001 From: xhh Date: Fri, 20 Nov 2015 17:34:46 +0800 Subject: [PATCH 038/211] Ignore auths when value not specified in Java clients --- .../src/main/resources/Java/auth/ApiKeyAuth.mustache | 3 +++ .../src/main/resources/Java/auth/HttpBasicAuth.mustache | 3 +++ .../Java/libraries/okhttp-gson/auth/HttpBasicAuth.mustache | 3 +++ .../src/main/java/io/swagger/client/auth/ApiKeyAuth.java | 5 ++++- .../src/main/java/io/swagger/client/auth/HttpBasicAuth.java | 5 ++++- .../src/main/java/io/swagger/client/auth/ApiKeyAuth.java | 5 ++++- .../src/main/java/io/swagger/client/auth/HttpBasicAuth.java | 5 ++++- .../src/main/java/io/swagger/client/auth/ApiKeyAuth.java | 3 +++ .../src/main/java/io/swagger/client/auth/HttpBasicAuth.java | 3 +++ 9 files changed, 31 insertions(+), 4 deletions(-) diff --git a/modules/swagger-codegen/src/main/resources/Java/auth/ApiKeyAuth.mustache b/modules/swagger-codegen/src/main/resources/Java/auth/ApiKeyAuth.mustache index 04be4812292..931d17b0d04 100644 --- a/modules/swagger-codegen/src/main/resources/Java/auth/ApiKeyAuth.mustache +++ b/modules/swagger-codegen/src/main/resources/Java/auth/ApiKeyAuth.mustache @@ -44,6 +44,9 @@ public class ApiKeyAuth implements Authentication { @Override public void applyToParams(List queryParams, Map headerParams) { + if (apiKey == null) { + return; + } String value; if (apiKeyPrefix != null) { value = apiKeyPrefix + " " + apiKey; diff --git a/modules/swagger-codegen/src/main/resources/Java/auth/HttpBasicAuth.mustache b/modules/swagger-codegen/src/main/resources/Java/auth/HttpBasicAuth.mustache index 63813e2504e..509f4742b61 100644 --- a/modules/swagger-codegen/src/main/resources/Java/auth/HttpBasicAuth.mustache +++ b/modules/swagger-codegen/src/main/resources/Java/auth/HttpBasicAuth.mustache @@ -31,6 +31,9 @@ public class HttpBasicAuth implements Authentication { @Override public void applyToParams(List queryParams, Map headerParams) { + if (username == null && password == null) { + return; + } String str = (username == null ? "" : username) + ":" + (password == null ? "" : password); try { headerParams.put("Authorization", "Basic " + DatatypeConverter.printBase64Binary(str.getBytes("UTF-8"))); diff --git a/modules/swagger-codegen/src/main/resources/Java/libraries/okhttp-gson/auth/HttpBasicAuth.mustache b/modules/swagger-codegen/src/main/resources/Java/libraries/okhttp-gson/auth/HttpBasicAuth.mustache index 5b4070fcafb..76fa4a2d0a3 100644 --- a/modules/swagger-codegen/src/main/resources/Java/libraries/okhttp-gson/auth/HttpBasicAuth.mustache +++ b/modules/swagger-codegen/src/main/resources/Java/libraries/okhttp-gson/auth/HttpBasicAuth.mustache @@ -31,6 +31,9 @@ public class HttpBasicAuth implements Authentication { @Override public void applyToParams(List queryParams, Map headerParams) { + if (username == null && password == null) { + return; + } String str = (username == null ? "" : username) + ":" + (password == null ? "" : password); try { headerParams.put("Authorization", "Basic " + Base64.encodeToString(str.getBytes("UTF-8"), false)); diff --git a/samples/client/petstore/java/default/src/main/java/io/swagger/client/auth/ApiKeyAuth.java b/samples/client/petstore/java/default/src/main/java/io/swagger/client/auth/ApiKeyAuth.java index 14891e3504f..0011210c8cc 100644 --- a/samples/client/petstore/java/default/src/main/java/io/swagger/client/auth/ApiKeyAuth.java +++ b/samples/client/petstore/java/default/src/main/java/io/swagger/client/auth/ApiKeyAuth.java @@ -5,7 +5,7 @@ import io.swagger.client.Pair; import java.util.Map; import java.util.List; -@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-10-30T16:36:47.681+08:00") +@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-11-20T17:28:23.285+08:00") public class ApiKeyAuth implements Authentication { private final String location; private final String paramName; @@ -44,6 +44,9 @@ public class ApiKeyAuth implements Authentication { @Override public void applyToParams(List queryParams, Map headerParams) { + if (apiKey == null) { + return; + } String value; if (apiKeyPrefix != null) { value = apiKeyPrefix + " " + apiKey; diff --git a/samples/client/petstore/java/default/src/main/java/io/swagger/client/auth/HttpBasicAuth.java b/samples/client/petstore/java/default/src/main/java/io/swagger/client/auth/HttpBasicAuth.java index 99ff90e4c6f..074f1833542 100644 --- a/samples/client/petstore/java/default/src/main/java/io/swagger/client/auth/HttpBasicAuth.java +++ b/samples/client/petstore/java/default/src/main/java/io/swagger/client/auth/HttpBasicAuth.java @@ -8,7 +8,7 @@ import java.util.List; import java.io.UnsupportedEncodingException; import javax.xml.bind.DatatypeConverter; -@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-10-30T16:36:47.681+08:00") +@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-11-20T17:28:23.285+08:00") public class HttpBasicAuth implements Authentication { private String username; private String password; @@ -31,6 +31,9 @@ public class HttpBasicAuth implements Authentication { @Override public void applyToParams(List queryParams, Map headerParams) { + if (username == null && password == null) { + return; + } String str = (username == null ? "" : username) + ":" + (password == null ? "" : password); try { headerParams.put("Authorization", "Basic " + DatatypeConverter.printBase64Binary(str.getBytes("UTF-8"))); diff --git a/samples/client/petstore/java/jersey2/src/main/java/io/swagger/client/auth/ApiKeyAuth.java b/samples/client/petstore/java/jersey2/src/main/java/io/swagger/client/auth/ApiKeyAuth.java index d7d3d3e63b0..bc3bdaefc44 100644 --- a/samples/client/petstore/java/jersey2/src/main/java/io/swagger/client/auth/ApiKeyAuth.java +++ b/samples/client/petstore/java/jersey2/src/main/java/io/swagger/client/auth/ApiKeyAuth.java @@ -5,7 +5,7 @@ import io.swagger.client.Pair; import java.util.Map; import java.util.List; -@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-11-17T11:17:50.535-05:00") +@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-11-20T17:28:47.318+08:00") public class ApiKeyAuth implements Authentication { private final String location; private final String paramName; @@ -44,6 +44,9 @@ public class ApiKeyAuth implements Authentication { @Override public void applyToParams(List queryParams, Map headerParams) { + if (apiKey == null) { + return; + } String value; if (apiKeyPrefix != null) { value = apiKeyPrefix + " " + apiKey; diff --git a/samples/client/petstore/java/jersey2/src/main/java/io/swagger/client/auth/HttpBasicAuth.java b/samples/client/petstore/java/jersey2/src/main/java/io/swagger/client/auth/HttpBasicAuth.java index 390502ab9e5..0abfc056e1d 100644 --- a/samples/client/petstore/java/jersey2/src/main/java/io/swagger/client/auth/HttpBasicAuth.java +++ b/samples/client/petstore/java/jersey2/src/main/java/io/swagger/client/auth/HttpBasicAuth.java @@ -8,7 +8,7 @@ import java.util.List; import java.io.UnsupportedEncodingException; import javax.xml.bind.DatatypeConverter; -@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-11-17T11:17:50.535-05:00") +@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-11-20T17:28:47.318+08:00") public class HttpBasicAuth implements Authentication { private String username; private String password; @@ -31,6 +31,9 @@ public class HttpBasicAuth implements Authentication { @Override public void applyToParams(List queryParams, Map headerParams) { + if (username == null && password == null) { + return; + } String str = (username == null ? "" : username) + ":" + (password == null ? "" : password); try { headerParams.put("Authorization", "Basic " + DatatypeConverter.printBase64Binary(str.getBytes("UTF-8"))); diff --git a/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/auth/ApiKeyAuth.java b/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/auth/ApiKeyAuth.java index ee2b2fe13ed..258cfea3f7a 100644 --- a/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/auth/ApiKeyAuth.java +++ b/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/auth/ApiKeyAuth.java @@ -44,6 +44,9 @@ public class ApiKeyAuth implements Authentication { @Override public void applyToParams(List queryParams, Map headerParams) { + if (apiKey == null) { + return; + } String value; if (apiKeyPrefix != null) { value = apiKeyPrefix + " " + apiKey; diff --git a/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/auth/HttpBasicAuth.java b/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/auth/HttpBasicAuth.java index d2b56433169..38617121e30 100644 --- a/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/auth/HttpBasicAuth.java +++ b/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/auth/HttpBasicAuth.java @@ -31,6 +31,9 @@ public class HttpBasicAuth implements Authentication { @Override public void applyToParams(List queryParams, Map headerParams) { + if (username == null && password == null) { + return; + } String str = (username == null ? "" : username) + ":" + (password == null ? "" : password); try { headerParams.put("Authorization", "Basic " + Base64.encodeToString(str.getBytes("UTF-8"), false)); From 1d47ca69feaa49ab62d6fe422543bf2fccd883d8 Mon Sep 17 00:00:00 2001 From: wing328 Date: Fri, 20 Nov 2015 17:36:17 +0800 Subject: [PATCH 039/211] update perl auth to skip null apikey/username&password --- .../main/resources/perl/ApiClient.mustache | 20 ++++++++++++++++--- .../perl/lib/WWW/SwaggerClient/ApiClient.pm | 12 ++++++++--- .../perl/lib/WWW/SwaggerClient/Role.pm | 4 ++-- 3 files changed, 28 insertions(+), 8 deletions(-) diff --git a/modules/swagger-codegen/src/main/resources/perl/ApiClient.mustache b/modules/swagger-codegen/src/main/resources/perl/ApiClient.mustache index bf1220912d2..1623721cc70 100644 --- a/modules/swagger-codegen/src/main/resources/perl/ApiClient.mustache +++ b/modules/swagger-codegen/src/main/resources/perl/ApiClient.mustache @@ -317,14 +317,28 @@ sub update_params_for_auth { foreach my $auth (@$auth_settings) { # determine which one to use if (!defined($auth)) { + # TODO show warning about auth setting not defined } {{#authMethods}}elsif ($auth eq '{{name}}') { - {{#isApiKey}}{{#isKeyInHeader}}$header_params->{'{{keyParamName}}'} = $self->get_api_key_with_prefix('{{keyParamName}}');{{/isKeyInHeader}}{{#isKeyInQuery}}$query_params->{'{{keyParamName}}'} = $self->get_api_key_with_prefix('{{keyParamName}}');{{/isKeyInQuery}}{{/isApiKey}}{{#isBasic}}$header_params->{'Authorization'} = 'Basic '.encode_base64($WWW::{{moduleName}}::Configuration::username.":".$WWW::{{moduleName}}::Configuration::password);{{/isBasic}} - {{#isOAuth}}$header_params->{'Authorization'} = 'Bearer ' . $WWW::{{moduleName}}::Configuration::access_token;{{/isOAuth}} + {{#isApiKey}}{{#isKeyInHeader}} + my $api_key = $self->get_api_key_with_prefix('{{keyParamName}}'); + if ($api_key) { + $header_params->{'{{keyParamName}}'} = $api_key; + }{{/isKeyInHeader}}{{#isKeyInQuery}} + my $api_key = $self->get_api_key_with_prefix('{{keyParamName}}'); + if ($api_key) { + $query_params->{'{{keyParamName}}'} = $api_key; + }{{/isKeyInQuery}}{{/isApiKey}}{{#isBasic}} + if ($WWW::{{moduleName}}::Configuration::username || $WWW::{{moduleName}}::Configuration::password) { + $header_params->{'Authorization'} = 'Basic ' . encode_base64($WWW::{{moduleName}}::Configuration::username . ":" . $WWW::{{moduleName}}::Configuration::password); + }{{/isBasic}}{{#isOAuth}} + if ($WWW::{{moduleName}}::Configuration::access_token) { + $header_params->{'Authorization'} = 'Bearer ' . $WWW::{{moduleName}}::Configuration::access_token; + }{{/isOAuth}} } {{/authMethods}} else { - # TODO show warning about security definition not found + # TODO show warning about security definition not found } } } diff --git a/samples/client/petstore/perl/lib/WWW/SwaggerClient/ApiClient.pm b/samples/client/petstore/perl/lib/WWW/SwaggerClient/ApiClient.pm index dbd822cc1d4..11f2ab3f236 100644 --- a/samples/client/petstore/perl/lib/WWW/SwaggerClient/ApiClient.pm +++ b/samples/client/petstore/perl/lib/WWW/SwaggerClient/ApiClient.pm @@ -317,18 +317,24 @@ sub update_params_for_auth { foreach my $auth (@$auth_settings) { # determine which one to use if (!defined($auth)) { + # TODO show warning about auth setting not defined } elsif ($auth eq 'api_key') { - $header_params->{'api_key'} = $self->get_api_key_with_prefix('api_key'); + my $api_key = $self->get_api_key_with_prefix('api_key'); + if ($api_key) { + $header_params->{'api_key'} = $api_key; + } } elsif ($auth eq 'petstore_auth') { - $header_params->{'Authorization'} = 'Bearer ' . $WWW::SwaggerClient::Configuration::access_token; + if ($WWW::SwaggerClient::Configuration::access_token) { + $header_params->{'Authorization'} = 'Bearer ' . $WWW::SwaggerClient::Configuration::access_token; + } } else { - # TODO show warning about security definition not found + # TODO show warning about security definition not found } } } diff --git a/samples/client/petstore/perl/lib/WWW/SwaggerClient/Role.pm b/samples/client/petstore/perl/lib/WWW/SwaggerClient/Role.pm index feb5228cb61..941d9e0ce24 100644 --- a/samples/client/petstore/perl/lib/WWW/SwaggerClient/Role.pm +++ b/samples/client/petstore/perl/lib/WWW/SwaggerClient/Role.pm @@ -37,7 +37,7 @@ has version_info => ( is => 'ro', default => sub { { app_name => 'Swagger Petstore', app_version => '1.0.0', - generated_date => '2015-11-13T20:46:43.271Z', + generated_date => '2015-11-20T17:35:18.902+08:00', generator_class => 'class io.swagger.codegen.languages.PerlClientCodegen', } }, documentation => 'Information about the application version and the codegen codebase version' @@ -103,7 +103,7 @@ Automatically generated by the Perl Swagger Codegen project: =over 4 -=item Build date: 2015-11-13T20:46:43.271Z +=item Build date: 2015-11-20T17:35:18.902+08:00 =item Build package: class io.swagger.codegen.languages.PerlClientCodegen From 136d0aaa87970e314c0e542e60f720a590adaca6 Mon Sep 17 00:00:00 2001 From: xhh Date: Fri, 20 Nov 2015 20:10:05 +0800 Subject: [PATCH 040/211] Use okhttp's Credentials class to build basic auth string --- .../okhttp-gson/auth/HttpBasicAuth.mustache | 11 +++---- .../Java/libraries/okhttp-gson/pom.mustache | 5 --- .../client/petstore/java/okhttp-gson/pom.xml | 5 --- .../io/swagger/client/auth/HttpBasicAuth.java | 11 +++---- .../swagger/client/auth/ApiKeyAuthTest.java | 31 ++++++++++++++++++- .../client/auth/HttpBasicAuthTest.java | 10 ++++++ 6 files changed, 48 insertions(+), 25 deletions(-) diff --git a/modules/swagger-codegen/src/main/resources/Java/libraries/okhttp-gson/auth/HttpBasicAuth.mustache b/modules/swagger-codegen/src/main/resources/Java/libraries/okhttp-gson/auth/HttpBasicAuth.mustache index 76fa4a2d0a3..f3ed85d980b 100644 --- a/modules/swagger-codegen/src/main/resources/Java/libraries/okhttp-gson/auth/HttpBasicAuth.mustache +++ b/modules/swagger-codegen/src/main/resources/Java/libraries/okhttp-gson/auth/HttpBasicAuth.mustache @@ -2,7 +2,7 @@ package {{invokerPackage}}.auth; import {{invokerPackage}}.Pair; -import com.migcomponents.migbase64.Base64; +import com.squareup.okhttp.Credentials; import java.util.Map; import java.util.List; @@ -34,11 +34,8 @@ public class HttpBasicAuth implements Authentication { if (username == null && password == null) { return; } - String str = (username == null ? "" : username) + ":" + (password == null ? "" : password); - try { - headerParams.put("Authorization", "Basic " + Base64.encodeToString(str.getBytes("UTF-8"), false)); - } catch (UnsupportedEncodingException e) { - throw new RuntimeException(e); - } + headerParams.put("Authorization", Credentials.basic( + username == null ? "" : username, + password == null ? "" : password)); } } diff --git a/modules/swagger-codegen/src/main/resources/Java/libraries/okhttp-gson/pom.mustache b/modules/swagger-codegen/src/main/resources/Java/libraries/okhttp-gson/pom.mustache index 67fc10e8323..0d7e9015101 100644 --- a/modules/swagger-codegen/src/main/resources/Java/libraries/okhttp-gson/pom.mustache +++ b/modules/swagger-codegen/src/main/resources/Java/libraries/okhttp-gson/pom.mustache @@ -122,11 +122,6 @@ gson ${gson-version} - - com.brsanthu - migbase64 - 2.2 - diff --git a/samples/client/petstore/java/okhttp-gson/pom.xml b/samples/client/petstore/java/okhttp-gson/pom.xml index 2442e1c318e..9fa057be939 100644 --- a/samples/client/petstore/java/okhttp-gson/pom.xml +++ b/samples/client/petstore/java/okhttp-gson/pom.xml @@ -122,11 +122,6 @@ gson ${gson-version} - - com.brsanthu - migbase64 - 2.2 - diff --git a/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/auth/HttpBasicAuth.java b/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/auth/HttpBasicAuth.java index 38617121e30..6ed16d1db30 100644 --- a/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/auth/HttpBasicAuth.java +++ b/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/auth/HttpBasicAuth.java @@ -2,7 +2,7 @@ package io.swagger.client.auth; import io.swagger.client.Pair; -import com.migcomponents.migbase64.Base64; +import com.squareup.okhttp.Credentials; import java.util.Map; import java.util.List; @@ -34,11 +34,8 @@ public class HttpBasicAuth implements Authentication { if (username == null && password == null) { return; } - String str = (username == null ? "" : username) + ":" + (password == null ? "" : password); - try { - headerParams.put("Authorization", "Basic " + Base64.encodeToString(str.getBytes("UTF-8"), false)); - } catch (UnsupportedEncodingException e) { - throw new RuntimeException(e); - } + headerParams.put("Authorization", Credentials.basic( + username == null ? "" : username, + password == null ? "" : password)); } } diff --git a/samples/client/petstore/java/okhttp-gson/src/test/java/io/swagger/client/auth/ApiKeyAuthTest.java b/samples/client/petstore/java/okhttp-gson/src/test/java/io/swagger/client/auth/ApiKeyAuthTest.java index 5bdb4fb78fb..3715e9724e6 100644 --- a/samples/client/petstore/java/okhttp-gson/src/test/java/io/swagger/client/auth/ApiKeyAuthTest.java +++ b/samples/client/petstore/java/okhttp-gson/src/test/java/io/swagger/client/auth/ApiKeyAuthTest.java @@ -29,9 +29,23 @@ public class ApiKeyAuthTest { assertEquals(0, headerParams.size()); } + @Test + public void testApplyToParamsInQueryWithNullValue() { + List queryParams = new ArrayList(); + Map headerParams = new HashMap(); + + ApiKeyAuth auth = new ApiKeyAuth("query", "api_key"); + auth.setApiKey(null); + auth.applyToParams(queryParams, headerParams); + + // no changes to parameters + assertEquals(0, queryParams.size()); + assertEquals(0, headerParams.size()); + } + @Test public void testApplyToParamsInHeaderWithPrefix() { - List queryParams = new ArrayList(); + List queryParams = new ArrayList(); Map headerParams = new HashMap(); ApiKeyAuth auth = new ApiKeyAuth("header", "X-API-TOKEN"); @@ -44,4 +58,19 @@ public class ApiKeyAuthTest { assertEquals(1, headerParams.size()); assertEquals("Token my-api-token", headerParams.get("X-API-TOKEN")); } + + @Test + public void testApplyToParamsInHeaderWithNullValue() { + List queryParams = new ArrayList(); + Map headerParams = new HashMap(); + + ApiKeyAuth auth = new ApiKeyAuth("header", "X-API-TOKEN"); + auth.setApiKey(null); + auth.setApiKeyPrefix("Token"); + auth.applyToParams(queryParams, headerParams); + + // no changes to parameters + assertEquals(0, queryParams.size()); + assertEquals(0, headerParams.size()); + } } diff --git a/samples/client/petstore/java/okhttp-gson/src/test/java/io/swagger/client/auth/HttpBasicAuthTest.java b/samples/client/petstore/java/okhttp-gson/src/test/java/io/swagger/client/auth/HttpBasicAuthTest.java index 52c5497ba83..ddee04f57fc 100644 --- a/samples/client/petstore/java/okhttp-gson/src/test/java/io/swagger/client/auth/HttpBasicAuthTest.java +++ b/samples/client/petstore/java/okhttp-gson/src/test/java/io/swagger/client/auth/HttpBasicAuthTest.java @@ -48,5 +48,15 @@ public class HttpBasicAuthTest { // the string below is base64-encoded result of "my-username:" with the "Basic " prefix expected = "Basic bXktdXNlcm5hbWU6"; assertEquals(expected, headerParams.get("Authorization")); + + // null username and password should be ignored + queryParams = new ArrayList(); + headerParams = new HashMap(); + auth.setUsername(null); + auth.setPassword(null); + auth.applyToParams(queryParams, headerParams); + // no changes to parameters + assertEquals(0, queryParams.size()); + assertEquals(0, headerParams.size()); } } From 1496bf89b96112995f6fe7082877ff8b45bd9fe3 Mon Sep 17 00:00:00 2001 From: wing328 Date: Sat, 21 Nov 2015 13:22:00 +0800 Subject: [PATCH 041/211] add equal and gethashcode to C# model --- .../src/main/resources/csharp/model.mustache | 122 +++++-- .../main/csharp/IO/Swagger/Model/Category.cs | 147 ++++++--- .../src/main/csharp/IO/Swagger/Model/Order.cs | 249 ++++++++++----- .../src/main/csharp/IO/Swagger/Model/Pet.cs | 249 ++++++++++----- .../src/main/csharp/IO/Swagger/Model/Tag.cs | 147 ++++++--- .../src/main/csharp/IO/Swagger/Model/User.cs | 299 ++++++++++++------ .../csharp/SwaggerClientTest/TestPet.cs | 46 +++ .../bin/Debug/SwaggerClientTest.dll | Bin 62464 -> 67072 bytes .../bin/Debug/SwaggerClientTest.dll.mdb | Bin 19469 -> 21049 bytes ...ClientTest.csproj.FilesWrittenAbsolute.txt | 16 +- .../obj/Debug/SwaggerClientTest.dll | Bin 62464 -> 67072 bytes .../obj/Debug/SwaggerClientTest.dll.mdb | Bin 19469 -> 21049 bytes 12 files changed, 883 insertions(+), 392 deletions(-) diff --git a/modules/swagger-codegen/src/main/resources/csharp/model.mustache b/modules/swagger-codegen/src/main/resources/csharp/model.mustache index d40ece4cc02..c95d2f1a1b9 100644 --- a/modules/swagger-codegen/src/main/resources/csharp/model.mustache +++ b/modules/swagger-codegen/src/main/resources/csharp/model.mustache @@ -8,46 +8,98 @@ using Newtonsoft.Json; {{#models}} {{#model}} -namespace {{packageName}}.Model { - - /// - /// {{description}} - /// - [DataContract] - public class {{classname}}{{#parent}} : {{{parent}}}{{/parent}} { - {{#vars}} - /// - /// {{^description}}Gets or Sets {{{name}}}{{/description}}{{#description}}{{{description}}}{{/description}} - /// {{#description}} - /// {{{description}}}{{/description}} - [DataMember(Name="{{baseName}}", EmitDefaultValue=false)] - public {{{datatype}}} {{name}} { get; set; } - - {{/vars}} +namespace {{packageName}}.Model +{ /// - /// Get the string presentation of the object + /// {{description}} /// - /// String presentation of the object - public override string ToString() { - var sb = new StringBuilder(); - sb.Append("class {{classname}} {\n"); - {{#vars}} - sb.Append(" {{name}}: ").Append({{name}}).Append("\n"); - {{/vars}} - sb.Append("}\n"); - return sb.ToString(); - } + [DataContract] + public class {{classname}} : IEquatable<{{classname}}>{{#parent}}, {{{parent}}}{{/parent}} + { + {{#vars}} + /// + /// {{^description}}Gets or Sets {{{name}}}{{/description}}{{#description}}{{{description}}}{{/description}} + /// {{#description}} + /// {{{description}}}{{/description}} + [DataMember(Name="{{baseName}}", EmitDefaultValue=false)] + public {{{datatype}}} {{name}} { get; set; } + + {{/vars}} + + /// + /// Returns the string presentation of the object + /// + /// String presentation of the object + public override string ToString() + { + var sb = new StringBuilder(); + sb.Append("class {{classname}} {\n"); + {{#vars}}sb.Append(" {{name}}: ").Append({{name}}).Append("\n"); + {{/vars}} + sb.Append("}\n"); + return sb.ToString(); + } + + /// + /// Returns the JSON string presentation of the object + /// + /// JSON string presentation of the object + public {{#parent}} new {{/parent}}string ToJson() + { + return JsonConvert.SerializeObject(this, Formatting.Indented); + } - /// - /// Get the JSON string presentation of the object - /// - /// JSON string presentation of the object - public {{#parent}} new {{/parent}}string ToJson() { - return JsonConvert.SerializeObject(this, Formatting.Indented); - } + /// + /// Returns true if objects are equal + /// + /// Object to be compared + /// Boolean + public override bool Equals(object obj) + { + // credit: http://stackoverflow.com/a/10454552/677735 + return this.Equals(obj as {{classname}}); + } -} + /// + /// Returns true if {{classname}} instances are equal + /// + /// Instance of {{classname}} to be compared + /// Boolean + public bool Equals({{classname}} other) + { + // credit: http://stackoverflow.com/a/10454552/677735 + if (other == null) + return false; + + return {{#vars}} + ( + this.{{name}} == other.{{name}} || + this.{{name}} != null && + this.{{name}}.Equals(other.{{name}}) + ){{#hasMore}} && {{/hasMore}}{{/vars}}; + } + + /// + /// Gets the hash code + /// + /// Hash code + public override int GetHashCode() + { + // credit: http://stackoverflow.com/a/263416/677735 + unchecked // Overflow is fine, just wrap + { + int hash = 41; + // Suitable nullity checks etc, of course :) + {{#vars}} + if (this.{{name}} != null) + hash = hash * 57 + this.{{name}}.GetHashCode(); + {{/vars}} + return hash; + } + } + + } {{/model}} {{/models}} } diff --git a/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Model/Category.cs b/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Model/Category.cs index 56ebfdb3b7b..6b39196b2b7 100644 --- a/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Model/Category.cs +++ b/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Model/Category.cs @@ -6,52 +6,111 @@ using System.Collections.Generic; using System.Runtime.Serialization; using Newtonsoft.Json; -namespace IO.Swagger.Model { - - /// - /// - /// - [DataContract] - public class Category { - - /// - /// Gets or Sets Id - /// - [DataMember(Name="id", EmitDefaultValue=false)] - public long? Id { get; set; } - - - /// - /// Gets or Sets Name - /// - [DataMember(Name="name", EmitDefaultValue=false)] - public string Name { get; set; } - - +namespace IO.Swagger.Model +{ /// - /// Get the string presentation of the object + /// /// - /// String presentation of the object - public override string ToString() { - var sb = new StringBuilder(); - sb.Append("class Category {\n"); - - sb.Append(" Id: ").Append(Id).Append("\n"); - - sb.Append(" Name: ").Append(Name).Append("\n"); - - sb.Append("}\n"); - return sb.ToString(); + [DataContract] + public class Category : IEquatable + { + + /// + /// Gets or Sets Id + /// + [DataMember(Name="id", EmitDefaultValue=false)] + public long? Id { get; set; } + + + /// + /// Gets or Sets Name + /// + [DataMember(Name="name", EmitDefaultValue=false)] + public string Name { get; set; } + + + + /// + /// Returns the string presentation of the object + /// + /// String presentation of the object + public override string ToString() + { + var sb = new StringBuilder(); + sb.Append("class Category {\n"); + sb.Append(" Id: ").Append(Id).Append("\n"); + sb.Append(" Name: ").Append(Name).Append("\n"); + + sb.Append("}\n"); + return sb.ToString(); + } + + /// + /// Returns the JSON string presentation of the object + /// + /// JSON string presentation of the object + public string ToJson() + { + return JsonConvert.SerializeObject(this, Formatting.Indented); + } + + /// + /// Returns true if objects are equal + /// + /// Object to be compared + /// Boolean + public override bool Equals(object obj) + { + // credit: http://stackoverflow.com/a/10454552/677735 + return this.Equals(obj as Category); + } + + /// + /// Returns true if Category instances are equal + /// + /// Instance of Category to be compared + /// Boolean + public bool Equals(Category other) + { + // credit: http://stackoverflow.com/a/10454552/677735 + if (other == null) + return false; + + return + ( + this.Id == other.Id || + this.Id != null && + this.Id.Equals(other.Id) + ) && + ( + this.Name == other.Name || + this.Name != null && + this.Name.Equals(other.Name) + ); + } + + /// + /// Gets the hash code + /// + /// Hash code + public override int GetHashCode() + { + // credit: http://stackoverflow.com/a/263416/677735 + unchecked // Overflow is fine, just wrap + { + int hash = 41; + // Suitable nullity checks etc, of course :) + + if (this.Id != null) + hash = hash * 57 + this.Id.GetHashCode(); + + if (this.Name != null) + hash = hash * 57 + this.Name.GetHashCode(); + + return hash; + } + } + } - - /// - /// Get the JSON string presentation of the object - /// - /// JSON string presentation of the object - public string ToJson() { - return JsonConvert.SerializeObject(this, Formatting.Indented); - } - -} } diff --git a/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Model/Order.cs b/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Model/Order.cs index 1fa62c1605a..8346e1cc6d8 100644 --- a/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Model/Order.cs +++ b/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Model/Order.cs @@ -6,89 +6,176 @@ using System.Collections.Generic; using System.Runtime.Serialization; using Newtonsoft.Json; -namespace IO.Swagger.Model { - - /// - /// - /// - [DataContract] - public class Order { - - /// - /// Gets or Sets Id - /// - [DataMember(Name="id", EmitDefaultValue=false)] - public long? Id { get; set; } - - - /// - /// Gets or Sets PetId - /// - [DataMember(Name="petId", EmitDefaultValue=false)] - public long? PetId { get; set; } - - - /// - /// Gets or Sets Quantity - /// - [DataMember(Name="quantity", EmitDefaultValue=false)] - public int? Quantity { get; set; } - - - /// - /// Gets or Sets ShipDate - /// - [DataMember(Name="shipDate", EmitDefaultValue=false)] - public DateTime? ShipDate { get; set; } - - - /// - /// Order Status - /// - /// Order Status - [DataMember(Name="status", EmitDefaultValue=false)] - public string Status { get; set; } - - - /// - /// Gets or Sets Complete - /// - [DataMember(Name="complete", EmitDefaultValue=false)] - public bool? Complete { get; set; } - - +namespace IO.Swagger.Model +{ /// - /// Get the string presentation of the object + /// /// - /// String presentation of the object - public override string ToString() { - var sb = new StringBuilder(); - sb.Append("class Order {\n"); - - sb.Append(" Id: ").Append(Id).Append("\n"); - - sb.Append(" PetId: ").Append(PetId).Append("\n"); - - sb.Append(" Quantity: ").Append(Quantity).Append("\n"); - - sb.Append(" ShipDate: ").Append(ShipDate).Append("\n"); - - sb.Append(" Status: ").Append(Status).Append("\n"); - - sb.Append(" Complete: ").Append(Complete).Append("\n"); - - sb.Append("}\n"); - return sb.ToString(); + [DataContract] + public class Order : IEquatable + { + + /// + /// Gets or Sets Id + /// + [DataMember(Name="id", EmitDefaultValue=false)] + public long? Id { get; set; } + + + /// + /// Gets or Sets PetId + /// + [DataMember(Name="petId", EmitDefaultValue=false)] + public long? PetId { get; set; } + + + /// + /// Gets or Sets Quantity + /// + [DataMember(Name="quantity", EmitDefaultValue=false)] + public int? Quantity { get; set; } + + + /// + /// Gets or Sets ShipDate + /// + [DataMember(Name="shipDate", EmitDefaultValue=false)] + public DateTime? ShipDate { get; set; } + + + /// + /// Order Status + /// + /// Order Status + [DataMember(Name="status", EmitDefaultValue=false)] + public string Status { get; set; } + + + /// + /// Gets or Sets Complete + /// + [DataMember(Name="complete", EmitDefaultValue=false)] + public bool? Complete { get; set; } + + + + /// + /// Returns the string presentation of the object + /// + /// String presentation of the object + public override string ToString() + { + var sb = new StringBuilder(); + sb.Append("class Order {\n"); + sb.Append(" Id: ").Append(Id).Append("\n"); + sb.Append(" PetId: ").Append(PetId).Append("\n"); + sb.Append(" Quantity: ").Append(Quantity).Append("\n"); + sb.Append(" ShipDate: ").Append(ShipDate).Append("\n"); + sb.Append(" Status: ").Append(Status).Append("\n"); + sb.Append(" Complete: ").Append(Complete).Append("\n"); + + sb.Append("}\n"); + return sb.ToString(); + } + + /// + /// Returns the JSON string presentation of the object + /// + /// JSON string presentation of the object + public string ToJson() + { + return JsonConvert.SerializeObject(this, Formatting.Indented); + } + + /// + /// Returns true if objects are equal + /// + /// Object to be compared + /// Boolean + public override bool Equals(object obj) + { + // credit: http://stackoverflow.com/a/10454552/677735 + return this.Equals(obj as Order); + } + + /// + /// Returns true if Order instances are equal + /// + /// Instance of Order to be compared + /// Boolean + public bool Equals(Order other) + { + // credit: http://stackoverflow.com/a/10454552/677735 + if (other == null) + return false; + + return + ( + this.Id == other.Id || + this.Id != null && + this.Id.Equals(other.Id) + ) && + ( + this.PetId == other.PetId || + this.PetId != null && + this.PetId.Equals(other.PetId) + ) && + ( + this.Quantity == other.Quantity || + this.Quantity != null && + this.Quantity.Equals(other.Quantity) + ) && + ( + this.ShipDate == other.ShipDate || + this.ShipDate != null && + this.ShipDate.Equals(other.ShipDate) + ) && + ( + this.Status == other.Status || + this.Status != null && + this.Status.Equals(other.Status) + ) && + ( + this.Complete == other.Complete || + this.Complete != null && + this.Complete.Equals(other.Complete) + ); + } + + /// + /// Gets the hash code + /// + /// Hash code + public override int GetHashCode() + { + // credit: http://stackoverflow.com/a/263416/677735 + unchecked // Overflow is fine, just wrap + { + int hash = 41; + // Suitable nullity checks etc, of course :) + + if (this.Id != null) + hash = hash * 57 + this.Id.GetHashCode(); + + if (this.PetId != null) + hash = hash * 57 + this.PetId.GetHashCode(); + + if (this.Quantity != null) + hash = hash * 57 + this.Quantity.GetHashCode(); + + if (this.ShipDate != null) + hash = hash * 57 + this.ShipDate.GetHashCode(); + + if (this.Status != null) + hash = hash * 57 + this.Status.GetHashCode(); + + if (this.Complete != null) + hash = hash * 57 + this.Complete.GetHashCode(); + + return hash; + } + } + } - - /// - /// Get the JSON string presentation of the object - /// - /// JSON string presentation of the object - public string ToJson() { - return JsonConvert.SerializeObject(this, Formatting.Indented); - } - -} } diff --git a/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Model/Pet.cs b/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Model/Pet.cs index 37c80259944..3c5264fe8c8 100644 --- a/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Model/Pet.cs +++ b/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Model/Pet.cs @@ -6,89 +6,176 @@ using System.Collections.Generic; using System.Runtime.Serialization; using Newtonsoft.Json; -namespace IO.Swagger.Model { - - /// - /// - /// - [DataContract] - public class Pet { - - /// - /// Gets or Sets Id - /// - [DataMember(Name="id", EmitDefaultValue=false)] - public long? Id { get; set; } - - - /// - /// Gets or Sets Category - /// - [DataMember(Name="category", EmitDefaultValue=false)] - public Category Category { get; set; } - - - /// - /// Gets or Sets Name - /// - [DataMember(Name="name", EmitDefaultValue=false)] - public string Name { get; set; } - - - /// - /// Gets or Sets PhotoUrls - /// - [DataMember(Name="photoUrls", EmitDefaultValue=false)] - public List PhotoUrls { get; set; } - - - /// - /// Gets or Sets Tags - /// - [DataMember(Name="tags", EmitDefaultValue=false)] - public List Tags { get; set; } - - - /// - /// pet status in the store - /// - /// pet status in the store - [DataMember(Name="status", EmitDefaultValue=false)] - public string Status { get; set; } - - +namespace IO.Swagger.Model +{ /// - /// Get the string presentation of the object + /// /// - /// String presentation of the object - public override string ToString() { - var sb = new StringBuilder(); - sb.Append("class Pet {\n"); - - sb.Append(" Id: ").Append(Id).Append("\n"); - - sb.Append(" Category: ").Append(Category).Append("\n"); - - sb.Append(" Name: ").Append(Name).Append("\n"); - - sb.Append(" PhotoUrls: ").Append(PhotoUrls).Append("\n"); - - sb.Append(" Tags: ").Append(Tags).Append("\n"); - - sb.Append(" Status: ").Append(Status).Append("\n"); - - sb.Append("}\n"); - return sb.ToString(); + [DataContract] + public class Pet : IEquatable + { + + /// + /// Gets or Sets Id + /// + [DataMember(Name="id", EmitDefaultValue=false)] + public long? Id { get; set; } + + + /// + /// Gets or Sets Category + /// + [DataMember(Name="category", EmitDefaultValue=false)] + public Category Category { get; set; } + + + /// + /// Gets or Sets Name + /// + [DataMember(Name="name", EmitDefaultValue=false)] + public string Name { get; set; } + + + /// + /// Gets or Sets PhotoUrls + /// + [DataMember(Name="photoUrls", EmitDefaultValue=false)] + public List PhotoUrls { get; set; } + + + /// + /// Gets or Sets Tags + /// + [DataMember(Name="tags", EmitDefaultValue=false)] + public List Tags { get; set; } + + + /// + /// pet status in the store + /// + /// pet status in the store + [DataMember(Name="status", EmitDefaultValue=false)] + public string Status { get; set; } + + + + /// + /// Returns the string presentation of the object + /// + /// String presentation of the object + public override string ToString() + { + var sb = new StringBuilder(); + sb.Append("class Pet {\n"); + sb.Append(" Id: ").Append(Id).Append("\n"); + sb.Append(" Category: ").Append(Category).Append("\n"); + sb.Append(" Name: ").Append(Name).Append("\n"); + sb.Append(" PhotoUrls: ").Append(PhotoUrls).Append("\n"); + sb.Append(" Tags: ").Append(Tags).Append("\n"); + sb.Append(" Status: ").Append(Status).Append("\n"); + + sb.Append("}\n"); + return sb.ToString(); + } + + /// + /// Returns the JSON string presentation of the object + /// + /// JSON string presentation of the object + public string ToJson() + { + return JsonConvert.SerializeObject(this, Formatting.Indented); + } + + /// + /// Returns true if objects are equal + /// + /// Object to be compared + /// Boolean + public override bool Equals(object obj) + { + // credit: http://stackoverflow.com/a/10454552/677735 + return this.Equals(obj as Pet); + } + + /// + /// Returns true if Pet instances are equal + /// + /// Instance of Pet to be compared + /// Boolean + public bool Equals(Pet other) + { + // credit: http://stackoverflow.com/a/10454552/677735 + if (other == null) + return false; + + return + ( + this.Id == other.Id || + this.Id != null && + this.Id.Equals(other.Id) + ) && + ( + this.Category == other.Category || + this.Category != null && + this.Category.Equals(other.Category) + ) && + ( + this.Name == other.Name || + this.Name != null && + this.Name.Equals(other.Name) + ) && +// ( +// this.PhotoUrls == other.PhotoUrls || +// this.PhotoUrls != null && +// this.PhotoUrls.Equals(other.PhotoUrls) +// ) && + ( + this.Tags == other.Tags || + this.Tags != null && + this.Tags.Equals(other.Tags) + ) && + ( + this.Status == other.Status || + this.Status != null && + this.Status.Equals(other.Status) + ); + } + + /// + /// Gets the hash code + /// + /// Hash code + public override int GetHashCode() + { + // credit: http://stackoverflow.com/a/263416/677735 + unchecked // Overflow is fine, just wrap + { + int hash = 41; + // Suitable nullity checks etc, of course :) + + if (this.Id != null) + hash = hash * 57 + this.Id.GetHashCode(); + + if (this.Category != null) + hash = hash * 57 + this.Category.GetHashCode(); + + if (this.Name != null) + hash = hash * 57 + this.Name.GetHashCode(); + + if (this.PhotoUrls != null) + hash = hash * 57 + this.PhotoUrls.GetHashCode(); + + if (this.Tags != null) + hash = hash * 57 + this.Tags.GetHashCode(); + + if (this.Status != null) + hash = hash * 57 + this.Status.GetHashCode(); + + return hash; + } + } + } - - /// - /// Get the JSON string presentation of the object - /// - /// JSON string presentation of the object - public string ToJson() { - return JsonConvert.SerializeObject(this, Formatting.Indented); - } - -} } diff --git a/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Model/Tag.cs b/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Model/Tag.cs index 7d2ea38833b..6e8f84b89e9 100644 --- a/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Model/Tag.cs +++ b/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Model/Tag.cs @@ -6,52 +6,111 @@ using System.Collections.Generic; using System.Runtime.Serialization; using Newtonsoft.Json; -namespace IO.Swagger.Model { - - /// - /// - /// - [DataContract] - public class Tag { - - /// - /// Gets or Sets Id - /// - [DataMember(Name="id", EmitDefaultValue=false)] - public long? Id { get; set; } - - - /// - /// Gets or Sets Name - /// - [DataMember(Name="name", EmitDefaultValue=false)] - public string Name { get; set; } - - +namespace IO.Swagger.Model +{ /// - /// Get the string presentation of the object + /// /// - /// String presentation of the object - public override string ToString() { - var sb = new StringBuilder(); - sb.Append("class Tag {\n"); - - sb.Append(" Id: ").Append(Id).Append("\n"); - - sb.Append(" Name: ").Append(Name).Append("\n"); - - sb.Append("}\n"); - return sb.ToString(); + [DataContract] + public class Tag : IEquatable + { + + /// + /// Gets or Sets Id + /// + [DataMember(Name="id", EmitDefaultValue=false)] + public long? Id { get; set; } + + + /// + /// Gets or Sets Name + /// + [DataMember(Name="name", EmitDefaultValue=false)] + public string Name { get; set; } + + + + /// + /// Returns the string presentation of the object + /// + /// String presentation of the object + public override string ToString() + { + var sb = new StringBuilder(); + sb.Append("class Tag {\n"); + sb.Append(" Id: ").Append(Id).Append("\n"); + sb.Append(" Name: ").Append(Name).Append("\n"); + + sb.Append("}\n"); + return sb.ToString(); + } + + /// + /// Returns the JSON string presentation of the object + /// + /// JSON string presentation of the object + public string ToJson() + { + return JsonConvert.SerializeObject(this, Formatting.Indented); + } + + /// + /// Returns true if objects are equal + /// + /// Object to be compared + /// Boolean + public override bool Equals(object obj) + { + // credit: http://stackoverflow.com/a/10454552/677735 + return this.Equals(obj as Tag); + } + + /// + /// Returns true if Tag instances are equal + /// + /// Instance of Tag to be compared + /// Boolean + public bool Equals(Tag other) + { + // credit: http://stackoverflow.com/a/10454552/677735 + if (other == null) + return false; + + return + ( + this.Id == other.Id || + this.Id != null && + this.Id.Equals(other.Id) + ) && + ( + this.Name == other.Name || + this.Name != null && + this.Name.Equals(other.Name) + ); + } + + /// + /// Gets the hash code + /// + /// Hash code + public override int GetHashCode() + { + // credit: http://stackoverflow.com/a/263416/677735 + unchecked // Overflow is fine, just wrap + { + int hash = 41; + // Suitable nullity checks etc, of course :) + + if (this.Id != null) + hash = hash * 57 + this.Id.GetHashCode(); + + if (this.Name != null) + hash = hash * 57 + this.Name.GetHashCode(); + + return hash; + } + } + } - - /// - /// Get the JSON string presentation of the object - /// - /// JSON string presentation of the object - public string ToJson() { - return JsonConvert.SerializeObject(this, Formatting.Indented); - } - -} } diff --git a/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Model/User.cs b/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Model/User.cs index 5430d1182cb..aff43555136 100644 --- a/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Model/User.cs +++ b/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Model/User.cs @@ -6,107 +6,208 @@ using System.Collections.Generic; using System.Runtime.Serialization; using Newtonsoft.Json; -namespace IO.Swagger.Model { - - /// - /// - /// - [DataContract] - public class User { - - /// - /// Gets or Sets Id - /// - [DataMember(Name="id", EmitDefaultValue=false)] - public long? Id { get; set; } - - - /// - /// Gets or Sets Username - /// - [DataMember(Name="username", EmitDefaultValue=false)] - public string Username { get; set; } - - - /// - /// Gets or Sets FirstName - /// - [DataMember(Name="firstName", EmitDefaultValue=false)] - public string FirstName { get; set; } - - - /// - /// Gets or Sets LastName - /// - [DataMember(Name="lastName", EmitDefaultValue=false)] - public string LastName { get; set; } - - - /// - /// Gets or Sets Email - /// - [DataMember(Name="email", EmitDefaultValue=false)] - public string Email { get; set; } - - - /// - /// Gets or Sets Password - /// - [DataMember(Name="password", EmitDefaultValue=false)] - public string Password { get; set; } - - - /// - /// Gets or Sets Phone - /// - [DataMember(Name="phone", EmitDefaultValue=false)] - public string Phone { get; set; } - - - /// - /// User Status - /// - /// User Status - [DataMember(Name="userStatus", EmitDefaultValue=false)] - public int? UserStatus { get; set; } - - +namespace IO.Swagger.Model +{ /// - /// Get the string presentation of the object + /// /// - /// String presentation of the object - public override string ToString() { - var sb = new StringBuilder(); - sb.Append("class User {\n"); - - sb.Append(" Id: ").Append(Id).Append("\n"); - - sb.Append(" Username: ").Append(Username).Append("\n"); - - sb.Append(" FirstName: ").Append(FirstName).Append("\n"); - - sb.Append(" LastName: ").Append(LastName).Append("\n"); - - sb.Append(" Email: ").Append(Email).Append("\n"); - - sb.Append(" Password: ").Append(Password).Append("\n"); - - sb.Append(" Phone: ").Append(Phone).Append("\n"); - - sb.Append(" UserStatus: ").Append(UserStatus).Append("\n"); - - sb.Append("}\n"); - return sb.ToString(); + [DataContract] + public class User : IEquatable + { + + /// + /// Gets or Sets Id + /// + [DataMember(Name="id", EmitDefaultValue=false)] + public long? Id { get; set; } + + + /// + /// Gets or Sets Username + /// + [DataMember(Name="username", EmitDefaultValue=false)] + public string Username { get; set; } + + + /// + /// Gets or Sets FirstName + /// + [DataMember(Name="firstName", EmitDefaultValue=false)] + public string FirstName { get; set; } + + + /// + /// Gets or Sets LastName + /// + [DataMember(Name="lastName", EmitDefaultValue=false)] + public string LastName { get; set; } + + + /// + /// Gets or Sets Email + /// + [DataMember(Name="email", EmitDefaultValue=false)] + public string Email { get; set; } + + + /// + /// Gets or Sets Password + /// + [DataMember(Name="password", EmitDefaultValue=false)] + public string Password { get; set; } + + + /// + /// Gets or Sets Phone + /// + [DataMember(Name="phone", EmitDefaultValue=false)] + public string Phone { get; set; } + + + /// + /// User Status + /// + /// User Status + [DataMember(Name="userStatus", EmitDefaultValue=false)] + public int? UserStatus { get; set; } + + + + /// + /// Returns the string presentation of the object + /// + /// String presentation of the object + public override string ToString() + { + var sb = new StringBuilder(); + sb.Append("class User {\n"); + sb.Append(" Id: ").Append(Id).Append("\n"); + sb.Append(" Username: ").Append(Username).Append("\n"); + sb.Append(" FirstName: ").Append(FirstName).Append("\n"); + sb.Append(" LastName: ").Append(LastName).Append("\n"); + sb.Append(" Email: ").Append(Email).Append("\n"); + sb.Append(" Password: ").Append(Password).Append("\n"); + sb.Append(" Phone: ").Append(Phone).Append("\n"); + sb.Append(" UserStatus: ").Append(UserStatus).Append("\n"); + + sb.Append("}\n"); + return sb.ToString(); + } + + /// + /// Returns the JSON string presentation of the object + /// + /// JSON string presentation of the object + public string ToJson() + { + return JsonConvert.SerializeObject(this, Formatting.Indented); + } + + /// + /// Returns true if objects are equal + /// + /// Object to be compared + /// Boolean + public override bool Equals(object obj) + { + // credit: http://stackoverflow.com/a/10454552/677735 + return this.Equals(obj as User); + } + + /// + /// Returns true if User instances are equal + /// + /// Instance of User to be compared + /// Boolean + public bool Equals(User other) + { + // credit: http://stackoverflow.com/a/10454552/677735 + if (other == null) + return false; + + return + ( + this.Id == other.Id || + this.Id != null && + this.Id.Equals(other.Id) + ) && + ( + this.Username == other.Username || + this.Username != null && + this.Username.Equals(other.Username) + ) && + ( + this.FirstName == other.FirstName || + this.FirstName != null && + this.FirstName.Equals(other.FirstName) + ) && + ( + this.LastName == other.LastName || + this.LastName != null && + this.LastName.Equals(other.LastName) + ) && + ( + this.Email == other.Email || + this.Email != null && + this.Email.Equals(other.Email) + ) && + ( + this.Password == other.Password || + this.Password != null && + this.Password.Equals(other.Password) + ) && + ( + this.Phone == other.Phone || + this.Phone != null && + this.Phone.Equals(other.Phone) + ) && + ( + this.UserStatus == other.UserStatus || + this.UserStatus != null && + this.UserStatus.Equals(other.UserStatus) + ); + } + + /// + /// Gets the hash code + /// + /// Hash code + public override int GetHashCode() + { + // credit: http://stackoverflow.com/a/263416/677735 + unchecked // Overflow is fine, just wrap + { + int hash = 41; + // Suitable nullity checks etc, of course :) + + if (this.Id != null) + hash = hash * 57 + this.Id.GetHashCode(); + + if (this.Username != null) + hash = hash * 57 + this.Username.GetHashCode(); + + if (this.FirstName != null) + hash = hash * 57 + this.FirstName.GetHashCode(); + + if (this.LastName != null) + hash = hash * 57 + this.LastName.GetHashCode(); + + if (this.Email != null) + hash = hash * 57 + this.Email.GetHashCode(); + + if (this.Password != null) + hash = hash * 57 + this.Password.GetHashCode(); + + if (this.Phone != null) + hash = hash * 57 + this.Phone.GetHashCode(); + + if (this.UserStatus != null) + hash = hash * 57 + this.UserStatus.GetHashCode(); + + return hash; + } + } + } - - /// - /// Get the JSON string presentation of the object - /// - /// JSON string presentation of the object - public string ToJson() { - return JsonConvert.SerializeObject(this, Formatting.Indented); - } - -} } diff --git a/samples/client/petstore/csharp/SwaggerClientTest/TestPet.cs b/samples/client/petstore/csharp/SwaggerClientTest/TestPet.cs index 5a42b8703c2..6fe0de92cac 100644 --- a/samples/client/petstore/csharp/SwaggerClientTest/TestPet.cs +++ b/samples/client/petstore/csharp/SwaggerClientTest/TestPet.cs @@ -144,6 +144,52 @@ namespace SwaggerClient.TestPet } + [Test ()] + public void TestEqual() + { + // create pet + Pet p1 = new Pet(); + p1.Id = petId; + p1.Name = "Csharp test"; + p1.Status = "available"; + // create Category object + Category category1 = new Category(); + category1.Id = 56; + category1.Name = "sample category name2"; + List photoUrls1 = new List(new String[] {"sample photoUrls"}); + // create Tag object + Tag tag1 = new Tag(); + tag1.Id = petId; + tag1.Name = "sample tag name1"; + List tags1 = new List(new Tag[] {tag1}); + p1.Tags = tags1; + p1.Category = category1; + p1.PhotoUrls = photoUrls1; + + // create pet + Pet p2 = new Pet(); + p2.Id = petId; + p2.Name = "Csharp test"; + p2.Status = "available"; + // create Category object + Category category2 = new Category(); + category2.Id = 56; + category2.Name = "sample category name2"; + List photoUrls2 = new List(new String[] {"sample photoUrls"}); + // create Tag object + Tag tag2 = new Tag(); + tag2.Id = petId; + tag2.Name = "sample tag name1"; + List tags2 = new List(new Tag[] {tag2}); + p2.Tags = tags2; + p2.Category = category2; + p2.PhotoUrls = photoUrls2; + + Assert.IsTrue (category1.Equals (category2)); + Assert.IsTrue (tag1.Equals (tag2)); + Assert.IsTrue (p1.Equals(p2)); + } + } } diff --git a/samples/client/petstore/csharp/SwaggerClientTest/bin/Debug/SwaggerClientTest.dll b/samples/client/petstore/csharp/SwaggerClientTest/bin/Debug/SwaggerClientTest.dll index c975e54d4bed8fc21372acb08c3eaa6fab9aa969..5e020c8b222027bde45f4a7a71a9cde3f078339b 100755 GIT binary patch delta 11756 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 delta 7275 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 diff --git a/samples/client/petstore/csharp/SwaggerClientTest/bin/Debug/SwaggerClientTest.dll.mdb b/samples/client/petstore/csharp/SwaggerClientTest/bin/Debug/SwaggerClientTest.dll.mdb index 5c1092d07fca586d960495ae792c0d8c2f9a8e0f..915a29526545d08d305da895ba140ded4178cc07 100644 GIT binary patch literal 21049 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 K4rcXufd3Ehs4epV literal 19469 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 delta 7275 zcma)>3tSX+yT^Ys?6M0Bdzsk_3#K4KWT<$_yoZ-Gql=;WmYG3mg{G^EhQ2C`riNxE zj%g|0?Nt;3UGvIGK*CHk?P8gk^uEfmEX}mrTiSX4|M|B|=XB2J%;z%?&-eK~|J(DQ zof*fX#fGAb5ldFbeghzqPC8z(lx!Vo&9q3!Vwfnw98r>_YDv-)(aSEe2%X<(i=^A- z%h2{nsq**G&Phq$$<%}$_s}WBh+WHodCvoq*7^54gTv%5Pqj8mh|C`iL>H})U?}9~ zb@DnmoHrvQgX_kn8?>fp-CFkv1EikXj0wq7FKzXNAyRMc0@;;Xhv!nHQtk1)cx~cy z7HN$p{XIUWlMR!7E2vL7ZJoB35;kZ}GhEtdl(0!_e(nJ+aY{F-kM{7CAyQv$^^|0( zpH@3%f>fq;@TauhM$7i?rpEq-v7(#QNdHl5sLSoVvxR<(RH?n@Pt>ygZtbYwqUHPD zODA^YlU+XTX=yJ_Dn;7QlK%*wD)^DsaBTVz=^&qRrx_NhmiIPnhDB@pygO!yJv7Wa zOo+)12M+VVv~b`E54;)<9Hl^_bc|~7;HU@W#9_As<7amS400OnLv(vJ!+?Xd6?Xv+ z6o4=Hd#nh(9`277^zrwaz2Pi)#e-A}t zqgr;ck0Me2-VSOeC6zq*;l1)D@<}_vMD+9 z9TW@CN&B+UGra#_DQvchlxs2hXhG32X8(2?GOZJEJDtRD zXjy^yzzzzyeRZs-z2q)70ttEpHhann>r@=QFSDG7-XHIjG_?P-(Lj0oJMzXSei{aR8{ zLg3F!G=-OF;*9j&$%Vn}l@(5d{=AF}xel1Bw&VZg4uHS!Ojz2(^HMQ8`Rh&aR{Qq07*cCCS z7PGa}KI$7_V80X$)UM8HLsN6ib-UTmgw~xx%V>`TntK5y4AT0}jUU8*5f-|v6G)4J z*;h}j8hTJF6hqoOM6rl!ahbBqGAg`hEU7_THMfJKb&FqX4z<2pn=&u8C-2^WhE_^r zD7nWrfS=xztY5j(E1(FMaYWmw4PyXC;4%7vfX3P ziFk_LO@A$PrqY>3XQEaz-zB{j+&o{B2Oe;oaI{4ew^z886c&jm8;LuW19Bt=ll9Vz|#>S!I)q)eRUbc54FILE1Tim6MOt@3@8loA)A) zcIgK$?&6dr{lw`kr!LYjoPOdoNcxqNLY18+jgW3|%HT9k`khl2rvgcm*a*F2SY|Q# zFAyc!KvjD~GD%X>NTXs2s#ET>(n+Ni}=SBToH%dBx2mdFAN;$|AwTNChnh$>92@RCmGr3NZY zx1dzuV6}iQ#A=<)+3GfHYn&34qpl}v;?yj$s(gxXQn0@ikzo}#C+vZbJj{pLtyWlKfktva!?-HNI-osLn}((s)iR<+wu z++NpM)za~)AXc?b7@MwZtZJQ6E{Ihv&=sRQ>LM#!cjnU3V4SWlu=Uh|XuhhopcU$- z7PLX#X6qHo+^O!i^$yWNwc6GvL?_h>Q{NDsRU2&mVsMJxp7edvdN20|dQnn;B(ggY z7JzNZ0A%XKw`2fD31V9^0Ao2dOKideQ9hWpYnIrA2jaXSHsOKjc8{*H2@k?lL2SZz zowwrji#pcM8*z$qPO$SvoRXc> z?Dvt!jt1iZ((c!R=rPjhzRiyY;|ymYDeA!xzThmfKNO;+&TI@1(Q0Q^3)=2nWDjcx zoJ;H@LYc>%EA0=5=(Kaa{cj=q%2{E0G(^{(4OZJIbR5Yd{HLRxTcK~spJl*8H1gI*p`ezHK%5YRp<$P!$)hDScP(s{s`;4Sz;B+#b`cuv&1U&BuWLb3O$9! zQF`WM0TRa|h8~ct;S6U|)HoE=zcd)J3O$1pf>?#}@ZICO#wwJDv@trd3gw~n37uGl z#^ZBAtU?oznX7B8LK9Ie=qo4PBYgP$NnNB8*(PI60V7tS3eyxc>SQ*!3gAbxAcw2M z@hx9otb2)~)Pb(WyD(DHy+?0UKxlAlUp8E&oO^g;) zK%~90GJZ&ex*49h4r=a!j)aY_l3#xQqGH=HzPIJsPZo776 zr8jWW?T)I1G@tdh-28>xrB)(F&?VBUkRs@3(yEXl$mnrL?Z8k$E{{vyff0gINZX0Y zf_jj)6HPiHi?kpXEnwr7#68-}6R!qQts`DU>OPDTbS&VRN;p>FXEd4pC=_(TQ(@YVVnN?|3e^MHAn1nY z6{2!Z4OkshfNIn)ZE=}!ij1bf=ZnJt2lLU2%+e0*6P-a|>T7#v6hQ@tBR4Ry;8$c~~ z3uNo9MGYr?O?9Y$DZHjSH0i|GRELW?@io;!Ui`YM-FhQ()uk1AdC>?pY;gvQx2!P)%4GJ~*}-i($d5QrwuZhcGrNz+ zYq`A+o6;fTh@7OHjy)oGR4!0XU*&r2d2U!P8*W5*i1-a%EaxSI#Co_&ZC`Ur z5o{DIx?w`Jf{C~v3T`l~eY?F)^uWkcXGdg3zUkE56}#m_M(ub-y9cu@Psu7qB2V6E zoML%_`wPimX<5hp_1tdcwv6J3EH&J(74{IW$%nXqgw(IK{*}F@RBd);Z|{RKxe=`A z+z6KQ6!-HYHX3JWCo7YsL)s6O1@wV>VwFcatj(`V_Fj$2rSC43Z{Ydd&ogW^#%r~t zX2!1Pk@Z~N$o(=>^RydP$;#8gKPOZmV8G+tTU<|_ces3m4UXTWn9qAoPcC0s> ztdIKv?l1I?q{wpbD6(t0-NNlIZV!3KP`rWnqx(mBjAWMyne zSMn>!%BaL0*IKzcWC8WCYQZU>8{#d(oTxePm^NG3-nJ0kSgvkH%f(*N~Oz z1*$*!b!26F)fq^BJz1IFN$w`Ufvk+f7()KLWMz7F7)t(oWMv$sPnHrrPP52A2IKt% z$2HU5u6L+0-k8Lg{jo=5KZtc$y;egJyUVsb(&_W0p+%tH8PI0zO$pRH56CS1XRVmB z0TVOgIOcR)ncFh&lye!+YZ;?{9V}0#kD&%w`9t}f^G%+oAOb3#PC8w5x)Gt>vhRj% zj?@%8N4iAkzv+~Nx9xx1p(%|e!L5yhjlmly%cNk{hb2-l^J9Z*zcc67^Or__(|>DW zZu!=%`E!FKE@oM@P1nu@U%Y-z3I=}6Fly(2eL%bL+uhn5H->4}n?7l_R(Lbp4m>OV qvyV-%(4u{DGhUu-(f)mN(_2>QT0|6;GlrBUz4tf_(iN#B!}MQ17I9|) diff --git a/samples/client/petstore/csharp/SwaggerClientTest/obj/Debug/SwaggerClientTest.dll.mdb b/samples/client/petstore/csharp/SwaggerClientTest/obj/Debug/SwaggerClientTest.dll.mdb index 5c1092d07fca586d960495ae792c0d8c2f9a8e0f..915a29526545d08d305da895ba140ded4178cc07 100644 GIT binary patch literal 21049 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 K4rcXufd3Ehs4epV literal 19469 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 Date: Sat, 21 Nov 2015 15:16:38 +0800 Subject: [PATCH 042/211] add test case for pet equal --- .../src/main/resources/csharp/model.mustache | 10 ++++++-- .../main/csharp/IO/Swagger/Model/Category.cs | 1 + .../src/main/csharp/IO/Swagger/Model/Order.cs | 1 + .../src/main/csharp/IO/Swagger/Model/Pet.cs | 13 +++++----- .../src/main/csharp/IO/Swagger/Model/Tag.cs | 1 + .../src/main/csharp/IO/Swagger/Model/User.cs | 1 + .../SwaggerClientTest.userprefs | 19 ++++++++++++++- .../csharp/SwaggerClientTest/TestPet.cs | 23 +++++++++++++++--- .../bin/Debug/SwaggerClientTest.dll | Bin 67072 -> 67584 bytes .../bin/Debug/SwaggerClientTest.dll.mdb | Bin 21049 -> 21107 bytes .../obj/Debug/SwaggerClientTest.dll | Bin 67072 -> 67584 bytes .../obj/Debug/SwaggerClientTest.dll.mdb | Bin 21049 -> 21107 bytes 12 files changed, 57 insertions(+), 12 deletions(-) diff --git a/modules/swagger-codegen/src/main/resources/csharp/model.mustache b/modules/swagger-codegen/src/main/resources/csharp/model.mustache index c95d2f1a1b9..7ab48dc56e2 100644 --- a/modules/swagger-codegen/src/main/resources/csharp/model.mustache +++ b/modules/swagger-codegen/src/main/resources/csharp/model.mustache @@ -1,4 +1,5 @@ using System; +using System.Linq; using System.IO; using System.Text; using System.Collections; @@ -72,12 +73,17 @@ namespace {{packageName}}.Model if (other == null) return false; - return {{#vars}} + return {{#vars}}{{#isNotContainer}} ( this.{{name}} == other.{{name}} || this.{{name}} != null && this.{{name}}.Equals(other.{{name}}) - ){{#hasMore}} && {{/hasMore}}{{/vars}}; + ){{#hasMore}} && {{/hasMore}}{{/isNotContainer}}{{^isNotContainer}} + ( + this.{{name}} == other.{{name}} || + this.{{name}} != null && + this.{{name}}.SequenceEqual(other.{{name}}) + ){{#hasMore}} && {{/hasMore}}{{/isNotContainer}}{{/vars}}; } /// diff --git a/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Model/Category.cs b/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Model/Category.cs index 6b39196b2b7..7d3f0936dce 100644 --- a/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Model/Category.cs +++ b/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Model/Category.cs @@ -1,4 +1,5 @@ using System; +using System.Linq; using System.IO; using System.Text; using System.Collections; diff --git a/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Model/Order.cs b/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Model/Order.cs index 8346e1cc6d8..1f786769d55 100644 --- a/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Model/Order.cs +++ b/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Model/Order.cs @@ -1,4 +1,5 @@ using System; +using System.Linq; using System.IO; using System.Text; using System.Collections; diff --git a/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Model/Pet.cs b/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Model/Pet.cs index 3c5264fe8c8..d85d8a8be7e 100644 --- a/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Model/Pet.cs +++ b/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Model/Pet.cs @@ -1,4 +1,5 @@ using System; +using System.Linq; using System.IO; using System.Text; using System.Collections; @@ -126,15 +127,15 @@ namespace IO.Swagger.Model this.Name != null && this.Name.Equals(other.Name) ) && -// ( -// this.PhotoUrls == other.PhotoUrls || -// this.PhotoUrls != null && -// this.PhotoUrls.Equals(other.PhotoUrls) -// ) && + ( + this.PhotoUrls == other.PhotoUrls || + this.PhotoUrls != null && + this.PhotoUrls.SequenceEqual(other.PhotoUrls) + ) && ( this.Tags == other.Tags || this.Tags != null && - this.Tags.Equals(other.Tags) + this.Tags.SequenceEqual(other.Tags) ) && ( this.Status == other.Status || diff --git a/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Model/Tag.cs b/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Model/Tag.cs index 6e8f84b89e9..8b2cbe08474 100644 --- a/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Model/Tag.cs +++ b/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Model/Tag.cs @@ -1,4 +1,5 @@ using System; +using System.Linq; using System.IO; using System.Text; using System.Collections; diff --git a/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Model/User.cs b/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Model/User.cs index aff43555136..d2c1e3a46eb 100644 --- a/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Model/User.cs +++ b/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Model/User.cs @@ -1,4 +1,5 @@ using System; +using System.Linq; using System.IO; using System.Text; using System.Collections; diff --git a/samples/client/petstore/csharp/SwaggerClientTest/SwaggerClientTest.userprefs b/samples/client/petstore/csharp/SwaggerClientTest/SwaggerClientTest.userprefs index 31e5cba141b..05585bff932 100644 --- a/samples/client/petstore/csharp/SwaggerClientTest/SwaggerClientTest.userprefs +++ b/samples/client/petstore/csharp/SwaggerClientTest/SwaggerClientTest.userprefs @@ -2,8 +2,25 @@ - + + + + + + + + + + + + + + + + + + diff --git a/samples/client/petstore/csharp/SwaggerClientTest/TestPet.cs b/samples/client/petstore/csharp/SwaggerClientTest/TestPet.cs index 6fe0de92cac..0227a2d9113 100644 --- a/samples/client/petstore/csharp/SwaggerClientTest/TestPet.cs +++ b/samples/client/petstore/csharp/SwaggerClientTest/TestPet.cs @@ -1,5 +1,6 @@ using NUnit.Framework; using System; +using System.Linq; using System.IO; using System.Collections.Generic; using IO.Swagger.Api; @@ -166,7 +167,7 @@ namespace SwaggerClient.TestPet p1.Category = category1; p1.PhotoUrls = photoUrls1; - // create pet + // create pet 2 Pet p2 = new Pet(); p2.Id = petId; p2.Name = "Csharp test"; @@ -185,9 +186,25 @@ namespace SwaggerClient.TestPet p2.Category = category2; p2.PhotoUrls = photoUrls2; + // p1 and p2 should be equal (both object and attribute level) Assert.IsTrue (category1.Equals (category2)); - Assert.IsTrue (tag1.Equals (tag2)); - Assert.IsTrue (p1.Equals(p2)); + Assert.IsTrue (tags1.SequenceEqual (tags2)); + Assert.IsTrue (p1.PhotoUrls.SequenceEqual(p2.PhotoUrls)); + + Assert.IsTrue (p1.Equals (p2)); + + // update attribute to that p1 and p2 are not equal + category2.Name = "new category name"; + Assert.IsFalse(category1.Equals (category2)); + + tags2 = new List (); + Assert.IsFalse (tags1.SequenceEqual (tags2)); + + // photoUrls has not changed so it should be equal + Assert.IsTrue (p1.PhotoUrls.SequenceEqual(p2.PhotoUrls)); + + Assert.IsFalse (p1.Equals (p2)); + } } diff --git a/samples/client/petstore/csharp/SwaggerClientTest/bin/Debug/SwaggerClientTest.dll b/samples/client/petstore/csharp/SwaggerClientTest/bin/Debug/SwaggerClientTest.dll index 5e020c8b222027bde45f4a7a71a9cde3f078339b..924934c46233779ca4dd6c58049f0518ece993b2 100755 GIT binary patch delta 5639 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 OuYAqxxm#Rzg7M#yM;ccE delta 5375 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 Ha`S%yPU&#W delta 3869 zcmZ9P2Ut{B8ixPFjKj=aj06EAMF`z276z22f(Wj=*?khSnkB-TLD~$cAY!8ph>C!T z%86J}V~aIvjG7{-No?39f)R>^T$M0XRh_ucH6Qy_#>hWl+HyFbr(IFNCy{L-^usE!$%VN z2!PJ7;9Z}5+RY}@uFvT4qbu9nA{WH@u8)YJ%0-hG^0A6OHq}cT#<~?R?fZ|L4db$w zf80td#EOHZlTE@}Z{hr%y~8~0w-@`>{h={cE?PQS-(6&PB0smbb<+=?`=Sgk&WqB^ zd4W{V`M(Q{6Rnw>%$1wK2aU zWn?jByy-Sxyh+oSSNdABLHui9M;69w@cK_4=kLSc>gU4ZdH;UHnLW?wXJ;@yQrR(< z3StXmO^qmJrbj9l$5KV?lCG({a%(JYi`_1z9%6g0%0sdAQ|!-OQ%_}mEM1KKO-lbJ z&h=Eb#?t-R2V&}kbt`4Y_&sG&9L5Fw z5_hy~>ZNRmqswuPNToed%0}?K{_*T%ex<)7)AE;iP2;@=$3e^HF zEz~a3nz~S#w!%ZTK}#F8Uv*9Us(#ecer=VM8n>d4>YSF&Yiqlv?y5Ulx~sh>rN%Y) zRlU|yyS772#jQ}8wxYj^$I}<_i{s5rX!y>7cB3@nqPzZ0e|Rg|F*A#!$5Zj9|s2qUl-AQ`E$R%>I%l}dV1Qd&}8$08ap1Y>1QZPq_V`t ziN^NPv-*A_JxFXbjpb_7Id@dICsIdZL6T{aovEw(izHf{R3W9Nqp04JL|c=#bxqyX z2b1Vf(oaaG<*8*}tS4{L_>8JcqRUB*(iMYPPlp8bqU!FdQZG)XisU89<|l_S+Xz#w zw@SS$nZ8NhE!D(do4zimlIe8v8H9}Fy7(zN##jfwdayBs^@zVv?;6x|Q|R-QB`M}r z3rADvSjutJST1y~TBuKFf(9t-GtqG`c}W^jTou7a9mF{`V&$bE*@kT;fkKF>aTT8 zJ%lHEda8dWrK7~TZbDfq%}@O-)!c+J^%lNNrM0Q+kmBdBGX41zWYIX^ZhYdP$Wi-J zsVcQvx+wXLBOrW}M!VC#O*7vxXK-)z&i_C0 z-Eiu=@v6arPERLL`-FKDO}Dj@y(M<9wt6y=o=$wmtph{Y+x-2&kps#mQPrgCNn+!Q zjHImL8G7+gx0TG7+1iAb`{N>++!klXsyv-mrdRTVfgVbnV4Kj?P#c~RG=Mt>`C9&% zPW9;*)A`vTC-!fi7Bo(AEQ1;|e&=U`oLM4o4T@CMOr|T7ukyfP7nfM6R6Xs$H1jmJ zZaS@>zG1p?tdy1Uum~4!H6+M>_jLMp`W{n`+p%RcX!(p4eC&{k_M2zWmKj@TNVixy zlPYJf;*BV6n@QVeemzqvt`GLyo-5K=~6y5pSYG(@=ohxAH3;6QzETE**r$`=dsUV=J_Qhj7m#b8O+?lQ{#LV73sJVX=Mpp z)mao9SW?PpX(?OAwNaBDw_vcflx>5V@3*du(fTsBfwx2r9 zX!t1T95@9&4muCcgJ(gtU>;x~D#hSe3^v2pKo`IV;CrDu@CEous2!)Cj%`KL`De=PM=*CThjt3b+|u0$l~OKs*3^ z4LlDV23-g5g0F&ZfQJR40q{-mLGY*0EwE28t^?l&CxhRI?tpK>H$!*9bs}j6QNh&OYnN=HF#t=b|lO|)Q-W&82kt70N28kA;LT0ZTJm{fj=FN zX29Y*VLOW_USd1#XAGgt~)sBXQ_NffvB%Lp{K1d>&m5wgx+c9iX?t74UwL4R|wrqd4w~ g!5zT&kS+L6_%p~3Y(EmsK=>%82!MO>HPN+y0k5`lDgXcg diff --git a/samples/client/petstore/csharp/SwaggerClientTest/obj/Debug/SwaggerClientTest.dll b/samples/client/petstore/csharp/SwaggerClientTest/obj/Debug/SwaggerClientTest.dll index 5e020c8b222027bde45f4a7a71a9cde3f078339b..924934c46233779ca4dd6c58049f0518ece993b2 100755 GIT binary patch delta 5639 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 OuYAqxxm#Rzg7M#yM;ccE delta 5375 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 Ha`S%yPU&#W delta 3869 zcmZ9P2Ut{B8ixPFjKj=aj06EAMF`z276z22f(Wj=*?khSnkB-TLD~$cAY!8ph>C!T z%86J}V~aIvjG7{-No?39f)R>^T$M0XRh_ucH6Qy_#>hWl+HyFbr(IFNCy{L-^usE!$%VN z2!PJ7;9Z}5+RY}@uFvT4qbu9nA{WH@u8)YJ%0-hG^0A6OHq}cT#<~?R?fZ|L4db$w zf80td#EOHZlTE@}Z{hr%y~8~0w-@`>{h={cE?PQS-(6&PB0smbb<+=?`=Sgk&WqB^ zd4W{V`M(Q{6Rnw>%$1wK2aU zWn?jByy-Sxyh+oSSNdABLHui9M;69w@cK_4=kLSc>gU4ZdH;UHnLW?wXJ;@yQrR(< z3StXmO^qmJrbj9l$5KV?lCG({a%(JYi`_1z9%6g0%0sdAQ|!-OQ%_}mEM1KKO-lbJ z&h=Eb#?t-R2V&}kbt`4Y_&sG&9L5Fw z5_hy~>ZNRmqswuPNToed%0}?K{_*T%ex<)7)AE;iP2;@=$3e^HF zEz~a3nz~S#w!%ZTK}#F8Uv*9Us(#ecer=VM8n>d4>YSF&Yiqlv?y5Ulx~sh>rN%Y) zRlU|yyS772#jQ}8wxYj^$I}<_i{s5rX!y>7cB3@nqPzZ0e|Rg|F*A#!$5Zj9|s2qUl-AQ`E$R%>I%l}dV1Qd&}8$08ap1Y>1QZPq_V`t ziN^NPv-*A_JxFXbjpb_7Id@dICsIdZL6T{aovEw(izHf{R3W9Nqp04JL|c=#bxqyX z2b1Vf(oaaG<*8*}tS4{L_>8JcqRUB*(iMYPPlp8bqU!FdQZG)XisU89<|l_S+Xz#w zw@SS$nZ8NhE!D(do4zimlIe8v8H9}Fy7(zN##jfwdayBs^@zVv?;6x|Q|R-QB`M}r z3rADvSjutJST1y~TBuKFf(9t-GtqG`c}W^jTou7a9mF{`V&$bE*@kT;fkKF>aTT8 zJ%lHEda8dWrK7~TZbDfq%}@O-)!c+J^%lNNrM0Q+kmBdBGX41zWYIX^ZhYdP$Wi-J zsVcQvx+wXLBOrW}M!VC#O*7vxXK-)z&i_C0 z-Eiu=@v6arPERLL`-FKDO}Dj@y(M<9wt6y=o=$wmtph{Y+x-2&kps#mQPrgCNn+!Q zjHImL8G7+gx0TG7+1iAb`{N>++!klXsyv-mrdRTVfgVbnV4Kj?P#c~RG=Mt>`C9&% zPW9;*)A`vTC-!fi7Bo(AEQ1;|e&=U`oLM4o4T@CMOr|T7ukyfP7nfM6R6Xs$H1jmJ zZaS@>zG1p?tdy1Uum~4!H6+M>_jLMp`W{n`+p%RcX!(p4eC&{k_M2zWmKj@TNVixy zlPYJf;*BV6n@QVeemzqvt`GLyo-5K=~6y5pSYG(@=ohxAH3;6QzETE**r$`=dsUV=J_Qhj7m#b8O+?lQ{#LV73sJVX=Mpp z)mao9SW?PpX(?OAwNaBDw_vcflx>5V@3*du(fTsBfwx2r9 zX!t1T95@9&4muCcgJ(gtU>;x~D#hSe3^v2pKo`IV;CrDu@CEous2!)Cj%`KL`De=PM=*CThjt3b+|u0$l~OKs*3^ z4LlDV23-g5g0F&ZfQJR40q{-mLGY*0EwE28t^?l&CxhRI?tpK>H$!*9bs}j6QNh&OYnN=HF#t=b|lO|)Q-W&82kt70N28kA;LT0ZTJm{fj=FN zX29Y*VLOW_USd1#XAGgt~)sBXQ_NffvB%Lp{K1d>&m5wgx+c9iX?t74UwL4R|wrqd4w~ g!5zT&kS+L6_%p~3Y(EmsK=>%82!MO>HPN+y0k5`lDgXcg From 6712754f6aa1bcaf8531f89a495fa7257511f8a8 Mon Sep 17 00:00:00 2001 From: wing328 Date: Sun, 22 Nov 2015 00:06:12 +0800 Subject: [PATCH 043/211] Add python flask --- README.md | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/README.md b/README.md index 0eeb2a3065e..ef321e4bb59 100644 --- a/README.md +++ b/README.md @@ -36,6 +36,7 @@ Check out [Swagger-Spec](https://github.com/swagger-api/swagger-spec) for additi - [To build a server stub](#to-build-a-server-stub) - [Node.js](#nodejs) - [PHP Silex](#php-silex) + - [Python Flask (Connexion)](#python-flask-connexion) - [Ruby Sinatra](#ruby-sinatra) - [Scala Scalatra](#scala-scalatra) - [Java JAX-RS](#java-jax-rs) @@ -268,9 +269,11 @@ AkkaScalaClientCodegen.java AndroidClientCodegen.java AsyncScalaClientCodegen.java CSharpClientCodegen.java +ClojureClientCodegen.java CsharpDotNet2ClientCodegen.java DartClientCodegen.java FlashClientCodegen.java +FlaskConnexionCodegen.java JavaClientCodegen.java JavaInflectorServerCodegen.java JaxRSServerCodegen.java @@ -441,6 +444,15 @@ java -jar modules/swagger-codegen-cli/target/swagger-codegen-cli.jar generate \ -o samples/server/petstore/silex ``` +### Python Flask (Connexion) + +``` +java -jar modules/swagger-codegen-cli/target/swagger-codegen-cli.jar generate \ + -i http://petstore.swagger.io/v2/swagger.json \ + -l flaskConnexion \ + -o samples/server/petstore/flaskConnexion +``` + ### Ruby Sinatra ``` From d5b80ac8cdc1bf4f7b5c6aa4831b142f9c6a4c3a Mon Sep 17 00:00:00 2001 From: wing328 Date: Fri, 20 Nov 2015 15:54:42 +0800 Subject: [PATCH 044/211] better auth for C#, format change --- .../main/resources/csharp/ApiClient.mustache | 39 +++++++++++++++---- .../csharp/IO/Swagger/Client/ApiClient.cs | 32 ++++++++++----- ...ClientTest.csproj.FilesWrittenAbsolute.txt | 10 ++++- 3 files changed, 62 insertions(+), 19 deletions(-) diff --git a/modules/swagger-codegen/src/main/resources/csharp/ApiClient.mustache b/modules/swagger-codegen/src/main/resources/csharp/ApiClient.mustache index 87d55ab3f6e..8af5250c471 100644 --- a/modules/swagger-codegen/src/main/resources/csharp/ApiClient.mustache +++ b/modules/swagger-codegen/src/main/resources/csharp/ApiClient.mustache @@ -198,10 +198,12 @@ namespace {{packageName}}.Client { if (obj is DateTime) return ((DateTime)obj).ToString ("u"); - else if (obj is IList) { + else if (obj is IList) + { string flattenString = ""; string separator = ","; - foreach (var param in (IList)obj) { + foreach (var param in (IList)obj) + { flattenString += param.ToString() + separator; } return flattenString.Remove(flattenString.Length - 1);; @@ -318,11 +320,29 @@ namespace {{packageName}}.Client { {{#authMethods}} case "{{name}}": - {{#isApiKey}}{{#isKeyInHeader}}headerParams["{{keyParamName}}"] = GetApiKeyWithPrefix("{{keyParamName}}");{{/isKeyInHeader}}{{#isKeyInQuery}}queryParams["{{keyParamName}}"] = GetApiKeyWithPrefix("{{keyParamName}}");{{/isKeyInQuery}}{{/isApiKey}}{{#isBasic}}headerParams["Authorization"] = "Basic " + Base64Encode(Configuration.Username + ":" + Configuration.Password);{{/isBasic}}{{#isOAuth}}headerParams["Authorization"] = "Bearer " + Configuration.AccessToken;{{/isOAuth}} + {{#isApiKey}}{{#isKeyInHeader}} + var apiKeyValue = GetApiKeyWithPrefix("{{keyParamName}}"); + if (!String.IsNullOrEmpty(apiKeyValue)) + { + headerParams["{{keyParamName}}"] = apiKeyValue; + }{{/isKeyInHeader}}{{#isKeyInQuery}} + var apiKeyValue = GetApiKeyWithPrefix("{{keyParamName}}"); + if (!String.IsNullOrEmpty(apiKeyValue)) + { + queryParams["{{keyParamName}}"] = apiKeyValue; + }{{/isKeyInQuery}}{{/isApiKey}}{{#isBasic}} + if (!String.IsNullOrEmpty(Configuration.Username) && !String.IsNullOrEmpty(Configuration.Password)) + { + headerParams["Authorization"] = "Basic " + Base64Encode(Configuration.Username + ":" + Configuration.Password); + }{{/isBasic}}{{#isOAuth}} + if (!String.IsNullOrEmpty(Configuration.AccessToken)) + { + headerParams["Authorization"] = "Bearer " + Configuration.AccessToken; + }{{/isOAuth}} break; {{/authMethods}} default: - //TODO show warning about security definition not found + //show warning about security definition not found break; } } @@ -335,11 +355,14 @@ namespace {{packageName}}.Client /// /// The accepts array to select from. /// The Accept header to use. - public String SelectHeaderAccept(String[] accepts) { + public String SelectHeaderAccept(String[] accepts) + { if (accepts.Length == 0) return null; + if (accepts.Contains("application/json", StringComparer.OrdinalIgnoreCase)) return "application/json"; + return String.Join(",", accepts); } @@ -350,8 +373,7 @@ namespace {{packageName}}.Client /// Encoded string. public static string Base64Encode(string text) { - var textByte = System.Text.Encoding.UTF8.GetBytes(text); - return System.Convert.ToBase64String(textByte); + return System.Convert.ToBase64String(System.Text.Encoding.UTF8.GetBytes(text)); } /// @@ -361,7 +383,8 @@ namespace {{packageName}}.Client /// Object to be casted /// Target type /// Casted object - public static dynamic ConvertType(dynamic source, Type dest) { + public static dynamic ConvertType(dynamic source, Type dest) + { return Convert.ChangeType(source, dest); } diff --git a/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Client/ApiClient.cs b/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Client/ApiClient.cs index 36217fde02d..a4f9276c882 100644 --- a/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Client/ApiClient.cs +++ b/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Client/ApiClient.cs @@ -198,10 +198,12 @@ namespace IO.Swagger.Client { if (obj is DateTime) return ((DateTime)obj).ToString ("u"); - else if (obj is IList) { + else if (obj is IList) + { string flattenString = ""; string separator = ","; - foreach (var param in (IList)obj) { + foreach (var param in (IList)obj) + { flattenString += param.ToString() + separator; } return flattenString.Remove(flattenString.Length - 1);; @@ -318,15 +320,24 @@ namespace IO.Swagger.Client { case "api_key": - headerParams["api_key"] = GetApiKeyWithPrefix("api_key"); + + var apiKeyValue = GetApiKeyWithPrefix("api_key"); + if (!String.IsNullOrEmpty(apiKeyValue)) + { + headerParams["api_key"] = apiKeyValue; + } break; case "petstore_auth": - headerParams["Authorization"] = "Bearer " + Configuration.AccessToken; + + if (!String.IsNullOrEmpty(Configuration.AccessToken)) + { + headerParams["Authorization"] = "Bearer " + Configuration.AccessToken; + } break; default: - //TODO show warning about security definition not found + //show warning about security definition not found break; } } @@ -339,11 +350,14 @@ namespace IO.Swagger.Client /// /// The accepts array to select from. /// The Accept header to use. - public String SelectHeaderAccept(String[] accepts) { + public String SelectHeaderAccept(String[] accepts) + { if (accepts.Length == 0) return null; + if (accepts.Contains("application/json", StringComparer.OrdinalIgnoreCase)) return "application/json"; + return String.Join(",", accepts); } @@ -354,8 +368,7 @@ namespace IO.Swagger.Client /// Encoded string. public static string Base64Encode(string text) { - var textByte = System.Text.Encoding.UTF8.GetBytes(text); - return System.Convert.ToBase64String(textByte); + return System.Convert.ToBase64String(System.Text.Encoding.UTF8.GetBytes(text)); } /// @@ -365,7 +378,8 @@ namespace IO.Swagger.Client /// Object to be casted /// Target type /// Casted object - public static dynamic ConvertType(dynamic source, Type dest) { + public static dynamic ConvertType(dynamic source, Type dest) + { return Convert.ChangeType(source, dest); } diff --git a/samples/client/petstore/csharp/SwaggerClientTest/obj/Debug/SwaggerClientTest.csproj.FilesWrittenAbsolute.txt b/samples/client/petstore/csharp/SwaggerClientTest/obj/Debug/SwaggerClientTest.csproj.FilesWrittenAbsolute.txt index b46eed9f9d6..6b370d8d490 100644 --- a/samples/client/petstore/csharp/SwaggerClientTest/obj/Debug/SwaggerClientTest.csproj.FilesWrittenAbsolute.txt +++ b/samples/client/petstore/csharp/SwaggerClientTest/obj/Debug/SwaggerClientTest.csproj.FilesWrittenAbsolute.txt @@ -1,6 +1,12 @@ +/Users/williamcheng/Code/csharp/swagger-codegen/samples/client/petstore/csharp/SwaggerClientTest/obj/Debug/.NETFramework,Version=v4.5.AssemblyAttribute.cs +/Users/williamcheng/Code/csharp/swagger-codegen/samples/client/petstore/csharp/SwaggerClientTest/bin/Debug/SwaggerClientTest.dll.mdb +/Users/williamcheng/Code/csharp/swagger-codegen/samples/client/petstore/csharp/SwaggerClientTest/bin/Debug/SwaggerClientTest.dll +/Users/williamcheng/Code/csharp/swagger-codegen/samples/client/petstore/csharp/SwaggerClientTest/obj/Debug/SwaggerClientTest.dll +/Users/williamcheng/Code/csharp/swagger-codegen/samples/client/petstore/csharp/SwaggerClientTest/obj/Debug/SwaggerClientTest.dll.mdb +/Users/williamcheng/Code/csharp/swagger-codegen/samples/client/petstore/csharp/SwaggerClientTest/bin/Debug/Newtonsoft.Json.dll +/Users/williamcheng/Code/csharp/swagger-codegen/samples/client/petstore/csharp/SwaggerClientTest/bin/Debug/nunit.framework.dll +/Users/williamcheng/Code/csharp/swagger-codegen/samples/client/petstore/csharp/SwaggerClientTest/bin/Debug/RestSharp.dll /Users/williamcheng/Code/wing328/swagger-codegen/samples/client/petstore/csharp/SwaggerClientTest/obj/Debug/.NETFramework,Version=v4.5.AssemblyAttribute.cs -/Users/williamcheng/Code/wing328/swagger-codegen/samples/client/petstore/csharp/SwaggerClientTest/bin/Debug/SwaggerClientTest.dll.mdb -/Users/williamcheng/Code/wing328/swagger-codegen/samples/client/petstore/csharp/SwaggerClientTest/bin/Debug/SwaggerClientTest.dll /Users/williamcheng/Code/wing328/swagger-codegen/samples/client/petstore/csharp/SwaggerClientTest/obj/Debug/SwaggerClientTest.dll /Users/williamcheng/Code/wing328/swagger-codegen/samples/client/petstore/csharp/SwaggerClientTest/obj/Debug/SwaggerClientTest.dll.mdb /Users/williamcheng/Code/wing328/swagger-codegen/samples/client/petstore/csharp/SwaggerClientTest/bin/Debug/Newtonsoft.Json.dll From 0ed70dcb4dcc860b3ff86e73dadd6153abc9f926 Mon Sep 17 00:00:00 2001 From: wing328 Date: Fri, 20 Nov 2015 16:15:19 +0800 Subject: [PATCH 045/211] update basic auth to allow only username/password --- .../src/main/resources/csharp/ApiClient.mustache | 2 +- .../csharp/SwaggerClientTest/SwaggerClientTest.userprefs | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/modules/swagger-codegen/src/main/resources/csharp/ApiClient.mustache b/modules/swagger-codegen/src/main/resources/csharp/ApiClient.mustache index 8af5250c471..bac6fd02a69 100644 --- a/modules/swagger-codegen/src/main/resources/csharp/ApiClient.mustache +++ b/modules/swagger-codegen/src/main/resources/csharp/ApiClient.mustache @@ -331,7 +331,7 @@ namespace {{packageName}}.Client { queryParams["{{keyParamName}}"] = apiKeyValue; }{{/isKeyInQuery}}{{/isApiKey}}{{#isBasic}} - if (!String.IsNullOrEmpty(Configuration.Username) && !String.IsNullOrEmpty(Configuration.Password)) + if (!String.IsNullOrEmpty(Configuration.Username) || !String.IsNullOrEmpty(Configuration.Password)) { headerParams["Authorization"] = "Basic " + Base64Encode(Configuration.Username + ":" + Configuration.Password); }{{/isBasic}}{{#isOAuth}} diff --git a/samples/client/petstore/csharp/SwaggerClientTest/SwaggerClientTest.userprefs b/samples/client/petstore/csharp/SwaggerClientTest/SwaggerClientTest.userprefs index 05585bff932..5f6ec1cf979 100644 --- a/samples/client/petstore/csharp/SwaggerClientTest/SwaggerClientTest.userprefs +++ b/samples/client/petstore/csharp/SwaggerClientTest/SwaggerClientTest.userprefs @@ -2,7 +2,7 @@ - + @@ -26,4 +26,4 @@ - \ No newline at end of file + From ff3ba73d188234b8560ff35325f05bdce950d75c Mon Sep 17 00:00:00 2001 From: wing328 Date: Sun, 22 Nov 2015 16:14:16 +0800 Subject: [PATCH 046/211] add documentation to test cases in C# --- .../SwaggerClientTest.userprefs | 21 ++---------------- .../csharp/SwaggerClientTest/TestPet.cs | 20 +++++++++++++++-- .../bin/Debug/SwaggerClientTest.dll | Bin 67584 -> 67584 bytes .../bin/Debug/SwaggerClientTest.dll.mdb | Bin 21107 -> 21137 bytes ...ClientTest.csproj.FilesWrittenAbsolute.txt | 2 ++ .../obj/Debug/SwaggerClientTest.dll | Bin 67584 -> 67584 bytes .../obj/Debug/SwaggerClientTest.dll.mdb | Bin 21107 -> 21137 bytes 7 files changed, 22 insertions(+), 21 deletions(-) diff --git a/samples/client/petstore/csharp/SwaggerClientTest/SwaggerClientTest.userprefs b/samples/client/petstore/csharp/SwaggerClientTest/SwaggerClientTest.userprefs index 5f6ec1cf979..0a2248522b9 100644 --- a/samples/client/petstore/csharp/SwaggerClientTest/SwaggerClientTest.userprefs +++ b/samples/client/petstore/csharp/SwaggerClientTest/SwaggerClientTest.userprefs @@ -2,28 +2,11 @@ - + - - - - - - - - - - - - - - - - - - + \ No newline at end of file diff --git a/samples/client/petstore/csharp/SwaggerClientTest/TestPet.cs b/samples/client/petstore/csharp/SwaggerClientTest/TestPet.cs index 0227a2d9113..19a14c592f4 100644 --- a/samples/client/petstore/csharp/SwaggerClientTest/TestPet.cs +++ b/samples/client/petstore/csharp/SwaggerClientTest/TestPet.cs @@ -49,7 +49,9 @@ namespace SwaggerClient.TestPet petApi.DeletePet(petId, "test key"); } - + /// + /// Test GetPetByIdAsync + /// [Test ()] public void TestGetPetByIdAsync () { @@ -74,6 +76,9 @@ namespace SwaggerClient.TestPet } + /// + /// Test GetPetById + /// [Test ()] public void TestGetPetById () { @@ -97,6 +102,9 @@ namespace SwaggerClient.TestPet } + /// + /// Test UpdatePetWithForm + /// [Test ()] public void TestUpdatePetWithForm () { @@ -115,6 +123,9 @@ namespace SwaggerClient.TestPet Assert.AreEqual (56, response.Category.Id); } + /// + /// Test UploadFile + /// [Test ()] public void TestUploadFile () { @@ -129,7 +140,9 @@ namespace SwaggerClient.TestPet } - + /// + /// Test FindPetByStatus + /// [Test ()] public void TestFindPetByStatus () { @@ -145,6 +158,9 @@ namespace SwaggerClient.TestPet } + /// + /// Test Equal + /// [Test ()] public void TestEqual() { diff --git a/samples/client/petstore/csharp/SwaggerClientTest/bin/Debug/SwaggerClientTest.dll b/samples/client/petstore/csharp/SwaggerClientTest/bin/Debug/SwaggerClientTest.dll index 924934c46233779ca4dd6c58049f0518ece993b2..cb328f9bb0767ff59711234a803eedb72bf52baf 100755 GIT binary patch delta 2800 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 Date: Sun, 22 Nov 2015 16:27:14 +0800 Subject: [PATCH 047/211] Use separate library to do base64 encoding in Java default and jersey2 clients to make it work in both JVM and Android --- .../src/main/resources/Java/auth/HttpBasicAuth.mustache | 5 +++-- .../src/main/resources/Java/libraries/jersey2/pom.mustache | 7 +++++++ .../swagger-codegen/src/main/resources/Java/pom.mustache | 7 +++++++ samples/client/petstore/java/default/pom.xml | 7 +++++++ .../main/java/io/swagger/client/auth/HttpBasicAuth.java | 7 ++++--- samples/client/petstore/java/jersey2/pom.xml | 7 +++++++ .../main/java/io/swagger/client/auth/HttpBasicAuth.java | 7 ++++--- 7 files changed, 39 insertions(+), 8 deletions(-) diff --git a/modules/swagger-codegen/src/main/resources/Java/auth/HttpBasicAuth.mustache b/modules/swagger-codegen/src/main/resources/Java/auth/HttpBasicAuth.mustache index 509f4742b61..febabe33d64 100644 --- a/modules/swagger-codegen/src/main/resources/Java/auth/HttpBasicAuth.mustache +++ b/modules/swagger-codegen/src/main/resources/Java/auth/HttpBasicAuth.mustache @@ -2,11 +2,12 @@ package {{invokerPackage}}.auth; import {{invokerPackage}}.Pair; +import com.migcomponents.migbase64.Base64; + import java.util.Map; import java.util.List; import java.io.UnsupportedEncodingException; -import javax.xml.bind.DatatypeConverter; {{>generatedAnnotation}} public class HttpBasicAuth implements Authentication { @@ -36,7 +37,7 @@ public class HttpBasicAuth implements Authentication { } String str = (username == null ? "" : username) + ":" + (password == null ? "" : password); try { - headerParams.put("Authorization", "Basic " + DatatypeConverter.printBase64Binary(str.getBytes("UTF-8"))); + headerParams.put("Authorization", "Basic " + Base64.encodeToString(str.getBytes("UTF-8"), false)); } catch (UnsupportedEncodingException e) { throw new RuntimeException(e); } diff --git a/modules/swagger-codegen/src/main/resources/Java/libraries/jersey2/pom.mustache b/modules/swagger-codegen/src/main/resources/Java/libraries/jersey2/pom.mustache index c8d2145bc6e..dbe0138aa54 100644 --- a/modules/swagger-codegen/src/main/resources/Java/libraries/jersey2/pom.mustache +++ b/modules/swagger-codegen/src/main/resources/Java/libraries/jersey2/pom.mustache @@ -152,6 +152,13 @@ ${jodatime-version} + + + com.brsanthu + migbase64 + 2.2 + + junit diff --git a/modules/swagger-codegen/src/main/resources/Java/pom.mustache b/modules/swagger-codegen/src/main/resources/Java/pom.mustache index 3f4d9d9a55b..c5bfbc65b74 100644 --- a/modules/swagger-codegen/src/main/resources/Java/pom.mustache +++ b/modules/swagger-codegen/src/main/resources/Java/pom.mustache @@ -148,6 +148,13 @@ ${jodatime-version} + + + com.brsanthu + migbase64 + 2.2 + + junit diff --git a/samples/client/petstore/java/default/pom.xml b/samples/client/petstore/java/default/pom.xml index 894e318b5f3..8a939b9dc34 100644 --- a/samples/client/petstore/java/default/pom.xml +++ b/samples/client/petstore/java/default/pom.xml @@ -148,6 +148,13 @@ ${jodatime-version} + + + com.brsanthu + migbase64 + 2.2 + + junit diff --git a/samples/client/petstore/java/default/src/main/java/io/swagger/client/auth/HttpBasicAuth.java b/samples/client/petstore/java/default/src/main/java/io/swagger/client/auth/HttpBasicAuth.java index 074f1833542..8c2aa444678 100644 --- a/samples/client/petstore/java/default/src/main/java/io/swagger/client/auth/HttpBasicAuth.java +++ b/samples/client/petstore/java/default/src/main/java/io/swagger/client/auth/HttpBasicAuth.java @@ -2,13 +2,14 @@ package io.swagger.client.auth; import io.swagger.client.Pair; +import com.migcomponents.migbase64.Base64; + import java.util.Map; import java.util.List; import java.io.UnsupportedEncodingException; -import javax.xml.bind.DatatypeConverter; -@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-11-20T17:28:23.285+08:00") +@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-11-22T13:15:32.345+08:00") public class HttpBasicAuth implements Authentication { private String username; private String password; @@ -36,7 +37,7 @@ public class HttpBasicAuth implements Authentication { } String str = (username == null ? "" : username) + ":" + (password == null ? "" : password); try { - headerParams.put("Authorization", "Basic " + DatatypeConverter.printBase64Binary(str.getBytes("UTF-8"))); + headerParams.put("Authorization", "Basic " + Base64.encodeToString(str.getBytes("UTF-8"), false)); } catch (UnsupportedEncodingException e) { throw new RuntimeException(e); } diff --git a/samples/client/petstore/java/jersey2/pom.xml b/samples/client/petstore/java/jersey2/pom.xml index e5353a66ea5..0881cc29374 100644 --- a/samples/client/petstore/java/jersey2/pom.xml +++ b/samples/client/petstore/java/jersey2/pom.xml @@ -152,6 +152,13 @@ ${jodatime-version} + + + com.brsanthu + migbase64 + 2.2 + + junit diff --git a/samples/client/petstore/java/jersey2/src/main/java/io/swagger/client/auth/HttpBasicAuth.java b/samples/client/petstore/java/jersey2/src/main/java/io/swagger/client/auth/HttpBasicAuth.java index 0abfc056e1d..071139d656a 100644 --- a/samples/client/petstore/java/jersey2/src/main/java/io/swagger/client/auth/HttpBasicAuth.java +++ b/samples/client/petstore/java/jersey2/src/main/java/io/swagger/client/auth/HttpBasicAuth.java @@ -2,13 +2,14 @@ package io.swagger.client.auth; import io.swagger.client.Pair; +import com.migcomponents.migbase64.Base64; + import java.util.Map; import java.util.List; import java.io.UnsupportedEncodingException; -import javax.xml.bind.DatatypeConverter; -@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-11-20T17:28:47.318+08:00") +@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-11-22T13:15:27.225+08:00") public class HttpBasicAuth implements Authentication { private String username; private String password; @@ -36,7 +37,7 @@ public class HttpBasicAuth implements Authentication { } String str = (username == null ? "" : username) + ":" + (password == null ? "" : password); try { - headerParams.put("Authorization", "Basic " + DatatypeConverter.printBase64Binary(str.getBytes("UTF-8"))); + headerParams.put("Authorization", "Basic " + Base64.encodeToString(str.getBytes("UTF-8"), false)); } catch (UnsupportedEncodingException e) { throw new RuntimeException(e); } From 3b308bd36f51cb2af0b35256a1c207b02fdd9429 Mon Sep 17 00:00:00 2001 From: wing328 Date: Sun, 22 Nov 2015 18:35:45 +0800 Subject: [PATCH 048/211] update auth for php to skip empty apikey/username,password --- .../src/main/resources/php/api.mustache | 12 +++-- .../php/SwaggerClient-php/lib/Api/PetApi.php | 46 ++++++++++++------- .../SwaggerClient-php/lib/Api/StoreApi.php | 4 +- .../php/SwaggerClient-php/lib/ApiClient.php | 2 +- .../lib/ObjectSerializer.php | 2 +- 5 files changed, 43 insertions(+), 23 deletions(-) diff --git a/modules/swagger-codegen/src/main/resources/php/api.mustache b/modules/swagger-codegen/src/main/resources/php/api.mustache index e3a9749c423..53a81030813 100644 --- a/modules/swagger-codegen/src/main/resources/php/api.mustache +++ b/modules/swagger-codegen/src/main/resources/php/api.mustache @@ -166,12 +166,18 @@ use \{{invokerPackage}}\ObjectSerializer; $httpBody = $formParams; // for HTTP post (form) } {{#authMethods}}{{#isApiKey}} + // this endpoint requires API key authentication $apiKey = $this->apiClient->getApiKeyWithPrefix('{{keyParamName}}'); - if (isset($apiKey)) { + if ($apiKey !== null) { {{#isKeyInHeader}}$headerParams['{{keyParamName}}'] = $apiKey;{{/isKeyInHeader}}{{#isKeyInQuery}}$queryParams['{{keyParamName}}'] = $apiKey;{{/isKeyInQuery}} }{{/isApiKey}} - {{#isBasic}}$headerParams['Authorization'] = 'Basic ' . base64_encode($this->apiClient->getConfig()->getUsername() . ":" . $this->apiClient->getConfig()->getPassword());{{/isBasic}} - {{#isOAuth}}$headerParams['Authorization'] = 'Bearer ' . $this->apiClient->getConfig()->getAccessToken();{{/isOAuth}} + {{#isBasic}}// this endpoint requires HTTP basic authentication + if ($this->apiClient->getConfig()->getUsername() !== null or $this->apiClient->getConfig()->getPassword() !== null) { + $headerParams['Authorization'] = 'Basic ' . base64_encode($this->apiClient->getConfig()->getUsername() . ":" . $this->apiClient->getConfig()->getPassword()); + }{{/isBasic}}{{#isOAuth}}// this endpoint requires OAuth (access token) + if ($this->apiClient->getConfig()->getAccessToken() !== null) { + $headerParams['Authorization'] = 'Bearer ' . $this->apiClient->getConfig()->getAccessToken(); + }{{/isOAuth}} {{/authMethods}} // make the API Call try diff --git a/samples/client/petstore/php/SwaggerClient-php/lib/Api/PetApi.php b/samples/client/petstore/php/SwaggerClient-php/lib/Api/PetApi.php index a418ac90b43..bc03a7974d3 100644 --- a/samples/client/petstore/php/SwaggerClient-php/lib/Api/PetApi.php +++ b/samples/client/petstore/php/SwaggerClient-php/lib/Api/PetApi.php @@ -135,8 +135,10 @@ class PetApi $httpBody = $formParams; // for HTTP post (form) } - - $headerParams['Authorization'] = 'Bearer ' . $this->apiClient->getConfig()->getAccessToken(); + // this endpoint requires OAuth (access token) + if ($this->apiClient->getConfig()->getAccessToken() !== null) { + $headerParams['Authorization'] = 'Bearer ' . $this->apiClient->getConfig()->getAccessToken(); + } // make the API Call try @@ -200,8 +202,10 @@ class PetApi $httpBody = $formParams; // for HTTP post (form) } - - $headerParams['Authorization'] = 'Bearer ' . $this->apiClient->getConfig()->getAccessToken(); + // this endpoint requires OAuth (access token) + if ($this->apiClient->getConfig()->getAccessToken() !== null) { + $headerParams['Authorization'] = 'Bearer ' . $this->apiClient->getConfig()->getAccessToken(); + } // make the API Call try @@ -264,8 +268,10 @@ class PetApi $httpBody = $formParams; // for HTTP post (form) } - - $headerParams['Authorization'] = 'Bearer ' . $this->apiClient->getConfig()->getAccessToken(); + // this endpoint requires OAuth (access token) + if ($this->apiClient->getConfig()->getAccessToken() !== null) { + $headerParams['Authorization'] = 'Bearer ' . $this->apiClient->getConfig()->getAccessToken(); + } // make the API Call try @@ -340,8 +346,10 @@ class PetApi $httpBody = $formParams; // for HTTP post (form) } - - $headerParams['Authorization'] = 'Bearer ' . $this->apiClient->getConfig()->getAccessToken(); + // this endpoint requires OAuth (access token) + if ($this->apiClient->getConfig()->getAccessToken() !== null) { + $headerParams['Authorization'] = 'Bearer ' . $this->apiClient->getConfig()->getAccessToken(); + } // make the API Call try @@ -424,13 +432,13 @@ class PetApi $httpBody = $formParams; // for HTTP post (form) } + // this endpoint requires API key authentication $apiKey = $this->apiClient->getApiKeyWithPrefix('api_key'); - if (isset($apiKey)) { + if ($apiKey !== null) { $headerParams['api_key'] = $apiKey; } - // make the API Call try { @@ -526,8 +534,10 @@ class PetApi $httpBody = $formParams; // for HTTP post (form) } - - $headerParams['Authorization'] = 'Bearer ' . $this->apiClient->getConfig()->getAccessToken(); + // this endpoint requires OAuth (access token) + if ($this->apiClient->getConfig()->getAccessToken() !== null) { + $headerParams['Authorization'] = 'Bearer ' . $this->apiClient->getConfig()->getAccessToken(); + } // make the API Call try @@ -602,8 +612,10 @@ class PetApi $httpBody = $formParams; // for HTTP post (form) } - - $headerParams['Authorization'] = 'Bearer ' . $this->apiClient->getConfig()->getAccessToken(); + // this endpoint requires OAuth (access token) + if ($this->apiClient->getConfig()->getAccessToken() !== null) { + $headerParams['Authorization'] = 'Bearer ' . $this->apiClient->getConfig()->getAccessToken(); + } // make the API Call try @@ -694,8 +706,10 @@ class PetApi $httpBody = $formParams; // for HTTP post (form) } - - $headerParams['Authorization'] = 'Bearer ' . $this->apiClient->getConfig()->getAccessToken(); + // this endpoint requires OAuth (access token) + if ($this->apiClient->getConfig()->getAccessToken() !== null) { + $headerParams['Authorization'] = 'Bearer ' . $this->apiClient->getConfig()->getAccessToken(); + } // make the API Call try diff --git a/samples/client/petstore/php/SwaggerClient-php/lib/Api/StoreApi.php b/samples/client/petstore/php/SwaggerClient-php/lib/Api/StoreApi.php index b64b52d2225..d709330b056 100644 --- a/samples/client/petstore/php/SwaggerClient-php/lib/Api/StoreApi.php +++ b/samples/client/petstore/php/SwaggerClient-php/lib/Api/StoreApi.php @@ -130,13 +130,13 @@ class StoreApi $httpBody = $formParams; // for HTTP post (form) } + // this endpoint requires API key authentication $apiKey = $this->apiClient->getApiKeyWithPrefix('api_key'); - if (isset($apiKey)) { + if ($apiKey !== null) { $headerParams['api_key'] = $apiKey; } - // make the API Call try { diff --git a/samples/client/petstore/php/SwaggerClient-php/lib/ApiClient.php b/samples/client/petstore/php/SwaggerClient-php/lib/ApiClient.php index 982b8955a15..a0bb07273e4 100644 --- a/samples/client/petstore/php/SwaggerClient-php/lib/ApiClient.php +++ b/samples/client/petstore/php/SwaggerClient-php/lib/ApiClient.php @@ -69,7 +69,7 @@ class ApiClient * Constructor of the class * @param Configuration $config config for this ApiClient */ - function __construct(Configuration $config = null) + public function __construct(Configuration $config = null) { if ($config == null) { $config = Configuration::getDefaultConfiguration(); diff --git a/samples/client/petstore/php/SwaggerClient-php/lib/ObjectSerializer.php b/samples/client/petstore/php/SwaggerClient-php/lib/ObjectSerializer.php index efdc1c896ab..0d281b9d1fa 100644 --- a/samples/client/petstore/php/SwaggerClient-php/lib/ObjectSerializer.php +++ b/samples/client/petstore/php/SwaggerClient-php/lib/ObjectSerializer.php @@ -193,7 +193,7 @@ class ObjectSerializer $deserialized = $values; } elseif ($class === '\DateTime') { $deserialized = new \DateTime($data); - } elseif (in_array($class, array('void', 'bool', 'string', 'double', 'byte', 'mixed', 'integer', 'float', 'int', 'DateTime', 'number', 'boolean', 'object'))) { + } elseif (in_array($class, array('integer', 'int', 'void', 'number', 'object', 'double', 'float', 'byte', 'DateTime', 'string', 'mixed', 'boolean', 'bool'))) { settype($data, $class); $deserialized = $data; } elseif ($class === '\SplFileObject') { From 5ae96c61a90c34ea00ebeb8f5d0990892dcc2ee7 Mon Sep 17 00:00:00 2001 From: xhh Date: Mon, 23 Nov 2015 15:57:14 +0800 Subject: [PATCH 049/211] Add "equals" and "hashCode" methods to Java clients Added for the default, "jersey2" and "okhttp-gson" clients --- .../Java/libraries/okhttp-gson/model.mustache | 16 +++++++++++++ .../src/main/resources/Java/model.mustache | 16 +++++++++++++ .../io/swagger/client/model/Category.java | 17 +++++++++++++- .../java/io/swagger/client/model/Order.java | 21 ++++++++++++++++- .../java/io/swagger/client/model/Pet.java | 23 +++++++++++++++++-- .../java/io/swagger/client/model/Tag.java | 17 +++++++++++++- .../java/io/swagger/client/model/User.java | 23 ++++++++++++++++++- .../io/swagger/petstore/test/PetApiTest.java | 21 +++++++++++++++++ .../io/swagger/client/model/Category.java | 17 +++++++++++++- .../java/io/swagger/client/model/Order.java | 21 ++++++++++++++++- .../java/io/swagger/client/model/Pet.java | 21 ++++++++++++++++- .../java/io/swagger/client/model/Tag.java | 17 +++++++++++++- .../java/io/swagger/client/model/User.java | 23 ++++++++++++++++++- .../io/swagger/petstore/test/PetApiTest.java | 21 +++++++++++++++++ .../io/swagger/client/model/Category.java | 15 ++++++++++++ .../java/io/swagger/client/model/Order.java | 19 +++++++++++++++ .../java/io/swagger/client/model/Pet.java | 21 ++++++++++++++++- .../java/io/swagger/client/model/Tag.java | 15 ++++++++++++ .../java/io/swagger/client/model/User.java | 21 +++++++++++++++++ .../io/swagger/petstore/test/PetApiTest.java | 21 +++++++++++++++++ 20 files changed, 374 insertions(+), 12 deletions(-) diff --git a/modules/swagger-codegen/src/main/resources/Java/libraries/okhttp-gson/model.mustache b/modules/swagger-codegen/src/main/resources/Java/libraries/okhttp-gson/model.mustache index 0987aa68f34..677b29762c3 100644 --- a/modules/swagger-codegen/src/main/resources/Java/libraries/okhttp-gson/model.mustache +++ b/modules/swagger-codegen/src/main/resources/Java/libraries/okhttp-gson/model.mustache @@ -8,6 +8,7 @@ import com.google.gson.annotations.SerializedName; {{#serializableModel}} import java.io.Serializable;{{/serializableModel}} +import java.util.Objects; import io.swagger.annotations.*; @@ -44,6 +45,21 @@ public class {{classname}} {{#parent}}extends {{{parent}}}{{/parent}} {{#seriali {{/vars}} + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + {{classname}} {{classVarName}} = ({{classname}}) o;{{#hasVars}} + return {{#vars}}Objects.equals({{name}}, {{classVarName}}.{{name}}){{#hasMore}} && + {{/hasMore}}{{^hasMore}};{{/hasMore}}{{/vars}}{{/hasVars}}{{^hasVars}} + return true;{{/hasVars}} + } + + @Override + public int hashCode() { + return Objects.hash({{#vars}}{{name}}{{#hasMore}}, {{/hasMore}}{{/vars}}); + } + @Override public String toString() { StringBuilder sb = new StringBuilder(); diff --git a/modules/swagger-codegen/src/main/resources/Java/model.mustache b/modules/swagger-codegen/src/main/resources/Java/model.mustache index f5e48ba997f..a6973c649f7 100644 --- a/modules/swagger-codegen/src/main/resources/Java/model.mustache +++ b/modules/swagger-codegen/src/main/resources/Java/model.mustache @@ -6,6 +6,7 @@ import {{invokerPackage}}.StringUtil; {{#serializableModel}} import java.io.Serializable;{{/serializableModel}} +import java.util.Objects; import io.swagger.annotations.*; import com.fasterxml.jackson.annotation.JsonProperty; @@ -42,6 +43,21 @@ public class {{classname}} {{#parent}}extends {{{parent}}}{{/parent}} {{#seriali {{/vars}} + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + {{classname}} {{classVarName}} = ({{classname}}) o;{{#hasVars}} + return {{#vars}}Objects.equals({{name}}, {{classVarName}}.{{name}}){{#hasMore}} && + {{/hasMore}}{{^hasMore}};{{/hasMore}}{{/vars}}{{/hasVars}}{{^hasVars}} + return true;{{/hasVars}} + } + + @Override + public int hashCode() { + return Objects.hash({{#vars}}{{name}}{{#hasMore}}, {{/hasMore}}{{/vars}}); + } + @Override public String toString() { StringBuilder sb = new StringBuilder(); diff --git a/samples/client/petstore/java/default/src/main/java/io/swagger/client/model/Category.java b/samples/client/petstore/java/default/src/main/java/io/swagger/client/model/Category.java index 1d1d9e1d1b5..1eaf71f9f71 100644 --- a/samples/client/petstore/java/default/src/main/java/io/swagger/client/model/Category.java +++ b/samples/client/petstore/java/default/src/main/java/io/swagger/client/model/Category.java @@ -3,13 +3,14 @@ package io.swagger.client.model; import io.swagger.client.StringUtil; +import java.util.Objects; import io.swagger.annotations.*; import com.fasterxml.jackson.annotation.JsonProperty; @ApiModel(description = "") -@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-10-30T16:36:47.681+08:00") +@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-11-23T15:47:53.879+08:00") public class Category { private Long id = null; @@ -41,6 +42,20 @@ public class Category { + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + Category category = (Category) o; + return Objects.equals(id, category.id) && + Objects.equals(name, category.name); + } + + @Override + public int hashCode() { + return Objects.hash(id, name); + } + @Override public String toString() { StringBuilder sb = new StringBuilder(); 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 9c6094aefbf..4ef600ccf55 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 @@ -4,13 +4,14 @@ import io.swagger.client.StringUtil; import java.util.Date; +import java.util.Objects; import io.swagger.annotations.*; import com.fasterxml.jackson.annotation.JsonProperty; @ApiModel(description = "") -@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-10-30T16:36:47.681+08:00") +@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-11-23T15:47:53.879+08:00") public class Order { private Long id = null; @@ -113,6 +114,24 @@ public enum StatusEnum { + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + Order order = (Order) o; + return Objects.equals(id, order.id) && + Objects.equals(petId, order.petId) && + Objects.equals(quantity, order.quantity) && + Objects.equals(shipDate, order.shipDate) && + Objects.equals(status, order.status) && + Objects.equals(complete, order.complete); + } + + @Override + public int hashCode() { + return Objects.hash(id, petId, quantity, shipDate, status, complete); + } + @Override public String toString() { StringBuilder sb = new StringBuilder(); 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 b842a7800de..c5101f0f7ec 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 @@ -2,17 +2,18 @@ package io.swagger.client.model; import io.swagger.client.StringUtil; import io.swagger.client.model.Category; -import io.swagger.client.model.Tag; import java.util.*; +import io.swagger.client.model.Tag; +import java.util.Objects; import io.swagger.annotations.*; import com.fasterxml.jackson.annotation.JsonProperty; @ApiModel(description = "") -@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-10-30T16:36:47.681+08:00") +@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-11-23T15:47:53.879+08:00") public class Pet { private Long id = null; @@ -115,6 +116,24 @@ public enum StatusEnum { + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + Pet pet = (Pet) o; + return Objects.equals(id, pet.id) && + Objects.equals(category, pet.category) && + Objects.equals(name, pet.name) && + Objects.equals(photoUrls, pet.photoUrls) && + Objects.equals(tags, pet.tags) && + Objects.equals(status, pet.status); + } + + @Override + public int hashCode() { + return Objects.hash(id, category, name, photoUrls, tags, status); + } + @Override public String toString() { StringBuilder sb = new StringBuilder(); diff --git a/samples/client/petstore/java/default/src/main/java/io/swagger/client/model/Tag.java b/samples/client/petstore/java/default/src/main/java/io/swagger/client/model/Tag.java index d52ef12d01c..be612525c65 100644 --- a/samples/client/petstore/java/default/src/main/java/io/swagger/client/model/Tag.java +++ b/samples/client/petstore/java/default/src/main/java/io/swagger/client/model/Tag.java @@ -3,13 +3,14 @@ package io.swagger.client.model; import io.swagger.client.StringUtil; +import java.util.Objects; import io.swagger.annotations.*; import com.fasterxml.jackson.annotation.JsonProperty; @ApiModel(description = "") -@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-10-30T16:36:47.681+08:00") +@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-11-23T15:47:53.879+08:00") public class Tag { private Long id = null; @@ -41,6 +42,20 @@ public class Tag { + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + Tag tag = (Tag) o; + return Objects.equals(id, tag.id) && + Objects.equals(name, tag.name); + } + + @Override + public int hashCode() { + return Objects.hash(id, name); + } + @Override public String toString() { StringBuilder sb = new StringBuilder(); diff --git a/samples/client/petstore/java/default/src/main/java/io/swagger/client/model/User.java b/samples/client/petstore/java/default/src/main/java/io/swagger/client/model/User.java index 8aa9e34283f..73e2686efb0 100644 --- a/samples/client/petstore/java/default/src/main/java/io/swagger/client/model/User.java +++ b/samples/client/petstore/java/default/src/main/java/io/swagger/client/model/User.java @@ -3,13 +3,14 @@ package io.swagger.client.model; import io.swagger.client.StringUtil; +import java.util.Objects; import io.swagger.annotations.*; import com.fasterxml.jackson.annotation.JsonProperty; @ApiModel(description = "") -@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-10-30T16:36:47.681+08:00") +@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-11-23T15:47:53.879+08:00") public class User { private Long id = null; @@ -120,6 +121,26 @@ public class User { + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + User user = (User) o; + return Objects.equals(id, user.id) && + Objects.equals(username, user.username) && + Objects.equals(firstName, user.firstName) && + Objects.equals(lastName, user.lastName) && + Objects.equals(email, user.email) && + Objects.equals(password, user.password) && + Objects.equals(phone, user.phone) && + Objects.equals(userStatus, user.userStatus); + } + + @Override + public int hashCode() { + return Objects.hash(id, username, firstName, lastName, email, password, phone, userStatus); + } + @Override public String toString() { StringBuilder sb = new StringBuilder(); 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 0a8f8a1665d..0dd8b310df9 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 @@ -174,6 +174,27 @@ public class PetApiTest { api.uploadFile(pet.getId(), "a test file", new File(file.getAbsolutePath())); } + @Test + public void testEqualsAndHashCode() { + Pet pet1 = new Pet(); + Pet pet2 = new Pet(); + assertTrue(pet1.equals(pet2)); + assertTrue(pet1.equals(pet2)); + assertTrue(pet1.hashCode() == pet1.hashCode()); + + pet2.setName("really-happy"); + pet2.setPhotoUrls(Arrays.asList(new String[]{"http://foo.bar.com/1", "http://foo.bar.com/2"})); + assertFalse(pet1.equals(pet2)); + assertFalse(pet1.equals(pet2)); + assertFalse(pet1.hashCode() == (pet2.hashCode())); + + pet1.setName("really-happy"); + pet1.setPhotoUrls(Arrays.asList(new String[]{"http://foo.bar.com/1", "http://foo.bar.com/2"})); + assertTrue(pet1.equals(pet2)); + assertTrue(pet1.equals(pet2)); + assertTrue(pet1.hashCode() == pet1.hashCode()); + } + private Pet createRandomPet() { Pet pet = new Pet(); pet.setId(System.currentTimeMillis()); diff --git a/samples/client/petstore/java/jersey2/src/main/java/io/swagger/client/model/Category.java b/samples/client/petstore/java/jersey2/src/main/java/io/swagger/client/model/Category.java index 26e1b89bba7..46ecec0daf5 100644 --- a/samples/client/petstore/java/jersey2/src/main/java/io/swagger/client/model/Category.java +++ b/samples/client/petstore/java/jersey2/src/main/java/io/swagger/client/model/Category.java @@ -3,13 +3,14 @@ package io.swagger.client.model; import io.swagger.client.StringUtil; +import java.util.Objects; import io.swagger.annotations.*; import com.fasterxml.jackson.annotation.JsonProperty; @ApiModel(description = "") -@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-11-17T11:17:50.535-05:00") +@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-11-23T15:52:25.446+08:00") public class Category { private Long id = null; @@ -41,6 +42,20 @@ public class Category { + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + Category category = (Category) o; + return Objects.equals(id, category.id) && + Objects.equals(name, category.name); + } + + @Override + public int hashCode() { + return Objects.hash(id, name); + } + @Override public String toString() { StringBuilder sb = new StringBuilder(); 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 6efc0786703..9570fe22827 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 @@ -4,13 +4,14 @@ import io.swagger.client.StringUtil; import java.util.Date; +import java.util.Objects; import io.swagger.annotations.*; import com.fasterxml.jackson.annotation.JsonProperty; @ApiModel(description = "") -@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-11-17T11:17:50.535-05:00") +@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-11-23T15:52:25.446+08:00") public class Order { private Long id = null; @@ -113,6 +114,24 @@ public enum StatusEnum { + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + Order order = (Order) o; + return Objects.equals(id, order.id) && + Objects.equals(petId, order.petId) && + Objects.equals(quantity, order.quantity) && + Objects.equals(shipDate, order.shipDate) && + Objects.equals(status, order.status) && + Objects.equals(complete, order.complete); + } + + @Override + public int hashCode() { + return Objects.hash(id, petId, quantity, shipDate, status, complete); + } + @Override public String toString() { StringBuilder sb = new StringBuilder(); 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 02f0b88d6f5..a066ee8b251 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 @@ -6,13 +6,14 @@ import java.util.*; import io.swagger.client.model.Tag; +import java.util.Objects; import io.swagger.annotations.*; import com.fasterxml.jackson.annotation.JsonProperty; @ApiModel(description = "") -@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-11-17T11:17:50.535-05:00") +@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-11-23T15:52:25.446+08:00") public class Pet { private Long id = null; @@ -115,6 +116,24 @@ public enum StatusEnum { + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + Pet pet = (Pet) o; + return Objects.equals(id, pet.id) && + Objects.equals(category, pet.category) && + Objects.equals(name, pet.name) && + Objects.equals(photoUrls, pet.photoUrls) && + Objects.equals(tags, pet.tags) && + Objects.equals(status, pet.status); + } + + @Override + public int hashCode() { + return Objects.hash(id, category, name, photoUrls, tags, status); + } + @Override public String toString() { StringBuilder sb = new StringBuilder(); diff --git a/samples/client/petstore/java/jersey2/src/main/java/io/swagger/client/model/Tag.java b/samples/client/petstore/java/jersey2/src/main/java/io/swagger/client/model/Tag.java index 9dc8e017f9f..2d64dbe4351 100644 --- a/samples/client/petstore/java/jersey2/src/main/java/io/swagger/client/model/Tag.java +++ b/samples/client/petstore/java/jersey2/src/main/java/io/swagger/client/model/Tag.java @@ -3,13 +3,14 @@ package io.swagger.client.model; import io.swagger.client.StringUtil; +import java.util.Objects; import io.swagger.annotations.*; import com.fasterxml.jackson.annotation.JsonProperty; @ApiModel(description = "") -@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-11-17T11:17:50.535-05:00") +@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-11-23T15:52:25.446+08:00") public class Tag { private Long id = null; @@ -41,6 +42,20 @@ public class Tag { + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + Tag tag = (Tag) o; + return Objects.equals(id, tag.id) && + Objects.equals(name, tag.name); + } + + @Override + public int hashCode() { + return Objects.hash(id, name); + } + @Override public String toString() { StringBuilder sb = new StringBuilder(); diff --git a/samples/client/petstore/java/jersey2/src/main/java/io/swagger/client/model/User.java b/samples/client/petstore/java/jersey2/src/main/java/io/swagger/client/model/User.java index 8ad399fcc6b..8712e66e386 100644 --- a/samples/client/petstore/java/jersey2/src/main/java/io/swagger/client/model/User.java +++ b/samples/client/petstore/java/jersey2/src/main/java/io/swagger/client/model/User.java @@ -3,13 +3,14 @@ package io.swagger.client.model; import io.swagger.client.StringUtil; +import java.util.Objects; import io.swagger.annotations.*; import com.fasterxml.jackson.annotation.JsonProperty; @ApiModel(description = "") -@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-11-17T11:17:50.535-05:00") +@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-11-23T15:52:25.446+08:00") public class User { private Long id = null; @@ -120,6 +121,26 @@ public class User { + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + User user = (User) o; + return Objects.equals(id, user.id) && + Objects.equals(username, user.username) && + Objects.equals(firstName, user.firstName) && + Objects.equals(lastName, user.lastName) && + Objects.equals(email, user.email) && + Objects.equals(password, user.password) && + Objects.equals(phone, user.phone) && + Objects.equals(userStatus, user.userStatus); + } + + @Override + public int hashCode() { + return Objects.hash(id, username, firstName, lastName, email, password, phone, userStatus); + } + @Override public String toString() { StringBuilder sb = new StringBuilder(); 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 0a8f8a1665d..0dd8b310df9 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 @@ -174,6 +174,27 @@ public class PetApiTest { api.uploadFile(pet.getId(), "a test file", new File(file.getAbsolutePath())); } + @Test + public void testEqualsAndHashCode() { + Pet pet1 = new Pet(); + Pet pet2 = new Pet(); + assertTrue(pet1.equals(pet2)); + assertTrue(pet1.equals(pet2)); + assertTrue(pet1.hashCode() == pet1.hashCode()); + + pet2.setName("really-happy"); + pet2.setPhotoUrls(Arrays.asList(new String[]{"http://foo.bar.com/1", "http://foo.bar.com/2"})); + assertFalse(pet1.equals(pet2)); + assertFalse(pet1.equals(pet2)); + assertFalse(pet1.hashCode() == (pet2.hashCode())); + + pet1.setName("really-happy"); + pet1.setPhotoUrls(Arrays.asList(new String[]{"http://foo.bar.com/1", "http://foo.bar.com/2"})); + assertTrue(pet1.equals(pet2)); + assertTrue(pet1.equals(pet2)); + assertTrue(pet1.hashCode() == pet1.hashCode()); + } + private Pet createRandomPet() { Pet pet = new Pet(); pet.setId(System.currentTimeMillis()); diff --git a/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/model/Category.java b/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/model/Category.java index 0a7023ac7a5..1edddf2d7ff 100644 --- a/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/model/Category.java +++ b/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/model/Category.java @@ -5,6 +5,7 @@ import io.swagger.client.StringUtil; import com.google.gson.annotations.SerializedName; +import java.util.Objects; import io.swagger.annotations.*; @@ -44,6 +45,20 @@ public class Category { + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + Category category = (Category) o; + return Objects.equals(id, category.id) && + Objects.equals(name, category.name); + } + + @Override + public int hashCode() { + return Objects.hash(id, name); + } + @Override public String toString() { StringBuilder sb = new StringBuilder(); diff --git a/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/model/Order.java b/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/model/Order.java index df8e77b6fb3..d6053ceb783 100644 --- a/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/model/Order.java +++ b/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/model/Order.java @@ -6,6 +6,7 @@ import java.util.Date; import com.google.gson.annotations.SerializedName; +import java.util.Objects; import io.swagger.annotations.*; @@ -125,6 +126,24 @@ public enum StatusEnum { + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + Order order = (Order) o; + return Objects.equals(id, order.id) && + Objects.equals(petId, order.petId) && + Objects.equals(quantity, order.quantity) && + Objects.equals(shipDate, order.shipDate) && + Objects.equals(status, order.status) && + Objects.equals(complete, order.complete); + } + + @Override + public int hashCode() { + return Objects.hash(id, petId, quantity, shipDate, status, complete); + } + @Override public String toString() { StringBuilder sb = new StringBuilder(); diff --git a/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/model/Pet.java b/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/model/Pet.java index d1310e10ded..6cd9e1c7b77 100644 --- a/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/model/Pet.java +++ b/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/model/Pet.java @@ -2,12 +2,13 @@ package io.swagger.client.model; import io.swagger.client.StringUtil; import io.swagger.client.model.Category; -import io.swagger.client.model.Tag; import java.util.*; +import io.swagger.client.model.Tag; import com.google.gson.annotations.SerializedName; +import java.util.Objects; import io.swagger.annotations.*; @@ -127,6 +128,24 @@ public enum StatusEnum { + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + Pet pet = (Pet) o; + return Objects.equals(id, pet.id) && + Objects.equals(category, pet.category) && + Objects.equals(name, pet.name) && + Objects.equals(photoUrls, pet.photoUrls) && + Objects.equals(tags, pet.tags) && + Objects.equals(status, pet.status); + } + + @Override + public int hashCode() { + return Objects.hash(id, category, name, photoUrls, tags, status); + } + @Override public String toString() { StringBuilder sb = new StringBuilder(); diff --git a/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/model/Tag.java b/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/model/Tag.java index 9935b744f2d..d9240a03990 100644 --- a/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/model/Tag.java +++ b/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/model/Tag.java @@ -5,6 +5,7 @@ import io.swagger.client.StringUtil; import com.google.gson.annotations.SerializedName; +import java.util.Objects; import io.swagger.annotations.*; @@ -44,6 +45,20 @@ public class Tag { + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + Tag tag = (Tag) o; + return Objects.equals(id, tag.id) && + Objects.equals(name, tag.name); + } + + @Override + public int hashCode() { + return Objects.hash(id, name); + } + @Override public String toString() { StringBuilder sb = new StringBuilder(); diff --git a/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/model/User.java b/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/model/User.java index cba6abef8dd..9587082fd7d 100644 --- a/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/model/User.java +++ b/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/model/User.java @@ -5,6 +5,7 @@ import io.swagger.client.StringUtil; import com.google.gson.annotations.SerializedName; +import java.util.Objects; import io.swagger.annotations.*; @@ -129,6 +130,26 @@ public class User { + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + User user = (User) o; + return Objects.equals(id, user.id) && + Objects.equals(username, user.username) && + Objects.equals(firstName, user.firstName) && + Objects.equals(lastName, user.lastName) && + Objects.equals(email, user.email) && + Objects.equals(password, user.password) && + Objects.equals(phone, user.phone) && + Objects.equals(userStatus, user.userStatus); + } + + @Override + public int hashCode() { + return Objects.hash(id, username, firstName, lastName, email, password, phone, userStatus); + } + @Override public String toString() { StringBuilder sb = new StringBuilder(); diff --git a/samples/client/petstore/java/okhttp-gson/src/test/java/io/swagger/petstore/test/PetApiTest.java b/samples/client/petstore/java/okhttp-gson/src/test/java/io/swagger/petstore/test/PetApiTest.java index cab122649c7..b0997a86335 100644 --- a/samples/client/petstore/java/okhttp-gson/src/test/java/io/swagger/petstore/test/PetApiTest.java +++ b/samples/client/petstore/java/okhttp-gson/src/test/java/io/swagger/petstore/test/PetApiTest.java @@ -272,6 +272,27 @@ public class PetApiTest { api.uploadFile(pet.getId(), "a test file", new File(file.getAbsolutePath())); } + @Test + public void testEqualsAndHashCode() { + Pet pet1 = new Pet(); + Pet pet2 = new Pet(); + assertTrue(pet1.equals(pet2)); + assertTrue(pet1.equals(pet2)); + assertTrue(pet1.hashCode() == pet1.hashCode()); + + pet2.setName("really-happy"); + pet2.setPhotoUrls(Arrays.asList(new String[]{"http://foo.bar.com/1", "http://foo.bar.com/2"})); + assertFalse(pet1.equals(pet2)); + assertFalse(pet1.equals(pet2)); + assertFalse(pet1.hashCode() == (pet2.hashCode())); + + pet1.setName("really-happy"); + pet1.setPhotoUrls(Arrays.asList(new String[]{"http://foo.bar.com/1", "http://foo.bar.com/2"})); + assertTrue(pet1.equals(pet2)); + assertTrue(pet1.equals(pet2)); + assertTrue(pet1.hashCode() == pet1.hashCode()); + } + private Pet createRandomPet() { Pet pet = new Pet(); pet.setId(System.currentTimeMillis()); From 630def9d1912d710ab491b872669a4afe911fb5a Mon Sep 17 00:00:00 2001 From: xhh Date: Mon, 23 Nov 2015 19:59:44 +0800 Subject: [PATCH 050/211] Add "equals" and "hashCode" methods to Java clients for the "retrofit" and "retrofit2" libraries --- .../Java/libraries/okhttp-gson/model.mustache | 8 ++++-- .../Java/libraries/retrofit/model.mustache | 20 +++++++++++++++ .../Java/libraries/retrofit2/model.mustache | 20 +++++++++++++++ .../src/main/resources/Java/model.mustache | 8 ++++-- .../io/swagger/client/model/Category.java | 10 +++++--- .../java/io/swagger/client/model/Order.java | 10 +++++--- .../java/io/swagger/client/model/Pet.java | 10 +++++--- .../java/io/swagger/client/model/Tag.java | 10 +++++--- .../java/io/swagger/client/model/User.java | 10 +++++--- .../io/swagger/client/model/Category.java | 8 ++++-- .../java/io/swagger/client/model/Order.java | 8 ++++-- .../java/io/swagger/client/model/Pet.java | 8 ++++-- .../java/io/swagger/client/model/Tag.java | 8 ++++-- .../java/io/swagger/client/model/User.java | 8 ++++-- .../io/swagger/client/model/Category.java | 19 ++++++++++++++ .../java/io/swagger/client/model/Order.java | 23 +++++++++++++++++ .../java/io/swagger/client/model/Pet.java | 25 ++++++++++++++++++- .../java/io/swagger/client/model/Tag.java | 19 ++++++++++++++ .../java/io/swagger/client/model/User.java | 25 +++++++++++++++++++ .../io/swagger/petstore/test/PetApiTest.java | 21 ++++++++++++++++ .../io/swagger/client/model/Category.java | 19 ++++++++++++++ .../java/io/swagger/client/model/Order.java | 23 +++++++++++++++++ .../java/io/swagger/client/model/Pet.java | 23 +++++++++++++++++ .../java/io/swagger/client/model/Tag.java | 19 ++++++++++++++ .../java/io/swagger/client/model/User.java | 25 +++++++++++++++++++ .../io/swagger/petstore/test/PetApiTest.java | 21 ++++++++++++++++ 26 files changed, 378 insertions(+), 30 deletions(-) diff --git a/modules/swagger-codegen/src/main/resources/Java/libraries/okhttp-gson/model.mustache b/modules/swagger-codegen/src/main/resources/Java/libraries/okhttp-gson/model.mustache index 677b29762c3..b7b4ea2cf3f 100644 --- a/modules/swagger-codegen/src/main/resources/Java/libraries/okhttp-gson/model.mustache +++ b/modules/swagger-codegen/src/main/resources/Java/libraries/okhttp-gson/model.mustache @@ -47,8 +47,12 @@ public class {{classname}} {{#parent}}extends {{{parent}}}{{/parent}} {{#seriali @Override public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } {{classname}} {{classVarName}} = ({{classname}}) o;{{#hasVars}} return {{#vars}}Objects.equals({{name}}, {{classVarName}}.{{name}}){{#hasMore}} && {{/hasMore}}{{^hasMore}};{{/hasMore}}{{/vars}}{{/hasVars}}{{^hasVars}} diff --git a/modules/swagger-codegen/src/main/resources/Java/libraries/retrofit/model.mustache b/modules/swagger-codegen/src/main/resources/Java/libraries/retrofit/model.mustache index 0987aa68f34..b7b4ea2cf3f 100644 --- a/modules/swagger-codegen/src/main/resources/Java/libraries/retrofit/model.mustache +++ b/modules/swagger-codegen/src/main/resources/Java/libraries/retrofit/model.mustache @@ -8,6 +8,7 @@ import com.google.gson.annotations.SerializedName; {{#serializableModel}} import java.io.Serializable;{{/serializableModel}} +import java.util.Objects; import io.swagger.annotations.*; @@ -44,6 +45,25 @@ public class {{classname}} {{#parent}}extends {{{parent}}}{{/parent}} {{#seriali {{/vars}} + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + {{classname}} {{classVarName}} = ({{classname}}) o;{{#hasVars}} + return {{#vars}}Objects.equals({{name}}, {{classVarName}}.{{name}}){{#hasMore}} && + {{/hasMore}}{{^hasMore}};{{/hasMore}}{{/vars}}{{/hasVars}}{{^hasVars}} + return true;{{/hasVars}} + } + + @Override + public int hashCode() { + return Objects.hash({{#vars}}{{name}}{{#hasMore}}, {{/hasMore}}{{/vars}}); + } + @Override public String toString() { StringBuilder sb = new StringBuilder(); diff --git a/modules/swagger-codegen/src/main/resources/Java/libraries/retrofit2/model.mustache b/modules/swagger-codegen/src/main/resources/Java/libraries/retrofit2/model.mustache index 0987aa68f34..b7b4ea2cf3f 100644 --- a/modules/swagger-codegen/src/main/resources/Java/libraries/retrofit2/model.mustache +++ b/modules/swagger-codegen/src/main/resources/Java/libraries/retrofit2/model.mustache @@ -8,6 +8,7 @@ import com.google.gson.annotations.SerializedName; {{#serializableModel}} import java.io.Serializable;{{/serializableModel}} +import java.util.Objects; import io.swagger.annotations.*; @@ -44,6 +45,25 @@ public class {{classname}} {{#parent}}extends {{{parent}}}{{/parent}} {{#seriali {{/vars}} + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + {{classname}} {{classVarName}} = ({{classname}}) o;{{#hasVars}} + return {{#vars}}Objects.equals({{name}}, {{classVarName}}.{{name}}){{#hasMore}} && + {{/hasMore}}{{^hasMore}};{{/hasMore}}{{/vars}}{{/hasVars}}{{^hasVars}} + return true;{{/hasVars}} + } + + @Override + public int hashCode() { + return Objects.hash({{#vars}}{{name}}{{#hasMore}}, {{/hasMore}}{{/vars}}); + } + @Override public String toString() { StringBuilder sb = new StringBuilder(); diff --git a/modules/swagger-codegen/src/main/resources/Java/model.mustache b/modules/swagger-codegen/src/main/resources/Java/model.mustache index a6973c649f7..55aa77e30f0 100644 --- a/modules/swagger-codegen/src/main/resources/Java/model.mustache +++ b/modules/swagger-codegen/src/main/resources/Java/model.mustache @@ -45,8 +45,12 @@ public class {{classname}} {{#parent}}extends {{{parent}}}{{/parent}} {{#seriali @Override public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } {{classname}} {{classVarName}} = ({{classname}}) o;{{#hasVars}} return {{#vars}}Objects.equals({{name}}, {{classVarName}}.{{name}}){{#hasMore}} && {{/hasMore}}{{^hasMore}};{{/hasMore}}{{/vars}}{{/hasVars}}{{^hasVars}} diff --git a/samples/client/petstore/java/default/src/main/java/io/swagger/client/model/Category.java b/samples/client/petstore/java/default/src/main/java/io/swagger/client/model/Category.java index 1eaf71f9f71..07bd79cd8a3 100644 --- a/samples/client/petstore/java/default/src/main/java/io/swagger/client/model/Category.java +++ b/samples/client/petstore/java/default/src/main/java/io/swagger/client/model/Category.java @@ -10,7 +10,7 @@ import com.fasterxml.jackson.annotation.JsonProperty; @ApiModel(description = "") -@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-11-23T15:47:53.879+08:00") +@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-11-23T19:53:03.542+08:00") public class Category { private Long id = null; @@ -44,8 +44,12 @@ public class Category { @Override public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } Category category = (Category) o; return Objects.equals(id, category.id) && Objects.equals(name, category.name); 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 4ef600ccf55..8cbcad11dc5 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 @@ -11,7 +11,7 @@ import com.fasterxml.jackson.annotation.JsonProperty; @ApiModel(description = "") -@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-11-23T15:47:53.879+08:00") +@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-11-23T19:53:03.542+08:00") public class Order { private Long id = null; @@ -116,8 +116,12 @@ public enum StatusEnum { @Override public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } Order order = (Order) o; return Objects.equals(id, order.id) && Objects.equals(petId, order.petId) && 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 c5101f0f7ec..ec78248b840 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 @@ -13,7 +13,7 @@ import com.fasterxml.jackson.annotation.JsonProperty; @ApiModel(description = "") -@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-11-23T15:47:53.879+08:00") +@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-11-23T19:53:03.542+08:00") public class Pet { private Long id = null; @@ -118,8 +118,12 @@ public enum StatusEnum { @Override public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } Pet pet = (Pet) o; return Objects.equals(id, pet.id) && Objects.equals(category, pet.category) && diff --git a/samples/client/petstore/java/default/src/main/java/io/swagger/client/model/Tag.java b/samples/client/petstore/java/default/src/main/java/io/swagger/client/model/Tag.java index be612525c65..3c2278b5e4f 100644 --- a/samples/client/petstore/java/default/src/main/java/io/swagger/client/model/Tag.java +++ b/samples/client/petstore/java/default/src/main/java/io/swagger/client/model/Tag.java @@ -10,7 +10,7 @@ import com.fasterxml.jackson.annotation.JsonProperty; @ApiModel(description = "") -@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-11-23T15:47:53.879+08:00") +@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-11-23T19:53:03.542+08:00") public class Tag { private Long id = null; @@ -44,8 +44,12 @@ public class Tag { @Override public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } Tag tag = (Tag) o; return Objects.equals(id, tag.id) && Objects.equals(name, tag.name); diff --git a/samples/client/petstore/java/default/src/main/java/io/swagger/client/model/User.java b/samples/client/petstore/java/default/src/main/java/io/swagger/client/model/User.java index 73e2686efb0..ec20b37c378 100644 --- a/samples/client/petstore/java/default/src/main/java/io/swagger/client/model/User.java +++ b/samples/client/petstore/java/default/src/main/java/io/swagger/client/model/User.java @@ -10,7 +10,7 @@ import com.fasterxml.jackson.annotation.JsonProperty; @ApiModel(description = "") -@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-11-23T15:47:53.879+08:00") +@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-11-23T19:53:03.542+08:00") public class User { private Long id = null; @@ -123,8 +123,12 @@ public class User { @Override public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } User user = (User) o; return Objects.equals(id, user.id) && Objects.equals(username, user.username) && diff --git a/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/model/Category.java b/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/model/Category.java index 1edddf2d7ff..4f15da15c65 100644 --- a/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/model/Category.java +++ b/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/model/Category.java @@ -47,8 +47,12 @@ public class Category { @Override public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } Category category = (Category) o; return Objects.equals(id, category.id) && Objects.equals(name, category.name); diff --git a/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/model/Order.java b/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/model/Order.java index d6053ceb783..18c51201ad4 100644 --- a/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/model/Order.java +++ b/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/model/Order.java @@ -128,8 +128,12 @@ public enum StatusEnum { @Override public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } Order order = (Order) o; return Objects.equals(id, order.id) && Objects.equals(petId, order.petId) && diff --git a/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/model/Pet.java b/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/model/Pet.java index 6cd9e1c7b77..7e771866b39 100644 --- a/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/model/Pet.java +++ b/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/model/Pet.java @@ -130,8 +130,12 @@ public enum StatusEnum { @Override public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } Pet pet = (Pet) o; return Objects.equals(id, pet.id) && Objects.equals(category, pet.category) && diff --git a/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/model/Tag.java b/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/model/Tag.java index d9240a03990..474904011f7 100644 --- a/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/model/Tag.java +++ b/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/model/Tag.java @@ -47,8 +47,12 @@ public class Tag { @Override public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } Tag tag = (Tag) o; return Objects.equals(id, tag.id) && Objects.equals(name, tag.name); diff --git a/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/model/User.java b/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/model/User.java index 9587082fd7d..82f1a0822db 100644 --- a/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/model/User.java +++ b/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/model/User.java @@ -132,8 +132,12 @@ public class User { @Override public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } User user = (User) o; return Objects.equals(id, user.id) && Objects.equals(username, user.username) && diff --git a/samples/client/petstore/java/retrofit/src/main/java/io/swagger/client/model/Category.java b/samples/client/petstore/java/retrofit/src/main/java/io/swagger/client/model/Category.java index 0a7023ac7a5..4f15da15c65 100644 --- a/samples/client/petstore/java/retrofit/src/main/java/io/swagger/client/model/Category.java +++ b/samples/client/petstore/java/retrofit/src/main/java/io/swagger/client/model/Category.java @@ -5,6 +5,7 @@ import io.swagger.client.StringUtil; import com.google.gson.annotations.SerializedName; +import java.util.Objects; import io.swagger.annotations.*; @@ -44,6 +45,24 @@ public class Category { + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + Category category = (Category) o; + return Objects.equals(id, category.id) && + Objects.equals(name, category.name); + } + + @Override + public int hashCode() { + return Objects.hash(id, name); + } + @Override public String toString() { StringBuilder sb = new StringBuilder(); diff --git a/samples/client/petstore/java/retrofit/src/main/java/io/swagger/client/model/Order.java b/samples/client/petstore/java/retrofit/src/main/java/io/swagger/client/model/Order.java index df8e77b6fb3..18c51201ad4 100644 --- a/samples/client/petstore/java/retrofit/src/main/java/io/swagger/client/model/Order.java +++ b/samples/client/petstore/java/retrofit/src/main/java/io/swagger/client/model/Order.java @@ -6,6 +6,7 @@ import java.util.Date; import com.google.gson.annotations.SerializedName; +import java.util.Objects; import io.swagger.annotations.*; @@ -125,6 +126,28 @@ public enum StatusEnum { + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + Order order = (Order) o; + return Objects.equals(id, order.id) && + Objects.equals(petId, order.petId) && + Objects.equals(quantity, order.quantity) && + Objects.equals(shipDate, order.shipDate) && + Objects.equals(status, order.status) && + Objects.equals(complete, order.complete); + } + + @Override + public int hashCode() { + return Objects.hash(id, petId, quantity, shipDate, status, complete); + } + @Override public String toString() { StringBuilder sb = new StringBuilder(); diff --git a/samples/client/petstore/java/retrofit/src/main/java/io/swagger/client/model/Pet.java b/samples/client/petstore/java/retrofit/src/main/java/io/swagger/client/model/Pet.java index d1310e10ded..7e771866b39 100644 --- a/samples/client/petstore/java/retrofit/src/main/java/io/swagger/client/model/Pet.java +++ b/samples/client/petstore/java/retrofit/src/main/java/io/swagger/client/model/Pet.java @@ -2,12 +2,13 @@ package io.swagger.client.model; import io.swagger.client.StringUtil; import io.swagger.client.model.Category; -import io.swagger.client.model.Tag; import java.util.*; +import io.swagger.client.model.Tag; import com.google.gson.annotations.SerializedName; +import java.util.Objects; import io.swagger.annotations.*; @@ -127,6 +128,28 @@ public enum StatusEnum { + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + Pet pet = (Pet) o; + return Objects.equals(id, pet.id) && + Objects.equals(category, pet.category) && + Objects.equals(name, pet.name) && + Objects.equals(photoUrls, pet.photoUrls) && + Objects.equals(tags, pet.tags) && + Objects.equals(status, pet.status); + } + + @Override + public int hashCode() { + return Objects.hash(id, category, name, photoUrls, tags, status); + } + @Override public String toString() { StringBuilder sb = new StringBuilder(); diff --git a/samples/client/petstore/java/retrofit/src/main/java/io/swagger/client/model/Tag.java b/samples/client/petstore/java/retrofit/src/main/java/io/swagger/client/model/Tag.java index 9935b744f2d..474904011f7 100644 --- a/samples/client/petstore/java/retrofit/src/main/java/io/swagger/client/model/Tag.java +++ b/samples/client/petstore/java/retrofit/src/main/java/io/swagger/client/model/Tag.java @@ -5,6 +5,7 @@ import io.swagger.client.StringUtil; import com.google.gson.annotations.SerializedName; +import java.util.Objects; import io.swagger.annotations.*; @@ -44,6 +45,24 @@ public class Tag { + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + Tag tag = (Tag) o; + return Objects.equals(id, tag.id) && + Objects.equals(name, tag.name); + } + + @Override + public int hashCode() { + return Objects.hash(id, name); + } + @Override public String toString() { StringBuilder sb = new StringBuilder(); diff --git a/samples/client/petstore/java/retrofit/src/main/java/io/swagger/client/model/User.java b/samples/client/petstore/java/retrofit/src/main/java/io/swagger/client/model/User.java index cba6abef8dd..82f1a0822db 100644 --- a/samples/client/petstore/java/retrofit/src/main/java/io/swagger/client/model/User.java +++ b/samples/client/petstore/java/retrofit/src/main/java/io/swagger/client/model/User.java @@ -5,6 +5,7 @@ import io.swagger.client.StringUtil; import com.google.gson.annotations.SerializedName; +import java.util.Objects; import io.swagger.annotations.*; @@ -129,6 +130,30 @@ public class User { + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + User user = (User) o; + return Objects.equals(id, user.id) && + Objects.equals(username, user.username) && + Objects.equals(firstName, user.firstName) && + Objects.equals(lastName, user.lastName) && + Objects.equals(email, user.email) && + Objects.equals(password, user.password) && + Objects.equals(phone, user.phone) && + Objects.equals(userStatus, user.userStatus); + } + + @Override + public int hashCode() { + return Objects.hash(id, username, firstName, lastName, email, password, phone, userStatus); + } + @Override public String toString() { StringBuilder sb = new StringBuilder(); diff --git a/samples/client/petstore/java/retrofit/src/test/java/io/swagger/petstore/test/PetApiTest.java b/samples/client/petstore/java/retrofit/src/test/java/io/swagger/petstore/test/PetApiTest.java index ec93912b1f6..51d84c5cff4 100644 --- a/samples/client/petstore/java/retrofit/src/test/java/io/swagger/petstore/test/PetApiTest.java +++ b/samples/client/petstore/java/retrofit/src/test/java/io/swagger/petstore/test/PetApiTest.java @@ -143,6 +143,27 @@ public class PetApiTest { api.uploadFile(pet.getId(), "a test file", new TypedFile("text/plain", file)); } + @Test + public void testEqualsAndHashCode() { + Pet pet1 = new Pet(); + Pet pet2 = new Pet(); + assertTrue(pet1.equals(pet2)); + assertTrue(pet1.equals(pet2)); + assertTrue(pet1.hashCode() == pet1.hashCode()); + + pet2.setName("really-happy"); + pet2.setPhotoUrls(Arrays.asList(new String[]{"http://foo.bar.com/1", "http://foo.bar.com/2"})); + assertFalse(pet1.equals(pet2)); + assertFalse(pet1.equals(pet2)); + assertFalse(pet1.hashCode() == (pet2.hashCode())); + + pet1.setName("really-happy"); + pet1.setPhotoUrls(Arrays.asList(new String[]{"http://foo.bar.com/1", "http://foo.bar.com/2"})); + assertTrue(pet1.equals(pet2)); + assertTrue(pet1.equals(pet2)); + assertTrue(pet1.hashCode() == pet1.hashCode()); + } + private Pet createRandomPet() { Pet pet = new Pet(); pet.setId(System.currentTimeMillis()); diff --git a/samples/client/petstore/java/retrofit2/src/main/java/io/swagger/client/model/Category.java b/samples/client/petstore/java/retrofit2/src/main/java/io/swagger/client/model/Category.java index 0a7023ac7a5..4f15da15c65 100644 --- a/samples/client/petstore/java/retrofit2/src/main/java/io/swagger/client/model/Category.java +++ b/samples/client/petstore/java/retrofit2/src/main/java/io/swagger/client/model/Category.java @@ -5,6 +5,7 @@ import io.swagger.client.StringUtil; import com.google.gson.annotations.SerializedName; +import java.util.Objects; import io.swagger.annotations.*; @@ -44,6 +45,24 @@ public class Category { + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + Category category = (Category) o; + return Objects.equals(id, category.id) && + Objects.equals(name, category.name); + } + + @Override + public int hashCode() { + return Objects.hash(id, name); + } + @Override public String toString() { StringBuilder sb = new StringBuilder(); diff --git a/samples/client/petstore/java/retrofit2/src/main/java/io/swagger/client/model/Order.java b/samples/client/petstore/java/retrofit2/src/main/java/io/swagger/client/model/Order.java index df8e77b6fb3..18c51201ad4 100644 --- a/samples/client/petstore/java/retrofit2/src/main/java/io/swagger/client/model/Order.java +++ b/samples/client/petstore/java/retrofit2/src/main/java/io/swagger/client/model/Order.java @@ -6,6 +6,7 @@ import java.util.Date; import com.google.gson.annotations.SerializedName; +import java.util.Objects; import io.swagger.annotations.*; @@ -125,6 +126,28 @@ public enum StatusEnum { + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + Order order = (Order) o; + return Objects.equals(id, order.id) && + Objects.equals(petId, order.petId) && + Objects.equals(quantity, order.quantity) && + Objects.equals(shipDate, order.shipDate) && + Objects.equals(status, order.status) && + Objects.equals(complete, order.complete); + } + + @Override + public int hashCode() { + return Objects.hash(id, petId, quantity, shipDate, status, complete); + } + @Override public String toString() { StringBuilder sb = new StringBuilder(); diff --git a/samples/client/petstore/java/retrofit2/src/main/java/io/swagger/client/model/Pet.java b/samples/client/petstore/java/retrofit2/src/main/java/io/swagger/client/model/Pet.java index 9ab5457e26a..7e771866b39 100644 --- a/samples/client/petstore/java/retrofit2/src/main/java/io/swagger/client/model/Pet.java +++ b/samples/client/petstore/java/retrofit2/src/main/java/io/swagger/client/model/Pet.java @@ -8,6 +8,7 @@ import io.swagger.client.model.Tag; import com.google.gson.annotations.SerializedName; +import java.util.Objects; import io.swagger.annotations.*; @@ -127,6 +128,28 @@ public enum StatusEnum { + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + Pet pet = (Pet) o; + return Objects.equals(id, pet.id) && + Objects.equals(category, pet.category) && + Objects.equals(name, pet.name) && + Objects.equals(photoUrls, pet.photoUrls) && + Objects.equals(tags, pet.tags) && + Objects.equals(status, pet.status); + } + + @Override + public int hashCode() { + return Objects.hash(id, category, name, photoUrls, tags, status); + } + @Override public String toString() { StringBuilder sb = new StringBuilder(); diff --git a/samples/client/petstore/java/retrofit2/src/main/java/io/swagger/client/model/Tag.java b/samples/client/petstore/java/retrofit2/src/main/java/io/swagger/client/model/Tag.java index 9935b744f2d..474904011f7 100644 --- a/samples/client/petstore/java/retrofit2/src/main/java/io/swagger/client/model/Tag.java +++ b/samples/client/petstore/java/retrofit2/src/main/java/io/swagger/client/model/Tag.java @@ -5,6 +5,7 @@ import io.swagger.client.StringUtil; import com.google.gson.annotations.SerializedName; +import java.util.Objects; import io.swagger.annotations.*; @@ -44,6 +45,24 @@ public class Tag { + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + Tag tag = (Tag) o; + return Objects.equals(id, tag.id) && + Objects.equals(name, tag.name); + } + + @Override + public int hashCode() { + return Objects.hash(id, name); + } + @Override public String toString() { StringBuilder sb = new StringBuilder(); diff --git a/samples/client/petstore/java/retrofit2/src/main/java/io/swagger/client/model/User.java b/samples/client/petstore/java/retrofit2/src/main/java/io/swagger/client/model/User.java index cba6abef8dd..82f1a0822db 100644 --- a/samples/client/petstore/java/retrofit2/src/main/java/io/swagger/client/model/User.java +++ b/samples/client/petstore/java/retrofit2/src/main/java/io/swagger/client/model/User.java @@ -5,6 +5,7 @@ import io.swagger.client.StringUtil; import com.google.gson.annotations.SerializedName; +import java.util.Objects; import io.swagger.annotations.*; @@ -129,6 +130,30 @@ public class User { + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + User user = (User) o; + return Objects.equals(id, user.id) && + Objects.equals(username, user.username) && + Objects.equals(firstName, user.firstName) && + Objects.equals(lastName, user.lastName) && + Objects.equals(email, user.email) && + Objects.equals(password, user.password) && + Objects.equals(phone, user.phone) && + Objects.equals(userStatus, user.userStatus); + } + + @Override + public int hashCode() { + return Objects.hash(id, username, firstName, lastName, email, password, phone, userStatus); + } + @Override public String toString() { StringBuilder sb = new StringBuilder(); diff --git a/samples/client/petstore/java/retrofit2/src/test/java/io/swagger/petstore/test/PetApiTest.java b/samples/client/petstore/java/retrofit2/src/test/java/io/swagger/petstore/test/PetApiTest.java index 8522c4f30ad..309914b434e 100644 --- a/samples/client/petstore/java/retrofit2/src/test/java/io/swagger/petstore/test/PetApiTest.java +++ b/samples/client/petstore/java/retrofit2/src/test/java/io/swagger/petstore/test/PetApiTest.java @@ -142,6 +142,27 @@ public class PetApiTest { api.uploadFile(pet.getId(), "a test file", RequestBody.create(MediaType.parse("text/plain"), file)).execute(); } + @Test + public void testEqualsAndHashCode() { + Pet pet1 = new Pet(); + Pet pet2 = new Pet(); + assertTrue(pet1.equals(pet2)); + assertTrue(pet1.equals(pet2)); + assertTrue(pet1.hashCode() == pet1.hashCode()); + + pet2.setName("really-happy"); + pet2.setPhotoUrls(Arrays.asList(new String[]{"http://foo.bar.com/1", "http://foo.bar.com/2"})); + assertFalse(pet1.equals(pet2)); + assertFalse(pet1.equals(pet2)); + assertFalse(pet1.hashCode() == (pet2.hashCode())); + + pet1.setName("really-happy"); + pet1.setPhotoUrls(Arrays.asList(new String[]{"http://foo.bar.com/1", "http://foo.bar.com/2"})); + assertTrue(pet1.equals(pet2)); + assertTrue(pet1.equals(pet2)); + assertTrue(pet1.hashCode() == pet1.hashCode()); + } + private Pet createRandomPet() { Pet pet = new Pet(); pet.setId(System.currentTimeMillis()); From 0cb8e4ca698ca63875bdbcd607f45a59f5572e1c Mon Sep 17 00:00:00 2001 From: Tony Tam Date: Mon, 23 Nov 2015 14:27:22 -1000 Subject: [PATCH 051/211] updated readme, base path --- .../codegen/languages/JaxRSServerCodegen.java | 15 +++------------ .../src/main/resources/JavaJaxRS/README.mustache | 9 +++++++++ 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/JaxRSServerCodegen.java b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/JaxRSServerCodegen.java index 375f5d72bff..6bc1a392414 100644 --- a/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/JaxRSServerCodegen.java +++ b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/JaxRSServerCodegen.java @@ -33,18 +33,6 @@ public class JaxRSServerCodegen extends JavaClientCodegen implements CodegenConf additionalProperties.put(CodegenConstants.ARTIFACT_ID, artifactId); additionalProperties.put(CodegenConstants.ARTIFACT_VERSION, artifactVersion); additionalProperties.put("title", title); - - - languageSpecificPrimitives = new HashSet( - Arrays.asList( - "String", - "boolean", - "Boolean", - "Double", - "Integer", - "Long", - "Float") - ); } public CodegenType getTag() { @@ -109,6 +97,9 @@ public class JaxRSServerCodegen extends JavaClientCodegen implements CodegenConf @Override public void preprocessSwagger(Swagger swagger) { + if("/".equals(swagger.getBasePath())) { + swagger.setBasePath(""); + } if(swagger != null && swagger.getPaths() != null) { for(String pathname : swagger.getPaths().keySet()) { Path path = swagger.getPath(pathname); diff --git a/modules/swagger-codegen/src/main/resources/JavaJaxRS/README.mustache b/modules/swagger-codegen/src/main/resources/JavaJaxRS/README.mustache index 00431f63dbc..f240464851d 100644 --- a/modules/swagger-codegen/src/main/resources/JavaJaxRS/README.mustache +++ b/modules/swagger-codegen/src/main/resources/JavaJaxRS/README.mustache @@ -12,3 +12,12 @@ To run the server, please execute the following: ``` mvn clean package jetty:run ``` + +You can then view the swagger listing here: + +``` +http://localhost:8080{{contextPath}}/swagger.json +``` + +Note that if you have configured the `host` to be something other than localhost, the calls through +swagger-ui will be directed to that host and not localhost! \ No newline at end of file From 0bc0d1808e7eeb41bed07e9a2d39a80a035864a8 Mon Sep 17 00:00:00 2001 From: wing328 Date: Tue, 24 Nov 2015 17:36:38 +0800 Subject: [PATCH 052/211] add eq for python, update test case --- .../src/main/resources/python/model.mustache | 13 +++++++ samples/client/petstore/python/.coverage | 2 +- .../petstore/python/dev-requirements.txt.log | 35 +++++++++++++++++++ .../python/swagger_client/models/category.py | 13 +++++++ .../python/swagger_client/models/order.py | 13 +++++++ .../python/swagger_client/models/pet.py | 13 +++++++ .../python/swagger_client/models/tag.py | 13 +++++++ .../python/swagger_client/models/user.py | 13 +++++++ .../petstore/python/tests/test_pet_model.py | 33 +++++++++++++++++ 9 files changed, 147 insertions(+), 1 deletion(-) diff --git a/modules/swagger-codegen/src/main/resources/python/model.mustache b/modules/swagger-codegen/src/main/resources/python/model.mustache index 81e0b05849a..0dbe29add4f 100644 --- a/modules/swagger-codegen/src/main/resources/python/model.mustache +++ b/modules/swagger-codegen/src/main/resources/python/model.mustache @@ -113,5 +113,18 @@ class {{classname}}(object): For `print` and `pprint` """ return self.to_str() + + def __eq__(self, other): + """ + Returns true if both objects are equal + """ + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """ + Returns true if both objects are not equal + """ + return not self == other + {{/model}} {{/models}} diff --git a/samples/client/petstore/python/.coverage b/samples/client/petstore/python/.coverage index ddd00f77a03..98dd5627b87 100644 --- a/samples/client/petstore/python/.coverage +++ b/samples/client/petstore/python/.coverage @@ -1 +1 @@ -!coverage.py: This is a private format, don't read it directly!{"lines": {"/Users/williamcheng/Code/wing328/swagger-codegen/samples/client/petstore/python/swagger_client/apis/pet_api.py": [512, 513, 514, 516, 86, 18, 20, 22, 23, 26, 539, 28, 29, 542, 543, 32, 548, 37, 39, 40, 41, 42, 555, 556, 45, 558, 559, 560, 562, 564, 565, 566, 568, 569, 571, 574, 575, 576, 580, 581, 70, 584, 73, 586, 587, 588, 589, 590, 591, 592, 593, 594, 595, 596, 598, 88, 90, 92, 93, 95, 96, 97, 100, 101, 102, 106, 107, 621, 622, 624, 625, 626, 79, 116, 117, 118, 631, 632, 121, 122, 635, 124, 638, 639, 641, 642, 643, 645, 647, 649, 650, 651, 652, 653, 654, 656, 145, 146, 659, 148, 661, 150, 665, 666, 155, 156, 538, 159, 160, 673, 162, 675, 164, 677, 166, 679, 168, 169, 171, 172, 173, 541, 176, 177, 178, 115, 182, 183, 186, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 552, 200, 119, 120, 377, 221, 222, 549, 224, 225, 226, 231, 232, 431, 235, 236, 110, 238, 240, 241, 242, 244, 246, 247, 249, 383, 252, 253, 254, 258, 259, 262, 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 276, 46, 48, 297, 298, 300, 301, 302, 44, 307, 308, 311, 312, 314, 316, 317, 318, 320, 322, 323, 325, 113, 328, 329, 330, 334, 335, 338, 340, 341, 342, 343, 344, 345, 346, 347, 348, 349, 350, 485, 352, 84, 114, 373, 374, 376, 660, 378, 149, 384, 387, 390, 391, 393, 394, 395, 397, 399, 401, 402, 404, 407, 408, 409, 413, 414, 69, 417, 419, 420, 421, 422, 423, 424, 425, 426, 427, 428, 429, 669, 72, 671, 74, 672, 83, 454, 455, 457, 458, 459, 674, 112, 464, 465, 468, 471, 472, 676, 474, 475, 476, 478, 480, 80, 482, 483, 484, 678, 486, 487, 489, 492, 493, 494, 680, 498, 499, 502, 681, 504, 505, 506, 507, 508, 509, 510, 511], "/Users/williamcheng/Code/wing328/swagger-codegen/samples/client/petstore/python/swagger_client/apis/user_api.py": [32, 355, 37, 39, 200, 124, 428, 589, 48, 18, 20, 22, 23, 276, 26, 507, 28, 29], "/Users/williamcheng/Code/wing328/swagger-codegen/samples/client/petstore/python/swagger_client/api_client.py": [518, 525, 526, 527, 19, 21, 22, 23, 24, 537, 26, 27, 28, 29, 30, 31, 32, 33, 34, 547, 36, 37, 40, 42, 44, 558, 49, 52, 566, 568, 569, 570, 571, 572, 573, 575, 68, 69, 70, 75, 76, 77, 79, 80, 82, 84, 91, 96, 98, 102, 103, 104, 107, 108, 109, 111, 112, 115, 116, 117, 118, 119, 120, 123, 124, 125, 126, 129, 130, 131, 134, 137, 138, 141, 144, 145, 146, 147, 149, 152, 153, 155, 157, 158, 160, 162, 171, 172, 174, 176, 191, 192, 194, 195, 196, 197, 198, 199, 200, 201, 202, 204, 205, 212, 213, 214, 216, 217, 219, 231, 235, 236, 240, 242, 251, 252, 254, 255, 256, 257, 258, 260, 261, 262, 263, 267, 268, 269, 272, 274, 275, 276, 278, 279, 280, 281, 283, 286, 287, 288, 316, 317, 318, 319, 320, 322, 323, 324, 325, 326, 327, 328, 329, 330, 332, 333, 337, 338, 339, 340, 341, 345, 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, 369, 370, 371, 372, 379, 387, 389, 390, 392, 393, 394, 395, 548, 397, 398, 399, 400, 401, 402, 404, 406, 413, 414, 416, 418, 419, 421, 423, 430, 431, 433, 435, 436, 438, 440, 448, 450, 453, 454, 455, 456, 458, 459, 467, 546, 493, 502, 503, 508, 510], "/Users/williamcheng/Code/wing328/swagger-codegen/samples/client/petstore/python/swagger_client/models/category.py": [72, 74, 109, 19, 21, 22, 104, 25, 29, 30, 96, 100, 114, 102, 39, 40, 41, 103, 44, 45, 46, 112, 49, 50, 83, 116, 94, 52, 122, 61, 85, 63], "/Users/williamcheng/Code/wing328/swagger-codegen/samples/client/petstore/python/swagger_client/rest.py": [20, 21, 23, 24, 25, 26, 27, 28, 31, 33, 35, 36, 40, 42, 48, 51, 53, 54, 55, 56, 57, 59, 63, 65, 72, 74, 82, 83, 88, 92, 95, 98, 101, 102, 103, 104, 105, 106, 109, 110, 121, 122, 124, 129, 130, 132, 135, 137, 138, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 152, 153, 154, 155, 156, 159, 160, 161, 166, 170, 171, 174, 176, 177, 179, 181, 182, 183, 184, 186, 191, 198, 199, 200, 201, 203, 204, 205, 206, 207, 208, 210, 211, 212, 213, 214, 215, 217, 225, 227, 228, 229, 230, 231, 232, 239, 243, 244, 245, 246, 248, 249, 251], "/Users/williamcheng/Code/wing328/swagger-codegen/samples/client/petstore/python/swagger_client/models/__init__.py": [1, 4, 5, 6, 7, 8], "/Users/williamcheng/Code/wing328/swagger-codegen/samples/client/petstore/python/swagger_client/apis/store_api.py": [18, 276, 22, 23, 26, 28, 29, 197, 32, 37, 39, 40, 41, 44, 46, 48, 20, 68, 69, 71, 72, 79, 82, 83, 85, 87, 89, 91, 92, 94, 97, 98, 99, 103, 104, 107, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 121], "/Users/williamcheng/Code/wing328/swagger-codegen/samples/client/petstore/python/swagger_client/configuration.py": [135, 136, 137, 138, 139, 142, 19, 149, 22, 23, 25, 26, 27, 29, 158, 31, 32, 34, 36, 37, 39, 40, 41, 170, 43, 172, 46, 47, 189, 179, 52, 54, 59, 61, 190, 63, 192, 224, 67, 69, 71, 200, 73, 204, 80, 81, 82, 84, 213, 86, 199, 88, 90, 219, 92, 221, 222, 223, 96, 225, 98, 100, 102, 230, 104, 167, 111, 76, 168, 157, 122, 123, 42, 21], "/Users/williamcheng/Code/wing328/swagger-codegen/samples/client/petstore/python/swagger_client/__init__.py": [1, 4, 5, 6, 7, 8, 11, 12, 13, 16, 18, 20], "/Users/williamcheng/Code/wing328/swagger-codegen/samples/client/petstore/python/swagger_client/models/pet.py": [128, 130, 150, 172, 139, 141, 19, 215, 21, 22, 152, 25, 29, 30, 161, 163, 39, 40, 41, 42, 43, 44, 45, 174, 48, 49, 50, 51, 52, 53, 54, 183, 57, 58, 59, 60, 61, 62, 64, 194, 195, 200, 73, 202, 75, 206, 208, 209, 210, 211, 84, 213, 86, 185, 216, 218, 220, 222, 95, 97, 226, 228, 106, 108, 117, 119, 212], "/Users/williamcheng/Code/wing328/swagger-codegen/samples/client/petstore/python/swagger_client/models/user.py": [70, 136, 202, 272, 81, 147, 213, 22, 25, 92, 29, 158, 224, 103, 169, 235, 114, 19, 180, 30, 246, 266, 191, 125, 21], "/Users/williamcheng/Code/wing328/swagger-codegen/samples/client/petstore/python/swagger_client/apis/__init__.py": [1, 4, 5, 6], "/Users/williamcheng/Code/wing328/swagger-codegen/samples/client/petstore/python/swagger_client/models/order.py": [130, 44, 141, 45, 19, 21, 22, 152, 25, 29, 30, 52, 161, 163, 39, 40, 41, 42, 43, 172, 173, 174, 175, 48, 49, 50, 51, 180, 53, 54, 57, 58, 59, 60, 61, 62, 191, 64, 202, 75, 86, 176, 222, 97, 228, 178, 108, 119], "/Users/williamcheng/Code/wing328/swagger-codegen/samples/client/petstore/python/swagger_client/models/tag.py": [72, 74, 109, 19, 21, 22, 104, 25, 29, 30, 96, 100, 114, 102, 39, 40, 41, 103, 44, 45, 46, 112, 49, 50, 83, 116, 94, 52, 122, 61, 85, 63]}} \ No newline at end of file +!coverage.py: This is a private format, don't read it directly!{"lines": {"/Users/williamcheng/Code/wing328/swagger-codegen/samples/client/petstore/python/swagger_client/models/order.py": [130, 172, 141, 173, 19, 21, 22, 152, 25, 29, 30, 161, 163, 39, 40, 41, 42, 43, 44, 45, 174, 175, 48, 49, 50, 51, 180, 53, 54, 52, 58, 59, 60, 61, 62, 191, 64, 202, 75, 86, 57, 176, 222, 97, 228, 178, 234, 108, 240, 119], "/Users/williamcheng/Code/wing328/swagger-codegen/samples/client/petstore/python/swagger_client/models/tag.py": [128, 132, 134, 19, 21, 22, 25, 29, 30, 39, 40, 41, 44, 45, 46, 49, 50, 52, 61, 63, 72, 74, 83, 85, 94, 96, 100, 102, 103, 104, 109, 112, 114, 116, 122], "/Users/williamcheng/Code/wing328/swagger-codegen/samples/client/petstore/python/swagger_client/models/__init__.py": [1, 4, 5, 6, 7, 8], "/Users/williamcheng/Code/wing328/swagger-codegen/samples/client/petstore/python/swagger_client/apis/__init__.py": [1, 4, 5, 6], "/Users/williamcheng/Code/wing328/swagger-codegen/samples/client/petstore/python/swagger_client/models/pet.py": [128, 130, 150, 172, 139, 141, 19, 215, 21, 22, 152, 25, 29, 30, 161, 163, 39, 40, 41, 42, 43, 44, 45, 174, 48, 49, 50, 51, 52, 53, 54, 183, 185, 58, 59, 60, 61, 62, 64, 194, 195, 200, 73, 202, 75, 206, 208, 209, 210, 211, 84, 213, 86, 57, 216, 218, 220, 222, 95, 97, 226, 228, 234, 108, 238, 240, 117, 119, 212, 106], "/Users/williamcheng/Code/wing328/swagger-codegen/samples/client/petstore/python/swagger_client/configuration.py": [135, 136, 137, 138, 139, 142, 19, 149, 22, 23, 25, 26, 157, 158, 31, 32, 34, 36, 37, 39, 40, 41, 170, 43, 172, 46, 47, 189, 179, 52, 54, 59, 61, 190, 63, 192, 224, 67, 69, 71, 200, 73, 204, 80, 81, 82, 84, 213, 86, 199, 88, 90, 219, 92, 221, 222, 223, 96, 225, 98, 100, 102, 230, 104, 167, 111, 76, 168, 122, 123, 42, 21], "/Users/williamcheng/Code/wing328/swagger-codegen/samples/client/petstore/python/swagger_client/apis/store_api.py": [87, 18, 276, 22, 23, 26, 28, 29, 197, 32, 37, 39, 40, 41, 44, 46, 48, 68, 69, 71, 72, 79, 82, 83, 85, 121, 89, 91, 92, 94, 97, 98, 99, 103, 104, 107, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 20], "/Users/williamcheng/Code/wing328/swagger-codegen/samples/client/petstore/python/swagger_client/models/category.py": [128, 134, 19, 21, 22, 25, 29, 30, 39, 40, 41, 44, 45, 46, 49, 50, 52, 61, 63, 72, 74, 83, 85, 94, 96, 100, 102, 103, 104, 109, 112, 114, 116, 122], "/Users/williamcheng/Code/wing328/swagger-codegen/samples/client/petstore/python/swagger_client/api_client.py": [518, 525, 526, 527, 19, 21, 22, 23, 24, 537, 26, 27, 28, 29, 30, 31, 32, 33, 34, 547, 36, 37, 40, 42, 44, 45, 558, 47, 49, 52, 566, 568, 569, 570, 571, 572, 573, 575, 68, 69, 70, 75, 76, 77, 79, 80, 82, 84, 91, 96, 98, 102, 103, 104, 107, 108, 109, 111, 112, 115, 116, 117, 118, 119, 120, 123, 124, 125, 126, 129, 130, 131, 134, 137, 138, 141, 144, 145, 146, 147, 149, 152, 153, 155, 157, 158, 160, 162, 171, 172, 174, 176, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 204, 205, 212, 213, 214, 216, 217, 219, 231, 235, 236, 240, 242, 251, 252, 254, 255, 256, 257, 258, 260, 261, 262, 263, 267, 268, 269, 272, 274, 275, 276, 278, 279, 280, 281, 283, 286, 287, 288, 316, 317, 318, 319, 320, 322, 323, 324, 325, 326, 327, 328, 329, 330, 332, 333, 337, 338, 339, 340, 341, 345, 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, 369, 370, 371, 372, 379, 387, 389, 390, 392, 393, 394, 395, 548, 397, 398, 399, 400, 401, 402, 404, 406, 413, 414, 416, 418, 419, 421, 423, 430, 431, 433, 435, 436, 438, 440, 448, 450, 453, 454, 455, 456, 458, 459, 467, 546, 493, 502, 503, 508, 510], "/Users/williamcheng/Code/wing328/swagger-codegen/samples/client/petstore/python/swagger_client/apis/pet_api.py": [512, 513, 514, 516, 86, 18, 20, 22, 23, 26, 539, 28, 29, 542, 543, 32, 548, 37, 39, 40, 41, 42, 555, 556, 45, 558, 559, 48, 562, 564, 565, 566, 568, 569, 345, 571, 574, 575, 576, 580, 581, 70, 584, 73, 586, 587, 588, 589, 590, 591, 592, 593, 594, 595, 596, 598, 88, 90, 92, 93, 95, 96, 97, 100, 101, 102, 106, 107, 621, 622, 624, 625, 626, 79, 116, 117, 118, 631, 632, 121, 122, 635, 124, 638, 639, 641, 642, 643, 645, 647, 649, 650, 651, 652, 653, 654, 656, 145, 146, 659, 660, 149, 150, 665, 666, 155, 156, 669, 671, 160, 673, 162, 675, 164, 677, 166, 679, 168, 169, 171, 172, 173, 541, 176, 177, 178, 115, 182, 183, 186, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 200, 119, 120, 377, 221, 222, 549, 224, 225, 226, 231, 232, 235, 236, 110, 238, 240, 552, 242, 244, 246, 247, 249, 383, 252, 253, 254, 258, 259, 262, 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 276, 46, 560, 538, 297, 298, 300, 301, 302, 44, 307, 308, 311, 312, 314, 316, 317, 318, 320, 322, 323, 325, 113, 328, 329, 330, 334, 335, 338, 340, 341, 342, 343, 344, 241, 346, 347, 348, 349, 350, 485, 352, 84, 114, 373, 374, 376, 148, 378, 661, 384, 387, 390, 391, 393, 394, 395, 397, 399, 401, 402, 404, 407, 408, 409, 413, 414, 69, 417, 419, 420, 421, 422, 423, 424, 425, 426, 427, 428, 429, 431, 72, 159, 74, 672, 83, 454, 455, 457, 458, 459, 674, 112, 464, 465, 468, 471, 472, 676, 474, 475, 476, 478, 480, 80, 482, 483, 484, 678, 486, 487, 489, 492, 493, 494, 680, 498, 499, 502, 681, 504, 505, 506, 507, 508, 509, 510, 511], "/Users/williamcheng/Code/wing328/swagger-codegen/samples/client/petstore/python/swagger_client/apis/user_api.py": [32, 355, 37, 39, 200, 124, 428, 589, 48, 18, 20, 22, 23, 276, 26, 507, 28, 29], "/Users/williamcheng/Code/wing328/swagger-codegen/samples/client/petstore/python/swagger_client/models/user.py": [278, 136, 266, 272, 147, 21, 22, 25, 284, 29, 158, 169, 180, 30, 191, 70, 202, 81, 213, 92, 224, 103, 235, 114, 19, 246, 125], "/Users/williamcheng/Code/wing328/swagger-codegen/samples/client/petstore/python/swagger_client/__init__.py": [1, 4, 5, 6, 7, 8, 11, 12, 13, 16, 18, 20], "/Users/williamcheng/Code/wing328/swagger-codegen/samples/client/petstore/python/swagger_client/rest.py": [20, 21, 23, 24, 25, 26, 27, 28, 31, 33, 35, 36, 40, 42, 43, 45, 48, 51, 53, 54, 55, 56, 57, 59, 63, 65, 72, 74, 82, 83, 88, 92, 95, 98, 101, 102, 103, 104, 105, 106, 109, 110, 121, 122, 124, 129, 130, 132, 135, 137, 138, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 152, 153, 154, 155, 156, 159, 160, 161, 166, 170, 174, 176, 177, 179, 181, 182, 183, 184, 186, 191, 198, 199, 200, 201, 203, 204, 205, 206, 207, 208, 210, 211, 212, 213, 214, 215, 217, 225, 227, 228, 229, 230, 231, 232, 239, 243, 244, 245, 246, 248, 249, 251]}} \ No newline at end of file diff --git a/samples/client/petstore/python/dev-requirements.txt.log b/samples/client/petstore/python/dev-requirements.txt.log index 316a9394b50..382d1cf081d 100644 --- a/samples/client/petstore/python/dev-requirements.txt.log +++ b/samples/client/petstore/python/dev-requirements.txt.log @@ -34,3 +34,38 @@ Requirement already satisfied (use --upgrade to upgrade): randomize in ./venv/li Requirement already satisfied (use --upgrade to upgrade): virtualenv>=1.11.2 in ./venv/lib/python2.7/site-packages (from tox->-r dev-requirements.txt (line 2)) Requirement already satisfied (use --upgrade to upgrade): py>=1.4.17 in ./venv/lib/python2.7/site-packages (from tox->-r dev-requirements.txt (line 2)) Requirement already satisfied (use --upgrade to upgrade): pluggy<0.4.0,>=0.3.0 in ./venv/lib/python2.7/site-packages (from tox->-r dev-requirements.txt (line 2)) +Requirement already satisfied (use --upgrade to upgrade): nose in ./venv/lib/python2.7/site-packages (from -r dev-requirements.txt (line 1)) +Requirement already satisfied (use --upgrade to upgrade): tox in ./venv/lib/python2.7/site-packages (from -r dev-requirements.txt (line 2)) +Requirement already satisfied (use --upgrade to upgrade): coverage in ./venv/lib/python2.7/site-packages (from -r dev-requirements.txt (line 3)) +Requirement already satisfied (use --upgrade to upgrade): randomize in ./venv/lib/python2.7/site-packages (from -r dev-requirements.txt (line 4)) +Requirement already satisfied (use --upgrade to upgrade): virtualenv>=1.11.2 in ./venv/lib/python2.7/site-packages (from tox->-r dev-requirements.txt (line 2)) +Requirement already satisfied (use --upgrade to upgrade): py>=1.4.17 in ./venv/lib/python2.7/site-packages (from tox->-r dev-requirements.txt (line 2)) +Requirement already satisfied (use --upgrade to upgrade): pluggy<0.4.0,>=0.3.0 in ./venv/lib/python2.7/site-packages (from tox->-r dev-requirements.txt (line 2)) +Requirement already satisfied (use --upgrade to upgrade): nose in ./venv/lib/python2.7/site-packages (from -r dev-requirements.txt (line 1)) +Requirement already satisfied (use --upgrade to upgrade): tox in ./venv/lib/python2.7/site-packages (from -r dev-requirements.txt (line 2)) +Requirement already satisfied (use --upgrade to upgrade): coverage in ./venv/lib/python2.7/site-packages (from -r dev-requirements.txt (line 3)) +Requirement already satisfied (use --upgrade to upgrade): randomize in ./venv/lib/python2.7/site-packages (from -r dev-requirements.txt (line 4)) +Requirement already satisfied (use --upgrade to upgrade): virtualenv>=1.11.2 in ./venv/lib/python2.7/site-packages (from tox->-r dev-requirements.txt (line 2)) +Requirement already satisfied (use --upgrade to upgrade): py>=1.4.17 in ./venv/lib/python2.7/site-packages (from tox->-r dev-requirements.txt (line 2)) +Requirement already satisfied (use --upgrade to upgrade): pluggy<0.4.0,>=0.3.0 in ./venv/lib/python2.7/site-packages (from tox->-r dev-requirements.txt (line 2)) +Requirement already satisfied (use --upgrade to upgrade): nose in ./venv/lib/python2.7/site-packages (from -r dev-requirements.txt (line 1)) +Requirement already satisfied (use --upgrade to upgrade): tox in ./venv/lib/python2.7/site-packages (from -r dev-requirements.txt (line 2)) +Requirement already satisfied (use --upgrade to upgrade): coverage in ./venv/lib/python2.7/site-packages (from -r dev-requirements.txt (line 3)) +Requirement already satisfied (use --upgrade to upgrade): randomize in ./venv/lib/python2.7/site-packages (from -r dev-requirements.txt (line 4)) +Requirement already satisfied (use --upgrade to upgrade): virtualenv>=1.11.2 in ./venv/lib/python2.7/site-packages (from tox->-r dev-requirements.txt (line 2)) +Requirement already satisfied (use --upgrade to upgrade): py>=1.4.17 in ./venv/lib/python2.7/site-packages (from tox->-r dev-requirements.txt (line 2)) +Requirement already satisfied (use --upgrade to upgrade): pluggy<0.4.0,>=0.3.0 in ./venv/lib/python2.7/site-packages (from tox->-r dev-requirements.txt (line 2)) +Requirement already satisfied (use --upgrade to upgrade): nose in ./venv/lib/python2.7/site-packages (from -r dev-requirements.txt (line 1)) +Requirement already satisfied (use --upgrade to upgrade): tox in ./venv/lib/python2.7/site-packages (from -r dev-requirements.txt (line 2)) +Requirement already satisfied (use --upgrade to upgrade): coverage in ./venv/lib/python2.7/site-packages (from -r dev-requirements.txt (line 3)) +Requirement already satisfied (use --upgrade to upgrade): randomize in ./venv/lib/python2.7/site-packages (from -r dev-requirements.txt (line 4)) +Requirement already satisfied (use --upgrade to upgrade): virtualenv>=1.11.2 in ./venv/lib/python2.7/site-packages (from tox->-r dev-requirements.txt (line 2)) +Requirement already satisfied (use --upgrade to upgrade): py>=1.4.17 in ./venv/lib/python2.7/site-packages (from tox->-r dev-requirements.txt (line 2)) +Requirement already satisfied (use --upgrade to upgrade): pluggy<0.4.0,>=0.3.0 in ./venv/lib/python2.7/site-packages (from tox->-r dev-requirements.txt (line 2)) +Requirement already satisfied (use --upgrade to upgrade): nose in ./venv/lib/python2.7/site-packages (from -r dev-requirements.txt (line 1)) +Requirement already satisfied (use --upgrade to upgrade): tox in ./venv/lib/python2.7/site-packages (from -r dev-requirements.txt (line 2)) +Requirement already satisfied (use --upgrade to upgrade): coverage in ./venv/lib/python2.7/site-packages (from -r dev-requirements.txt (line 3)) +Requirement already satisfied (use --upgrade to upgrade): randomize in ./venv/lib/python2.7/site-packages (from -r dev-requirements.txt (line 4)) +Requirement already satisfied (use --upgrade to upgrade): virtualenv>=1.11.2 in ./venv/lib/python2.7/site-packages (from tox->-r dev-requirements.txt (line 2)) +Requirement already satisfied (use --upgrade to upgrade): py>=1.4.17 in ./venv/lib/python2.7/site-packages (from tox->-r dev-requirements.txt (line 2)) +Requirement already satisfied (use --upgrade to upgrade): pluggy<0.4.0,>=0.3.0 in ./venv/lib/python2.7/site-packages (from tox->-r dev-requirements.txt (line 2)) diff --git a/samples/client/petstore/python/swagger_client/models/category.py b/samples/client/petstore/python/swagger_client/models/category.py index 06ad3b8421f..7c36ea3ec47 100644 --- a/samples/client/petstore/python/swagger_client/models/category.py +++ b/samples/client/petstore/python/swagger_client/models/category.py @@ -124,3 +124,16 @@ class Category(object): For `print` and `pprint` """ return self.to_str() + + def __eq__(self, other): + """ + Returns true if both objects are equal + """ + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """ + Returns true if both objects are not equal + """ + return not self == other + diff --git a/samples/client/petstore/python/swagger_client/models/order.py b/samples/client/petstore/python/swagger_client/models/order.py index 40e4504de87..39081233b11 100644 --- a/samples/client/petstore/python/swagger_client/models/order.py +++ b/samples/client/petstore/python/swagger_client/models/order.py @@ -230,3 +230,16 @@ class Order(object): For `print` and `pprint` """ return self.to_str() + + def __eq__(self, other): + """ + Returns true if both objects are equal + """ + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """ + Returns true if both objects are not equal + """ + return not self == other + diff --git a/samples/client/petstore/python/swagger_client/models/pet.py b/samples/client/petstore/python/swagger_client/models/pet.py index d8700908eb7..eafb352f2d0 100644 --- a/samples/client/petstore/python/swagger_client/models/pet.py +++ b/samples/client/petstore/python/swagger_client/models/pet.py @@ -230,3 +230,16 @@ class Pet(object): For `print` and `pprint` """ return self.to_str() + + def __eq__(self, other): + """ + Returns true if both objects are equal + """ + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """ + Returns true if both objects are not equal + """ + return not self == other + diff --git a/samples/client/petstore/python/swagger_client/models/tag.py b/samples/client/petstore/python/swagger_client/models/tag.py index 262fc10f338..2041940dadf 100644 --- a/samples/client/petstore/python/swagger_client/models/tag.py +++ b/samples/client/petstore/python/swagger_client/models/tag.py @@ -124,3 +124,16 @@ class Tag(object): For `print` and `pprint` """ return self.to_str() + + def __eq__(self, other): + """ + Returns true if both objects are equal + """ + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """ + Returns true if both objects are not equal + """ + return not self == other + diff --git a/samples/client/petstore/python/swagger_client/models/user.py b/samples/client/petstore/python/swagger_client/models/user.py index 7f74d20f3d3..a3ad99fa4c5 100644 --- a/samples/client/petstore/python/swagger_client/models/user.py +++ b/samples/client/petstore/python/swagger_client/models/user.py @@ -274,3 +274,16 @@ class User(object): For `print` and `pprint` """ return self.to_str() + + def __eq__(self, other): + """ + Returns true if both objects are equal + """ + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + """ + Returns true if both objects are not equal + """ + return not self == other + diff --git a/samples/client/petstore/python/tests/test_pet_model.py b/samples/client/petstore/python/tests/test_pet_model.py index 0b0df18a8d0..d2bd3c9ca3d 100644 --- a/samples/client/petstore/python/tests/test_pet_model.py +++ b/samples/client/petstore/python/tests/test_pet_model.py @@ -38,3 +38,36 @@ class PetModelTests(unittest.TestCase): " 'status': 'available',\n" " 'tags': [{'id': 1, 'name': None}]}") self.assertEqual(data, self.pet.to_str()) + + def test_equal(self): + self.pet1 = swagger_client.Pet() + self.pet1.name = "test name" + self.pet1.id = 1 + self.pet1.photo_urls = ["string"] + self.pet1.status = "available" + cate1 = swagger_client.Category() + cate1.id = 1 + cate1.name = "dog" + self.pet.category = cate1 + tag1 = swagger_client.Tag() + tag1.id = 1 + self.pet1.tags = [tag1] + + self.pet2 = swagger_client.Pet() + self.pet2.name = "test name" + self.pet2.id = 1 + self.pet2.photo_urls = ["string"] + self.pet2.status = "available" + cate2 = swagger_client.Category() + cate2.id = 1 + cate2.name = "dog" + self.pet.category = cate2 + tag2 = swagger_client.Tag() + tag2.id = 1 + self.pet2.tags = [tag2] + + self.assertTrue(self.pet1 == self.pet2) + + # reset pet1 tags to empty array so that object comparison returns false + self.pet1.tags = [] + self.assertFalse(self.pet1 == self.pet2) From a55088c3cdea2a6f049cff02acc18d3485948f73 Mon Sep 17 00:00:00 2001 From: wing328 Date: Wed, 25 Nov 2015 00:00:26 +0800 Subject: [PATCH 053/211] fix php access token setter --- .../src/main/resources/php/configuration.mustache | 2 +- .../petstore/php/SwaggerClient-php/lib/Configuration.php | 2 +- .../petstore/php/SwaggerClient-php/tests/PetApiTest.php | 4 ++++ 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/modules/swagger-codegen/src/main/resources/php/configuration.mustache b/modules/swagger-codegen/src/main/resources/php/configuration.mustache index 14d7957fe54..28082851c00 100644 --- a/modules/swagger-codegen/src/main/resources/php/configuration.mustache +++ b/modules/swagger-codegen/src/main/resources/php/configuration.mustache @@ -211,7 +211,7 @@ class Configuration */ public function setAccessToken($accessToken) { - $this->$accessToken = $accessToken; + $this->accessToken = $accessToken; return $this; } diff --git a/samples/client/petstore/php/SwaggerClient-php/lib/Configuration.php b/samples/client/petstore/php/SwaggerClient-php/lib/Configuration.php index 1fdac785bfd..033f2da7a22 100644 --- a/samples/client/petstore/php/SwaggerClient-php/lib/Configuration.php +++ b/samples/client/petstore/php/SwaggerClient-php/lib/Configuration.php @@ -211,7 +211,7 @@ class Configuration */ public function setAccessToken($accessToken) { - $this->$accessToken = $accessToken; + $this->accessToken = $accessToken; return $this; } diff --git a/samples/client/petstore/php/SwaggerClient-php/tests/PetApiTest.php b/samples/client/petstore/php/SwaggerClient-php/tests/PetApiTest.php index fe818069dac..58d5cd661f4 100644 --- a/samples/client/petstore/php/SwaggerClient-php/tests/PetApiTest.php +++ b/samples/client/petstore/php/SwaggerClient-php/tests/PetApiTest.php @@ -82,6 +82,10 @@ class PetApiTest extends \PHPUnit_Framework_TestCase $this->assertNotEquals($apiClient3, $apiClient4); // customied pet api not using the old pet api's api client $this->assertNotEquals($pet_api2->getApiClient(), $pet_api3->getApiClient()); + + // test access token + $api_client->getConfig()->setAccessToken("testing_only"); + $this->assertSame('testing_only', $api_client->getConfig()->getAccessToken()); } // test getPetById with a Pet object (id 10005) From cc58711490f3fb41a13970e47cddf7a52fe3e04e Mon Sep 17 00:00:00 2001 From: Alvin Date: Sat, 21 Nov 2015 19:42:01 +0800 Subject: [PATCH 054/211] update okhttp-gson samples --- .../okhttp-gson/src/main/java/io/swagger/client/ApiClient.java | 2 +- .../src/main/java/io/swagger/client/ApiException.java | 2 +- .../src/main/java/io/swagger/client/Configuration.java | 2 +- .../java/okhttp-gson/src/main/java/io/swagger/client/Pair.java | 2 +- .../okhttp-gson/src/main/java/io/swagger/client/StringUtil.java | 2 +- .../src/main/java/io/swagger/client/auth/ApiKeyAuth.java | 2 +- .../src/main/java/io/swagger/client/auth/Authentication.java | 2 +- .../okhttp-gson/src/main/java/io/swagger/client/auth/OAuth.java | 2 +- 8 files changed, 8 insertions(+), 8 deletions(-) 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 8d38c18e907..7810e567548 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 @@ -143,8 +143,8 @@ public class ApiClient { // Setup authentications (key: authentication name, value: authentication). authentications = new HashMap(); - authentications.put("api_key", new ApiKeyAuth("header", "api_key")); authentications.put("petstore_auth", new OAuth()); + authentications.put("api_key", new ApiKeyAuth("header", "api_key")); // Prevent the authentications from being modified. authentications = Collections.unmodifiableMap(authentications); } diff --git a/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/ApiException.java b/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/ApiException.java index 6d4b388a623..157b37036f3 100644 --- a/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/ApiException.java +++ b/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/ApiException.java @@ -3,7 +3,7 @@ package io.swagger.client; import java.util.Map; import java.util.List; -@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-11-21T20:11:09.490+08:00") +@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-11-25T15:16:28.364+08:00") public class ApiException extends Exception { private int code = 0; private Map> responseHeaders = null; diff --git a/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/Configuration.java b/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/Configuration.java index 9399e3bed44..473891b1177 100644 --- a/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/Configuration.java +++ b/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/Configuration.java @@ -1,6 +1,6 @@ package io.swagger.client; -@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-11-21T20:11:09.490+08:00") +@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-11-25T15:16:28.364+08:00") public class Configuration { private static ApiClient defaultApiClient = new ApiClient(); diff --git a/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/Pair.java b/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/Pair.java index b1b4a5565a6..83b0fc79f8c 100644 --- a/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/Pair.java +++ b/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/Pair.java @@ -1,6 +1,6 @@ package io.swagger.client; -@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-11-21T20:11:09.490+08:00") +@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-11-25T15:16:28.364+08:00") public class Pair { private String name = ""; private String value = ""; diff --git a/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/StringUtil.java b/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/StringUtil.java index f5cb2680b10..c77fd0a42ed 100644 --- a/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/StringUtil.java +++ b/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/StringUtil.java @@ -1,6 +1,6 @@ package io.swagger.client; -@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-11-21T20:11:09.490+08:00") +@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-11-25T15:16:28.364+08:00") public class StringUtil { /** * Check if the given array contains the given value (with case-insensitive comparison). diff --git a/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/auth/ApiKeyAuth.java b/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/auth/ApiKeyAuth.java index 258cfea3f7a..5f85066b2a9 100644 --- a/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/auth/ApiKeyAuth.java +++ b/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/auth/ApiKeyAuth.java @@ -5,7 +5,7 @@ import io.swagger.client.Pair; import java.util.Map; import java.util.List; -@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-11-21T20:11:09.490+08:00") +@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-11-25T15:16:28.364+08:00") public class ApiKeyAuth implements Authentication { private final String location; private final String paramName; diff --git a/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/auth/Authentication.java b/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/auth/Authentication.java index fccf3057d4b..f9cc5d1cdd7 100644 --- a/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/auth/Authentication.java +++ b/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/auth/Authentication.java @@ -5,7 +5,7 @@ import io.swagger.client.Pair; import java.util.Map; import java.util.List; -@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-11-21T20:11:09.490+08:00") +@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-11-25T15:16:28.364+08:00") public interface Authentication { /** Apply authentication settings to header and query params. */ void applyToParams(List queryParams, Map headerParams); diff --git a/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/auth/OAuth.java b/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/auth/OAuth.java index dc224c2e050..dd1946c0200 100644 --- a/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/auth/OAuth.java +++ b/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/auth/OAuth.java @@ -5,7 +5,7 @@ import io.swagger.client.Pair; import java.util.Map; import java.util.List; -@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-11-21T20:11:09.490+08:00") +@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-11-25T15:16:28.364+08:00") public class OAuth implements Authentication { private String accessToken; From 6675cbc20e5dc7ee72afa271782837e115020913 Mon Sep 17 00:00:00 2001 From: xhh Date: Wed, 25 Nov 2015 17:55:04 +0800 Subject: [PATCH 055/211] Auto generate operationId for python-flask server codegen --- bin/flaskConnexion.sh | 2 +- .../io/swagger/codegen/DefaultCodegen.java | 63 +++++++++++-------- .../languages/FlaskConnexionCodegen.java | 15 +++-- .../server/petstore/flaskConnexion/README.md | 2 +- .../controllers/default_controller.py | 24 +++---- .../flaskConnexion/swagger/swagger.yaml | 48 +++++++------- 6 files changed, 85 insertions(+), 69 deletions(-) diff --git a/bin/flaskConnexion.sh b/bin/flaskConnexion.sh index f300d3124b1..1745d2a3ba2 100755 --- a/bin/flaskConnexion.sh +++ b/bin/flaskConnexion.sh @@ -26,6 +26,6 @@ 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 -i modules/swagger-codegen/src/test/resources/2_0/petstore.json -l flaskConnexion -o samples/server/petstore/flaskConnexion " +ags="$@ generate -i modules/swagger-codegen/src/test/resources/2_0/petstore.json -l python-flask -o samples/server/petstore/flaskConnexion " java $JAVA_OPTS -Dservice -jar $executable $ags diff --git a/modules/swagger-codegen/src/main/java/io/swagger/codegen/DefaultCodegen.java b/modules/swagger-codegen/src/main/java/io/swagger/codegen/DefaultCodegen.java index 99ceca6796c..f6877236163 100644 --- a/modules/swagger-codegen/src/main/java/io/swagger/codegen/DefaultCodegen.java +++ b/modules/swagger-codegen/src/main/java/io/swagger/codegen/DefaultCodegen.java @@ -1081,31 +1081,7 @@ public class DefaultCodegen { Set imports = new HashSet(); op.vendorExtensions = operation.getVendorExtensions(); - String operationId = operation.getOperationId(); - if (operationId == null) { - String tmpPath = path; - tmpPath = tmpPath.replaceAll("\\{", ""); - tmpPath = tmpPath.replaceAll("\\}", ""); - String[] parts = (tmpPath + "/" + httpMethod).split("/"); - StringBuilder builder = new StringBuilder(); - if ("/".equals(tmpPath)) { - // must be root tmpPath - builder.append("root"); - } - for (int i = 0; i < parts.length; i++) { - String part = parts[i]; - if (part.length() > 0) { - if (builder.toString().length() == 0) { - part = Character.toLowerCase(part.charAt(0)) + part.substring(1); - } else { - part = initialCaps(part); - } - builder.append(part); - } - } - operationId = builder.toString(); - LOGGER.info("generated operationId " + operationId + "\tfor Path: " + httpMethod + " " + path); - } + String operationId = getOrGenerateOperationId(operation, path, httpMethod); operationId = removeNonNameElementToCamelCase(operationId); op.path = path; op.operationId = toOperationId(operationId); @@ -1620,6 +1596,43 @@ public class DefaultCodegen { return secs; } + /** + * Get operationId from the operation object, and if it's blank, generate a new one from the given parameters. + * + * @param operation the operation object + * @param path the path of the operation + * @param httpMethod the HTTP method of the operation + * @return the (generated) operationId + */ + protected String getOrGenerateOperationId(Operation operation, String path, String httpMethod) { + String operationId = operation.getOperationId(); + if (StringUtils.isBlank(operationId)) { + String tmpPath = path; + tmpPath = tmpPath.replaceAll("\\{", ""); + tmpPath = tmpPath.replaceAll("\\}", ""); + String[] parts = (tmpPath + "/" + httpMethod).split("/"); + StringBuilder builder = new StringBuilder(); + if ("/".equals(tmpPath)) { + // must be root tmpPath + builder.append("root"); + } + for (int i = 0; i < parts.length; i++) { + String part = parts[i]; + if (part.length() > 0) { + if (builder.toString().length() == 0) { + part = Character.toLowerCase(part.charAt(0)) + part.substring(1); + } else { + part = initialCaps(part); + } + builder.append(part); + } + } + operationId = builder.toString(); + LOGGER.info("generated operationId " + operationId + "\tfor Path: " + httpMethod + " " + path); + } + return operationId; + } + /** * Check the type to see if it needs import the library/module/package * diff --git a/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/FlaskConnexionCodegen.java b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/FlaskConnexionCodegen.java index b3de913501a..62fe01e2fb0 100644 --- a/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/FlaskConnexionCodegen.java +++ b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/FlaskConnexionCodegen.java @@ -5,6 +5,7 @@ import com.google.common.collect.ArrayListMultimap; import com.google.common.collect.Lists; import com.google.common.collect.Multimap; import io.swagger.codegen.*; +import io.swagger.models.HttpMethod; import io.swagger.models.Operation; import io.swagger.models.Path; import io.swagger.models.Swagger; @@ -205,13 +206,15 @@ public class FlaskConnexionCodegen extends DefaultCodegen implements CodegenConf for(String pathname : swagger.getPaths().keySet()) { Path path = swagger.getPath(pathname); if(path.getOperations() != null) { - for(Operation operation : path.getOperations()) { - String operationId = operation.getOperationId(); - if(operationId != null && operationId.indexOf(".") == -1) { - operation.setVendorExtension("x-operationId", underscore(sanitizeName(operationId))); - operationId = controllerPackage + "." + defaultController + "." + underscore(sanitizeName(operationId)); - operation.setOperationId(operationId); + for(Map.Entry entry : path.getOperationMap().entrySet()) { + String httpMethod = entry.getKey().name().toLowerCase(); + Operation operation = entry.getValue(); + String operationId = getOrGenerateOperationId(operation, pathname, httpMethod); + String xOperationId = underscore(sanitizeName(operationId)); + if(!operationId.contains(".")) { + operation.setOperationId(controllerPackage + "." + defaultController + "." + xOperationId); } + operation.setVendorExtension("x-operationId", xOperationId); if(operation.getTags() != null) { List> tags = new ArrayList>(); for(String tag : operation.getTags()) { diff --git a/samples/server/petstore/flaskConnexion/README.md b/samples/server/petstore/flaskConnexion/README.md index d85f471ba40..2b8c96e6170 100644 --- a/samples/server/petstore/flaskConnexion/README.md +++ b/samples/server/petstore/flaskConnexion/README.md @@ -3,7 +3,7 @@ ## Overview This server was generated by the [swagger-codegen](https://github.com/swagger-api/swagger-codegen) project. By using the [swagger-spec](https://github.com/swagger-api/swagger-core/wiki) from a remote server, you can easily generate a server stub. This -is an example of building a swagger-enabled JAX-RS server. +is an example of building a swagger-enabled flask server. This example uses the [connexion](https://github.com/zalando/connexion) library on top of Flask. diff --git a/samples/server/petstore/flaskConnexion/controllers/default_controller.py b/samples/server/petstore/flaskConnexion/controllers/default_controller.py index 8d771afed91..d42c48575d1 100644 --- a/samples/server/petstore/flaskConnexion/controllers/default_controller.py +++ b/samples/server/petstore/flaskConnexion/controllers/default_controller.py @@ -23,6 +23,18 @@ def update_user(username, body) -> str: def delete_user(username) -> str: return 'do some magic!' +def get_inventory() -> str: + return 'do some magic!' + +def place_order(body) -> str: + return 'do some magic!' + +def get_order_by_id(orderId) -> str: + return 'do some magic!' + +def delete_order(orderId) -> str: + return 'do some magic!' + def update_pet(body) -> str: return 'do some magic!' @@ -46,15 +58,3 @@ def delete_pet(petId, apiKey) -> str: def upload_file(petId, additionalMetadata, file) -> str: return 'do some magic!' - -def get_inventory() -> str: - return 'do some magic!' - -def place_order(body) -> str: - return 'do some magic!' - -def get_order_by_id(orderId) -> str: - return 'do some magic!' - -def delete_order(orderId) -> str: - return 'do some magic!' diff --git a/samples/server/petstore/flaskConnexion/swagger/swagger.yaml b/samples/server/petstore/flaskConnexion/swagger/swagger.yaml index 047d1652a87..e6455eeab98 100644 --- a/samples/server/petstore/flaskConnexion/swagger/swagger.yaml +++ b/samples/server/petstore/flaskConnexion/swagger/swagger.yaml @@ -45,9 +45,9 @@ paths: - petstore_auth: - "write:pets" - "read:pets" - x-operationId: "add_pet" x-tags: - tag: "pet" + x-operationId: "add_pet" put: tags: - "pet" @@ -78,9 +78,9 @@ paths: - petstore_auth: - "write:pets" - "read:pets" - x-operationId: "update_pet" x-tags: - tag: "pet" + x-operationId: "update_pet" /pet/findByStatus: get: tags: @@ -114,9 +114,9 @@ paths: - petstore_auth: - "write:pets" - "read:pets" - x-operationId: "find_pets_by_status" x-tags: - tag: "pet" + x-operationId: "find_pets_by_status" /pet/findByTags: get: tags: @@ -150,9 +150,9 @@ paths: - petstore_auth: - "write:pets" - "read:pets" - x-operationId: "find_pets_by_tags" x-tags: - tag: "pet" + x-operationId: "find_pets_by_tags" /pet/{petId}: get: tags: @@ -185,9 +185,9 @@ paths: - petstore_auth: - "write:pets" - "read:pets" - x-operationId: "get_pet_by_id" x-tags: - tag: "pet" + x-operationId: "get_pet_by_id" post: tags: - "pet" @@ -222,9 +222,9 @@ paths: - petstore_auth: - "write:pets" - "read:pets" - x-operationId: "update_pet_with_form" x-tags: - tag: "pet" + x-operationId: "update_pet_with_form" delete: tags: - "pet" @@ -253,9 +253,9 @@ paths: - petstore_auth: - "write:pets" - "read:pets" - x-operationId: "delete_pet" x-tags: - tag: "pet" + x-operationId: "delete_pet" /pet/{petId}/uploadImage: post: tags: @@ -292,9 +292,9 @@ paths: - petstore_auth: - "write:pets" - "read:pets" - x-operationId: "upload_file" x-tags: - tag: "pet" + x-operationId: "upload_file" /store/inventory: get: tags: @@ -316,9 +316,9 @@ paths: format: "int32" security: - api_key: [] - x-operationId: "get_inventory" x-tags: - tag: "store" + x-operationId: "get_inventory" /store/order: post: tags: @@ -343,9 +343,9 @@ paths: $ref: "#/definitions/Order" 400: description: "Invalid Order" - x-operationId: "place_order" x-tags: - tag: "store" + x-operationId: "place_order" /store/order/{orderId}: get: tags: @@ -372,9 +372,9 @@ paths: description: "Invalid ID supplied" 404: description: "Order not found" - x-operationId: "get_order_by_id" x-tags: - tag: "store" + x-operationId: "get_order_by_id" delete: tags: - "store" @@ -396,9 +396,9 @@ paths: description: "Invalid ID supplied" 404: description: "Order not found" - x-operationId: "delete_order" x-tags: - tag: "store" + x-operationId: "delete_order" /user: post: tags: @@ -419,9 +419,9 @@ paths: responses: default: description: "successful operation" - x-operationId: "create_user" x-tags: - tag: "user" + x-operationId: "create_user" /user/createWithArray: post: tags: @@ -444,9 +444,9 @@ paths: responses: default: description: "successful operation" - x-operationId: "create_users_with_array_input" x-tags: - tag: "user" + x-operationId: "create_users_with_array_input" /user/createWithList: post: tags: @@ -469,9 +469,9 @@ paths: responses: default: description: "successful operation" - x-operationId: "create_users_with_list_input" x-tags: - tag: "user" + x-operationId: "create_users_with_list_input" /user/login: get: tags: @@ -500,9 +500,9 @@ paths: type: "string" 400: description: "Invalid username/password supplied" - x-operationId: "login_user" x-tags: - tag: "user" + x-operationId: "login_user" /user/logout: get: tags: @@ -517,9 +517,9 @@ paths: responses: default: description: "successful operation" - x-operationId: "logout_user" x-tags: - tag: "user" + x-operationId: "logout_user" /user/{username}: get: tags: @@ -555,9 +555,9 @@ paths: description: "Invalid username supplied" 404: description: "User not found" - x-operationId: "get_user_by_name" x-tags: - tag: "user" + x-operationId: "get_user_by_name" put: tags: - "user" @@ -584,9 +584,9 @@ paths: description: "Invalid user supplied" 404: description: "User not found" - x-operationId: "update_user" x-tags: - tag: "user" + x-operationId: "update_user" delete: tags: - "user" @@ -607,14 +607,10 @@ paths: description: "Invalid username supplied" 404: description: "User not found" - x-operationId: "delete_user" x-tags: - tag: "user" + x-operationId: "delete_user" securityDefinitions: - api_key: - type: "apiKey" - name: "api_key" - in: "header" petstore_auth: type: "oauth2" authorizationUrl: "http://petstore.swagger.io/api/oauth/dialog" @@ -622,6 +618,10 @@ securityDefinitions: scopes: write:pets: "modify pets in your account" read:pets: "read your pets" + api_key: + type: "apiKey" + name: "api_key" + in: "header" definitions: User: properties: From 801efaa3d4a7848e99482305edf73c0192d17514 Mon Sep 17 00:00:00 2001 From: xhh Date: Wed, 25 Nov 2015 18:13:39 +0800 Subject: [PATCH 056/211] Replace "nickname" with "operationId" in some API templates --- .../src/main/resources/Java/api.mustache | 4 ++-- .../resources/Java/libraries/jersey2/api.mustache | 4 ++-- .../Java/libraries/okhttp-gson/api.mustache | 14 +++++++------- .../resources/Java/libraries/retrofit/api.mustache | 4 ++-- .../Java/libraries/retrofit2/api.mustache | 2 +- .../src/main/resources/JavaInflector/api.mustache | 2 +- .../src/main/resources/JavaJaxRS/api.mustache | 4 ++-- .../src/main/resources/JavaSpringMVC/api.mustache | 2 +- .../src/main/resources/clojure/api.mustache | 4 ++-- .../src/main/resources/codegen/api.template | 4 ++-- .../src/main/resources/ruby/api.mustache | 10 +++++----- .../src/main/resources/scala/api.mustache | 2 +- 12 files changed, 28 insertions(+), 28 deletions(-) diff --git a/modules/swagger-codegen/src/main/resources/Java/api.mustache b/modules/swagger-codegen/src/main/resources/Java/api.mustache index 3ac280b2d70..5f617a253f1 100644 --- a/modules/swagger-codegen/src/main/resources/Java/api.mustache +++ b/modules/swagger-codegen/src/main/resources/Java/api.mustache @@ -41,13 +41,13 @@ public class {{classname}} { {{#allParams}} * @param {{paramName}} {{description}} {{/allParams}} * @return {{#returnType}}{{{returnType}}}{{/returnType}}{{^returnType}}void{{/returnType}} */ - public {{#returnType}}{{{returnType}}} {{/returnType}}{{^returnType}}void {{/returnType}}{{nickname}} ({{#allParams}}{{{dataType}}} {{paramName}}{{#hasMore}}, {{/hasMore}}{{/allParams}}) throws ApiException { + public {{#returnType}}{{{returnType}}} {{/returnType}}{{^returnType}}void {{/returnType}}{{operationId}}({{#allParams}}{{{dataType}}} {{paramName}}{{#hasMore}}, {{/hasMore}}{{/allParams}}) throws ApiException { Object {{localVariablePrefix}}postBody = {{#bodyParam}}{{^isBinary}}{{paramName}}{{/isBinary}}{{#isBinary}}null{{/isBinary}}{{/bodyParam}}{{^bodyParam}}null{{/bodyParam}}; byte[] {{localVariablePrefix}}postBinaryBody = {{#bodyParam}}{{#isBinary}}{{paramName}}{{/isBinary}}{{^isBinary}}null{{/isBinary}}{{/bodyParam}}{{^bodyParam}}null{{/bodyParam}}; {{#allParams}}{{#required}} // verify the required parameter '{{paramName}}' is set if ({{paramName}} == null) { - throw new ApiException(400, "Missing the required parameter '{{paramName}}' when calling {{nickname}}"); + throw new ApiException(400, "Missing the required parameter '{{paramName}}' when calling {{operationId}}"); } {{/required}}{{/allParams}} // create path and map variables diff --git a/modules/swagger-codegen/src/main/resources/Java/libraries/jersey2/api.mustache b/modules/swagger-codegen/src/main/resources/Java/libraries/jersey2/api.mustache index 10f2fa2f744..0d5c3bcf7f0 100644 --- a/modules/swagger-codegen/src/main/resources/Java/libraries/jersey2/api.mustache +++ b/modules/swagger-codegen/src/main/resources/Java/libraries/jersey2/api.mustache @@ -41,12 +41,12 @@ public class {{classname}} { {{#allParams}} * @param {{paramName}} {{description}} {{/allParams}} * @return {{#returnType}}{{{returnType}}}{{/returnType}}{{^returnType}}void{{/returnType}} */ - public {{#returnType}}{{{returnType}}} {{/returnType}}{{^returnType}}void {{/returnType}}{{nickname}} ({{#allParams}}{{{dataType}}} {{paramName}}{{#hasMore}}, {{/hasMore}}{{/allParams}}) throws ApiException { + public {{#returnType}}{{{returnType}}} {{/returnType}}{{^returnType}}void {{/returnType}}{{operationId}}({{#allParams}}{{{dataType}}} {{paramName}}{{#hasMore}}, {{/hasMore}}{{/allParams}}) throws ApiException { Object {{localVariablePrefix}}postBody = {{#bodyParam}}{{paramName}}{{/bodyParam}}{{^bodyParam}}null{{/bodyParam}}; {{#allParams}}{{#required}} // verify the required parameter '{{paramName}}' is set if ({{paramName}} == null) { - throw new ApiException(400, "Missing the required parameter '{{paramName}}' when calling {{nickname}}"); + throw new ApiException(400, "Missing the required parameter '{{paramName}}' when calling {{operationId}}"); } {{/required}}{{/allParams}} // create path and map variables diff --git a/modules/swagger-codegen/src/main/resources/Java/libraries/okhttp-gson/api.mustache b/modules/swagger-codegen/src/main/resources/Java/libraries/okhttp-gson/api.mustache index efb1a14f27d..1bf63010a1e 100644 --- a/modules/swagger-codegen/src/main/resources/Java/libraries/okhttp-gson/api.mustache +++ b/modules/swagger-codegen/src/main/resources/Java/libraries/okhttp-gson/api.mustache @@ -39,13 +39,13 @@ public class {{classname}} { } {{#operation}} - /* Build call for {{nickname}} */ - private Call {{nickname}}Call({{#allParams}}{{{dataType}}} {{paramName}}{{#hasMore}}, {{/hasMore}}{{/allParams}}) throws ApiException { + /* Build call for {{operationId}} */ + private Call {{operationId}}Call({{#allParams}}{{{dataType}}} {{paramName}}{{#hasMore}}, {{/hasMore}}{{/allParams}}) throws ApiException { Object {{localVariablePrefix}}postBody = {{#bodyParam}}{{paramName}}{{/bodyParam}}{{^bodyParam}}null{{/bodyParam}}; {{#allParams}}{{#required}} // verify the required parameter '{{paramName}}' is set if ({{paramName}} == null) { - throw new ApiException("Missing the required parameter '{{paramName}}' when calling {{nickname}}(Async)"); + throw new ApiException("Missing the required parameter '{{paramName}}' when calling {{operationId}}(Async)"); } {{/required}}{{/allParams}} @@ -87,8 +87,8 @@ public class {{classname}} { * @param {{paramName}} {{description}}{{/allParams}}{{#returnType}} * @return {{{returnType}}}{{/returnType}} */ - public {{#returnType}}{{{returnType}}} {{/returnType}}{{^returnType}}void {{/returnType}}{{nickname}}({{#allParams}}{{{dataType}}} {{paramName}}{{#hasMore}}, {{/hasMore}}{{/allParams}}) throws ApiException { - Call {{localVariablePrefix}}call = {{nickname}}Call({{#allParams}}{{paramName}}{{#hasMore}}, {{/hasMore}}{{/allParams}}); + public {{#returnType}}{{{returnType}}} {{/returnType}}{{^returnType}}void {{/returnType}}{{operationId}}({{#allParams}}{{{dataType}}} {{paramName}}{{#hasMore}}, {{/hasMore}}{{/allParams}}) throws ApiException { + Call {{localVariablePrefix}}call = {{operationId}}Call({{#allParams}}{{paramName}}{{#hasMore}}, {{/hasMore}}{{/allParams}}); {{#returnType}}Type {{localVariablePrefix}}returnType = new TypeToken<{{{returnType}}}>(){}.getType(); return {{localVariablePrefix}}apiClient.execute({{localVariablePrefix}}call, {{localVariablePrefix}}returnType);{{/returnType}}{{^returnType}}{{localVariablePrefix}}apiClient.execute({{localVariablePrefix}}call);{{/returnType}} } @@ -100,8 +100,8 @@ public class {{classname}} { * @param callback The callback to be executed when the API call finishes * @return The request call */ - public Call {{nickname}}Async({{#allParams}}{{{dataType}}} {{paramName}}, {{/allParams}}ApiCallback<{{#returnType}}{{{returnType}}}{{/returnType}}{{^returnType}}Void{{/returnType}}> {{localVariablePrefix}}callback) throws ApiException { - Call {{localVariablePrefix}}call = {{nickname}}Call({{#allParams}}{{paramName}}{{#hasMore}}, {{/hasMore}}{{/allParams}}); + public Call {{operationId}}Async({{#allParams}}{{{dataType}}} {{paramName}}, {{/allParams}}ApiCallback<{{#returnType}}{{{returnType}}}{{/returnType}}{{^returnType}}Void{{/returnType}}> {{localVariablePrefix}}callback) throws ApiException { + Call {{localVariablePrefix}}call = {{operationId}}Call({{#allParams}}{{paramName}}{{#hasMore}}, {{/hasMore}}{{/allParams}}); {{#returnType}}Type {{localVariablePrefix}}returnType = new TypeToken<{{{returnType}}}>(){}.getType(); {{localVariablePrefix}}apiClient.executeAsync({{localVariablePrefix}}call, {{localVariablePrefix}}returnType, {{localVariablePrefix}}callback);{{/returnType}}{{^returnType}}{{localVariablePrefix}}apiClient.executeAsync({{localVariablePrefix}}call, {{localVariablePrefix}}callback);{{/returnType}} return {{localVariablePrefix}}call; diff --git a/modules/swagger-codegen/src/main/resources/Java/libraries/retrofit/api.mustache b/modules/swagger-codegen/src/main/resources/Java/libraries/retrofit/api.mustache index 84c799d6252..9d758bddd21 100644 --- a/modules/swagger-codegen/src/main/resources/Java/libraries/retrofit/api.mustache +++ b/modules/swagger-codegen/src/main/resources/Java/libraries/retrofit/api.mustache @@ -26,7 +26,7 @@ public interface {{classname}} { {{#formParams}}{{#-first}} {{#isMultipart}}@Multipart{{/isMultipart}}{{^isMultipart}}@FormUrlEncoded{{/isMultipart}}{{/-first}}{{/formParams}} @{{httpMethod}}("{{path}}") - {{#returnType}}{{{returnType}}}{{/returnType}}{{^returnType}}Object{{/returnType}} {{nickname}}({{^allParams}});{{/allParams}} + {{#returnType}}{{{returnType}}}{{/returnType}}{{^returnType}}Object{{/returnType}} {{operationId}}({{^allParams}});{{/allParams}} {{#allParams}}{{>libraries/retrofit/queryParams}}{{>libraries/retrofit/pathParams}}{{>libraries/retrofit/headerParams}}{{>libraries/retrofit/bodyParams}}{{>libraries/retrofit/formParams}}{{#hasMore}}, {{/hasMore}}{{^hasMore}} );{{/hasMore}}{{/allParams}} @@ -40,7 +40,7 @@ public interface {{classname}} { {{#formParams}}{{#-first}} {{#isMultipart}}@Multipart{{/isMultipart}}{{^isMultipart}}@FormUrlEncoded{{/isMultipart}}{{/-first}}{{/formParams}} @{{httpMethod}}("{{path}}") - void {{nickname}}( + void {{operationId}}( {{#allParams}}{{>libraries/retrofit/queryParams}}{{>libraries/retrofit/pathParams}}{{>libraries/retrofit/headerParams}}{{>libraries/retrofit/bodyParams}}{{>libraries/retrofit/formParams}}, {{/allParams}}Callback<{{#returnType}}{{{returnType}}}{{/returnType}}{{^returnType}}Object{{/returnType}}> cb ); {{/operation}} diff --git a/modules/swagger-codegen/src/main/resources/Java/libraries/retrofit2/api.mustache b/modules/swagger-codegen/src/main/resources/Java/libraries/retrofit2/api.mustache index d0205c3d0b1..a066a625cff 100644 --- a/modules/swagger-codegen/src/main/resources/Java/libraries/retrofit2/api.mustache +++ b/modules/swagger-codegen/src/main/resources/Java/libraries/retrofit2/api.mustache @@ -25,7 +25,7 @@ public interface {{classname}} { {{#formParams}}{{#-first}} {{#isMultipart}}@Multipart{{/isMultipart}}{{^isMultipart}}@FormUrlEncoded{{/isMultipart}}{{/-first}}{{/formParams}} @{{httpMethod}}("{{path}}") - Call<{{#returnType}}{{{returnType}}}{{/returnType}}{{^returnType}}Object{{/returnType}}> {{nickname}}({{^allParams}});{{/allParams}} + Call<{{#returnType}}{{{returnType}}}{{/returnType}}{{^returnType}}Object{{/returnType}}> {{operationId}}({{^allParams}});{{/allParams}} {{#allParams}}{{>libraries/retrofit2/queryParams}}{{>libraries/retrofit2/pathParams}}{{>libraries/retrofit2/headerParams}}{{>libraries/retrofit2/bodyParams}}{{>libraries/retrofit2/formParams}}{{#hasMore}}, {{/hasMore}}{{^hasMore}} );{{/hasMore}}{{/allParams}} diff --git a/modules/swagger-codegen/src/main/resources/JavaInflector/api.mustache b/modules/swagger-codegen/src/main/resources/JavaInflector/api.mustache index 74e688ee23e..0a5e225306c 100644 --- a/modules/swagger-codegen/src/main/resources/JavaInflector/api.mustache +++ b/modules/swagger-codegen/src/main/resources/JavaInflector/api.mustache @@ -24,7 +24,7 @@ public class {{classname}} { {{#operation}} /* - public ResponseContext {{nickname}}(RequestContext request {{#allParams}}, {{>queryParams}}{{>pathParams}}{{>headerParams}}{{>bodyParams}}{{>formParams}}{{/allParams}}) { + public ResponseContext {{operationId}}(RequestContext request {{#allParams}}, {{>queryParams}}{{>pathParams}}{{>headerParams}}{{>bodyParams}}{{>formParams}}{{/allParams}}) { return new ResponseContext().status(Status.INTERNAL_SERVER_ERROR).entity( "Not implemented" ); } */ diff --git a/modules/swagger-codegen/src/main/resources/JavaJaxRS/api.mustache b/modules/swagger-codegen/src/main/resources/JavaJaxRS/api.mustache index ea9f2518b01..da3eba49461 100644 --- a/modules/swagger-codegen/src/main/resources/JavaJaxRS/api.mustache +++ b/modules/swagger-codegen/src/main/resources/JavaJaxRS/api.mustache @@ -47,10 +47,10 @@ public class {{classname}} { @io.swagger.annotations.ApiResponse(code = {{{code}}}, message = "{{{message}}}", response = {{{returnType}}}.class{{#returnContainer}}, responseContainer = "{{{returnContainer}}}"{{/returnContainer}}){{#hasMore}}, {{/hasMore}}{{/responses}} }) - public Response {{nickname}}({{#allParams}}{{>queryParams}}{{>pathParams}}{{>headerParams}}{{>bodyParams}}{{>formParams}}{{#hasMore}}, + public Response {{operationId}}({{#allParams}}{{>queryParams}}{{>pathParams}}{{>headerParams}}{{>bodyParams}}{{>formParams}}{{#hasMore}}, {{/hasMore}}{{/allParams}}) throws NotFoundException { - return delegate.{{nickname}}({{#allParams}}{{#isFile}}fileDetail{{/isFile}}{{^isFile}}{{paramName}}{{/isFile}}{{#hasMore}},{{/hasMore}}{{/allParams}}); + return delegate.{{operationId}}({{#allParams}}{{#isFile}}fileDetail{{/isFile}}{{^isFile}}{{paramName}}{{/isFile}}{{#hasMore}},{{/hasMore}}{{/allParams}}); } {{/operation}} } diff --git a/modules/swagger-codegen/src/main/resources/JavaSpringMVC/api.mustache b/modules/swagger-codegen/src/main/resources/JavaSpringMVC/api.mustache index 6eb6358a702..a882c006975 100644 --- a/modules/swagger-codegen/src/main/resources/JavaSpringMVC/api.mustache +++ b/modules/swagger-codegen/src/main/resources/JavaSpringMVC/api.mustache @@ -50,7 +50,7 @@ public class {{classname}} { {{#hasProduces}}produces = { {{#produces}}"{{mediaType}}"{{#hasMore}}, {{/hasMore}}{{/produces}} }, {{/hasProduces}} {{#hasConsumes}}consumes = { {{#consumes}}"{{mediaType}}"{{#hasMore}}, {{/hasMore}}{{/consumes}} },{{/hasConsumes}} method = RequestMethod.{{httpMethod}}) - public ResponseEntity<{{>returnTypes}}> {{nickname}}({{#allParams}}{{>queryParams}}{{>pathParams}}{{>headerParams}}{{>bodyParams}}{{>formParams}}{{#hasMore}}, + public ResponseEntity<{{>returnTypes}}> {{operationId}}({{#allParams}}{{>queryParams}}{{>pathParams}}{{>headerParams}}{{>bodyParams}}{{>formParams}}{{#hasMore}}, {{/hasMore}}{{/allParams}}) throws NotFoundException { // do some magic! diff --git a/modules/swagger-codegen/src/main/resources/clojure/api.mustache b/modules/swagger-codegen/src/main/resources/clojure/api.mustache index 1acdf94d764..94e95dffaf7 100644 --- a/modules/swagger-codegen/src/main/resources/clojure/api.mustache +++ b/modules/swagger-codegen/src/main/resources/clojure/api.mustache @@ -2,10 +2,10 @@ (:require [.core :refer [call-api check-required-params]]) (:import (java.io File))) <#operations><#operation> -(defn +(defn "<&summary><#notes> <¬es>"<#hasOptionalParams> - ([<#allParams><#required><#isFile>^File ] (<#allParams><#required> nil)) + ([<#allParams><#required><#isFile>^File ] (<#allParams><#required> nil)) <#hasOptionalParams>([<#allParams><#required><#isFile>^File <#hasOptionalParams>{:keys [<#allParams><^required><#isFile>^File ]}]<#hasRequiredParams> <#hasOptionalParams> (check-required-params<#allParams><#required> ) <#hasOptionalParams> (call-api "" : diff --git a/modules/swagger-codegen/src/main/resources/codegen/api.template b/modules/swagger-codegen/src/main/resources/codegen/api.template index 9dbc8dd4ba1..62802f7f1e7 100644 --- a/modules/swagger-codegen/src/main/resources/codegen/api.template +++ b/modules/swagger-codegen/src/main/resources/codegen/api.template @@ -14,8 +14,8 @@ classname: {{classname}} # loop over each operation in the API: {{#operation}} -# each operation has a `nickname`: -nickname: {{nickname}} +# each operation has an `operationId`: +operationId: {{operationId}} # and parameters: {{#allParams}} diff --git a/modules/swagger-codegen/src/main/resources/ruby/api.mustache b/modules/swagger-codegen/src/main/resources/ruby/api.mustache index a43260c0607..b8e2e0da4c8 100644 --- a/modules/swagger-codegen/src/main/resources/ruby/api.mustache +++ b/modules/swagger-codegen/src/main/resources/ruby/api.mustache @@ -16,13 +16,13 @@ module {{moduleName}} {{/required}}{{/allParams}} # @param [Hash] opts the optional parameters {{#allParams}}{{^required}} # @option opts [{{{dataType}}}] :{{paramName}} {{description}} {{/required}}{{/allParams}} # @return [{{#returnType}}{{{returnType}}}{{/returnType}}{{^returnType}}nil{{/returnType}}] - def {{nickname}}({{#allParams}}{{#required}}{{paramName}}, {{/required}}{{/allParams}}opts = {}) + def {{operationId}}({{#allParams}}{{#required}}{{paramName}}, {{/required}}{{/allParams}}opts = {}) if Configuration.debugging - Configuration.logger.debug "Calling API: {{classname}}#{{nickname}} ..." + Configuration.logger.debug "Calling API: {{classname}}#{{operationId}} ..." end {{#allParams}}{{#required}} # verify the required parameter '{{paramName}}' is set - fail "Missing the required parameter '{{paramName}}' when calling {{nickname}}" if {{{paramName}}}.nil?{{#isEnum}} + fail "Missing the required parameter '{{paramName}}' when calling {{operationId}}" if {{{paramName}}}.nil?{{#isEnum}} unless [{{#allowableValues}}{{#values}}'{{{this}}}'{{^-last}}, {{/-last}}{{/values}}{{/allowableValues}}].include?({{{paramName}}}) fail "invalid value for '{{{paramName}}}', must be one of {{#allowableValues}}{{#values}}{{{this}}}{{^-last}}, {{/-last}}{{/values}}{{/allowableValues}}" end{{/isEnum}} @@ -71,7 +71,7 @@ module {{moduleName}} :auth_names => auth_names, :return_type => '{{{returnType}}}') if Configuration.debugging - Configuration.logger.debug "API called: {{classname}}#{{nickname}}. Result: #{result.inspect}" + Configuration.logger.debug "API called: {{classname}}#{{operationId}}. Result: #{result.inspect}" end return result{{/returnType}}{{^returnType}}@api_client.call_api(:{{httpMethod}}, path, :header_params => header_params, @@ -80,7 +80,7 @@ module {{moduleName}} :body => post_body, :auth_names => auth_names) if Configuration.debugging - Configuration.logger.debug "API called: {{classname}}#{{nickname}}" + Configuration.logger.debug "API called: {{classname}}#{{operationId}}" end return nil{{/returnType}} end diff --git a/modules/swagger-codegen/src/main/resources/scala/api.mustache b/modules/swagger-codegen/src/main/resources/scala/api.mustache index 87b04b5900f..3b74dca8162 100644 --- a/modules/swagger-codegen/src/main/resources/scala/api.mustache +++ b/modules/swagger-codegen/src/main/resources/scala/api.mustache @@ -30,7 +30,7 @@ class {{classname}}(val defBasePath: String = "{{basePath}}", {{#allParams}} * @param {{paramName}} {{description}} {{/allParams}} * @return {{#returnType}}{{{returnType}}}{{/returnType}}{{^returnType}}void{{/returnType}} */ - def {{nickname}} ({{#allParams}}{{paramName}}: {{dataType}}{{#defaultValue}} /* = {{{defaultValue}}} */{{/defaultValue}}{{#hasMore}}, {{/hasMore}}{{/allParams}}) {{#returnType}}: Option[{{returnType}}]{{/returnType}} = { + def {{operationId}} ({{#allParams}}{{paramName}}: {{dataType}}{{#defaultValue}} /* = {{{defaultValue}}} */{{/defaultValue}}{{#hasMore}}, {{/hasMore}}{{/allParams}}) {{#returnType}}: Option[{{returnType}}]{{/returnType}} = { // create path and map variables val path = "{{path}}".replaceAll("\\{format\\}","json"){{#pathParams}}.replaceAll("\\{" + "{{baseName}}" + "\\}",apiInvoker.escape({{paramName}})) From 27e43d3fbbc9766b31a6b54d30e00ac303688516 Mon Sep 17 00:00:00 2001 From: xhh Date: Wed, 25 Nov 2015 19:41:40 +0800 Subject: [PATCH 057/211] Implement toOperationId for python-flask server codegen and use "operationId" in the template to replace vendorExtensions.x-operationId --- .../languages/FlaskConnexionCodegen.java | 19 +++++++++++++++--- .../flaskConnexion/controller.mustache | 2 +- .../flaskConnexion/swagger/swagger.yaml | 20 ------------------- 3 files changed, 17 insertions(+), 24 deletions(-) diff --git a/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/FlaskConnexionCodegen.java b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/FlaskConnexionCodegen.java index 62fe01e2fb0..7a06ee8b845 100644 --- a/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/FlaskConnexionCodegen.java +++ b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/FlaskConnexionCodegen.java @@ -207,14 +207,16 @@ public class FlaskConnexionCodegen extends DefaultCodegen implements CodegenConf Path path = swagger.getPath(pathname); if(path.getOperations() != null) { for(Map.Entry entry : path.getOperationMap().entrySet()) { + // Normalize `operationId` and add package/class path in front, e.g. + // controllers.default_controller.add_pet String httpMethod = entry.getKey().name().toLowerCase(); Operation operation = entry.getValue(); String operationId = getOrGenerateOperationId(operation, pathname, httpMethod); - String xOperationId = underscore(sanitizeName(operationId)); if(!operationId.contains(".")) { - operation.setOperationId(controllerPackage + "." + defaultController + "." + xOperationId); + operationId = underscore(sanitizeName(operationId)); + operationId = controllerPackage + "." + defaultController + "." + operationId; } - operation.setVendorExtension("x-operationId", xOperationId); + operation.setOperationId(operationId); if(operation.getTags() != null) { List> tags = new ArrayList>(); for(String tag : operation.getTags()) { @@ -295,4 +297,15 @@ public class FlaskConnexionCodegen extends DefaultCodegen implements CodegenConf } return super.postProcessSupportingFileData(objs); } + + @Override + public String toOperationId(String operationId) { + operationId = super.toOperationId(operationId); + // Use the part after the last dot, e.g. + // controllers.defaultController.addPet => addPet + operationId = operationId.replaceAll(".*\\.", ""); + // Need to underscore it since it has been processed via removeNonNameElementToCamelCase, e.g. + // addPet => add_pet + return underscore(operationId); + } } \ No newline at end of file diff --git a/modules/swagger-codegen/src/main/resources/flaskConnexion/controller.mustache b/modules/swagger-codegen/src/main/resources/flaskConnexion/controller.mustache index cb8544aa1b4..06b3c63fdb0 100644 --- a/modules/swagger-codegen/src/main/resources/flaskConnexion/controller.mustache +++ b/modules/swagger-codegen/src/main/resources/flaskConnexion/controller.mustache @@ -3,7 +3,7 @@ {{#operations}} {{#operation}} -def {{vendorExtensions.x-operationId}}({{#allParams}}{{paramName}}{{#hasMore}}, {{/hasMore}}{{/allParams}}) -> str: +def {{operationId}}({{#allParams}}{{paramName}}{{#hasMore}}, {{/hasMore}}{{/allParams}}) -> str: return 'do some magic!' {{/operation}} {{/operations}} diff --git a/samples/server/petstore/flaskConnexion/swagger/swagger.yaml b/samples/server/petstore/flaskConnexion/swagger/swagger.yaml index e6455eeab98..1a4ff85e60a 100644 --- a/samples/server/petstore/flaskConnexion/swagger/swagger.yaml +++ b/samples/server/petstore/flaskConnexion/swagger/swagger.yaml @@ -47,7 +47,6 @@ paths: - "read:pets" x-tags: - tag: "pet" - x-operationId: "add_pet" put: tags: - "pet" @@ -80,7 +79,6 @@ paths: - "read:pets" x-tags: - tag: "pet" - x-operationId: "update_pet" /pet/findByStatus: get: tags: @@ -116,7 +114,6 @@ paths: - "read:pets" x-tags: - tag: "pet" - x-operationId: "find_pets_by_status" /pet/findByTags: get: tags: @@ -152,7 +149,6 @@ paths: - "read:pets" x-tags: - tag: "pet" - x-operationId: "find_pets_by_tags" /pet/{petId}: get: tags: @@ -187,7 +183,6 @@ paths: - "read:pets" x-tags: - tag: "pet" - x-operationId: "get_pet_by_id" post: tags: - "pet" @@ -224,7 +219,6 @@ paths: - "read:pets" x-tags: - tag: "pet" - x-operationId: "update_pet_with_form" delete: tags: - "pet" @@ -255,7 +249,6 @@ paths: - "read:pets" x-tags: - tag: "pet" - x-operationId: "delete_pet" /pet/{petId}/uploadImage: post: tags: @@ -294,7 +287,6 @@ paths: - "read:pets" x-tags: - tag: "pet" - x-operationId: "upload_file" /store/inventory: get: tags: @@ -318,7 +310,6 @@ paths: - api_key: [] x-tags: - tag: "store" - x-operationId: "get_inventory" /store/order: post: tags: @@ -345,7 +336,6 @@ paths: description: "Invalid Order" x-tags: - tag: "store" - x-operationId: "place_order" /store/order/{orderId}: get: tags: @@ -374,7 +364,6 @@ paths: description: "Order not found" x-tags: - tag: "store" - x-operationId: "get_order_by_id" delete: tags: - "store" @@ -398,7 +387,6 @@ paths: description: "Order not found" x-tags: - tag: "store" - x-operationId: "delete_order" /user: post: tags: @@ -421,7 +409,6 @@ paths: description: "successful operation" x-tags: - tag: "user" - x-operationId: "create_user" /user/createWithArray: post: tags: @@ -446,7 +433,6 @@ paths: description: "successful operation" x-tags: - tag: "user" - x-operationId: "create_users_with_array_input" /user/createWithList: post: tags: @@ -471,7 +457,6 @@ paths: description: "successful operation" x-tags: - tag: "user" - x-operationId: "create_users_with_list_input" /user/login: get: tags: @@ -502,7 +487,6 @@ paths: description: "Invalid username/password supplied" x-tags: - tag: "user" - x-operationId: "login_user" /user/logout: get: tags: @@ -519,7 +503,6 @@ paths: description: "successful operation" x-tags: - tag: "user" - x-operationId: "logout_user" /user/{username}: get: tags: @@ -557,7 +540,6 @@ paths: description: "User not found" x-tags: - tag: "user" - x-operationId: "get_user_by_name" put: tags: - "user" @@ -586,7 +568,6 @@ paths: description: "User not found" x-tags: - tag: "user" - x-operationId: "update_user" delete: tags: - "user" @@ -609,7 +590,6 @@ paths: description: "User not found" x-tags: - tag: "user" - x-operationId: "delete_user" securityDefinitions: petstore_auth: type: "oauth2" From d250ce3becedb89b8a404c9ad2e936c3023aa25b Mon Sep 17 00:00:00 2001 From: xhh Date: Thu, 26 Nov 2015 17:16:28 +0800 Subject: [PATCH 058/211] Do not resolve non-model body parameter as inline model --- .../swagger/codegen/InlineModelResolver.java | 12 +++++----- .../codegen/InlineModelResolverTest.java | 22 +++++++++++++++++++ 2 files changed, 29 insertions(+), 5 deletions(-) diff --git a/modules/swagger-codegen/src/main/java/io/swagger/codegen/InlineModelResolver.java b/modules/swagger-codegen/src/main/java/io/swagger/codegen/InlineModelResolver.java index d2f47f2a6f6..f727560210a 100644 --- a/modules/swagger-codegen/src/main/java/io/swagger/codegen/InlineModelResolver.java +++ b/modules/swagger-codegen/src/main/java/io/swagger/codegen/InlineModelResolver.java @@ -45,13 +45,15 @@ public class InlineModelResolver { if (bp.getSchema() != null) { Model model = bp.getSchema(); if(model instanceof ModelImpl) { - String modelName = uniqueName(bp.getName()); ModelImpl obj = (ModelImpl) model; - flattenProperties(obj.getProperties(), pathname); + if (obj.getType() == null || "object".equals(obj.getType())) { + String modelName = uniqueName(bp.getName()); + flattenProperties(obj.getProperties(), pathname); - bp.setSchema(new RefModel(modelName)); - addGenerated(modelName, model); - swagger.addDefinition(modelName, model); + bp.setSchema(new RefModel(modelName)); + addGenerated(modelName, model); + swagger.addDefinition(modelName, model); + } } else if (model instanceof ArrayModel) { ArrayModel am = (ArrayModel) model; diff --git a/modules/swagger-codegen/src/test/java/io/swagger/codegen/InlineModelResolverTest.java b/modules/swagger-codegen/src/test/java/io/swagger/codegen/InlineModelResolverTest.java index fa1bf8bab40..68d64562eba 100644 --- a/modules/swagger-codegen/src/test/java/io/swagger/codegen/InlineModelResolverTest.java +++ b/modules/swagger-codegen/src/test/java/io/swagger/codegen/InlineModelResolverTest.java @@ -127,6 +127,28 @@ public class InlineModelResolverTest { assertNotNull(impl.getProperties().get("address")); } + @Test + public void notResolveNonModelBodyParameter() throws Exception { + Swagger swagger = new Swagger(); + + swagger.path("/hello", new Path() + .get(new Operation() + .parameter(new BodyParameter() + .name("body") + .schema(new ModelImpl() + .type("string") + .format("binary"))))); + + new InlineModelResolver().flatten(swagger); + + Operation operation = swagger.getPaths().get("/hello").getGet(); + BodyParameter bp = (BodyParameter)operation.getParameters().get(0); + assertTrue(bp.getSchema() instanceof ModelImpl); + ModelImpl m = (ModelImpl) bp.getSchema(); + assertEquals("string", m.getType()); + assertEquals("binary", m.getFormat()); + } + @Test public void resolveInlineArrayBodyParameter() throws Exception { Swagger swagger = new Swagger(); From 4531bc41eb5dd433846de985cd753578268112bc Mon Sep 17 00:00:00 2001 From: xhh Date: Thu, 26 Nov 2015 17:44:56 +0800 Subject: [PATCH 059/211] Update CodegenTest to apply InlineModelResolver to swagger --- .../java/io/swagger/codegen/CodegenTest.java | 25 ++++++++++++------- 1 file changed, 16 insertions(+), 9 deletions(-) diff --git a/modules/swagger-codegen/src/test/java/io/swagger/codegen/CodegenTest.java b/modules/swagger-codegen/src/test/java/io/swagger/codegen/CodegenTest.java index 0fa8953e7bf..3adc19e6db9 100644 --- a/modules/swagger-codegen/src/test/java/io/swagger/codegen/CodegenTest.java +++ b/modules/swagger-codegen/src/test/java/io/swagger/codegen/CodegenTest.java @@ -14,7 +14,7 @@ public class CodegenTest { @Test(description = "read a file upload param from a 2.0 spec") public void fileUploadParamTest() { - final Swagger model = new SwaggerParser().read("src/test/resources/2_0/petstore.json"); + final Swagger model = parseAndPrepareSwagger("src/test/resources/2_0/petstore.json"); final DefaultCodegen codegen = new DefaultCodegen(); final String path = "/pet/{petId}/uploadImage"; final Operation p = model.getPaths().get(path).getPost(); @@ -39,7 +39,7 @@ public class CodegenTest { @Test(description = "read formParam values from a 2.0 spec") public void formParamTest() { - final Swagger model = new SwaggerParser().read("src/test/resources/2_0/petstore.json"); + final Swagger model = parseAndPrepareSwagger("src/test/resources/2_0/petstore.json"); final DefaultCodegen codegen = new DefaultCodegen(); final String path = "/pet/{petId}"; final Operation p = model.getPaths().get(path).getPost(); @@ -83,7 +83,7 @@ public class CodegenTest { @Test(description = "handle required parameters from a 2.0 spec as required when figuring out Swagger types") public void requiredParametersTest() { - final Swagger model = new SwaggerParser().read("src/test/resources/2_0/requiredTest.json"); + final Swagger model = parseAndPrepareSwagger("src/test/resources/2_0/requiredTest.json"); final DefaultCodegen codegen = new DefaultCodegen() { public String getSwaggerType(Property p) { @@ -106,7 +106,7 @@ public class CodegenTest { @Test(description = "select main response from a 2.0 spec using the lowest 2XX code") public void responseSelectionTest1() { - final Swagger model = new SwaggerParser().read("src/test/resources/2_0/responseSelectionTest.json"); + final Swagger model = parseAndPrepareSwagger("src/test/resources/2_0/responseSelectionTest.json"); final DefaultCodegen codegen = new DefaultCodegen(); final String path = "/tests/withTwoHundredAndDefault"; final Operation p = model.getPaths().get(path).getGet(); @@ -117,7 +117,7 @@ public class CodegenTest { @Test(description = "select main response from a 2.0 spec using the default keyword when no 2XX code") public void responseSelectionTest2() { - final Swagger model = new SwaggerParser().read("src/test/resources/2_0/responseSelectionTest.json"); + final Swagger model = parseAndPrepareSwagger("src/test/resources/2_0/responseSelectionTest.json"); final DefaultCodegen codegen = new DefaultCodegen(); final String path = "/tests/withoutTwoHundredButDefault"; final Operation p = model.getPaths().get(path).getGet(); @@ -128,7 +128,7 @@ public class CodegenTest { @Test(description = "return byte array when response format is byte") public void binaryDataTest() { - final Swagger model = new SwaggerParser().read("src/test/resources/2_0/binaryDataTest.json"); + final Swagger model = parseAndPrepareSwagger("src/test/resources/2_0/binaryDataTest.json"); final DefaultCodegen codegen = new DefaultCodegen(); final String path = "/tests/binaryResponse"; final Operation p = model.getPaths().get(path).getPost(); @@ -142,7 +142,7 @@ public class CodegenTest { @Test(description = "use operation consumes and produces") public void localConsumesAndProducesTest() { - final Swagger model = new SwaggerParser().read("src/test/resources/2_0/globalConsumesAndProduces.json"); + final Swagger model = parseAndPrepareSwagger("src/test/resources/2_0/globalConsumesAndProduces.json"); final DefaultCodegen codegen = new DefaultCodegen(); final String path = "/tests/localConsumesAndProduces"; final Operation p = model.getPaths().get(path).getGet(); @@ -158,7 +158,7 @@ public class CodegenTest { @Test(description = "use spec consumes and produces") public void globalConsumesAndProducesTest() { - final Swagger model = new SwaggerParser().read("src/test/resources/2_0/globalConsumesAndProduces.json"); + final Swagger model = parseAndPrepareSwagger("src/test/resources/2_0/globalConsumesAndProduces.json"); final DefaultCodegen codegen = new DefaultCodegen(); final String path = "/tests/globalConsumesAndProduces"; final Operation p = model.getPaths().get(path).getGet(); @@ -174,7 +174,7 @@ public class CodegenTest { @Test(description = "use operation consumes and produces (reset in operation with empty array)") public void localResetConsumesAndProducesTest() { - final Swagger model = new SwaggerParser().read("src/test/resources/2_0/globalConsumesAndProduces.json"); + final Swagger model = parseAndPrepareSwagger("src/test/resources/2_0/globalConsumesAndProduces.json"); final DefaultCodegen codegen = new DefaultCodegen(); final String path = "/tests/localResetConsumesAndProduces"; final Operation p = model.getPaths().get(path).getGet(); @@ -187,4 +187,11 @@ public class CodegenTest { Assert.assertNull(op.produces); } + + private Swagger parseAndPrepareSwagger(String path) { + Swagger swagger = new SwaggerParser().read(path); + // resolve inline models + new InlineModelResolver().flatten(swagger); + return swagger; + } } From be944650df1f77de0ffee33e63a15d6d3721d4e1 Mon Sep 17 00:00:00 2001 From: 317959997 Date: Thu, 26 Nov 2015 13:30:04 -0500 Subject: [PATCH 060/211] added initial Netflix Feign support --- .../codegen/languages/JavaClientCodegen.java | 15 +- .../Java/libraries/feign/ApiClient.mustache | 86 ++++++++ .../Java/libraries/feign/api.mustache | 34 ++++ .../libraries/feign/build.gradle.mustache | 113 +++++++++++ .../Java/libraries/feign/pom.mustache | 183 ++++++++++++++++++ 5 files changed, 425 insertions(+), 6 deletions(-) create mode 100644 modules/swagger-codegen/src/main/resources/Java/libraries/feign/ApiClient.mustache create mode 100644 modules/swagger-codegen/src/main/resources/Java/libraries/feign/api.mustache create mode 100644 modules/swagger-codegen/src/main/resources/Java/libraries/feign/build.gradle.mustache create mode 100644 modules/swagger-codegen/src/main/resources/Java/libraries/feign/pom.mustache 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 636f0157a52..1c2ccf2d690 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 @@ -98,6 +98,7 @@ public class JavaClientCodegen extends DefaultCodegen implements CodegenConfig { .defaultValue("false")); supportedLibraries.put(DEFAULT_LIBRARY, "HTTP client: Jersey client 1.18. JSON processing: Jackson 2.4.2"); + supportedLibraries.put("feign", "HTTP client: Netflix Feign 8.1.1"); supportedLibraries.put("jersey2", "HTTP client: Jersey client 2.6"); supportedLibraries.put("okhttp-gson", "HTTP client: OkHttp 2.4.0. JSON processing: Gson 2.3.1"); supportedLibraries.put("retrofit", "HTTP client: OkHttp 2.4.0. JSON processing: Gson 2.3.1 (Retrofit 1.9.0)"); @@ -215,12 +216,14 @@ public class JavaClientCodegen extends DefaultCodegen implements CodegenConfig { supportingFiles.add(new SupportingFile("StringUtil.mustache", invokerFolder, "StringUtil.java")); final String authFolder = (sourceFolder + '/' + invokerPackage + ".auth").replace(".", "/"); - supportingFiles.add(new SupportingFile("auth/HttpBasicAuth.mustache", authFolder, "HttpBasicAuth.java")); - supportingFiles.add(new SupportingFile("auth/ApiKeyAuth.mustache", authFolder, "ApiKeyAuth.java")); - supportingFiles.add(new SupportingFile("auth/OAuth.mustache", authFolder, "OAuth.java")); - supportingFiles.add(new SupportingFile("auth/OAuthFlow.mustache", authFolder, "OAuthFlow.java")); + if (!"feign".equals(getLibrary())) { + supportingFiles.add(new SupportingFile("auth/HttpBasicAuth.mustache", authFolder, "HttpBasicAuth.java")); + supportingFiles.add(new SupportingFile("auth/ApiKeyAuth.mustache", authFolder, "ApiKeyAuth.java")); + supportingFiles.add(new SupportingFile("auth/OAuth.mustache", authFolder, "OAuth.java")); + supportingFiles.add(new SupportingFile("auth/OAuthFlow.mustache", authFolder, "OAuthFlow.java")); + } - if (!("retrofit".equals(getLibrary()) || "retrofit2".equals(getLibrary()))) { + if (!("feign".equals(getLibrary()) || "retrofit".equals(getLibrary()) || "retrofit2".equals(getLibrary()))) { supportingFiles.add(new SupportingFile("apiException.mustache", invokerFolder, "ApiException.java")); supportingFiles.add(new SupportingFile("Configuration.mustache", invokerFolder, "Configuration.java")); supportingFiles.add(new SupportingFile("JSON.mustache", invokerFolder, "JSON.java")); @@ -237,7 +240,7 @@ public class JavaClientCodegen extends DefaultCodegen implements CodegenConfig { } else if ("retrofit".equals(getLibrary()) || "retrofit2".equals(getLibrary())) { supportingFiles.add(new SupportingFile("auth/OAuthOkHttpClient.mustache", authFolder, "OAuthOkHttpClient.java")); supportingFiles.add(new SupportingFile("CollectionFormats.mustache", invokerFolder, "CollectionFormats.java")); - } else { + } else if (!"feign".equals(getLibrary())) { supportingFiles.add(new SupportingFile("TypeRef.mustache", invokerFolder, "TypeRef.java")); } } diff --git a/modules/swagger-codegen/src/main/resources/Java/libraries/feign/ApiClient.mustache b/modules/swagger-codegen/src/main/resources/Java/libraries/feign/ApiClient.mustache new file mode 100644 index 00000000000..7ce51e909eb --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/Java/libraries/feign/ApiClient.mustache @@ -0,0 +1,86 @@ +package {{invokerPackage}}; + +import com.fasterxml.jackson.databind.DeserializationFeature; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.SerializationFeature; +import feign.Feign; +import feign.jackson.JacksonDecoder; +import feign.jackson.JacksonEncoder; +import feign.slf4j.Slf4jLogger; + +{{>generatedAnnotation}} +public class ApiClient { + public interface Api {} + + private ObjectMapper objectMapper; + private String basePath = "{{basePath}}"; + + public ApiClient() { + objectMapper = createObjectMapper(); + } + + public String getBasePath() { + return basePath; + } + + public ApiClient setBasePath(String basePath) { + this.basePath = basePath; + return this; + } + + private ObjectMapper createObjectMapper() { + ObjectMapper objectMapper = new ObjectMapper(); + objectMapper.enable(SerializationFeature.WRITE_ENUMS_USING_TO_STRING); + objectMapper.enable(DeserializationFeature.READ_ENUMS_USING_TO_STRING); + return objectMapper; + } + + /** + * Creates a feign client for given API interface. + * + * Usage: + * ApiClient apiClient = new ApiClient(); + * apiClient.setBasePath("http://localhost:8080"); + * XYZApi api = apiClient.buildClient(XYZApi.class); + * XYZResponse response = api.someMethod(...); + */ + public T buildClient(Class clientClass) { + return Feign.builder() + .encoder(new JacksonEncoder(objectMapper)) + .decoder(new JacksonDecoder(objectMapper)) +// enable for basic auth: +// .requestInterceptor(new feign.auth.BasicAuthRequestInterceptor(username, password)) + .logger(new Slf4jLogger()) + .target(clientClass, basePath); + } + + /** + * Select the Accept header's value from the given accepts array: + * if JSON exists in the given array, use it; + * otherwise use all of them (joining into a string) + * + * @param accepts The accepts array to select from + * @return The Accept header to use. If the given array is empty, + * null will be returned (not to set the Accept header explicitly). + */ + public String selectHeaderAccept(String[] accepts) { + if (accepts.length == 0) return null; + if (StringUtil.containsIgnoreCase(accepts, "application/json")) return "application/json"; + return StringUtil.join(accepts, ","); + } + + /** + * Select the Content-Type header's value from the given array: + * if JSON exists in the given array, use it; + * otherwise use the first one of the array. + * + * @param contentTypes The Content-Type array to select from + * @return The Content-Type header to use. If the given array is empty, + * JSON will be used. + */ + public String selectHeaderContentType(String[] contentTypes) { + if (contentTypes.length == 0) return "application/json"; + if (StringUtil.containsIgnoreCase(contentTypes, "application/json")) return "application/json"; + return contentTypes[0]; + } +} diff --git a/modules/swagger-codegen/src/main/resources/Java/libraries/feign/api.mustache b/modules/swagger-codegen/src/main/resources/Java/libraries/feign/api.mustache new file mode 100644 index 00000000000..9ffcb014a84 --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/Java/libraries/feign/api.mustache @@ -0,0 +1,34 @@ +package {{package}}; + +import {{invokerPackage}}.ApiException; +import {{invokerPackage}}.ApiClient; +import {{invokerPackage}}.Configuration; +import {{invokerPackage}}.Pair; +import {{invokerPackage}}.TypeRef; + +{{#imports}}import {{import}}; +{{/imports}} + +{{^fullJavaUtil}}import java.util.*; +{{/fullJavaUtil}} +import feign.*; + +{{>generatedAnnotation}} +public interface {{classname}} extends {{invokerPackage}}.ApiClient.Api { + +{{#operations}}{{#operation}} + /** + * {{summary}} + * {{notes}} +{{#allParams}} * @param {{paramName}} {{description}} +{{/allParams}} * @return {{#returnType}}{{{returnType}}}{{/returnType}}{{^returnType}}void{{/returnType}} + */ + @RequestLine("{{httpMethod}} {{{path}}}{{#hasParams}}?{{/hasParams}}{{#allParams}}{{paramName}}={{=<% %>=}}{<%paramName%>}<%={{ }}=%>{{#hasMore}}&{{/hasMore}}{{/allParams}}") + @Headers({ + {{#headerParams}}"{{paramName}}: {{=<% %>=}}{<%paramName%>}<%={{ }}=%>"{{#hasMore}}, + {{/hasMore}}{{/headerParams}} + }) + {{#returnType}}{{{returnType}}} {{/returnType}}{{^returnType}}void {{/returnType}}{{nickname}} ({{#allParams}}@Param("{{paramName}}") {{{dataType}}} {{paramName}}{{#hasMore}}, {{/hasMore}}{{/allParams}}) throws ApiException; + {{/operation}} +{{/operations}} +} diff --git a/modules/swagger-codegen/src/main/resources/Java/libraries/feign/build.gradle.mustache b/modules/swagger-codegen/src/main/resources/Java/libraries/feign/build.gradle.mustache new file mode 100644 index 00000000000..a528180df28 --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/Java/libraries/feign/build.gradle.mustache @@ -0,0 +1,113 @@ +group = '{{groupId}}' +version = '{{artifactVersion}}' + +buildscript { + repositories { + jcenter() + } + dependencies { + classpath 'com.android.tools.build:gradle:1.2.2' + classpath 'com.github.dcendents:android-maven-plugin:1.2' + } +} + +repositories { + jcenter() +} + + +if(hasProperty('target') && target == 'android') { + + apply plugin: 'com.android.library' + apply plugin: 'com.github.dcendents.android-maven' + + android { + compileSdkVersion 22 + buildToolsVersion '22.0.0' + defaultConfig { + minSdkVersion 14 + targetSdkVersion 22 + } + compileOptions { + sourceCompatibility JavaVersion.VERSION_1_7 + targetCompatibility JavaVersion.VERSION_1_7 + } + + // Rename the aar correctly + libraryVariants.all { variant -> + variant.outputs.each { output -> + def outputFile = output.outputFile + if (outputFile != null && outputFile.name.endsWith('.aar')) { + def fileName = "${project.name}-${variant.baseName}-${version}.aar" + output.outputFile = new File(outputFile.parent, fileName) + } + } + } + + dependencies { + provided 'javax.annotation:jsr250-api:1.0' + } + } + + afterEvaluate { + android.libraryVariants.all { variant -> + def task = project.tasks.create "jar${variant.name.capitalize()}", Jar + task.description = "Create jar artifact for ${variant.name}" + task.dependsOn variant.javaCompile + task.from variant.javaCompile.destinationDir + task.destinationDir = project.file("${project.buildDir}/outputs/jar") + task.archiveName = "${project.name}-${variant.baseName}-${version}.jar" + artifacts.add('archives', task); + } + } + + task sourcesJar(type: Jar) { + from android.sourceSets.main.java.srcDirs + classifier = 'sources' + } + + artifacts { + archives sourcesJar + } + +} else { + + apply plugin: 'java' + apply plugin: 'maven' + + sourceCompatibility = JavaVersion.VERSION_1_7 + targetCompatibility = JavaVersion.VERSION_1_7 + + install { + repositories.mavenInstaller { + pom.artifactId = '{{artifactId}}' + } + } + + task execute(type:JavaExec) { + main = System.getProperty('mainClass') + classpath = sourceSets.main.runtimeClasspath + } +} + +ext { + swagger_annotations_version = "1.5.0" + jackson_version = "2.6.3" + feign_version = "8.1.1" + jodatime_version = "2.5" + junit_version = "4.12" +} + +dependencies { + compile "io.swagger:swagger-annotations:$swagger_annotations_version" + compile "com.netflix.feign:feign-core:$feign_version" + compile "com.netflix.feign:feign-jackson:$feign_version" + compile "com.netflix.feign:feign-slf4j:$feign_version" + compile "com.fasterxml.jackson.core:jackson-core:$jackson_version" + compile "com.fasterxml.jackson.core:jackson-annotations:$jackson_version" + compile "com.fasterxml.jackson.core:jackson-databind:$jackson_version" + compile "com.fasterxml.jackson.datatype:jackson-datatype-joda:2.1.5" + compile "joda-time:joda-time:$jodatime_version" + compile "com.brsanthu:migbase64:2.2" + testCompile "junit:junit:$junit_version" +} diff --git a/modules/swagger-codegen/src/main/resources/Java/libraries/feign/pom.mustache b/modules/swagger-codegen/src/main/resources/Java/libraries/feign/pom.mustache new file mode 100644 index 00000000000..e8069b82931 --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/Java/libraries/feign/pom.mustache @@ -0,0 +1,183 @@ + + 4.0.0 + {{groupId}} + {{artifactId}} + jar + {{artifactId}} + {{artifactVersion}} + + scm:git:git@github.com:swagger-api/swagger-mustache.git + scm:git:git@github.com:swagger-api/swagger-codegen.git + https://github.com/swagger-api/swagger-codegen + + + 2.2.0 + + + + + + org.apache.maven.plugins + maven-surefire-plugin + 2.12 + + + + loggerPath + conf/log4j.properties + + + -Xms512m -Xmx1500m + methods + pertest + + + + maven-dependency-plugin + + + package + + copy-dependencies + + + ${project.build.directory}/lib + + + + + + + + org.apache.maven.plugins + maven-jar-plugin + 2.2 + + + + jar + test-jar + + + + + + + + + org.codehaus.mojo + build-helper-maven-plugin + + + add_sources + generate-sources + + add-source + + + + src/main/java + + + + + add_test_sources + generate-test-sources + + add-test-source + + + + src/test/java + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + 2.3.2 + + 1.6 + 1.6 + + + + + + + io.swagger + swagger-annotations + ${swagger-annotations-version} + + + + + com.netflix.feign + feign-core + ${feign-version} + + + com.netflix.feign + feign-jackson + ${feign-version} + + + com.netflix.feign + feign-slf4j + ${feign-version} + + + + + com.fasterxml.jackson.core + jackson-core + ${jackson-version} + + + com.fasterxml.jackson.core + jackson-annotations + ${jackson-version} + + + com.fasterxml.jackson.core + jackson-databind + ${jackson-version} + + + com.fasterxml.jackson.datatype + jackson-datatype-joda + 2.1.5 + + + joda-time + joda-time + ${jodatime-version} + + + + + com.brsanthu + migbase64 + 2.2 + + + + + junit + junit + ${junit-version} + test + + + + 1.5.0 + 8.1.1 + 2.6.3 + 2.5 + 4.12 + 1.0.0 + + From 077a24f694c173e6c842ef61f9c47001518a2651 Mon Sep 17 00:00:00 2001 From: 317959997 Date: Thu, 26 Nov 2015 13:34:33 -0500 Subject: [PATCH 061/211] updated README.md on the new Netflix Feign library --- README.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index ef321e4bb59..2b1fa95364e 100644 --- a/README.md +++ b/README.md @@ -353,9 +353,10 @@ CONFIG OPTIONS library template (sub-template) to use: - HTTP client: Jersey client 1.18. JSON processing: Jackson 2.4.2 jersey2 - HTTP client: Jersey client 2.6 + feign - HTTP client: Netflix Feign 8.1.1. JSON processing: Jackson 2.6.3 okhttp-gson - HTTP client: OkHttp 2.4.0. JSON processing: Gson 2.3.1 retrofit - HTTP client: OkHttp 2.4.0. JSON processing: Gson 2.3.1 (Retrofit 1.9.0) - retrofit2 - HTTP client: OkHttp 2.5.0. JSON processing: Gson 2.4 (Retrofit 2.0.0-beta2) + retrofit2 - HTTP client: OkHttp 2.5.0. JSON processing: Gson 2.4 (Retrofit 2.0.0-beta2) ``` Your config file for java can look like @@ -365,6 +366,7 @@ Your config file for java can look like "groupId":"com.my.company", "artifactId":"MyClent", "artifactVersion":"1.2.0" + "library":"feign" } ``` From 3cf8f24a079abf6c5cf0eb01771c6141cfe65aed Mon Sep 17 00:00:00 2001 From: 317959997 Date: Thu, 26 Nov 2015 13:37:19 -0500 Subject: [PATCH 062/211] updated README.md on the new Netflix Feign library --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 2b1fa95364e..e66a9e397a8 100644 --- a/README.md +++ b/README.md @@ -3,6 +3,8 @@ [![Build Status](https://travis-ci.org/swagger-api/swagger-codegen.png)](https://travis-ci.org/swagger-api/swagger-codegen) [![Maven Central](https://maven-badges.herokuapp.com/maven-central/io.swagger/swagger-codegen-project/badge.svg?style=plastic)](https://maven-badges.herokuapp.com/maven-central/io.swagger/swagger-codegen-project) +This is a fork with added support for [Netflix Feign](https://github.com/Netflix/feign) + ## Overview This is the swagger codegen project, which allows generation of client libraries automatically from a Swagger-compliant server. From 4b9b7a6a012190349018a6b562185381fbd06c53 Mon Sep 17 00:00:00 2001 From: 317959997 Date: Thu, 26 Nov 2015 13:37:58 -0500 Subject: [PATCH 063/211] updated README.md on the new Netflix Feign library --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index e66a9e397a8..4a96ff7f7fc 100644 --- a/README.md +++ b/README.md @@ -367,7 +367,7 @@ Your config file for java can look like { "groupId":"com.my.company", "artifactId":"MyClent", - "artifactVersion":"1.2.0" + "artifactVersion":"1.2.0", "library":"feign" } ``` From dfda666806d42985559e360f6a7d717e7c665ca4 Mon Sep 17 00:00:00 2001 From: dantran Date: Thu, 26 Nov 2015 21:57:37 -0800 Subject: [PATCH 064/211] Honor Enum's value --- .../swagger-codegen/src/main/resources/Java/enumClass.mustache | 2 ++ modules/swagger-codegen/src/main/resources/Java/model.mustache | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/modules/swagger-codegen/src/main/resources/Java/enumClass.mustache b/modules/swagger-codegen/src/main/resources/Java/enumClass.mustache index fd8e8442254..0377a81f92b 100644 --- a/modules/swagger-codegen/src/main/resources/Java/enumClass.mustache +++ b/modules/swagger-codegen/src/main/resources/Java/enumClass.mustache @@ -1,3 +1,4 @@ + public enum {{datatypeWithEnum}} { {{#allowableValues}}{{#enumVars}}{{name}}("{{value}}"){{^-last}}, {{/-last}}{{#-last}};{{/-last}}{{/enumVars}}{{/allowableValues}} @@ -9,6 +10,7 @@ public enum {{datatypeWithEnum}} { } @Override + @JsonValue 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 55aa77e30f0..ac27bca08de 100644 --- a/modules/swagger-codegen/src/main/resources/Java/model.mustache +++ b/modules/swagger-codegen/src/main/resources/Java/model.mustache @@ -9,7 +9,7 @@ import java.io.Serializable;{{/serializableModel}} import java.util.Objects; import io.swagger.annotations.*; -import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.*; {{#models}} {{#model}}{{#description}} From 7731bc9d370c79f6a12ab9ff93d7c61e1a816346 Mon Sep 17 00:00:00 2001 From: xhh Date: Fri, 27 Nov 2015 17:32:31 +0800 Subject: [PATCH 065/211] Fix issue of escaping HTML elements in enum values See swagger-api/swagger-editor#727 --- .../src/main/resources/Java/enumClass.mustache | 6 +++--- .../Java/libraries/okhttp-gson/enumClass.mustache | 8 ++++---- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/modules/swagger-codegen/src/main/resources/Java/enumClass.mustache b/modules/swagger-codegen/src/main/resources/Java/enumClass.mustache index fd8e8442254..61420a71a54 100644 --- a/modules/swagger-codegen/src/main/resources/Java/enumClass.mustache +++ b/modules/swagger-codegen/src/main/resources/Java/enumClass.mustache @@ -1,10 +1,10 @@ -public enum {{datatypeWithEnum}} { - {{#allowableValues}}{{#enumVars}}{{name}}("{{value}}"){{^-last}}, +public enum {{{datatypeWithEnum}}} { + {{#allowableValues}}{{#enumVars}}{{{name}}}("{{{value}}}"){{^-last}}, {{/-last}}{{#-last}};{{/-last}}{{/enumVars}}{{/allowableValues}} private String value; - {{datatypeWithEnum}}(String value) { + {{{datatypeWithEnum}}}(String value) { this.value = value; } diff --git a/modules/swagger-codegen/src/main/resources/Java/libraries/okhttp-gson/enumClass.mustache b/modules/swagger-codegen/src/main/resources/Java/libraries/okhttp-gson/enumClass.mustache index bb1109c27ca..0fed02b67a3 100644 --- a/modules/swagger-codegen/src/main/resources/Java/libraries/okhttp-gson/enumClass.mustache +++ b/modules/swagger-codegen/src/main/resources/Java/libraries/okhttp-gson/enumClass.mustache @@ -1,12 +1,12 @@ -public enum {{datatypeWithEnum}} { - {{#allowableValues}}{{#enumVars}}@SerializedName("{{value}}") - {{name}}("{{value}}"){{^-last}}, +public enum {{{datatypeWithEnum}}} { + {{#allowableValues}}{{#enumVars}}@SerializedName("{{{value}}}") + {{{name}}}("{{{value}}}"){{^-last}}, {{/-last}}{{#-last}};{{/-last}}{{/enumVars}}{{/allowableValues}} private String value; - {{datatypeWithEnum}}(String value) { + {{{datatypeWithEnum}}}(String value) { this.value = value; } From aebfacaa2251a201903175e1212f84995e710031 Mon Sep 17 00:00:00 2001 From: jfastnacht Date: Fri, 27 Nov 2015 15:25:40 +0100 Subject: [PATCH 066/211] Adjusted codegen to fit pull request comments in https://github.com/swagger-api/swagger-codegen/pull/1619 --- .../languages/SlimFrameworkServerCodegen.java | 42 +++++++++++++++---- 1 file changed, 34 insertions(+), 8 deletions(-) diff --git a/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/SlimFrameworkServerCodegen.java b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/SlimFrameworkServerCodegen.java index 847f1a5fdcd..ef318cb6bdd 100644 --- a/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/SlimFrameworkServerCodegen.java +++ b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/SlimFrameworkServerCodegen.java @@ -8,6 +8,7 @@ import io.swagger.codegen.SupportingFile; import io.swagger.models.properties.ArrayProperty; import io.swagger.models.properties.MapProperty; import io.swagger.models.properties.Property; +import io.swagger.models.properties.RefProperty; import java.io.File; import java.util.Arrays; @@ -19,6 +20,7 @@ public class SlimFrameworkServerCodegen extends DefaultCodegen implements Codege protected String groupId = "io.swagger"; protected String artifactId = "swagger-server"; protected String artifactVersion = "1.0.0"; + private String variableNamingConvention = "camelCase"; public SlimFrameworkServerCodegen() { super(); @@ -73,10 +75,10 @@ public class SlimFrameworkServerCodegen extends DefaultCodegen implements Codege typeMapping.put("double", "double"); typeMapping.put("string", "string"); typeMapping.put("byte", "int"); - typeMapping.put("boolean", "boolean"); - typeMapping.put("date", "DateTime"); - typeMapping.put("datetime", "DateTime"); - typeMapping.put("file", "string"); + typeMapping.put("boolean", "bool"); + typeMapping.put("date", "\\DateTime"); + typeMapping.put("datetime", "\\DateTime"); + typeMapping.put("file", "\\SplFileObject"); typeMapping.put("map", "map"); typeMapping.put("array", "array"); typeMapping.put("list", "array"); @@ -119,11 +121,15 @@ public class SlimFrameworkServerCodegen extends DefaultCodegen implements Codege if (p instanceof ArrayProperty) { ArrayProperty ap = (ArrayProperty) p; Property inner = ap.getItems(); - return getSwaggerType(p) + "[" + getTypeDeclaration(inner) + "]"; + return getTypeDeclaration(inner) + "[]"; } else if (p instanceof MapProperty) { MapProperty mp = (MapProperty) p; Property inner = mp.getAdditionalProperties(); return getSwaggerType(p) + "[string," + getTypeDeclaration(inner) + "]"; + } else if (p instanceof RefProperty) { + String type = super.getTypeDeclaration(p); + return (!languageSpecificPrimitives.contains(type)) + ? "\\" + modelPackage + "\\" + type : type; } return super.getTypeDeclaration(p); } @@ -148,16 +154,36 @@ public class SlimFrameworkServerCodegen extends DefaultCodegen implements Codege return toModelName(type); } + @Override + public String getTypeDeclaration(String name) { + if (!languageSpecificPrimitives.contains(name)) { + return "\\" + modelPackage + "\\" + name; + } + return super.getTypeDeclaration(name); + } + public String toDefaultValue(Property p) { return "null"; } + public void setParameterNamingConvention(String variableNamingConvention) { + this.variableNamingConvention = variableNamingConvention; + } @Override public String toVarName(String name) { - // return the name in underscore style - // PhoneNumber => phone_number - name = underscore(name); + // sanitize name + name = sanitizeName(name); + + if ("camelCase".equals(variableNamingConvention)) { + // return the name in camelCase style + // phone_number => phoneNumber + name = camelize(name, true); + } else { // default to snake case + // return the name in underscore style + // PhoneNumber => phone_number + name = underscore(name); + } // parameter name starting with number won't compile // need to escape it by appending _ at the beginning From 41936ab5c94127b81c8d98713b479b1128239b84 Mon Sep 17 00:00:00 2001 From: jfastnacht Date: Fri, 27 Nov 2015 15:37:25 +0100 Subject: [PATCH 067/211] Adjusted index.mustache to fit camelCase variable naming. Updated index.php sample. --- .../src/main/resources/slim/index.mustache | 4 ++-- samples/server/petstore/slim/SwaggerServer/index.php | 10 +++++----- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/modules/swagger-codegen/src/main/resources/slim/index.mustache b/modules/swagger-codegen/src/main/resources/slim/index.mustache index 4e17aa6e523..4fdd77681c3 100644 --- a/modules/swagger-codegen/src/main/resources/slim/index.mustache +++ b/modules/swagger-codegen/src/main/resources/slim/index.mustache @@ -18,8 +18,8 @@ $app = new Slim\App(); $app->{{httpMethod}}('{{path}}', function($request, $response, $args) { {{#hasHeaderParams}}$headers = $request->getHeaders();{{/hasHeaderParams}} {{#hasQueryParams}}$queryParams = $request->getQueryParams(); - {{#queryParams}}$qp_{{paramName}} = $queryParams['{{paramName}}'];{{newline}} {{/queryParams}}{{/hasQueryParams}} - {{#hasFormParams}}{{#formParams}}$fp_{{paramName}} = $args['{{paramName}}'];{{newline}} {{/formParams}}{{/hasFormParams}} + {{#queryParams}}${{paramName}} = $queryParams['{{paramName}}'];{{newline}} {{/queryParams}}{{/hasQueryParams}} + {{#hasFormParams}}{{#formParams}}${{paramName}} = $args['{{paramName}}'];{{newline}} {{/formParams}}{{/hasFormParams}} {{#hasBodyParam}}$body = $request->getParsedBody();{{/hasBodyParam}} $response->write('How about implementing {{nickname}} as a {{httpMethod}} method ?'); return $response; diff --git a/samples/server/petstore/slim/SwaggerServer/index.php b/samples/server/petstore/slim/SwaggerServer/index.php index f92530d90c1..1db11f806fb 100644 --- a/samples/server/petstore/slim/SwaggerServer/index.php +++ b/samples/server/petstore/slim/SwaggerServer/index.php @@ -66,7 +66,7 @@ $app->POST('/user/createWithList', function($request, $response, $args) { $app->GET('/user/login', function($request, $response, $args) { $queryParams = $request->getQueryParams(); - $qp_username = $queryParams['username']; $qp_password = $queryParams['password']; + $username = $queryParams['username']; $password = $queryParams['password']; $response->write('How about implementing loginUser as a GET method ?'); @@ -243,7 +243,7 @@ $app->POST('/pet', function($request, $response, $args) { $app->GET('/pet/findByStatus', function($request, $response, $args) { $queryParams = $request->getQueryParams(); - $qp_status = $queryParams['status']; + $status = $queryParams['status']; $response->write('How about implementing findPetsByStatus as a GET method ?'); @@ -260,7 +260,7 @@ $app->GET('/pet/findByStatus', function($request, $response, $args) { $app->GET('/pet/findByTags', function($request, $response, $args) { $queryParams = $request->getQueryParams(); - $qp_tags = $queryParams['tags']; + $tags = $queryParams['tags']; $response->write('How about implementing findPetsByTags as a GET method ?'); @@ -293,7 +293,7 @@ $app->GET('/pet/{petId}', function($request, $response, $args) { $app->POST('/pet/{petId}', function($request, $response, $args) { - $fp_name = $args['name']; $fp_status = $args['status']; + $name = $args['name']; $status = $args['status']; $response->write('How about implementing updatePetWithForm as a POST method ?'); return $response; @@ -325,7 +325,7 @@ $app->DELETE('/pet/{petId}', function($request, $response, $args) { $app->POST('/pet/{petId}/uploadImage', function($request, $response, $args) { - $fp_additional_metadata = $args['additional_metadata']; $fp_file = $args['file']; + $additionalMetadata = $args['additionalMetadata']; $file = $args['file']; $response->write('How about implementing uploadFile as a POST method ?'); return $response; From 7272cb0feb1d48f4502e7488b5b9ec161eaa6062 Mon Sep 17 00:00:00 2001 From: 317959997 Date: Fri, 27 Nov 2015 12:21:59 -0500 Subject: [PATCH 068/211] fixed feign api template --- .../src/main/resources/Java/libraries/feign/api.mustache | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/swagger-codegen/src/main/resources/Java/libraries/feign/api.mustache b/modules/swagger-codegen/src/main/resources/Java/libraries/feign/api.mustache index 9ffcb014a84..772079eebdb 100644 --- a/modules/swagger-codegen/src/main/resources/Java/libraries/feign/api.mustache +++ b/modules/swagger-codegen/src/main/resources/Java/libraries/feign/api.mustache @@ -23,7 +23,7 @@ public interface {{classname}} extends {{invokerPackage}}.ApiClient.Api { {{#allParams}} * @param {{paramName}} {{description}} {{/allParams}} * @return {{#returnType}}{{{returnType}}}{{/returnType}}{{^returnType}}void{{/returnType}} */ - @RequestLine("{{httpMethod}} {{{path}}}{{#hasParams}}?{{/hasParams}}{{#allParams}}{{paramName}}={{=<% %>=}}{<%paramName%>}<%={{ }}=%>{{#hasMore}}&{{/hasMore}}{{/allParams}}") + @RequestLine("{{httpMethod}} {{{path}}}{{#hasQueryParams}}?{{/hasQueryParams}}{{#queryParams}}{{paramName}}={{=<% %>=}}{<%paramName%>}<%={{ }}=%>{{#hasMore}}&{{/hasMore}}{{/queryParams}}") @Headers({ {{#headerParams}}"{{paramName}}: {{=<% %>=}}{<%paramName%>}<%={{ }}=%>"{{#hasMore}}, {{/hasMore}}{{/headerParams}} From a7f225b6ac766737a28b7d9e8199a90eddbed0ae Mon Sep 17 00:00:00 2001 From: 317959997 Date: Fri, 27 Nov 2015 12:25:00 -0500 Subject: [PATCH 069/211] added support for generating JMeter project from swagger --- README.md | 7 +- .../src/main/resources/JMeter/api.mustache | 178 ++++++++++++++++++ .../JMeter/testdata-localhost.mustache | 2 + .../services/io.swagger.codegen.CodegenConfig | 1 + 4 files changed, 185 insertions(+), 3 deletions(-) create mode 100644 modules/swagger-codegen/src/main/resources/JMeter/api.mustache create mode 100644 modules/swagger-codegen/src/main/resources/JMeter/testdata-localhost.mustache diff --git a/README.md b/README.md index 4a96ff7f7fc..ba1266e0ef4 100644 --- a/README.md +++ b/README.md @@ -1,9 +1,9 @@ # Swagger Code Generator -[![Build Status](https://travis-ci.org/swagger-api/swagger-codegen.png)](https://travis-ci.org/swagger-api/swagger-codegen) -[![Maven Central](https://maven-badges.herokuapp.com/maven-central/io.swagger/swagger-codegen-project/badge.svg?style=plastic)](https://maven-badges.herokuapp.com/maven-central/io.swagger/swagger-codegen-project) +This is a fork with added support for generating -This is a fork with added support for [Netflix Feign](https://github.com/Netflix/feign) + - Java client using [Netflix Feign](https://github.com/Netflix/feign). + - [Apache JMeter](http://jmeter.apache.org/) project for testing REST endpoints. ## Overview This is the swagger codegen project, which allows generation of client libraries automatically from a Swagger-compliant server. @@ -279,6 +279,7 @@ FlaskConnexionCodegen.java JavaClientCodegen.java JavaInflectorServerCodegen.java JaxRSServerCodegen.java +JMeterCodegen.java NodeJSServerCodegen.java ObjcClientCodegen.java PerlClientCodegen.java diff --git a/modules/swagger-codegen/src/main/resources/JMeter/api.mustache b/modules/swagger-codegen/src/main/resources/JMeter/api.mustache new file mode 100644 index 00000000000..1af63c2d66d --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/JMeter/api.mustache @@ -0,0 +1,178 @@ + + + + + + false + false + + + + host + localhost + = + + + port + 8080 + = + + + + + + + + + + testCases + ${__P(host,10)} + = + + + host + ${__P(host,localhost)} + = + + + port + ${__P(port,8080)} + = + {{#operations}}{{#operation}} + + testData.{{operationId}}File + ${__P(testData.{{operationId}}File,{{classname}}.csv)} + = + {{/operation}}{{/operations}} + + + + + + + + ${host} + ${port} + + + + + + 4 + + + {{#operations}}{{#operation}} + continue + + false + ${testCases} + + 1 + 1 + 1448391617000 + 1448391617000 + false + + + + + + {{#headerParams}} + + {{paramName}} + ${__RandomString(10,qwertyuiopasdfghjklzxcvbnm)} + {{/headerParams}} + + + + + + {{#queryParams}} + + false + 0 + = + true + {{paramName}} + {{/queryParams}} + + + + + + + + + {{vendorExtensions.x-path}} + {{httpMethod}} + true + false + true + false + HttpClient3.1 + false + + {{summary}} {{notes}} + + + + , + + ${testData.{{operationId}}File} + true + true + shareMode.all + false + + + + + + + ${httpStatusCode} + + Assertion.response_code + false + 8 + + + + {{/operation}} + {{/operations}} + + + false + + saveConfig + + + true + true + true + + true + true + true + true + false + true + true + false + false + false + false + false + false + false + false + 0 + true + true + + + + + + + + diff --git a/modules/swagger-codegen/src/main/resources/JMeter/testdata-localhost.mustache b/modules/swagger-codegen/src/main/resources/JMeter/testdata-localhost.mustache new file mode 100644 index 00000000000..48708a1d0fa --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/JMeter/testdata-localhost.mustache @@ -0,0 +1,2 @@ +testCase,httpStatusCode{{#operations}}{{#operation}}{{#hasParams}},{{/hasParams}}{{#allParams}}{{paramName}}{{#hasMore}},{{/hasMore}}{{/allParams}}{{/operation}}{{/operations}} +Success,200{{#operations}}{{#operation}}{{#hasParams}},{{/hasParams}}{{#allParams}}0{{#hasMore}},{{/hasMore}}{{/allParams}}{{/operation}}{{/operations}} \ No newline at end of file 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 5c607488d9b..de31683a15f 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 @@ -7,6 +7,7 @@ io.swagger.codegen.languages.FlaskConnexionCodegen io.swagger.codegen.languages.JavaClientCodegen io.swagger.codegen.languages.JaxRSServerCodegen io.swagger.codegen.languages.JavaInflectorServerCodegen +io.swagger.codegen.languages.JMeterCodegen io.swagger.codegen.languages.NodeJSServerCodegen io.swagger.codegen.languages.ObjcClientCodegen io.swagger.codegen.languages.PerlClientCodegen From dfc0813a184a668366887b21379ffacf8867d4b8 Mon Sep 17 00:00:00 2001 From: wing328 Date: Sat, 28 Nov 2015 15:40:44 +0800 Subject: [PATCH 070/211] add optional parameter to c# api client (enabled by default) --- .../io/swagger/codegen/CodegenConstants.java | 2 + .../languages/CSharpClientCodegen.java | 12 ++++ .../src/main/resources/csharp/api.mustache | 18 +++--- .../csharp/CSharpClientOptionsTest.java | 2 + .../options/CSharpClientOptionsProvider.java | 1 + .../src/main/csharp/IO/Swagger/Api/PetApi.cs | 56 +++++++++--------- .../main/csharp/IO/Swagger/Api/StoreApi.cs | 8 +-- .../src/main/csharp/IO/Swagger/Api/UserApi.cs | 40 ++++++------- .../SwaggerClientTest.userprefs | 2 +- .../csharp/SwaggerClientTest/TestPet.cs | 8 ++- .../bin/Debug/SwaggerClientTest.dll | Bin 67584 -> 68096 bytes .../bin/Debug/SwaggerClientTest.dll.mdb | Bin 21137 -> 21165 bytes .../obj/Debug/SwaggerClientTest.dll | Bin 67584 -> 68096 bytes .../obj/Debug/SwaggerClientTest.dll.mdb | Bin 21137 -> 21165 bytes 14 files changed, 86 insertions(+), 63 deletions(-) diff --git a/modules/swagger-codegen/src/main/java/io/swagger/codegen/CodegenConstants.java b/modules/swagger-codegen/src/main/java/io/swagger/codegen/CodegenConstants.java index a5bb97e5a93..74464397120 100644 --- a/modules/swagger-codegen/src/main/java/io/swagger/codegen/CodegenConstants.java +++ b/modules/swagger-codegen/src/main/java/io/swagger/codegen/CodegenConstants.java @@ -46,4 +46,6 @@ public class CodegenConstants { public static final String PACKAGE_NAME = "packageName"; public static final String PACKAGE_VERSION = "packageVersion"; public static final String POD_VERSION = "podVersion"; + + public static final String OPTIONAL_METHOD_ARGUMENT = "optionalMethodArgument"; } diff --git a/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/CSharpClientCodegen.java b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/CSharpClientCodegen.java index 3ab152cf66d..e95f9c71c4c 100644 --- a/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/CSharpClientCodegen.java +++ b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/CSharpClientCodegen.java @@ -25,6 +25,7 @@ import org.slf4j.LoggerFactory; public class CSharpClientCodegen extends DefaultCodegen implements CodegenConfig { private static final Logger LOGGER = LoggerFactory.getLogger(CSharpClientCodegen.class); + protected boolean optionalMethodArgumentFlag = true; protected String packageName = "IO.Swagger"; protected String packageVersion = "1.0.0"; protected String clientPackage = "IO.Swagger.Client"; @@ -91,6 +92,7 @@ public class CSharpClientCodegen extends DefaultCodegen implements CodegenConfig .defaultValue("IO.Swagger")); cliOptions.add(new CliOption(CodegenConstants.PACKAGE_VERSION, "C# package version.").defaultValue("1.0.0")); cliOptions.add(new CliOption(CodegenConstants.SORT_PARAMS_BY_REQUIRED_FLAG, CodegenConstants.SORT_PARAMS_BY_REQUIRED_FLAG_DESC)); + cliOptions.add(new CliOption(CodegenConstants.OPTIONAL_METHOD_ARGUMENT, "C# Optional method argument, e.g. void square(int x=10) (.net 4.0+ only). Default: false").defaultValue("false")); } @Override @@ -113,6 +115,12 @@ public class CSharpClientCodegen extends DefaultCodegen implements CodegenConfig } additionalProperties.put("clientPackage", clientPackage); + + if (additionalProperties.containsKey(CodegenConstants.OPTIONAL_METHOD_ARGUMENT)) { + setOptionalMethodArgumentFlag(Boolean.valueOf(additionalProperties + .get(CodegenConstants.OPTIONAL_METHOD_ARGUMENT).toString())); + } + additionalProperties.put("optionalMethodArgument", optionalMethodArgumentFlag); supportingFiles.add(new SupportingFile("Configuration.mustache", sourceFolder + File.separator + clientPackage.replace(".", java.io.File.separator), "Configuration.cs")); @@ -261,6 +269,10 @@ public class CSharpClientCodegen extends DefaultCodegen implements CodegenConfig return camelize(sanitizeName(operationId)); } + public void setOptionalMethodArgumentFlag(boolean flag) { + this.optionalMethodArgumentFlag = flag; + } + public void setPackageName(String packageName) { this.packageName = packageName; } diff --git a/modules/swagger-codegen/src/main/resources/csharp/api.mustache b/modules/swagger-codegen/src/main/resources/csharp/api.mustache index 6708fa1e16d..11d2ffe81bb 100644 --- a/modules/swagger-codegen/src/main/resources/csharp/api.mustache +++ b/modules/swagger-codegen/src/main/resources/csharp/api.mustache @@ -23,7 +23,7 @@ namespace {{packageName}}.Api /// {{#allParams}}/// {{description}} {{/allParams}}/// {{#returnType}}{{^returnContainer}}{{{returnType}}}{{/returnContainer}}{{/returnType}} - {{#returnType}}{{{returnType}}}{{/returnType}}{{^returnType}}void{{/returnType}} {{nickname}} ({{#allParams}}{{{dataType}}} {{paramName}}{{#hasMore}}, {{/hasMore}}{{/allParams}}); + {{#returnType}}{{{returnType}}}{{/returnType}}{{^returnType}}void{{/returnType}} {{operationId}} ({{#allParams}}{{{dataType}}} {{paramName}}{{^required}}{{#optionalMethodArgument}} = null{{/optionalMethodArgument}}{{/required}}{{#hasMore}}, {{/hasMore}}{{/allParams}}); /// /// {{summary}} @@ -33,7 +33,7 @@ namespace {{packageName}}.Api /// {{#allParams}}/// {{description}} {{/allParams}}/// {{#returnType}}{{^returnContainer}}{{{returnType}}}{{/returnContainer}}{{/returnType}} - {{#returnType}}System.Threading.Tasks.Task<{{{returnType}}}>{{/returnType}}{{^returnType}}System.Threading.Tasks.Task{{/returnType}} {{nickname}}Async ({{#allParams}}{{{dataType}}} {{paramName}}{{#hasMore}}, {{/hasMore}}{{/allParams}}); + {{#returnType}}System.Threading.Tasks.Task<{{{returnType}}}>{{/returnType}}{{^returnType}}System.Threading.Tasks.Task{{/returnType}} {{operationId}}Async ({{#allParams}}{{{dataType}}} {{paramName}}{{^required}}{{#optionalMethodArgument}} = null{{/optionalMethodArgument}}{{/required}}{{#hasMore}}, {{/hasMore}}{{/allParams}}); {{/operation}} } @@ -95,11 +95,11 @@ namespace {{packageName}}.Api /// {{#allParams}}/// {{description}} {{/allParams}}/// {{#returnType}}{{^returnContainer}}{{{returnType}}}{{/returnContainer}}{{/returnType}} - public {{#returnType}}{{{returnType}}}{{/returnType}}{{^returnType}}void{{/returnType}} {{nickname}} ({{#allParams}}{{{dataType}}} {{paramName}}{{#hasMore}}, {{/hasMore}}{{/allParams}}) + public {{#returnType}}{{{returnType}}}{{/returnType}}{{^returnType}}void{{/returnType}} {{operationId}} ({{#allParams}}{{{dataType}}} {{paramName}}{{^required}}{{#optionalMethodArgument}} = null{{/optionalMethodArgument}}{{/required}}{{#hasMore}}, {{/hasMore}}{{/allParams}}) { {{#allParams}}{{#required}} // verify the required parameter '{{paramName}}' is set - if ({{paramName}} == null) throw new ApiException(400, "Missing required parameter '{{paramName}}' when calling {{nickname}}"); + if ({{paramName}} == null) throw new ApiException(400, "Missing required parameter '{{paramName}}' when calling {{operationId}}"); {{/required}}{{/allParams}} var path_ = "{{path}}"; @@ -140,9 +140,9 @@ namespace {{packageName}}.Api IRestResponse response = (IRestResponse) ApiClient.CallApi(path_, Method.{{httpMethod}}, queryParams, postBody, headerParams, formParams, fileParams, pathParams, authSettings); if (((int)response.StatusCode) >= 400) - throw new ApiException ((int)response.StatusCode, "Error calling {{nickname}}: " + response.Content, response.Content); + throw new ApiException ((int)response.StatusCode, "Error calling {{operationId}}: " + response.Content, response.Content); else if (((int)response.StatusCode) == 0) - throw new ApiException ((int)response.StatusCode, "Error calling {{nickname}}: " + response.ErrorMessage, response.ErrorMessage); + throw new ApiException ((int)response.StatusCode, "Error calling {{operationId}}: " + response.ErrorMessage, response.ErrorMessage); {{#returnType}}return ({{{returnType}}}) ApiClient.Deserialize(response, typeof({{{returnType}}}));{{/returnType}}{{^returnType}}return;{{/returnType}} } @@ -152,10 +152,10 @@ namespace {{packageName}}.Api /// {{#allParams}}/// {{description}} {{/allParams}}/// {{#returnType}}{{^returnContainer}}{{{returnType}}}{{/returnContainer}}{{/returnType}} - {{#returnType}}public async System.Threading.Tasks.Task<{{{returnType}}}>{{/returnType}}{{^returnType}}public async System.Threading.Tasks.Task{{/returnType}} {{nickname}}Async ({{#allParams}}{{{dataType}}} {{paramName}}{{#hasMore}}, {{/hasMore}}{{/allParams}}) + {{#returnType}}public async System.Threading.Tasks.Task<{{{returnType}}}>{{/returnType}}{{^returnType}}public async System.Threading.Tasks.Task{{/returnType}} {{operationId}}Async ({{#allParams}}{{{dataType}}} {{paramName}}{{^required}}{{#optionalMethodArgument}} = null{{/optionalMethodArgument}}{{/required}}{{#hasMore}}, {{/hasMore}}{{/allParams}}) { {{#allParams}}{{#required}}// verify the required parameter '{{paramName}}' is set - if ({{paramName}} == null) throw new ApiException(400, "Missing required parameter '{{paramName}}' when calling {{nickname}}"); + if ({{paramName}} == null) throw new ApiException(400, "Missing required parameter '{{paramName}}' when calling {{operationId}}"); {{/required}}{{/allParams}} var path_ = "{{path}}"; @@ -195,7 +195,7 @@ namespace {{packageName}}.Api // make the HTTP request IRestResponse response = (IRestResponse) await ApiClient.CallApiAsync(path_, Method.{{httpMethod}}, queryParams, postBody, headerParams, formParams, fileParams, pathParams, authSettings); if (((int)response.StatusCode) >= 400) - throw new ApiException ((int)response.StatusCode, "Error calling {{nickname}}: " + response.Content, response.Content); + throw new ApiException ((int)response.StatusCode, "Error calling {{operationId}}: " + response.Content, response.Content); {{#returnType}}return ({{{returnType}}}) ApiClient.Deserialize(response, typeof({{{returnType}}}));{{/returnType}}{{^returnType}} return;{{/returnType}} diff --git a/modules/swagger-codegen/src/test/java/io/swagger/codegen/csharp/CSharpClientOptionsTest.java b/modules/swagger-codegen/src/test/java/io/swagger/codegen/csharp/CSharpClientOptionsTest.java index 4c0d5f366a1..ec5246f7723 100644 --- a/modules/swagger-codegen/src/test/java/io/swagger/codegen/csharp/CSharpClientOptionsTest.java +++ b/modules/swagger-codegen/src/test/java/io/swagger/codegen/csharp/CSharpClientOptionsTest.java @@ -27,6 +27,8 @@ public class CSharpClientOptionsTest extends AbstractOptionsTest { new Expectations(clientCodegen) {{ clientCodegen.setPackageName(CSharpClientOptionsProvider.PACKAGE_NAME_VALUE); times = 1; + clientCodegen.setOptionalMethodArgumentFlag(true); + times = 1; clientCodegen.setPackageVersion(CSharpClientOptionsProvider.PACKAGE_VERSION_VALUE); times = 1; }}; diff --git a/modules/swagger-codegen/src/test/java/io/swagger/codegen/options/CSharpClientOptionsProvider.java b/modules/swagger-codegen/src/test/java/io/swagger/codegen/options/CSharpClientOptionsProvider.java index 442465dfcf9..94440db97c0 100644 --- a/modules/swagger-codegen/src/test/java/io/swagger/codegen/options/CSharpClientOptionsProvider.java +++ b/modules/swagger-codegen/src/test/java/io/swagger/codegen/options/CSharpClientOptionsProvider.java @@ -21,6 +21,7 @@ public class CSharpClientOptionsProvider implements OptionsProvider { return builder.put(CodegenConstants.PACKAGE_NAME, PACKAGE_NAME_VALUE) .put(CodegenConstants.PACKAGE_VERSION, PACKAGE_VERSION_VALUE) .put(CodegenConstants.SORT_PARAMS_BY_REQUIRED_FLAG, "true") + .put(CodegenConstants.OPTIONAL_METHOD_ARGUMENT, "true") .build(); } diff --git a/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Api/PetApi.cs b/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Api/PetApi.cs index 00bd7a5e9f2..8344304ee79 100644 --- a/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Api/PetApi.cs +++ b/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Api/PetApi.cs @@ -22,7 +22,7 @@ namespace IO.Swagger.Api /// /// Pet object that needs to be added to the store /// - void UpdatePet (Pet body); + void UpdatePet (Pet body = null); /// /// Update an existing pet @@ -32,7 +32,7 @@ namespace IO.Swagger.Api /// /// Pet object that needs to be added to the store /// - System.Threading.Tasks.Task UpdatePetAsync (Pet body); + System.Threading.Tasks.Task UpdatePetAsync (Pet body = null); /// /// Add a new pet to the store @@ -42,7 +42,7 @@ namespace IO.Swagger.Api /// /// Pet object that needs to be added to the store /// - void AddPet (Pet body); + void AddPet (Pet body = null); /// /// Add a new pet to the store @@ -52,7 +52,7 @@ namespace IO.Swagger.Api /// /// Pet object that needs to be added to the store /// - System.Threading.Tasks.Task AddPetAsync (Pet body); + System.Threading.Tasks.Task AddPetAsync (Pet body = null); /// /// Finds Pets by status @@ -62,7 +62,7 @@ namespace IO.Swagger.Api /// /// Status values that need to be considered for filter /// - List FindPetsByStatus (List status); + List FindPetsByStatus (List status = null); /// /// Finds Pets by status @@ -72,7 +72,7 @@ namespace IO.Swagger.Api /// /// Status values that need to be considered for filter /// - System.Threading.Tasks.Task> FindPetsByStatusAsync (List status); + System.Threading.Tasks.Task> FindPetsByStatusAsync (List status = null); /// /// Finds Pets by tags @@ -82,7 +82,7 @@ namespace IO.Swagger.Api /// /// Tags to filter by /// - List FindPetsByTags (List tags); + List FindPetsByTags (List tags = null); /// /// Finds Pets by tags @@ -92,7 +92,7 @@ namespace IO.Swagger.Api /// /// Tags to filter by /// - System.Threading.Tasks.Task> FindPetsByTagsAsync (List tags); + System.Threading.Tasks.Task> FindPetsByTagsAsync (List tags = null); /// /// Find pet by ID @@ -124,7 +124,7 @@ namespace IO.Swagger.Api /// Updated name of the pet /// Updated status of the pet /// - void UpdatePetWithForm (string petId, string name, string status); + void UpdatePetWithForm (string petId, string name = null, string status = null); /// /// Updates a pet in the store with form data @@ -136,7 +136,7 @@ namespace IO.Swagger.Api /// Updated name of the pet /// Updated status of the pet /// - System.Threading.Tasks.Task UpdatePetWithFormAsync (string petId, string name, string status); + System.Threading.Tasks.Task UpdatePetWithFormAsync (string petId, string name = null, string status = null); /// /// Deletes a pet @@ -147,7 +147,7 @@ namespace IO.Swagger.Api /// Pet id to delete /// /// - void DeletePet (long? petId, string apiKey); + void DeletePet (long? petId, string apiKey = null); /// /// Deletes a pet @@ -158,7 +158,7 @@ namespace IO.Swagger.Api /// Pet id to delete /// /// - System.Threading.Tasks.Task DeletePetAsync (long? petId, string apiKey); + System.Threading.Tasks.Task DeletePetAsync (long? petId, string apiKey = null); /// /// uploads an image @@ -170,7 +170,7 @@ namespace IO.Swagger.Api /// Additional data to pass to server /// file to upload /// - void UploadFile (long? petId, string additionalMetadata, Stream file); + void UploadFile (long? petId, string additionalMetadata = null, Stream file = null); /// /// uploads an image @@ -182,7 +182,7 @@ namespace IO.Swagger.Api /// Additional data to pass to server /// file to upload /// - System.Threading.Tasks.Task UploadFileAsync (long? petId, string additionalMetadata, Stream file); + System.Threading.Tasks.Task UploadFileAsync (long? petId, string additionalMetadata = null, Stream file = null); } @@ -244,7 +244,7 @@ namespace IO.Swagger.Api /// /// Pet object that needs to be added to the store /// - public void UpdatePet (Pet body) + public void UpdatePet (Pet body = null) { @@ -294,7 +294,7 @@ namespace IO.Swagger.Api /// /// Pet object that needs to be added to the store /// - public async System.Threading.Tasks.Task UpdatePetAsync (Pet body) + public async System.Threading.Tasks.Task UpdatePetAsync (Pet body = null) { @@ -342,7 +342,7 @@ namespace IO.Swagger.Api /// /// Pet object that needs to be added to the store /// - public void AddPet (Pet body) + public void AddPet (Pet body = null) { @@ -392,7 +392,7 @@ namespace IO.Swagger.Api /// /// Pet object that needs to be added to the store /// - public async System.Threading.Tasks.Task AddPetAsync (Pet body) + public async System.Threading.Tasks.Task AddPetAsync (Pet body = null) { @@ -440,7 +440,7 @@ namespace IO.Swagger.Api /// /// Status values that need to be considered for filter /// - public List FindPetsByStatus (List status) + public List FindPetsByStatus (List status = null) { @@ -490,7 +490,7 @@ namespace IO.Swagger.Api /// /// Status values that need to be considered for filter /// - public async System.Threading.Tasks.Task> FindPetsByStatusAsync (List status) + public async System.Threading.Tasks.Task> FindPetsByStatusAsync (List status = null) { @@ -537,7 +537,7 @@ namespace IO.Swagger.Api /// /// Tags to filter by /// - public List FindPetsByTags (List tags) + public List FindPetsByTags (List tags = null) { @@ -587,7 +587,7 @@ namespace IO.Swagger.Api /// /// Tags to filter by /// - public async System.Threading.Tasks.Task> FindPetsByTagsAsync (List tags) + public async System.Threading.Tasks.Task> FindPetsByTagsAsync (List tags = null) { @@ -738,7 +738,7 @@ namespace IO.Swagger.Api /// Updated name of the pet /// Updated status of the pet /// - public void UpdatePetWithForm (string petId, string name, string status) + public void UpdatePetWithForm (string petId, string name = null, string status = null) { // verify the required parameter 'petId' is set @@ -795,7 +795,7 @@ namespace IO.Swagger.Api /// Updated name of the pet /// Updated status of the pet /// - public async System.Threading.Tasks.Task UpdatePetWithFormAsync (string petId, string name, string status) + public async System.Threading.Tasks.Task UpdatePetWithFormAsync (string petId, string name = null, string status = null) { // verify the required parameter 'petId' is set if (petId == null) throw new ApiException(400, "Missing required parameter 'petId' when calling UpdatePetWithForm"); @@ -848,7 +848,7 @@ namespace IO.Swagger.Api /// Pet id to delete /// /// - public void DeletePet (long? petId, string apiKey) + public void DeletePet (long? petId, string apiKey = null) { // verify the required parameter 'petId' is set @@ -903,7 +903,7 @@ namespace IO.Swagger.Api /// Pet id to delete /// /// - public async System.Threading.Tasks.Task DeletePetAsync (long? petId, string apiKey) + public async System.Threading.Tasks.Task DeletePetAsync (long? petId, string apiKey = null) { // verify the required parameter 'petId' is set if (petId == null) throw new ApiException(400, "Missing required parameter 'petId' when calling DeletePet"); @@ -956,7 +956,7 @@ namespace IO.Swagger.Api /// Additional data to pass to server /// file to upload /// - public void UploadFile (long? petId, string additionalMetadata, Stream file) + public void UploadFile (long? petId, string additionalMetadata = null, Stream file = null) { // verify the required parameter 'petId' is set @@ -1013,7 +1013,7 @@ namespace IO.Swagger.Api /// Additional data to pass to server /// file to upload /// - public async System.Threading.Tasks.Task UploadFileAsync (long? petId, string additionalMetadata, Stream file) + public async System.Threading.Tasks.Task UploadFileAsync (long? petId, string additionalMetadata = null, Stream file = null) { // verify the required parameter 'petId' is set if (petId == null) throw new ApiException(400, "Missing required parameter 'petId' when calling UploadFile"); diff --git a/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Api/StoreApi.cs b/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Api/StoreApi.cs index b0a439ddf1a..952987dfad4 100644 --- a/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Api/StoreApi.cs +++ b/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Api/StoreApi.cs @@ -40,7 +40,7 @@ namespace IO.Swagger.Api /// /// order placed for purchasing the pet /// Order - Order PlaceOrder (Order body); + Order PlaceOrder (Order body = null); /// /// Place an order for a pet @@ -50,7 +50,7 @@ namespace IO.Swagger.Api /// /// order placed for purchasing the pet /// Order - System.Threading.Tasks.Task PlaceOrderAsync (Order body); + System.Threading.Tasks.Task PlaceOrderAsync (Order body = null); /// /// Find purchase order by ID @@ -245,7 +245,7 @@ namespace IO.Swagger.Api /// /// order placed for purchasing the pet /// Order - public Order PlaceOrder (Order body) + public Order PlaceOrder (Order body = null) { @@ -295,7 +295,7 @@ namespace IO.Swagger.Api /// /// order placed for purchasing the pet /// Order - public async System.Threading.Tasks.Task PlaceOrderAsync (Order body) + public async System.Threading.Tasks.Task PlaceOrderAsync (Order body = null) { diff --git a/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Api/UserApi.cs b/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Api/UserApi.cs index b4c8d93c28c..3890e98b17f 100644 --- a/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Api/UserApi.cs +++ b/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Api/UserApi.cs @@ -22,7 +22,7 @@ namespace IO.Swagger.Api /// /// Created user object /// - void CreateUser (User body); + void CreateUser (User body = null); /// /// Create user @@ -32,7 +32,7 @@ namespace IO.Swagger.Api /// /// Created user object /// - System.Threading.Tasks.Task CreateUserAsync (User body); + System.Threading.Tasks.Task CreateUserAsync (User body = null); /// /// Creates list of users with given input array @@ -42,7 +42,7 @@ namespace IO.Swagger.Api /// /// List of user object /// - void CreateUsersWithArrayInput (List body); + void CreateUsersWithArrayInput (List body = null); /// /// Creates list of users with given input array @@ -52,7 +52,7 @@ namespace IO.Swagger.Api /// /// List of user object /// - System.Threading.Tasks.Task CreateUsersWithArrayInputAsync (List body); + System.Threading.Tasks.Task CreateUsersWithArrayInputAsync (List body = null); /// /// Creates list of users with given input array @@ -62,7 +62,7 @@ namespace IO.Swagger.Api /// /// List of user object /// - void CreateUsersWithListInput (List body); + void CreateUsersWithListInput (List body = null); /// /// Creates list of users with given input array @@ -72,7 +72,7 @@ namespace IO.Swagger.Api /// /// List of user object /// - System.Threading.Tasks.Task CreateUsersWithListInputAsync (List body); + System.Threading.Tasks.Task CreateUsersWithListInputAsync (List body = null); /// /// Logs user into the system @@ -83,7 +83,7 @@ namespace IO.Swagger.Api /// The user name for login /// The password for login in clear text /// string - string LoginUser (string username, string password); + string LoginUser (string username = null, string password = null); /// /// Logs user into the system @@ -94,7 +94,7 @@ namespace IO.Swagger.Api /// The user name for login /// The password for login in clear text /// string - System.Threading.Tasks.Task LoginUserAsync (string username, string password); + System.Threading.Tasks.Task LoginUserAsync (string username = null, string password = null); /// /// Logs out current logged in user session @@ -143,7 +143,7 @@ namespace IO.Swagger.Api /// name that need to be deleted /// Updated user object /// - void UpdateUser (string username, User body); + void UpdateUser (string username, User body = null); /// /// Updated user @@ -154,7 +154,7 @@ namespace IO.Swagger.Api /// name that need to be deleted /// Updated user object /// - System.Threading.Tasks.Task UpdateUserAsync (string username, User body); + System.Threading.Tasks.Task UpdateUserAsync (string username, User body = null); /// /// Delete user @@ -236,7 +236,7 @@ namespace IO.Swagger.Api /// /// Created user object /// - public void CreateUser (User body) + public void CreateUser (User body = null) { @@ -286,7 +286,7 @@ namespace IO.Swagger.Api /// /// Created user object /// - public async System.Threading.Tasks.Task CreateUserAsync (User body) + public async System.Threading.Tasks.Task CreateUserAsync (User body = null) { @@ -334,7 +334,7 @@ namespace IO.Swagger.Api /// /// List of user object /// - public void CreateUsersWithArrayInput (List body) + public void CreateUsersWithArrayInput (List body = null) { @@ -384,7 +384,7 @@ namespace IO.Swagger.Api /// /// List of user object /// - public async System.Threading.Tasks.Task CreateUsersWithArrayInputAsync (List body) + public async System.Threading.Tasks.Task CreateUsersWithArrayInputAsync (List body = null) { @@ -432,7 +432,7 @@ namespace IO.Swagger.Api /// /// List of user object /// - public void CreateUsersWithListInput (List body) + public void CreateUsersWithListInput (List body = null) { @@ -482,7 +482,7 @@ namespace IO.Swagger.Api /// /// List of user object /// - public async System.Threading.Tasks.Task CreateUsersWithListInputAsync (List body) + public async System.Threading.Tasks.Task CreateUsersWithListInputAsync (List body = null) { @@ -531,7 +531,7 @@ namespace IO.Swagger.Api /// The user name for login /// The password for login in clear text /// string - public string LoginUser (string username, string password) + public string LoginUser (string username = null, string password = null) { @@ -583,7 +583,7 @@ namespace IO.Swagger.Api /// The user name for login /// The password for login in clear text /// string - public async System.Threading.Tasks.Task LoginUserAsync (string username, string password) + public async System.Threading.Tasks.Task LoginUserAsync (string username = null, string password = null) { @@ -828,7 +828,7 @@ namespace IO.Swagger.Api /// name that need to be deleted /// Updated user object /// - public void UpdateUser (string username, User body) + public void UpdateUser (string username, User body = null) { // verify the required parameter 'username' is set @@ -883,7 +883,7 @@ namespace IO.Swagger.Api /// name that need to be deleted /// Updated user object /// - public async System.Threading.Tasks.Task UpdateUserAsync (string username, User body) + public async System.Threading.Tasks.Task UpdateUserAsync (string username, User body = null) { // verify the required parameter 'username' is set if (username == null) throw new ApiException(400, "Missing required parameter 'username' when calling UpdateUser"); diff --git a/samples/client/petstore/csharp/SwaggerClientTest/SwaggerClientTest.userprefs b/samples/client/petstore/csharp/SwaggerClientTest/SwaggerClientTest.userprefs index 0a2248522b9..cd6170dd2e8 100644 --- a/samples/client/petstore/csharp/SwaggerClientTest/SwaggerClientTest.userprefs +++ b/samples/client/petstore/csharp/SwaggerClientTest/SwaggerClientTest.userprefs @@ -2,7 +2,7 @@ - + diff --git a/samples/client/petstore/csharp/SwaggerClientTest/TestPet.cs b/samples/client/petstore/csharp/SwaggerClientTest/TestPet.cs index 19a14c592f4..e9169da9832 100644 --- a/samples/client/petstore/csharp/SwaggerClientTest/TestPet.cs +++ b/samples/client/petstore/csharp/SwaggerClientTest/TestPet.cs @@ -121,6 +121,11 @@ namespace SwaggerClient.TestPet Assert.AreEqual (petId, response.Tags [0].Id); Assert.AreEqual (56, response.Category.Id); + + // test optional parameter + petApi.UpdatePetWithForm (petId.ToString(), "new form name2"); + Pet response2 = petApi.GetPetById (petId); + Assert.AreEqual ("new form name2", response2.Name); } /// @@ -136,7 +141,8 @@ namespace SwaggerClient.TestPet petApi.UploadFile(petId, "new form name", fileStream); // test file upload without any form parameters - petApi.UploadFile(petId, null, fileStream); + // using optional parameter syntax introduced at .net 4.0 + petApi.UploadFile(petId: petId, file: fileStream); } diff --git a/samples/client/petstore/csharp/SwaggerClientTest/bin/Debug/SwaggerClientTest.dll b/samples/client/petstore/csharp/SwaggerClientTest/bin/Debug/SwaggerClientTest.dll index cb328f9bb0767ff59711234a803eedb72bf52baf..3e3230fe96b0ef4d060a947da417add0a8f6f663 100755 GIT binary patch delta 1935 zcmc)Le`r%z6bJBglV_83Ntd6G5}T=bga;D?H|GfGpQ)+1bNhwjr}nchRA+`vVT?>LstJ7?w9*#EbiQIlA3Kg*k60l z&pY?r^UizkCh1K~X^E5C)ajT-5S0*)bzzRf9JcY9+H$dlNaK+@3TH~BzG`$;3hGf= zF1A}!RX%N(Am{WJ5tV(S)EJ@*wq%zJqBHzV4>e->Is zUz{cKA0iUmYOVRK#UEd0=ZXz-XySUX#B!*CJ7x79Trj+csC48#FCFm9sR_N-iP%1D z@(a~|%5!zTh(;aUw~NR_{!tH4l#X1Jn~&7%PMgc_cMR8Xs*cLJ?iH@eq>W<@2g?j<=4D z4DH`D%FQU;%a85j+_tUs(jbwWbJgp&bv@1JgFJpm{*>%+bn>X2UvQ(@dhC+XJa&f1 zbc}{Vy>yeV=0^uH+MdqMy^YZhUMQ{%zNV?l-R6q)%a*v?Ehwfv*cRk-wj*xmPgGFj zUv#@I)XB3}YRTsxoarf=U5YFC;$B=lSTtS8NcT+e|9--ne|^Hj!pX?Ya`m+Kza_No z4_n;ge7{32*^8{8LaY|L-%+fpiD8vgjXXb7yR&e&hku5-+Z3Aqmm8R?&W+jQ>ve}! zePO)(OWVXcpbL6n0ES=%tb$E!8AWMtsh48Nw8D1S1-HOH*bfKc5Zp(b;(W`)7)-z< zJOL+R3QogQ@B(}v&cO`)7+!;4!W-}#_$|BzZ^J*>xR+c)y|)L}z?HBbHo+KdhOMw2 zJ_Ea89~^-D;9)oclkfzbgehg1rZG4LPs2341T*rZif z1Qw+Aa#Q?=0MQF{-`UX5oH;6fW9LG@vsXfzPV^b#1;mRXJ7?~OoNN}_3>Ev}V}_gK z8bkHT#dXL;j3DQmjWGKZX1k1)yLgZ*I!R4Sm-QNJINoWjTPpo$)4O=k0W{hR$6yxu zR}m+Spy``$w1{!pky$Y~u79ZZi2Iuk$K(3hxE+al(z U4&L&dJlPhR_mqe`A{DXy32mq&^#A|> delta 1451 zcmc&!T}TvB6h3#Hb$0#Pbbp53*;co7NhJS5O9M?SbX5e?d?+lG*hEYdH4MWvO#>5h zxq=TBXtGh%gE7?>+k;>d5gJAL6hed`_Rxb!50Q56omR!9x9Gxr_dDPD&Y3%h;dT#; z-9zHg?JOVw;lNj39C8;@7w(X+aRETYh^^2LHNN+0(M|%TOhvOk%(u%d<`ak-IVO-y zdV(YwR#}SW=>SPEpoy0Y^eKrqpcAk!gwuJFU}JB^<-tb)9Sn^F)N}w4*6V;;E?ByB zuQ69d>#w{~l98FyML48Y#Db+Y78^yhJfH(TDJF|_-i={0IMCCMo?<%FLrIBR+k2mo zcQmrEmXy-QK9_OD1kHC^Ujal!wyc@x&Avq9q?3J_xndST!exMF-1j<=SGKj(H`TRb zGq_a_kYq-!suEtF0f<2@p{T0(DDEFH9;6xlM+|J74*aN6wX^?`l9N4(G4w;dy#nUo z>hI_xk8ERFZjeU`emXjBmqg}FRO`kr2wgY{$imTYhX=W?VFBkFrg6T30u-VW2AY%U z+bN~%RRXMYCt53bv3FBCq|kD|?SG%p{nrzQ21lFyE_&Q=(QguVR)>P^hP!#_rwnXl zXAuc(<(d-GwJPSJi~gj4`U3Ub-8Q{*zibF&Ka3GFp&`NqjZg+A_{p)6c22}gxpFE@ zg%_&h6Anpt!+Os;L#G27U7xG~r(pvh+CQVxOBN8H*q0Ee?8}I=oX>NFwjiH;6kpIRVZ%c)k?~`_0Og& z{GheGQ3J;|j;mbn;JjOr)Q`{71mdN-;2x`24zdep;|fFWr3FEAZj&q2)Z&uIl#3K79+VVucpPFKpyF33$TYGbrznc9qEl9x;b>>dka0*J01I}#+|-PG_f||iB*f{mK&GfeIt3r%+wzz zToyfiIG`;0u@&~#1yd_LM_yQBOwt`aq}r(tSp1?g5Hr22<@BNIb(X~o8;=@%Yo2CF zc;*IaRKCVkQ`+WDrqpmD>8AP2GOm7ZLxetDJg%Gkk~~EtYvpG((%7DK+F^7XNu?rn zT53jY+InKYx7Ke=eI>(~n(_`FSsp7DGmj69)JIm$u6mxBB{@hAl{GRh?>Ca&a{ zx+ty`Ejpe0V-vNTu8KhYo2q&i>*j=sUHaX@M>5E{#kGZ0!|#CE|4b(Rl-VqzBa+lz znKYO=B%BeeCe?4HhOLcTy=SpIi*{y-tbe%Xe{b(8)vp z-@-8_8$=OB0BC%`1+Z}^#Lh3E&A zyC`#Gh<+!At delta 1645 zcmY+EeN5DK9LGPOyX!jRAp`=qqtsZXlU1`=9vqJcWPkX8E(%*K#id(ja3Xhba0ka7 zPj^Gkuey{*)`p=aGN73#Du}t2V#UK1YYW1Bh=&7tQXYFVI9j*8_j-m9$}Pu?!uQE%Ji<=94)ifL^Ek=H!Y_k#1@l(^u7 z@Z;Fmct92(4oC8J-Em79v{ic4Y%6ct7aWv* zJy*E6#)liqE8#@B!ASMlN^@&s5T!-_&j8!R8#Z**kns*cwOSMidR@7 zhBo*MAJq#YLKUo#db-lcqP2=t)ymaoWo}kQ67=DD$hV>L%v~Y zdu*Ud!_-1oNGs%`JNkLCIdXeIaW<7?+p?Dqmgdl*oHB7fGCiOohrY-;nX@!~W~AfB z6Cx(c7*J)T)5bH#rRiG}oi$a9j;P%$E}5v&blK#dB&TwjzRu+;kr=&4c>$#%moEZ~ zAD*NtkLh$CpAl`*2bC95F6D6};NHJCGhHxqgGh-6C+_x3_OrI0(toMxx;9?JbfegL@lpNp7&DdJy+AudDNi*l!k{|4N9 zPchS9#oQ}A;|~OlqKp;uIN;u0B}_vlJX|8m<5PpoHl}5V-;qt>^0b|2>~*yX zPK9Zcib#&!1?*rdau4niMsyo~AHF7>NQ?dez5yPJ`~$awyO2J3A9xt)hfjfzkOBBk zHIV|r4MUy=?nhkkJD^cbCK^H+MH!wCd`|@af5=0)4opWz;4aXDjKb%@X=Ds;i6rtw z#^Fam2QmTojw1RJ{s{gYT!}n}e+8~XCgHVFCZcmFQz${vL|5R`@DTV~WCmUis*zcE zHTVrO2VWOMbQw-e@<@0%!tnFpW<&!25xjv&;i0iaU2qwEBRn2?!h})}c^8qxZ-6bx zlknFxL{7K@o&eV%%jVC3Nyt<1F3^d1z%_CBTHv1WB=~m33*HWXgm}a6fp?In;k)9A z-kw15K{<$`MV7+{K`Y`5XWZmx;ePNa_;SP_z75=hJOkek?m`0KcF-ug65IX-P0*=$ diff --git a/samples/client/petstore/csharp/SwaggerClientTest/obj/Debug/SwaggerClientTest.dll b/samples/client/petstore/csharp/SwaggerClientTest/obj/Debug/SwaggerClientTest.dll index cb328f9bb0767ff59711234a803eedb72bf52baf..3e3230fe96b0ef4d060a947da417add0a8f6f663 100755 GIT binary patch delta 1935 zcmc)Le`r%z6bJBglV_83Ntd6G5}T=bga;D?H|GfGpQ)+1bNhwjr}nchRA+`vVT?>LstJ7?w9*#EbiQIlA3Kg*k60l z&pY?r^UizkCh1K~X^E5C)ajT-5S0*)bzzRf9JcY9+H$dlNaK+@3TH~BzG`$;3hGf= zF1A}!RX%N(Am{WJ5tV(S)EJ@*wq%zJqBHzV4>e->Is zUz{cKA0iUmYOVRK#UEd0=ZXz-XySUX#B!*CJ7x79Trj+csC48#FCFm9sR_N-iP%1D z@(a~|%5!zTh(;aUw~NR_{!tH4l#X1Jn~&7%PMgc_cMR8Xs*cLJ?iH@eq>W<@2g?j<=4D z4DH`D%FQU;%a85j+_tUs(jbwWbJgp&bv@1JgFJpm{*>%+bn>X2UvQ(@dhC+XJa&f1 zbc}{Vy>yeV=0^uH+MdqMy^YZhUMQ{%zNV?l-R6q)%a*v?Ehwfv*cRk-wj*xmPgGFj zUv#@I)XB3}YRTsxoarf=U5YFC;$B=lSTtS8NcT+e|9--ne|^Hj!pX?Ya`m+Kza_No z4_n;ge7{32*^8{8LaY|L-%+fpiD8vgjXXb7yR&e&hku5-+Z3Aqmm8R?&W+jQ>ve}! zePO)(OWVXcpbL6n0ES=%tb$E!8AWMtsh48Nw8D1S1-HOH*bfKc5Zp(b;(W`)7)-z< zJOL+R3QogQ@B(}v&cO`)7+!;4!W-}#_$|BzZ^J*>xR+c)y|)L}z?HBbHo+KdhOMw2 zJ_Ea89~^-D;9)oclkfzbgehg1rZG4LPs2341T*rZif z1Qw+Aa#Q?=0MQF{-`UX5oH;6fW9LG@vsXfzPV^b#1;mRXJ7?~OoNN}_3>Ev}V}_gK z8bkHT#dXL;j3DQmjWGKZX1k1)yLgZ*I!R4Sm-QNJINoWjTPpo$)4O=k0W{hR$6yxu zR}m+Spy``$w1{!pky$Y~u79ZZi2Iuk$K(3hxE+al(z U4&L&dJlPhR_mqe`A{DXy32mq&^#A|> delta 1451 zcmc&!T}TvB6h3#Hb$0#Pbbp53*;co7NhJS5O9M?SbX5e?d?+lG*hEYdH4MWvO#>5h zxq=TBXtGh%gE7?>+k;>d5gJAL6hed`_Rxb!50Q56omR!9x9Gxr_dDPD&Y3%h;dT#; z-9zHg?JOVw;lNj39C8;@7w(X+aRETYh^^2LHNN+0(M|%TOhvOk%(u%d<`ak-IVO-y zdV(YwR#}SW=>SPEpoy0Y^eKrqpcAk!gwuJFU}JB^<-tb)9Sn^F)N}w4*6V;;E?ByB zuQ69d>#w{~l98FyML48Y#Db+Y78^yhJfH(TDJF|_-i={0IMCCMo?<%FLrIBR+k2mo zcQmrEmXy-QK9_OD1kHC^Ujal!wyc@x&Avq9q?3J_xndST!exMF-1j<=SGKj(H`TRb zGq_a_kYq-!suEtF0f<2@p{T0(DDEFH9;6xlM+|J74*aN6wX^?`l9N4(G4w;dy#nUo z>hI_xk8ERFZjeU`emXjBmqg}FRO`kr2wgY{$imTYhX=W?VFBkFrg6T30u-VW2AY%U z+bN~%RRXMYCt53bv3FBCq|kD|?SG%p{nrzQ21lFyE_&Q=(QguVR)>P^hP!#_rwnXl zXAuc(<(d-GwJPSJi~gj4`U3Ub-8Q{*zibF&Ka3GFp&`NqjZg+A_{p)6c22}gxpFE@ zg%_&h6Anpt!+Os;L#G27U7xG~r(pvh+CQVxOBN8H*q0Ee?8}I=oX>NFwjiH;6kpIRVZ%c)k?~`_0Og& z{GheGQ3J;|j;mbn;JjOr)Q`{71mdN-;2x`24zdep;|fFWr3FEAZj&q2)Z&uIl#3K79+VVucpPFKpyF33$TYGbrznc9qEl9x;b>>dka0*J01I}#+|-PG_f||iB*f{mK&GfeIt3r%+wzz zToyfiIG`;0u@&~#1yd_LM_yQBOwt`aq}r(tSp1?g5Hr22<@BNIb(X~o8;=@%Yo2CF zc;*IaRKCVkQ`+WDrqpmD>8AP2GOm7ZLxetDJg%Gkk~~EtYvpG((%7DK+F^7XNu?rn zT53jY+InKYx7Ke=eI>(~n(_`FSsp7DGmj69)JIm$u6mxBB{@hAl{GRh?>Ca&a{ zx+ty`Ejpe0V-vNTu8KhYo2q&i>*j=sUHaX@M>5E{#kGZ0!|#CE|4b(Rl-VqzBa+lz znKYO=B%BeeCe?4HhOLcTy=SpIi*{y-tbe%Xe{b(8)vp z-@-8_8$=OB0BC%`1+Z}^#Lh3E&A zyC`#Gh<+!At delta 1645 zcmY+EeN5DK9LGPOyX!jRAp`=qqtsZXlU1`=9vqJcWPkX8E(%*K#id(ja3Xhba0ka7 zPj^Gkuey{*)`p=aGN73#Du}t2V#UK1YYW1Bh=&7tQXYFVI9j*8_j-m9$}Pu?!uQE%Ji<=94)ifL^Ek=H!Y_k#1@l(^u7 z@Z;Fmct92(4oC8J-Em79v{ic4Y%6ct7aWv* zJy*E6#)liqE8#@B!ASMlN^@&s5T!-_&j8!R8#Z**kns*cwOSMidR@7 zhBo*MAJq#YLKUo#db-lcqP2=t)ymaoWo}kQ67=DD$hV>L%v~Y zdu*Ud!_-1oNGs%`JNkLCIdXeIaW<7?+p?Dqmgdl*oHB7fGCiOohrY-;nX@!~W~AfB z6Cx(c7*J)T)5bH#rRiG}oi$a9j;P%$E}5v&blK#dB&TwjzRu+;kr=&4c>$#%moEZ~ zAD*NtkLh$CpAl`*2bC95F6D6};NHJCGhHxqgGh-6C+_x3_OrI0(toMxx;9?JbfegL@lpNp7&DdJy+AudDNi*l!k{|4N9 zPchS9#oQ}A;|~OlqKp;uIN;u0B}_vlJX|8m<5PpoHl}5V-;qt>^0b|2>~*yX zPK9Zcib#&!1?*rdau4niMsyo~AHF7>NQ?dez5yPJ`~$awyO2J3A9xt)hfjfzkOBBk zHIV|r4MUy=?nhkkJD^cbCK^H+MH!wCd`|@af5=0)4opWz;4aXDjKb%@X=Ds;i6rtw z#^Fam2QmTojw1RJ{s{gYT!}n}e+8~XCgHVFCZcmFQz${vL|5R`@DTV~WCmUis*zcE zHTVrO2VWOMbQw-e@<@0%!tnFpW<&!25xjv&;i0iaU2qwEBRn2?!h})}c^8qxZ-6bx zlknFxL{7K@o&eV%%jVC3Nyt<1F3^d1z%_CBTHv1WB=~m33*HWXgm}a6fp?In;k)9A z-kw15K{<$`MV7+{K`Y`5XWZmx;ePNa_;SP_z75=hJOkek?m`0KcF-ug65IX-P0*=$ From 3e213267aae43a4cfc3452de1469e0df00aa9289 Mon Sep 17 00:00:00 2001 From: wing328 Date: Sun, 29 Nov 2015 00:18:34 +0800 Subject: [PATCH 071/211] update java petstore sample --- .../java/io/swagger/client/ApiClient.java | 4 +- .../java/io/swagger/client/ApiException.java | 2 +- .../java/io/swagger/client/Configuration.java | 2 +- .../src/main/java/io/swagger/client/JSON.java | 2 +- .../src/main/java/io/swagger/client/Pair.java | 2 +- .../java/io/swagger/client/StringUtil.java | 2 +- .../main/java/io/swagger/client/TypeRef.java | 2 +- .../java/io/swagger/client/api/PetApi.java | 2 +- .../java/io/swagger/client/api/StoreApi.java | 2 +- .../java/io/swagger/client/api/UserApi.java | 2 +- .../io/swagger/client/auth/ApiKeyAuth.java | 2 +- .../swagger/client/auth/Authentication.java | 2 +- .../io/swagger/client/auth/HttpBasicAuth.java | 2 +- .../java/io/swagger/client/auth/OAuth.java | 2 +- .../io/swagger/client/model/Category.java | 4 +- .../java/io/swagger/client/model/Order.java | 6 +- .../java/io/swagger/client/model/Pet.java | 8 +- .../java/io/swagger/client/model/Tag.java | 4 +- .../java/io/swagger/client/model/User.java | 4 +- .../java/io/swagger/client/ApiClient.java | 4 +- .../java/io/swagger/client/ApiException.java | 2 +- .../java/io/swagger/client/Configuration.java | 2 +- .../src/main/java/io/swagger/client/JSON.java | 2 +- .../src/main/java/io/swagger/client/Pair.java | 2 +- .../java/io/swagger/client/StringUtil.java | 2 +- .../main/java/io/swagger/client/TypeRef.java | 2 +- .../java/io/swagger/client/api/PetApi.java | 2 +- .../java/io/swagger/client/api/StoreApi.java | 2 +- .../java/io/swagger/client/api/UserApi.java | 2 +- .../io/swagger/client/auth/ApiKeyAuth.java | 2 +- .../swagger/client/auth/Authentication.java | 2 +- .../io/swagger/client/auth/HttpBasicAuth.java | 2 +- .../java/io/swagger/client/auth/OAuth.java | 2 +- .../io/swagger/client/model/Category.java | 12 ++- .../java/io/swagger/client/model/Order.java | 14 +++- .../java/io/swagger/client/model/Pet.java | 16 ++-- .../java/io/swagger/client/model/Tag.java | 12 ++- .../java/io/swagger/client/model/User.java | 12 ++- .../java/io/swagger/client/ApiClient.java | 2 +- .../java/io/swagger/client/ApiException.java | 2 +- .../java/io/swagger/client/Configuration.java | 2 +- .../src/main/java/io/swagger/client/Pair.java | 2 +- .../java/io/swagger/client/StringUtil.java | 2 +- .../io/swagger/client/auth/ApiKeyAuth.java | 2 +- .../swagger/client/auth/Authentication.java | 2 +- .../java/io/swagger/client/auth/OAuth.java | 2 +- .../java/io/swagger/client/model/Pet.java | 2 +- .../java/io/swagger/client/ApiClient.java | 6 +- .../java/io/swagger/client/StringUtil.java | 2 +- .../java/io/swagger/client/api/PetApi.java | 69 ++++++++--------- .../java/io/swagger/client/api/StoreApi.java | 37 ++++----- .../java/io/swagger/client/api/UserApi.java | 69 ++++++++--------- .../java/io/swagger/client/auth/OAuth.java | 75 +++++++++++-------- .../java/io/swagger/client/model/Pet.java | 2 +- .../java/io/swagger/client/ApiClient.java | 6 +- .../java/io/swagger/client/StringUtil.java | 2 +- .../java/io/swagger/client/model/Pet.java | 2 +- 57 files changed, 243 insertions(+), 197 deletions(-) diff --git a/samples/client/petstore/java/default/src/main/java/io/swagger/client/ApiClient.java b/samples/client/petstore/java/default/src/main/java/io/swagger/client/ApiClient.java index bb8aaa7b990..f49054f111c 100644 --- a/samples/client/petstore/java/default/src/main/java/io/swagger/client/ApiClient.java +++ b/samples/client/petstore/java/default/src/main/java/io/swagger/client/ApiClient.java @@ -39,7 +39,7 @@ import io.swagger.client.auth.HttpBasicAuth; import io.swagger.client.auth.ApiKeyAuth; import io.swagger.client.auth.OAuth; -@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-11-07T15:05:10.376+08:00") +@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-11-29T00:18:25.953+08:00") public class ApiClient { private Map hostMap = new HashMap(); private Map defaultHeaderMap = new HashMap(); @@ -69,8 +69,8 @@ public class ApiClient { // Setup authentications (key: authentication name, value: authentication). authentications = new HashMap(); - authentications.put("petstore_auth", new OAuth()); authentications.put("api_key", new ApiKeyAuth("header", "api_key")); + authentications.put("petstore_auth", new OAuth()); // Prevent the authentications from being modified. authentications = Collections.unmodifiableMap(authentications); } diff --git a/samples/client/petstore/java/default/src/main/java/io/swagger/client/ApiException.java b/samples/client/petstore/java/default/src/main/java/io/swagger/client/ApiException.java index 4ed22daabcd..ceee6a36c45 100644 --- a/samples/client/petstore/java/default/src/main/java/io/swagger/client/ApiException.java +++ b/samples/client/petstore/java/default/src/main/java/io/swagger/client/ApiException.java @@ -3,7 +3,7 @@ package io.swagger.client; import java.util.Map; import java.util.List; -@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-10-30T16:36:47.681+08:00") +@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-11-29T00:18:25.953+08:00") public class ApiException extends Exception { private int code = 0; private Map> responseHeaders = null; diff --git a/samples/client/petstore/java/default/src/main/java/io/swagger/client/Configuration.java b/samples/client/petstore/java/default/src/main/java/io/swagger/client/Configuration.java index 8d0b098e28d..f39081c3f5d 100644 --- a/samples/client/petstore/java/default/src/main/java/io/swagger/client/Configuration.java +++ b/samples/client/petstore/java/default/src/main/java/io/swagger/client/Configuration.java @@ -1,6 +1,6 @@ package io.swagger.client; -@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-10-30T16:36:47.681+08:00") +@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-11-29T00:18:25.953+08:00") public class Configuration { private static ApiClient defaultApiClient = new ApiClient(); 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 180f9b8cc19..e26cf13bee5 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 @@ -8,7 +8,7 @@ import java.text.DateFormat; import java.io.IOException; -@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-11-07T15:05:10.376+08:00") +@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-11-29T00:18:25.953+08:00") public class JSON { private ObjectMapper mapper; diff --git a/samples/client/petstore/java/default/src/main/java/io/swagger/client/Pair.java b/samples/client/petstore/java/default/src/main/java/io/swagger/client/Pair.java index 58afaafb158..32d1b6cd6f4 100644 --- a/samples/client/petstore/java/default/src/main/java/io/swagger/client/Pair.java +++ b/samples/client/petstore/java/default/src/main/java/io/swagger/client/Pair.java @@ -1,6 +1,6 @@ package io.swagger.client; -@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-10-30T16:36:47.681+08:00") +@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-11-29T00:18:25.953+08:00") public class Pair { private String name = ""; private String value = ""; diff --git a/samples/client/petstore/java/default/src/main/java/io/swagger/client/StringUtil.java b/samples/client/petstore/java/default/src/main/java/io/swagger/client/StringUtil.java index e1536c68473..f21a48f2faa 100644 --- a/samples/client/petstore/java/default/src/main/java/io/swagger/client/StringUtil.java +++ b/samples/client/petstore/java/default/src/main/java/io/swagger/client/StringUtil.java @@ -1,6 +1,6 @@ package io.swagger.client; -@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-10-30T16:36:47.681+08:00") +@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-11-29T00:18:25.953+08:00") public class StringUtil { /** * Check if the given array contains the given value (with case-insensitive comparison). diff --git a/samples/client/petstore/java/default/src/main/java/io/swagger/client/TypeRef.java b/samples/client/petstore/java/default/src/main/java/io/swagger/client/TypeRef.java index b1ba48408db..41677e9d557 100644 --- a/samples/client/petstore/java/default/src/main/java/io/swagger/client/TypeRef.java +++ b/samples/client/petstore/java/default/src/main/java/io/swagger/client/TypeRef.java @@ -3,7 +3,7 @@ package io.swagger.client; import java.lang.reflect.ParameterizedType; import java.lang.reflect.Type; -@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-10-30T16:36:47.681+08:00") +@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-11-29T00:18:25.953+08:00") public class TypeRef { private final Type type; diff --git a/samples/client/petstore/java/default/src/main/java/io/swagger/client/api/PetApi.java b/samples/client/petstore/java/default/src/main/java/io/swagger/client/api/PetApi.java index 17e9a0e299e..080d4aa1dab 100644 --- a/samples/client/petstore/java/default/src/main/java/io/swagger/client/api/PetApi.java +++ b/samples/client/petstore/java/default/src/main/java/io/swagger/client/api/PetApi.java @@ -11,7 +11,7 @@ import java.io.File; import java.util.*; -@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-11-04T19:58:40.953+08:00") +@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-11-29T00:18:25.953+08:00") public class PetApi { private ApiClient apiClient; diff --git a/samples/client/petstore/java/default/src/main/java/io/swagger/client/api/StoreApi.java b/samples/client/petstore/java/default/src/main/java/io/swagger/client/api/StoreApi.java index a2f2900dd40..b7ce75e5532 100644 --- a/samples/client/petstore/java/default/src/main/java/io/swagger/client/api/StoreApi.java +++ b/samples/client/petstore/java/default/src/main/java/io/swagger/client/api/StoreApi.java @@ -11,7 +11,7 @@ import io.swagger.client.model.Order; import java.util.*; -@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-10-30T16:36:47.681+08:00") +@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-11-29T00:18:25.953+08:00") public class StoreApi { private ApiClient apiClient; diff --git a/samples/client/petstore/java/default/src/main/java/io/swagger/client/api/UserApi.java b/samples/client/petstore/java/default/src/main/java/io/swagger/client/api/UserApi.java index 9be6bbfa67f..9a4f4086d34 100644 --- a/samples/client/petstore/java/default/src/main/java/io/swagger/client/api/UserApi.java +++ b/samples/client/petstore/java/default/src/main/java/io/swagger/client/api/UserApi.java @@ -11,7 +11,7 @@ import java.util.*; import java.util.*; -@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-10-30T16:36:47.681+08:00") +@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-11-29T00:18:25.953+08:00") public class UserApi { private ApiClient apiClient; diff --git a/samples/client/petstore/java/default/src/main/java/io/swagger/client/auth/ApiKeyAuth.java b/samples/client/petstore/java/default/src/main/java/io/swagger/client/auth/ApiKeyAuth.java index 0011210c8cc..3cccbb7af1a 100644 --- a/samples/client/petstore/java/default/src/main/java/io/swagger/client/auth/ApiKeyAuth.java +++ b/samples/client/petstore/java/default/src/main/java/io/swagger/client/auth/ApiKeyAuth.java @@ -5,7 +5,7 @@ import io.swagger.client.Pair; import java.util.Map; import java.util.List; -@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-11-20T17:28:23.285+08:00") +@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-11-29T00:18:25.953+08:00") public class ApiKeyAuth implements Authentication { private final String location; private final String paramName; diff --git a/samples/client/petstore/java/default/src/main/java/io/swagger/client/auth/Authentication.java b/samples/client/petstore/java/default/src/main/java/io/swagger/client/auth/Authentication.java index d74fd356989..bf8dd752982 100644 --- a/samples/client/petstore/java/default/src/main/java/io/swagger/client/auth/Authentication.java +++ b/samples/client/petstore/java/default/src/main/java/io/swagger/client/auth/Authentication.java @@ -5,7 +5,7 @@ import io.swagger.client.Pair; import java.util.Map; import java.util.List; -@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-10-30T16:36:47.681+08:00") +@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-11-29T00:18:25.953+08:00") public interface Authentication { /** Apply authentication settings to header and query params. */ void applyToParams(List queryParams, Map headerParams); diff --git a/samples/client/petstore/java/default/src/main/java/io/swagger/client/auth/HttpBasicAuth.java b/samples/client/petstore/java/default/src/main/java/io/swagger/client/auth/HttpBasicAuth.java index 8c2aa444678..1a9280b8d7d 100644 --- a/samples/client/petstore/java/default/src/main/java/io/swagger/client/auth/HttpBasicAuth.java +++ b/samples/client/petstore/java/default/src/main/java/io/swagger/client/auth/HttpBasicAuth.java @@ -9,7 +9,7 @@ import java.util.List; import java.io.UnsupportedEncodingException; -@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-11-22T13:15:32.345+08:00") +@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-11-29T00:18:25.953+08:00") public class HttpBasicAuth implements Authentication { private String username; private String password; diff --git a/samples/client/petstore/java/default/src/main/java/io/swagger/client/auth/OAuth.java b/samples/client/petstore/java/default/src/main/java/io/swagger/client/auth/OAuth.java index 1ab313d67ca..a6e36a025a0 100644 --- a/samples/client/petstore/java/default/src/main/java/io/swagger/client/auth/OAuth.java +++ b/samples/client/petstore/java/default/src/main/java/io/swagger/client/auth/OAuth.java @@ -5,7 +5,7 @@ import io.swagger.client.Pair; import java.util.Map; import java.util.List; -@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-11-02T21:16:46.418+08:00") +@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-11-29T00:18:25.953+08:00") public class OAuth implements Authentication { private String accessToken; diff --git a/samples/client/petstore/java/default/src/main/java/io/swagger/client/model/Category.java b/samples/client/petstore/java/default/src/main/java/io/swagger/client/model/Category.java index 07bd79cd8a3..a57e6646dba 100644 --- a/samples/client/petstore/java/default/src/main/java/io/swagger/client/model/Category.java +++ b/samples/client/petstore/java/default/src/main/java/io/swagger/client/model/Category.java @@ -6,11 +6,11 @@ import io.swagger.client.StringUtil; import java.util.Objects; import io.swagger.annotations.*; -import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.*; @ApiModel(description = "") -@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-11-23T19:53:03.542+08:00") +@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-11-29T00:18:25.953+08:00") public class Category { private Long id = null; 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 8cbcad11dc5..61f1d56309c 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 @@ -7,11 +7,11 @@ import java.util.Date; import java.util.Objects; import io.swagger.annotations.*; -import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.*; @ApiModel(description = "") -@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-11-23T19:53:03.542+08:00") +@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-11-29T00:18:25.953+08:00") public class Order { private Long id = null; @@ -19,6 +19,7 @@ public class Order { private Integer quantity = null; private Date shipDate = null; + public enum StatusEnum { PLACED("placed"), APPROVED("approved"), @@ -31,6 +32,7 @@ public enum StatusEnum { } @Override + @JsonValue public String toString() { return value; } 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 ec78248b840..f57e68a48d1 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 @@ -2,18 +2,18 @@ package io.swagger.client.model; import io.swagger.client.StringUtil; import io.swagger.client.model.Category; -import java.util.*; import io.swagger.client.model.Tag; +import java.util.*; import java.util.Objects; import io.swagger.annotations.*; -import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.*; @ApiModel(description = "") -@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-11-23T19:53:03.542+08:00") +@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-11-29T00:18:25.953+08:00") public class Pet { private Long id = null; @@ -22,6 +22,7 @@ public class Pet { private List photoUrls = new ArrayList(); private List tags = new ArrayList(); + public enum StatusEnum { AVAILABLE("available"), PENDING("pending"), @@ -34,6 +35,7 @@ public enum StatusEnum { } @Override + @JsonValue public String toString() { return value; } diff --git a/samples/client/petstore/java/default/src/main/java/io/swagger/client/model/Tag.java b/samples/client/petstore/java/default/src/main/java/io/swagger/client/model/Tag.java index 3c2278b5e4f..a09cda034eb 100644 --- a/samples/client/petstore/java/default/src/main/java/io/swagger/client/model/Tag.java +++ b/samples/client/petstore/java/default/src/main/java/io/swagger/client/model/Tag.java @@ -6,11 +6,11 @@ import io.swagger.client.StringUtil; import java.util.Objects; import io.swagger.annotations.*; -import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.*; @ApiModel(description = "") -@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-11-23T19:53:03.542+08:00") +@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-11-29T00:18:25.953+08:00") public class Tag { private Long id = null; diff --git a/samples/client/petstore/java/default/src/main/java/io/swagger/client/model/User.java b/samples/client/petstore/java/default/src/main/java/io/swagger/client/model/User.java index ec20b37c378..ca5ece25bf9 100644 --- a/samples/client/petstore/java/default/src/main/java/io/swagger/client/model/User.java +++ b/samples/client/petstore/java/default/src/main/java/io/swagger/client/model/User.java @@ -6,11 +6,11 @@ import io.swagger.client.StringUtil; import java.util.Objects; import io.swagger.annotations.*; -import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.*; @ApiModel(description = "") -@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-11-23T19:53:03.542+08:00") +@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-11-29T00:18:25.953+08:00") public class User { private Long id = null; diff --git a/samples/client/petstore/java/jersey2/src/main/java/io/swagger/client/ApiClient.java b/samples/client/petstore/java/jersey2/src/main/java/io/swagger/client/ApiClient.java index c74c6e6ba29..decd81267c5 100644 --- a/samples/client/petstore/java/jersey2/src/main/java/io/swagger/client/ApiClient.java +++ b/samples/client/petstore/java/jersey2/src/main/java/io/swagger/client/ApiClient.java @@ -43,7 +43,7 @@ import io.swagger.client.auth.HttpBasicAuth; import io.swagger.client.auth.ApiKeyAuth; import io.swagger.client.auth.OAuth; -@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-11-17T11:17:50.535-05:00") +@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-11-29T00:18:01.946+08:00") public class ApiClient { private Client client; private Map hostMap = new HashMap(); @@ -76,8 +76,8 @@ public class ApiClient { // Setup authentications (key: authentication name, value: authentication). authentications = new HashMap(); - authentications.put("petstore_auth", new OAuth()); authentications.put("api_key", new ApiKeyAuth("header", "api_key")); + authentications.put("petstore_auth", new OAuth()); // Prevent the authentications from being modified. authentications = Collections.unmodifiableMap(authentications); } diff --git a/samples/client/petstore/java/jersey2/src/main/java/io/swagger/client/ApiException.java b/samples/client/petstore/java/jersey2/src/main/java/io/swagger/client/ApiException.java index 80bf3d260ca..0e36184742a 100644 --- a/samples/client/petstore/java/jersey2/src/main/java/io/swagger/client/ApiException.java +++ b/samples/client/petstore/java/jersey2/src/main/java/io/swagger/client/ApiException.java @@ -3,7 +3,7 @@ package io.swagger.client; import java.util.Map; import java.util.List; -@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-11-17T11:17:50.535-05:00") +@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-11-29T00:18:01.946+08:00") public class ApiException extends Exception { private int code = 0; private Map> responseHeaders = null; diff --git a/samples/client/petstore/java/jersey2/src/main/java/io/swagger/client/Configuration.java b/samples/client/petstore/java/jersey2/src/main/java/io/swagger/client/Configuration.java index 82b8e0459bc..2967d84c190 100644 --- a/samples/client/petstore/java/jersey2/src/main/java/io/swagger/client/Configuration.java +++ b/samples/client/petstore/java/jersey2/src/main/java/io/swagger/client/Configuration.java @@ -1,6 +1,6 @@ package io.swagger.client; -@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-11-17T11:17:50.535-05:00") +@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-11-29T00:18:01.946+08:00") public class Configuration { private static ApiClient defaultApiClient = new ApiClient(); 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 a05975c0e59..9116d366308 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 @@ -8,7 +8,7 @@ import java.text.DateFormat; import java.io.IOException; -@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-11-17T11:17:50.535-05:00") +@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-11-29T00:18:01.946+08:00") public class JSON { private ObjectMapper mapper; diff --git a/samples/client/petstore/java/jersey2/src/main/java/io/swagger/client/Pair.java b/samples/client/petstore/java/jersey2/src/main/java/io/swagger/client/Pair.java index aae34092fc2..995677baaf5 100644 --- a/samples/client/petstore/java/jersey2/src/main/java/io/swagger/client/Pair.java +++ b/samples/client/petstore/java/jersey2/src/main/java/io/swagger/client/Pair.java @@ -1,6 +1,6 @@ package io.swagger.client; -@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-11-17T11:17:50.535-05:00") +@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-11-29T00:18:01.946+08:00") public class Pair { private String name = ""; private String value = ""; diff --git a/samples/client/petstore/java/jersey2/src/main/java/io/swagger/client/StringUtil.java b/samples/client/petstore/java/jersey2/src/main/java/io/swagger/client/StringUtil.java index 02e52457fef..e9cc1341e04 100644 --- a/samples/client/petstore/java/jersey2/src/main/java/io/swagger/client/StringUtil.java +++ b/samples/client/petstore/java/jersey2/src/main/java/io/swagger/client/StringUtil.java @@ -1,6 +1,6 @@ package io.swagger.client; -@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-11-17T11:17:50.535-05:00") +@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-11-29T00:18:01.946+08:00") public class StringUtil { /** * Check if the given array contains the given value (with case-insensitive comparison). diff --git a/samples/client/petstore/java/jersey2/src/main/java/io/swagger/client/TypeRef.java b/samples/client/petstore/java/jersey2/src/main/java/io/swagger/client/TypeRef.java index 0452e40e0c4..9c97f34cd79 100644 --- a/samples/client/petstore/java/jersey2/src/main/java/io/swagger/client/TypeRef.java +++ b/samples/client/petstore/java/jersey2/src/main/java/io/swagger/client/TypeRef.java @@ -3,7 +3,7 @@ package io.swagger.client; import java.lang.reflect.ParameterizedType; import java.lang.reflect.Type; -@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-11-17T11:17:50.535-05:00") +@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-11-29T00:18:01.946+08:00") public class TypeRef { private final Type type; diff --git a/samples/client/petstore/java/jersey2/src/main/java/io/swagger/client/api/PetApi.java b/samples/client/petstore/java/jersey2/src/main/java/io/swagger/client/api/PetApi.java index 10134d4f3ea..a645de12c71 100644 --- a/samples/client/petstore/java/jersey2/src/main/java/io/swagger/client/api/PetApi.java +++ b/samples/client/petstore/java/jersey2/src/main/java/io/swagger/client/api/PetApi.java @@ -11,7 +11,7 @@ import java.io.File; import java.util.*; -@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-11-17T11:17:50.535-05:00") +@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-11-29T00:18:01.946+08:00") public class PetApi { private ApiClient apiClient; diff --git a/samples/client/petstore/java/jersey2/src/main/java/io/swagger/client/api/StoreApi.java b/samples/client/petstore/java/jersey2/src/main/java/io/swagger/client/api/StoreApi.java index d7e30dd2b0e..7253d1909b6 100644 --- a/samples/client/petstore/java/jersey2/src/main/java/io/swagger/client/api/StoreApi.java +++ b/samples/client/petstore/java/jersey2/src/main/java/io/swagger/client/api/StoreApi.java @@ -11,7 +11,7 @@ import io.swagger.client.model.Order; import java.util.*; -@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-11-17T11:17:50.535-05:00") +@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-11-29T00:18:01.946+08:00") public class StoreApi { private ApiClient apiClient; diff --git a/samples/client/petstore/java/jersey2/src/main/java/io/swagger/client/api/UserApi.java b/samples/client/petstore/java/jersey2/src/main/java/io/swagger/client/api/UserApi.java index db04594b56b..d6115d939fc 100644 --- a/samples/client/petstore/java/jersey2/src/main/java/io/swagger/client/api/UserApi.java +++ b/samples/client/petstore/java/jersey2/src/main/java/io/swagger/client/api/UserApi.java @@ -11,7 +11,7 @@ import java.util.*; import java.util.*; -@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-11-17T11:17:50.535-05:00") +@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-11-29T00:18:01.946+08:00") public class UserApi { private ApiClient apiClient; diff --git a/samples/client/petstore/java/jersey2/src/main/java/io/swagger/client/auth/ApiKeyAuth.java b/samples/client/petstore/java/jersey2/src/main/java/io/swagger/client/auth/ApiKeyAuth.java index bc3bdaefc44..098f4d0963a 100644 --- a/samples/client/petstore/java/jersey2/src/main/java/io/swagger/client/auth/ApiKeyAuth.java +++ b/samples/client/petstore/java/jersey2/src/main/java/io/swagger/client/auth/ApiKeyAuth.java @@ -5,7 +5,7 @@ import io.swagger.client.Pair; import java.util.Map; import java.util.List; -@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-11-20T17:28:47.318+08:00") +@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-11-29T00:18:01.946+08:00") public class ApiKeyAuth implements Authentication { private final String location; private final String paramName; diff --git a/samples/client/petstore/java/jersey2/src/main/java/io/swagger/client/auth/Authentication.java b/samples/client/petstore/java/jersey2/src/main/java/io/swagger/client/auth/Authentication.java index 0861802a7d3..939e4d10db7 100644 --- a/samples/client/petstore/java/jersey2/src/main/java/io/swagger/client/auth/Authentication.java +++ b/samples/client/petstore/java/jersey2/src/main/java/io/swagger/client/auth/Authentication.java @@ -5,7 +5,7 @@ import io.swagger.client.Pair; import java.util.Map; import java.util.List; -@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-11-17T11:17:50.535-05:00") +@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-11-29T00:18:01.946+08:00") public interface Authentication { /** Apply authentication settings to header and query params. */ void applyToParams(List queryParams, Map headerParams); diff --git a/samples/client/petstore/java/jersey2/src/main/java/io/swagger/client/auth/HttpBasicAuth.java b/samples/client/petstore/java/jersey2/src/main/java/io/swagger/client/auth/HttpBasicAuth.java index 071139d656a..5dff96d1f37 100644 --- a/samples/client/petstore/java/jersey2/src/main/java/io/swagger/client/auth/HttpBasicAuth.java +++ b/samples/client/petstore/java/jersey2/src/main/java/io/swagger/client/auth/HttpBasicAuth.java @@ -9,7 +9,7 @@ import java.util.List; import java.io.UnsupportedEncodingException; -@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-11-22T13:15:27.225+08:00") +@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-11-29T00:18:01.946+08:00") public class HttpBasicAuth implements Authentication { private String username; private String password; diff --git a/samples/client/petstore/java/jersey2/src/main/java/io/swagger/client/auth/OAuth.java b/samples/client/petstore/java/jersey2/src/main/java/io/swagger/client/auth/OAuth.java index 144d4c9681f..b7d6be76237 100644 --- a/samples/client/petstore/java/jersey2/src/main/java/io/swagger/client/auth/OAuth.java +++ b/samples/client/petstore/java/jersey2/src/main/java/io/swagger/client/auth/OAuth.java @@ -5,7 +5,7 @@ import io.swagger.client.Pair; import java.util.Map; import java.util.List; -@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-11-17T11:17:50.535-05:00") +@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-11-29T00:18:01.946+08:00") public class OAuth implements Authentication { private String accessToken; diff --git a/samples/client/petstore/java/jersey2/src/main/java/io/swagger/client/model/Category.java b/samples/client/petstore/java/jersey2/src/main/java/io/swagger/client/model/Category.java index 46ecec0daf5..abe1bb895d3 100644 --- a/samples/client/petstore/java/jersey2/src/main/java/io/swagger/client/model/Category.java +++ b/samples/client/petstore/java/jersey2/src/main/java/io/swagger/client/model/Category.java @@ -6,11 +6,11 @@ import io.swagger.client.StringUtil; import java.util.Objects; import io.swagger.annotations.*; -import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.*; @ApiModel(description = "") -@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-11-23T15:52:25.446+08:00") +@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-11-29T00:18:01.946+08:00") public class Category { private Long id = null; @@ -44,8 +44,12 @@ public class Category { @Override public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } Category category = (Category) o; return Objects.equals(id, category.id) && Objects.equals(name, category.name); 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 9570fe22827..6c90b3eca40 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 @@ -7,11 +7,11 @@ import java.util.Date; import java.util.Objects; import io.swagger.annotations.*; -import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.*; @ApiModel(description = "") -@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-11-23T15:52:25.446+08:00") +@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-11-29T00:18:01.946+08:00") public class Order { private Long id = null; @@ -19,6 +19,7 @@ public class Order { private Integer quantity = null; private Date shipDate = null; + public enum StatusEnum { PLACED("placed"), APPROVED("approved"), @@ -31,6 +32,7 @@ public enum StatusEnum { } @Override + @JsonValue public String toString() { return value; } @@ -116,8 +118,12 @@ public enum StatusEnum { @Override public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } Order order = (Order) o; return Objects.equals(id, order.id) && Objects.equals(petId, order.petId) && 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 a066ee8b251..28343f0fc44 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 @@ -2,18 +2,18 @@ package io.swagger.client.model; import io.swagger.client.StringUtil; import io.swagger.client.model.Category; -import java.util.*; import io.swagger.client.model.Tag; +import java.util.*; import java.util.Objects; import io.swagger.annotations.*; -import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.*; @ApiModel(description = "") -@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-11-23T15:52:25.446+08:00") +@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-11-29T00:18:01.946+08:00") public class Pet { private Long id = null; @@ -22,6 +22,7 @@ public class Pet { private List photoUrls = new ArrayList(); private List tags = new ArrayList(); + public enum StatusEnum { AVAILABLE("available"), PENDING("pending"), @@ -34,6 +35,7 @@ public enum StatusEnum { } @Override + @JsonValue public String toString() { return value; } @@ -118,8 +120,12 @@ public enum StatusEnum { @Override public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } Pet pet = (Pet) o; return Objects.equals(id, pet.id) && Objects.equals(category, pet.category) && diff --git a/samples/client/petstore/java/jersey2/src/main/java/io/swagger/client/model/Tag.java b/samples/client/petstore/java/jersey2/src/main/java/io/swagger/client/model/Tag.java index 2d64dbe4351..a7ee39070c8 100644 --- a/samples/client/petstore/java/jersey2/src/main/java/io/swagger/client/model/Tag.java +++ b/samples/client/petstore/java/jersey2/src/main/java/io/swagger/client/model/Tag.java @@ -6,11 +6,11 @@ import io.swagger.client.StringUtil; import java.util.Objects; import io.swagger.annotations.*; -import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.*; @ApiModel(description = "") -@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-11-23T15:52:25.446+08:00") +@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-11-29T00:18:01.946+08:00") public class Tag { private Long id = null; @@ -44,8 +44,12 @@ public class Tag { @Override public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } Tag tag = (Tag) o; return Objects.equals(id, tag.id) && Objects.equals(name, tag.name); diff --git a/samples/client/petstore/java/jersey2/src/main/java/io/swagger/client/model/User.java b/samples/client/petstore/java/jersey2/src/main/java/io/swagger/client/model/User.java index 8712e66e386..5bfea7707f4 100644 --- a/samples/client/petstore/java/jersey2/src/main/java/io/swagger/client/model/User.java +++ b/samples/client/petstore/java/jersey2/src/main/java/io/swagger/client/model/User.java @@ -6,11 +6,11 @@ import io.swagger.client.StringUtil; import java.util.Objects; import io.swagger.annotations.*; -import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.*; @ApiModel(description = "") -@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-11-23T15:52:25.446+08:00") +@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-11-29T00:18:01.946+08:00") public class User { private Long id = null; @@ -123,8 +123,12 @@ public class User { @Override public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } User user = (User) o; return Objects.equals(id, user.id) && Objects.equals(username, user.username) && 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 7810e567548..8d38c18e907 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 @@ -143,8 +143,8 @@ public class ApiClient { // Setup authentications (key: authentication name, value: authentication). authentications = new HashMap(); - authentications.put("petstore_auth", new OAuth()); authentications.put("api_key", new ApiKeyAuth("header", "api_key")); + authentications.put("petstore_auth", new OAuth()); // Prevent the authentications from being modified. authentications = Collections.unmodifiableMap(authentications); } diff --git a/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/ApiException.java b/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/ApiException.java index 157b37036f3..46b52990f44 100644 --- a/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/ApiException.java +++ b/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/ApiException.java @@ -3,7 +3,7 @@ package io.swagger.client; import java.util.Map; import java.util.List; -@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-11-25T15:16:28.364+08:00") +@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-11-29T00:18:08.052+08:00") public class ApiException extends Exception { private int code = 0; private Map> responseHeaders = null; diff --git a/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/Configuration.java b/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/Configuration.java index 473891b1177..b99c939af83 100644 --- a/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/Configuration.java +++ b/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/Configuration.java @@ -1,6 +1,6 @@ package io.swagger.client; -@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-11-25T15:16:28.364+08:00") +@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-11-29T00:18:08.052+08:00") public class Configuration { private static ApiClient defaultApiClient = new ApiClient(); diff --git a/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/Pair.java b/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/Pair.java index 83b0fc79f8c..98f5f92e0a4 100644 --- a/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/Pair.java +++ b/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/Pair.java @@ -1,6 +1,6 @@ package io.swagger.client; -@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-11-25T15:16:28.364+08:00") +@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-11-29T00:18:08.052+08:00") public class Pair { private String name = ""; private String value = ""; diff --git a/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/StringUtil.java b/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/StringUtil.java index c77fd0a42ed..702b8cf350c 100644 --- a/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/StringUtil.java +++ b/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/StringUtil.java @@ -1,6 +1,6 @@ package io.swagger.client; -@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-11-25T15:16:28.364+08:00") +@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-11-29T00:18:08.052+08:00") public class StringUtil { /** * Check if the given array contains the given value (with case-insensitive comparison). diff --git a/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/auth/ApiKeyAuth.java b/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/auth/ApiKeyAuth.java index 5f85066b2a9..2110aff20d8 100644 --- a/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/auth/ApiKeyAuth.java +++ b/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/auth/ApiKeyAuth.java @@ -5,7 +5,7 @@ import io.swagger.client.Pair; import java.util.Map; import java.util.List; -@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-11-25T15:16:28.364+08:00") +@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-11-29T00:18:08.052+08:00") public class ApiKeyAuth implements Authentication { private final String location; private final String paramName; diff --git a/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/auth/Authentication.java b/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/auth/Authentication.java index f9cc5d1cdd7..f00217c451e 100644 --- a/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/auth/Authentication.java +++ b/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/auth/Authentication.java @@ -5,7 +5,7 @@ import io.swagger.client.Pair; import java.util.Map; import java.util.List; -@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-11-25T15:16:28.364+08:00") +@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-11-29T00:18:08.052+08:00") public interface Authentication { /** Apply authentication settings to header and query params. */ void applyToParams(List queryParams, Map headerParams); diff --git a/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/auth/OAuth.java b/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/auth/OAuth.java index dd1946c0200..b750aaa2360 100644 --- a/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/auth/OAuth.java +++ b/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/auth/OAuth.java @@ -5,7 +5,7 @@ import io.swagger.client.Pair; import java.util.Map; import java.util.List; -@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-11-25T15:16:28.364+08:00") +@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-11-29T00:18:08.052+08:00") public class OAuth implements Authentication { private String accessToken; diff --git a/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/model/Pet.java b/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/model/Pet.java index 7e771866b39..bc3b80370b0 100644 --- a/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/model/Pet.java +++ b/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/model/Pet.java @@ -2,8 +2,8 @@ package io.swagger.client.model; import io.swagger.client.StringUtil; import io.swagger.client.model.Category; -import java.util.*; import io.swagger.client.model.Tag; +import java.util.*; import com.google.gson.annotations.SerializedName; diff --git a/samples/client/petstore/java/retrofit/src/main/java/io/swagger/client/ApiClient.java b/samples/client/petstore/java/retrofit/src/main/java/io/swagger/client/ApiClient.java index 6540997c319..ed1ff85acab 100644 --- a/samples/client/petstore/java/retrofit/src/main/java/io/swagger/client/ApiClient.java +++ b/samples/client/petstore/java/retrofit/src/main/java/io/swagger/client/ApiClient.java @@ -47,10 +47,10 @@ public class ApiClient { this(); for(String authName : authNames) { Interceptor auth; - if (authName == "petstore_auth") { - auth = new OAuth(OAuthFlow.implicit, "http://petstore.swagger.io/api/oauth/dialog", "", "write:pets, read:pets"); - } else if (authName == "api_key") { + if (authName == "api_key") { auth = new ApiKeyAuth("header", "api_key"); + } else if (authName == "petstore_auth") { + auth = new OAuth(OAuthFlow.implicit, "http://petstore.swagger.io/api/oauth/dialog", "", "write:pets, read:pets"); } else { throw new RuntimeException("auth name \"" + authName + "\" not found in available auth names"); } diff --git a/samples/client/petstore/java/retrofit/src/main/java/io/swagger/client/StringUtil.java b/samples/client/petstore/java/retrofit/src/main/java/io/swagger/client/StringUtil.java index 2f6d6fed42c..fa3abdc9c78 100644 --- a/samples/client/petstore/java/retrofit/src/main/java/io/swagger/client/StringUtil.java +++ b/samples/client/petstore/java/retrofit/src/main/java/io/swagger/client/StringUtil.java @@ -1,6 +1,6 @@ package io.swagger.client; -@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-10-20T11:42:31.307-07:00") +@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-11-29T00:18:14.988+08:00") public class StringUtil { /** * Check if the given array contains the given value (with case-insensitive comparison). diff --git a/samples/client/petstore/java/retrofit/src/main/java/io/swagger/client/api/PetApi.java b/samples/client/petstore/java/retrofit/src/main/java/io/swagger/client/api/PetApi.java index cd4dbe866a5..1746009aa77 100644 --- a/samples/client/petstore/java/retrofit/src/main/java/io/swagger/client/api/PetApi.java +++ b/samples/client/petstore/java/retrofit/src/main/java/io/swagger/client/api/PetApi.java @@ -1,15 +1,16 @@ package io.swagger.client.api; -import io.swagger.client.model.*; +import io.swagger.client.CollectionFormats.*; import retrofit.Callback; import retrofit.http.*; import retrofit.mime.*; -import java.util.*; import io.swagger.client.model.Pet; import java.io.File; +import java.util.*; + public interface PetApi { /** @@ -20,7 +21,7 @@ public interface PetApi { * @return Void */ - @PUT("/pet") + @PUT("/pet") Void updatePet( @Body Pet body ); @@ -29,14 +30,14 @@ public interface PetApi { * Update an existing pet * Async method * @param body Pet object that needs to be added to the store - * @param cb callback method + * @param cb callback method * @return void */ - @PUT("/pet") + @PUT("/pet") void updatePet( @Body Pet body, Callback cb - ); + ); /** * Add a new pet to the store @@ -46,7 +47,7 @@ public interface PetApi { * @return Void */ - @POST("/pet") + @POST("/pet") Void addPet( @Body Pet body ); @@ -55,14 +56,14 @@ public interface PetApi { * Add a new pet to the store * Async method * @param body Pet object that needs to be added to the store - * @param cb callback method + * @param cb callback method * @return void */ - @POST("/pet") + @POST("/pet") void addPet( @Body Pet body, Callback cb - ); + ); /** * Finds Pets by status @@ -72,7 +73,7 @@ public interface PetApi { * @return List */ - @GET("/pet/findByStatus") + @GET("/pet/findByStatus") List findPetsByStatus( @Query("status") List status ); @@ -81,14 +82,14 @@ public interface PetApi { * Finds Pets by status * Async method * @param status Status values that need to be considered for filter - * @param cb callback method + * @param cb callback method * @return void */ - @GET("/pet/findByStatus") + @GET("/pet/findByStatus") void findPetsByStatus( @Query("status") List status, Callback> cb - ); + ); /** * Finds Pets by tags @@ -98,7 +99,7 @@ public interface PetApi { * @return List */ - @GET("/pet/findByTags") + @GET("/pet/findByTags") List findPetsByTags( @Query("tags") List tags ); @@ -107,14 +108,14 @@ public interface PetApi { * Finds Pets by tags * Async method * @param tags Tags to filter by - * @param cb callback method + * @param cb callback method * @return void */ - @GET("/pet/findByTags") + @GET("/pet/findByTags") void findPetsByTags( @Query("tags") List tags, Callback> cb - ); + ); /** * Find pet by ID @@ -124,7 +125,7 @@ public interface PetApi { * @return Pet */ - @GET("/pet/{petId}") + @GET("/pet/{petId}") Pet getPetById( @Path("petId") Long petId ); @@ -133,14 +134,14 @@ public interface PetApi { * Find pet by ID * Async method * @param petId ID of pet that needs to be fetched - * @param cb callback method + * @param cb callback method * @return void */ - @GET("/pet/{petId}") + @GET("/pet/{petId}") void getPetById( @Path("petId") Long petId, Callback cb - ); + ); /** * Updates a pet in the store with form data @@ -153,7 +154,7 @@ public interface PetApi { */ @FormUrlEncoded - @POST("/pet/{petId}") + @POST("/pet/{petId}") Void updatePetWithForm( @Path("petId") String petId, @Field("name") String name, @Field("status") String status ); @@ -164,15 +165,15 @@ public interface PetApi { * @param petId ID of pet that needs to be updated * @param name Updated name of the pet * @param status Updated status of the pet - * @param cb callback method + * @param cb callback method * @return void */ @FormUrlEncoded - @POST("/pet/{petId}") + @POST("/pet/{petId}") void updatePetWithForm( @Path("petId") String petId, @Field("name") String name, @Field("status") String status, Callback cb - ); + ); /** * Deletes a pet @@ -183,7 +184,7 @@ public interface PetApi { * @return Void */ - @DELETE("/pet/{petId}") + @DELETE("/pet/{petId}") Void deletePet( @Path("petId") Long petId, @Header("api_key") String apiKey ); @@ -193,14 +194,14 @@ public interface PetApi { * Async method * @param petId Pet id to delete * @param apiKey - * @param cb callback method + * @param cb callback method * @return void */ - @DELETE("/pet/{petId}") + @DELETE("/pet/{petId}") void deletePet( @Path("petId") Long petId, @Header("api_key") String apiKey, Callback cb - ); + ); /** * uploads an image @@ -213,7 +214,7 @@ public interface PetApi { */ @Multipart - @POST("/pet/{petId}/uploadImage") + @POST("/pet/{petId}/uploadImage") Void uploadFile( @Path("petId") Long petId, @Part("additionalMetadata") String additionalMetadata, @Part("file") TypedFile file ); @@ -224,14 +225,14 @@ public interface PetApi { * @param petId ID of pet to update * @param additionalMetadata Additional data to pass to server * @param file file to upload - * @param cb callback method + * @param cb callback method * @return void */ @Multipart - @POST("/pet/{petId}/uploadImage") + @POST("/pet/{petId}/uploadImage") void uploadFile( @Path("petId") Long petId, @Part("additionalMetadata") String additionalMetadata, @Part("file") TypedFile file, Callback cb - ); + ); } diff --git a/samples/client/petstore/java/retrofit/src/main/java/io/swagger/client/api/StoreApi.java b/samples/client/petstore/java/retrofit/src/main/java/io/swagger/client/api/StoreApi.java index 1c0a8291d02..4d6d3aa7c00 100644 --- a/samples/client/petstore/java/retrofit/src/main/java/io/swagger/client/api/StoreApi.java +++ b/samples/client/petstore/java/retrofit/src/main/java/io/swagger/client/api/StoreApi.java @@ -1,15 +1,16 @@ package io.swagger.client.api; -import io.swagger.client.model.*; +import io.swagger.client.CollectionFormats.*; import retrofit.Callback; import retrofit.http.*; import retrofit.mime.*; -import java.util.*; import java.util.Map; import io.swagger.client.model.Order; +import java.util.*; + public interface StoreApi { /** @@ -19,21 +20,21 @@ public interface StoreApi { * @return Map */ - @GET("/store/inventory") + @GET("/store/inventory") Map getInventory(); /** * Returns pet inventories by status * Async method - * @param cb callback method + * @param cb callback method * @return void */ - @GET("/store/inventory") + @GET("/store/inventory") void getInventory( Callback> cb - ); + ); /** * Place an order for a pet @@ -43,7 +44,7 @@ public interface StoreApi { * @return Order */ - @POST("/store/order") + @POST("/store/order") Order placeOrder( @Body Order body ); @@ -52,14 +53,14 @@ public interface StoreApi { * Place an order for a pet * Async method * @param body order placed for purchasing the pet - * @param cb callback method + * @param cb callback method * @return void */ - @POST("/store/order") + @POST("/store/order") void placeOrder( @Body Order body, Callback cb - ); + ); /** * Find purchase order by ID @@ -69,7 +70,7 @@ public interface StoreApi { * @return Order */ - @GET("/store/order/{orderId}") + @GET("/store/order/{orderId}") Order getOrderById( @Path("orderId") String orderId ); @@ -78,14 +79,14 @@ public interface StoreApi { * Find purchase order by ID * Async method * @param orderId ID of pet that needs to be fetched - * @param cb callback method + * @param cb callback method * @return void */ - @GET("/store/order/{orderId}") + @GET("/store/order/{orderId}") void getOrderById( @Path("orderId") String orderId, Callback cb - ); + ); /** * Delete purchase order by ID @@ -95,7 +96,7 @@ public interface StoreApi { * @return Void */ - @DELETE("/store/order/{orderId}") + @DELETE("/store/order/{orderId}") Void deleteOrder( @Path("orderId") String orderId ); @@ -104,13 +105,13 @@ public interface StoreApi { * Delete purchase order by ID * Async method * @param orderId ID of the order that needs to be deleted - * @param cb callback method + * @param cb callback method * @return void */ - @DELETE("/store/order/{orderId}") + @DELETE("/store/order/{orderId}") void deleteOrder( @Path("orderId") String orderId, Callback cb - ); + ); } diff --git a/samples/client/petstore/java/retrofit/src/main/java/io/swagger/client/api/UserApi.java b/samples/client/petstore/java/retrofit/src/main/java/io/swagger/client/api/UserApi.java index 162222bc0f1..ff4b4562977 100644 --- a/samples/client/petstore/java/retrofit/src/main/java/io/swagger/client/api/UserApi.java +++ b/samples/client/petstore/java/retrofit/src/main/java/io/swagger/client/api/UserApi.java @@ -1,15 +1,16 @@ package io.swagger.client.api; -import io.swagger.client.model.*; +import io.swagger.client.CollectionFormats.*; import retrofit.Callback; import retrofit.http.*; import retrofit.mime.*; -import java.util.*; import io.swagger.client.model.User; import java.util.*; +import java.util.*; + public interface UserApi { /** @@ -20,7 +21,7 @@ public interface UserApi { * @return Void */ - @POST("/user") + @POST("/user") Void createUser( @Body User body ); @@ -29,14 +30,14 @@ public interface UserApi { * Create user * Async method * @param body Created user object - * @param cb callback method + * @param cb callback method * @return void */ - @POST("/user") + @POST("/user") void createUser( @Body User body, Callback cb - ); + ); /** * Creates list of users with given input array @@ -46,7 +47,7 @@ public interface UserApi { * @return Void */ - @POST("/user/createWithArray") + @POST("/user/createWithArray") Void createUsersWithArrayInput( @Body List body ); @@ -55,14 +56,14 @@ public interface UserApi { * Creates list of users with given input array * Async method * @param body List of user object - * @param cb callback method + * @param cb callback method * @return void */ - @POST("/user/createWithArray") + @POST("/user/createWithArray") void createUsersWithArrayInput( @Body List body, Callback cb - ); + ); /** * Creates list of users with given input array @@ -72,7 +73,7 @@ public interface UserApi { * @return Void */ - @POST("/user/createWithList") + @POST("/user/createWithList") Void createUsersWithListInput( @Body List body ); @@ -81,14 +82,14 @@ public interface UserApi { * Creates list of users with given input array * Async method * @param body List of user object - * @param cb callback method + * @param cb callback method * @return void */ - @POST("/user/createWithList") + @POST("/user/createWithList") void createUsersWithListInput( @Body List body, Callback cb - ); + ); /** * Logs user into the system @@ -99,7 +100,7 @@ public interface UserApi { * @return String */ - @GET("/user/login") + @GET("/user/login") String loginUser( @Query("username") String username, @Query("password") String password ); @@ -109,14 +110,14 @@ public interface UserApi { * Async method * @param username The user name for login * @param password The password for login in clear text - * @param cb callback method + * @param cb callback method * @return void */ - @GET("/user/login") + @GET("/user/login") void loginUser( @Query("username") String username, @Query("password") String password, Callback cb - ); + ); /** * Logs out current logged in user session @@ -125,21 +126,21 @@ public interface UserApi { * @return Void */ - @GET("/user/logout") + @GET("/user/logout") Void logoutUser(); /** * Logs out current logged in user session * Async method - * @param cb callback method + * @param cb callback method * @return void */ - @GET("/user/logout") + @GET("/user/logout") void logoutUser( Callback cb - ); + ); /** * Get user by user name @@ -149,7 +150,7 @@ public interface UserApi { * @return User */ - @GET("/user/{username}") + @GET("/user/{username}") User getUserByName( @Path("username") String username ); @@ -158,14 +159,14 @@ public interface UserApi { * Get user by user name * Async method * @param username The name that needs to be fetched. Use user1 for testing. - * @param cb callback method + * @param cb callback method * @return void */ - @GET("/user/{username}") + @GET("/user/{username}") void getUserByName( @Path("username") String username, Callback cb - ); + ); /** * Updated user @@ -176,7 +177,7 @@ public interface UserApi { * @return Void */ - @PUT("/user/{username}") + @PUT("/user/{username}") Void updateUser( @Path("username") String username, @Body User body ); @@ -186,14 +187,14 @@ public interface UserApi { * Async method * @param username name that need to be deleted * @param body Updated user object - * @param cb callback method + * @param cb callback method * @return void */ - @PUT("/user/{username}") + @PUT("/user/{username}") void updateUser( @Path("username") String username, @Body User body, Callback cb - ); + ); /** * Delete user @@ -203,7 +204,7 @@ public interface UserApi { * @return Void */ - @DELETE("/user/{username}") + @DELETE("/user/{username}") Void deleteUser( @Path("username") String username ); @@ -212,13 +213,13 @@ public interface UserApi { * Delete user * Async method * @param username The name that needs to be deleted - * @param cb callback method + * @param cb callback method * @return void */ - @DELETE("/user/{username}") + @DELETE("/user/{username}") void deleteUser( @Path("username") String username, Callback cb - ); + ); } diff --git a/samples/client/petstore/java/retrofit/src/main/java/io/swagger/client/auth/OAuth.java b/samples/client/petstore/java/retrofit/src/main/java/io/swagger/client/auth/OAuth.java index 80614f0f56a..b725e019aff 100644 --- a/samples/client/petstore/java/retrofit/src/main/java/io/swagger/client/auth/OAuth.java +++ b/samples/client/petstore/java/retrofit/src/main/java/io/swagger/client/auth/OAuth.java @@ -1,6 +1,7 @@ package io.swagger.client.auth; import static java.net.HttpURLConnection.HTTP_UNAUTHORIZED; +import static java.net.HttpURLConnection.HTTP_FORBIDDEN; import java.io.IOException; import java.util.Map; @@ -85,42 +86,55 @@ public class OAuth implements Interceptor { updateAccessToken(null); } - // Build the request - Builder rb = request.newBuilder(); - - String requestAccessToken = new String(getAccessToken()); - try { - oAuthRequest = new OAuthBearerClientRequest(request.urlString()) - .setAccessToken(requestAccessToken) - .buildHeaderMessage(); - } catch (OAuthSystemException e) { - throw new IOException(e); + if (getAccessToken() != null) { + // Build the request + Builder rb = request.newBuilder(); + + String requestAccessToken = new String(getAccessToken()); + try { + oAuthRequest = new OAuthBearerClientRequest(request.urlString()) + .setAccessToken(requestAccessToken) + .buildHeaderMessage(); + } catch (OAuthSystemException e) { + throw new IOException(e); + } + + for ( Map.Entry header : oAuthRequest.getHeaders().entrySet() ) { + rb.addHeader(header.getKey(), header.getValue()); + } + rb.url( oAuthRequest.getLocationUri()); + + //Execute the request + Response response = chain.proceed(rb.build()); + + // 401 most likely indicates that access token has expired. + // Time to refresh and resend the request + if ( response != null && (response.code() == HTTP_UNAUTHORIZED | response.code() == HTTP_FORBIDDEN) ) { + if (updateAccessToken(requestAccessToken)) { + return intercept( chain ); + } + } + return response; + } else { + return chain.proceed(chain.request()); } - - for ( Map.Entry header : oAuthRequest.getHeaders().entrySet() ) { - rb.addHeader(header.getKey(), header.getValue()); - } - rb.url( oAuthRequest.getLocationUri()); - - //Execute the request - Response response = chain.proceed(rb.build()); - - // 401 most likely indicates that access token has expired. - // Time to refresh and resend the request - if ( response.code() == HTTP_UNAUTHORIZED ) { - updateAccessToken(requestAccessToken); - return intercept( chain ); - } - return response; } - public synchronized void updateAccessToken(String requestAccessToken) throws IOException { + /* + * Returns true if the access token has been updated + */ + public synchronized boolean updateAccessToken(String requestAccessToken) throws IOException { if (getAccessToken() == null || getAccessToken().equals(requestAccessToken)) { try { OAuthJSONAccessTokenResponse accessTokenResponse = oauthClient.accessToken(this.tokenRequestBuilder.buildBodyMessage()); - setAccessToken(accessTokenResponse.getAccessToken()); - if (accessTokenListener != null) { - accessTokenListener.notify((BasicOAuthToken) accessTokenResponse.getOAuthToken()); + if (accessTokenResponse != null && accessTokenResponse.getAccessToken() != null) { + setAccessToken(accessTokenResponse.getAccessToken()); + if (accessTokenListener != null) { + accessTokenListener.notify((BasicOAuthToken) accessTokenResponse.getOAuthToken()); + } + return getAccessToken().equals(requestAccessToken); + } else { + return false; } } catch (OAuthSystemException e) { throw new IOException(e); @@ -128,6 +142,7 @@ public class OAuth implements Interceptor { throw new IOException(e); } } + return true; } public void registerAccessTokenListener(AccessTokenListener accessTokenListener) { diff --git a/samples/client/petstore/java/retrofit/src/main/java/io/swagger/client/model/Pet.java b/samples/client/petstore/java/retrofit/src/main/java/io/swagger/client/model/Pet.java index 7e771866b39..bc3b80370b0 100644 --- a/samples/client/petstore/java/retrofit/src/main/java/io/swagger/client/model/Pet.java +++ b/samples/client/petstore/java/retrofit/src/main/java/io/swagger/client/model/Pet.java @@ -2,8 +2,8 @@ package io.swagger.client.model; import io.swagger.client.StringUtil; import io.swagger.client.model.Category; -import java.util.*; import io.swagger.client.model.Tag; +import java.util.*; import com.google.gson.annotations.SerializedName; diff --git a/samples/client/petstore/java/retrofit2/src/main/java/io/swagger/client/ApiClient.java b/samples/client/petstore/java/retrofit2/src/main/java/io/swagger/client/ApiClient.java index 2138c3a172b..75e641c689c 100644 --- a/samples/client/petstore/java/retrofit2/src/main/java/io/swagger/client/ApiClient.java +++ b/samples/client/petstore/java/retrofit2/src/main/java/io/swagger/client/ApiClient.java @@ -44,10 +44,10 @@ public class ApiClient { this(); for(String authName : authNames) { Interceptor auth; - if (authName == "petstore_auth") { - auth = new OAuth(OAuthFlow.implicit, "http://petstore.swagger.io/api/oauth/dialog", "", "write:pets, read:pets"); - } else if (authName == "api_key") { + if (authName == "api_key") { auth = new ApiKeyAuth("header", "api_key"); + } else if (authName == "petstore_auth") { + auth = new OAuth(OAuthFlow.implicit, "http://petstore.swagger.io/api/oauth/dialog", "", "write:pets, read:pets"); } else { throw new RuntimeException("auth name \"" + authName + "\" not found in available auth names"); } diff --git a/samples/client/petstore/java/retrofit2/src/main/java/io/swagger/client/StringUtil.java b/samples/client/petstore/java/retrofit2/src/main/java/io/swagger/client/StringUtil.java index 5125ae3e55b..d4ecd6cd193 100644 --- a/samples/client/petstore/java/retrofit2/src/main/java/io/swagger/client/StringUtil.java +++ b/samples/client/petstore/java/retrofit2/src/main/java/io/swagger/client/StringUtil.java @@ -1,6 +1,6 @@ package io.swagger.client; -@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-11-10T12:25:26.227+01:00") +@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-11-29T00:18:18.137+08:00") public class StringUtil { /** * Check if the given array contains the given value (with case-insensitive comparison). diff --git a/samples/client/petstore/java/retrofit2/src/main/java/io/swagger/client/model/Pet.java b/samples/client/petstore/java/retrofit2/src/main/java/io/swagger/client/model/Pet.java index 7e771866b39..bc3b80370b0 100644 --- a/samples/client/petstore/java/retrofit2/src/main/java/io/swagger/client/model/Pet.java +++ b/samples/client/petstore/java/retrofit2/src/main/java/io/swagger/client/model/Pet.java @@ -2,8 +2,8 @@ package io.swagger.client.model; import io.swagger.client.StringUtil; import io.swagger.client.model.Category; -import java.util.*; import io.swagger.client.model.Tag; +import java.util.*; import com.google.gson.annotations.SerializedName; From aadc07396d78060c112146952d96d0ef700328b9 Mon Sep 17 00:00:00 2001 From: wing328 Date: Sun, 29 Nov 2015 18:31:14 +0800 Subject: [PATCH 072/211] add better exception handling in test case --- .../generator/online/OnlineGeneratorOptionsTest.java | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/modules/swagger-generator/src/test/java/io/swagger/generator/online/OnlineGeneratorOptionsTest.java b/modules/swagger-generator/src/test/java/io/swagger/generator/online/OnlineGeneratorOptionsTest.java index 0d2574673d6..77ca898f91f 100644 --- a/modules/swagger-generator/src/test/java/io/swagger/generator/online/OnlineGeneratorOptionsTest.java +++ b/modules/swagger-generator/src/test/java/io/swagger/generator/online/OnlineGeneratorOptionsTest.java @@ -109,7 +109,12 @@ public class OnlineGeneratorOptionsTest { outputFilename = Generator.generateClient(provider.getLanguage(), input); } final File dir = new File(new File(outputFilename).getParent()); - FileUtils.deleteDirectory(dir); + + try { + FileUtils.deleteDirectory(dir); + } catch (Exception e) { // directory can't be delete for some reasons + e.printStackTrace(); + } for (InvocationCounter option : options.values()) { assertNotEquals(option.getCounter(), 0, String.format("Option \"%s\" wasn't processed.", option.getValue())); From a41ca7278a2504749f8e51664c60fd838458e0e4 Mon Sep 17 00:00:00 2001 From: wing328 Date: Sat, 28 Nov 2015 16:01:59 +0800 Subject: [PATCH 073/211] update retrofit2 gradle to use double quote --- .../resources/Java/libraries/retrofit2/build.gradle.mustache | 4 ++-- samples/client/petstore/java/retrofit2/build.gradle | 4 ++-- .../retrofit2/src/main/java/io/swagger/client/StringUtil.java | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/modules/swagger-codegen/src/main/resources/Java/libraries/retrofit2/build.gradle.mustache b/modules/swagger-codegen/src/main/resources/Java/libraries/retrofit2/build.gradle.mustache index b1efe3911a8..cf0047cf283 100644 --- a/modules/swagger-codegen/src/main/resources/Java/libraries/retrofit2/build.gradle.mustache +++ b/modules/swagger-codegen/src/main/resources/Java/libraries/retrofit2/build.gradle.mustache @@ -98,8 +98,8 @@ ext { dependencies { compile "com.squareup.okhttp:okhttp:$okhttp_version" compile "com.squareup.retrofit:retrofit:$retrofit_version" - compile 'com.google.code.gson:gson:$gson_version' - compile 'com.squareup.retrofit:converter-gson:$retrofit_version' + compile "com.google.code.gson:gson:$gson_version" + compile "com.squareup.retrofit:converter-gson:$retrofit_version" compile "io.swagger:swagger-annotations:$swagger_annotations_version" compile "org.apache.oltu.oauth2:org.apache.oltu.oauth2.client:$oltu_version" testCompile "junit:junit:$junit_version" diff --git a/samples/client/petstore/java/retrofit2/build.gradle b/samples/client/petstore/java/retrofit2/build.gradle index 0deeeea2e37..29e1737f3b3 100644 --- a/samples/client/petstore/java/retrofit2/build.gradle +++ b/samples/client/petstore/java/retrofit2/build.gradle @@ -98,8 +98,8 @@ ext { dependencies { compile "com.squareup.okhttp:okhttp:$okhttp_version" compile "com.squareup.retrofit:retrofit:$retrofit_version" - compile 'com.google.code.gson:gson:$gson_version' - compile 'com.squareup.retrofit:converter-gson:$retrofit_version' + compile "com.google.code.gson:gson:$gson_version" + compile "com.squareup.retrofit:converter-gson:$retrofit_version" compile "io.swagger:swagger-annotations:$swagger_annotations_version" compile "org.apache.oltu.oauth2:org.apache.oltu.oauth2.client:$oltu_version" testCompile "junit:junit:$junit_version" diff --git a/samples/client/petstore/java/retrofit2/src/main/java/io/swagger/client/StringUtil.java b/samples/client/petstore/java/retrofit2/src/main/java/io/swagger/client/StringUtil.java index d4ecd6cd193..47f9908c4de 100644 --- a/samples/client/petstore/java/retrofit2/src/main/java/io/swagger/client/StringUtil.java +++ b/samples/client/petstore/java/retrofit2/src/main/java/io/swagger/client/StringUtil.java @@ -1,6 +1,6 @@ package io.swagger.client; -@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-11-29T00:18:18.137+08:00") +@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-11-28T16:01:49.902+08:00") public class StringUtil { /** * Check if the given array contains the given value (with case-insensitive comparison). From 96003a1e90afb43e6c730427ac19b34688783a7c Mon Sep 17 00:00:00 2001 From: wing328 Date: Mon, 30 Nov 2015 10:53:31 +0800 Subject: [PATCH 074/211] fix typo --- .../online/OnlineGeneratorOptionsTest.java | 2 +- .../AppIcon.appiconset/Contents.json | 17 ++++++++++++++++- 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/modules/swagger-generator/src/test/java/io/swagger/generator/online/OnlineGeneratorOptionsTest.java b/modules/swagger-generator/src/test/java/io/swagger/generator/online/OnlineGeneratorOptionsTest.java index 77ca898f91f..8ec4d1760e8 100644 --- a/modules/swagger-generator/src/test/java/io/swagger/generator/online/OnlineGeneratorOptionsTest.java +++ b/modules/swagger-generator/src/test/java/io/swagger/generator/online/OnlineGeneratorOptionsTest.java @@ -112,7 +112,7 @@ public class OnlineGeneratorOptionsTest { try { FileUtils.deleteDirectory(dir); - } catch (Exception e) { // directory can't be delete for some reasons + } catch (Exception e) { // directory can't be deleted for some reasons e.printStackTrace(); } for (InvocationCounter option : options.values()) { diff --git a/samples/client/petstore/objc/SwaggerClientTests/SwaggerClient/Images.xcassets/AppIcon.appiconset/Contents.json b/samples/client/petstore/objc/SwaggerClientTests/SwaggerClient/Images.xcassets/AppIcon.appiconset/Contents.json index f697f61f4aa..36d2c80d889 100644 --- a/samples/client/petstore/objc/SwaggerClientTests/SwaggerClient/Images.xcassets/AppIcon.appiconset/Contents.json +++ b/samples/client/petstore/objc/SwaggerClientTests/SwaggerClient/Images.xcassets/AppIcon.appiconset/Contents.json @@ -5,16 +5,31 @@ "size" : "29x29", "scale" : "2x" }, + { + "idiom" : "iphone", + "size" : "29x29", + "scale" : "3x" + }, { "idiom" : "iphone", "size" : "40x40", "scale" : "2x" }, + { + "idiom" : "iphone", + "size" : "40x40", + "scale" : "3x" + }, { "idiom" : "iphone", "size" : "60x60", "scale" : "2x" }, + { + "idiom" : "iphone", + "size" : "60x60", + "scale" : "3x" + }, { "idiom" : "ipad", "size" : "29x29", @@ -50,4 +65,4 @@ "version" : 1, "author" : "xcode" } -} +} \ No newline at end of file From 90c93522b3454b653d356ea564015d6d3c1290b5 Mon Sep 17 00:00:00 2001 From: wing328 Date: Mon, 30 Nov 2015 10:59:51 +0800 Subject: [PATCH 075/211] undo ios sample change --- .../AppIcon.appiconset/Contents.json | 17 +---------------- 1 file changed, 1 insertion(+), 16 deletions(-) diff --git a/samples/client/petstore/objc/SwaggerClientTests/SwaggerClient/Images.xcassets/AppIcon.appiconset/Contents.json b/samples/client/petstore/objc/SwaggerClientTests/SwaggerClient/Images.xcassets/AppIcon.appiconset/Contents.json index 36d2c80d889..f697f61f4aa 100644 --- a/samples/client/petstore/objc/SwaggerClientTests/SwaggerClient/Images.xcassets/AppIcon.appiconset/Contents.json +++ b/samples/client/petstore/objc/SwaggerClientTests/SwaggerClient/Images.xcassets/AppIcon.appiconset/Contents.json @@ -5,31 +5,16 @@ "size" : "29x29", "scale" : "2x" }, - { - "idiom" : "iphone", - "size" : "29x29", - "scale" : "3x" - }, { "idiom" : "iphone", "size" : "40x40", "scale" : "2x" }, - { - "idiom" : "iphone", - "size" : "40x40", - "scale" : "3x" - }, { "idiom" : "iphone", "size" : "60x60", "scale" : "2x" }, - { - "idiom" : "iphone", - "size" : "60x60", - "scale" : "3x" - }, { "idiom" : "ipad", "size" : "29x29", @@ -65,4 +50,4 @@ "version" : 1, "author" : "xcode" } -} \ No newline at end of file +} From 2bb129b0945e557163e154591d2d8524d6bd704c Mon Sep 17 00:00:00 2001 From: wing328 Date: Mon, 30 Nov 2015 11:45:27 +0800 Subject: [PATCH 076/211] skip findPetByStatus test case for objc due to invalid data --- .../SwaggerClient.xcodeproj/project.pbxproj | 32 +++++++++++++++++++ .../SwaggerClientTests/Tests/PetApiTest.m | 5 +++ 2 files changed, 37 insertions(+) diff --git a/samples/client/petstore/objc/SwaggerClientTests/SwaggerClient.xcodeproj/project.pbxproj b/samples/client/petstore/objc/SwaggerClientTests/SwaggerClient.xcodeproj/project.pbxproj index a5fe06f63b7..867a6811293 100644 --- a/samples/client/petstore/objc/SwaggerClientTests/SwaggerClient.xcodeproj/project.pbxproj +++ b/samples/client/petstore/objc/SwaggerClientTests/SwaggerClient.xcodeproj/project.pbxproj @@ -221,6 +221,7 @@ 6003F587195388D20070C39A /* Frameworks */, 6003F588195388D20070C39A /* Resources */, 429AF5C69E165ED75311B4B0 /* Copy Pods Resources */, + 183E54C09C54DAEB54B2546F /* Embed Pods Frameworks */, ); buildRules = ( ); @@ -240,6 +241,7 @@ 6003F5AB195388D20070C39A /* Frameworks */, 6003F5AC195388D20070C39A /* Resources */, E337D7E459CCFFDF27046FFC /* Copy Pods Resources */, + 111D7956304BD6E860AA8709 /* Embed Pods Frameworks */, ); buildRules = ( ); @@ -302,6 +304,36 @@ /* End PBXResourcesBuildPhase section */ /* Begin PBXShellScriptBuildPhase section */ + 111D7956304BD6E860AA8709 /* Embed Pods Frameworks */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + name = "Embed Pods Frameworks"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-SwaggerClient_Tests/Pods-SwaggerClient_Tests-frameworks.sh\"\n"; + showEnvVarsInLog = 0; + }; + 183E54C09C54DAEB54B2546F /* Embed Pods Frameworks */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + name = "Embed Pods Frameworks"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-SwaggerClient_Example/Pods-SwaggerClient_Example-frameworks.sh\"\n"; + showEnvVarsInLog = 0; + }; 429AF5C69E165ED75311B4B0 /* Copy Pods Resources */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; diff --git a/samples/client/petstore/objc/SwaggerClientTests/Tests/PetApiTest.m b/samples/client/petstore/objc/SwaggerClientTests/Tests/PetApiTest.m index 68add577ac1..421292bbf10 100644 --- a/samples/client/petstore/objc/SwaggerClientTests/Tests/PetApiTest.m +++ b/samples/client/petstore/objc/SwaggerClientTests/Tests/PetApiTest.m @@ -123,6 +123,10 @@ [self waitForExpectationsWithTimeout:10.0 handler:nil]; } +/* +wing328@20151130: comment out the test case below as some data do not contain the 'name' attribute, +which causes an exception when deserializing the data + - (void)testGetPetByStatus { XCTestExpectation *expectation = [self expectationWithDescription:@"testGetPetByStatus"]; SWGPet* pet = [self createPet]; @@ -153,6 +157,7 @@ }]; [self waitForExpectationsWithTimeout:10.0 handler:nil]; } +*/ - (void)testGetPetByTags { XCTestExpectation *expectation = [self expectationWithDescription:@"testGetPetByTags"]; From bb086a7f91a2172aa1a31eb268c8a3d91244303d Mon Sep 17 00:00:00 2001 From: wing328 Date: Mon, 30 Nov 2015 19:45:08 +0800 Subject: [PATCH 077/211] refactor apiclient, configuration, authentication for c# client --- .../main/resources/csharp/ApiClient.mustache | 76 +--- .../resources/csharp/Configuration.mustache | 40 +- .../src/main/resources/csharp/api.mustache | 136 ++++-- .../src/main/csharp/IO/Swagger/Api/PetApi.cs | 426 +++++++++++------- .../main/csharp/IO/Swagger/Api/StoreApi.cs | 178 ++++---- .../src/main/csharp/IO/Swagger/Api/UserApi.cs | 278 ++++++------ .../csharp/IO/Swagger/Client/ApiClient.cs | 71 +-- .../csharp/IO/Swagger/Client/Configuration.cs | 40 +- .../bin/Debug/SwaggerClientTest.dll | Bin 68096 -> 69120 bytes .../bin/Debug/SwaggerClientTest.dll.mdb | Bin 21165 -> 21310 bytes .../obj/Debug/SwaggerClientTest.dll | Bin 68096 -> 69120 bytes .../obj/Debug/SwaggerClientTest.dll.mdb | Bin 21165 -> 21310 bytes 12 files changed, 665 insertions(+), 580 deletions(-) diff --git a/modules/swagger-codegen/src/main/resources/csharp/ApiClient.mustache b/modules/swagger-codegen/src/main/resources/csharp/ApiClient.mustache index bac6fd02a69..680375a7499 100644 --- a/modules/swagger-codegen/src/main/resources/csharp/ApiClient.mustache +++ b/modules/swagger-codegen/src/main/resources/csharp/ApiClient.mustache @@ -64,12 +64,10 @@ namespace {{packageName}}.Client private RestRequest PrepareRequest( String path, RestSharp.Method method, Dictionary queryParams, String postBody, Dictionary headerParams, Dictionary formParams, - Dictionary fileParams, Dictionary pathParams, String[] authSettings) + Dictionary fileParams, Dictionary pathParams) { var request = new RestRequest(path, method); - UpdateParamsForAuth(queryParams, headerParams, authSettings); - // add default header, if any foreach(var defaultHeader in _defaultHeaderMap) request.AddHeader(defaultHeader.Key, defaultHeader.Value); @@ -111,15 +109,14 @@ namespace {{packageName}}.Client /// Form parameters. /// File parameters. /// Path parameters. - /// Authentication settings. /// Object public Object CallApi( String path, RestSharp.Method method, Dictionary queryParams, String postBody, Dictionary headerParams, Dictionary formParams, - Dictionary fileParams, Dictionary pathParams, String[] authSettings) + Dictionary fileParams, Dictionary pathParams) { var request = PrepareRequest( - path, method, queryParams, postBody, headerParams, formParams, fileParams, pathParams, authSettings); + path, method, queryParams, postBody, headerParams, formParams, fileParams, pathParams); var response = RestClient.Execute(request); StatusCode = (int) response.StatusCode; ResponseHeaders = response.Headers.ToDictionary(x => x.Name, x => x.Value.ToString()); @@ -137,15 +134,14 @@ namespace {{packageName}}.Client /// Form parameters. /// File parameters. /// Path parameters. - /// Authentication settings. /// The Task instance. public async System.Threading.Tasks.Task CallApiAsync( String path, RestSharp.Method method, Dictionary queryParams, String postBody, Dictionary headerParams, Dictionary formParams, - Dictionary fileParams, Dictionary pathParams, String[] authSettings) + Dictionary fileParams, Dictionary pathParams) { var request = PrepareRequest( - path, method, queryParams, postBody, headerParams, formParams, fileParams, pathParams, authSettings); + path, method, queryParams, postBody, headerParams, formParams, fileParams, pathParams); var response = await RestClient.ExecuteTaskAsync(request); StatusCode = (int)response.StatusCode; ResponseHeaders = response.Headers.ToDictionary(x => x.Name, x => x.Value.ToString()); @@ -286,68 +282,6 @@ namespace {{packageName}}.Client } } - /// - /// Get the API key with prefix. - /// - /// API key identifier (authentication scheme). - /// API key with prefix. - public string GetApiKeyWithPrefix (string apiKeyIdentifier) - { - var apiKeyValue = ""; - Configuration.ApiKey.TryGetValue (apiKeyIdentifier, out apiKeyValue); - var apiKeyPrefix = ""; - if (Configuration.ApiKeyPrefix.TryGetValue (apiKeyIdentifier, out apiKeyPrefix)) - return apiKeyPrefix + " " + apiKeyValue; - else - return apiKeyValue; - } - - /// - /// Update parameters based on authentication. - /// - /// Query parameters. - /// Header parameters. - /// Authentication settings. - public void UpdateParamsForAuth(Dictionary queryParams, Dictionary headerParams, string[] authSettings) - { - if (authSettings == null || authSettings.Length == 0) - return; - - foreach (string auth in authSettings) - { - // determine which one to use - switch(auth) - { - {{#authMethods}} - case "{{name}}": - {{#isApiKey}}{{#isKeyInHeader}} - var apiKeyValue = GetApiKeyWithPrefix("{{keyParamName}}"); - if (!String.IsNullOrEmpty(apiKeyValue)) - { - headerParams["{{keyParamName}}"] = apiKeyValue; - }{{/isKeyInHeader}}{{#isKeyInQuery}} - var apiKeyValue = GetApiKeyWithPrefix("{{keyParamName}}"); - if (!String.IsNullOrEmpty(apiKeyValue)) - { - queryParams["{{keyParamName}}"] = apiKeyValue; - }{{/isKeyInQuery}}{{/isApiKey}}{{#isBasic}} - if (!String.IsNullOrEmpty(Configuration.Username) || !String.IsNullOrEmpty(Configuration.Password)) - { - headerParams["Authorization"] = "Basic " + Base64Encode(Configuration.Username + ":" + Configuration.Password); - }{{/isBasic}}{{#isOAuth}} - if (!String.IsNullOrEmpty(Configuration.AccessToken)) - { - headerParams["Authorization"] = "Bearer " + Configuration.AccessToken; - }{{/isOAuth}} - break; - {{/authMethods}} - default: - //show warning about security definition not found - break; - } - } - } - /// /// Select the Accept header's value from the given accepts array: /// if JSON exists in the given array, use it; diff --git a/modules/swagger-codegen/src/main/resources/csharp/Configuration.mustache b/modules/swagger-codegen/src/main/resources/csharp/Configuration.mustache index 79b20c6062c..71e4e51c458 100644 --- a/modules/swagger-codegen/src/main/resources/csharp/Configuration.mustache +++ b/modules/swagger-codegen/src/main/resources/csharp/Configuration.mustache @@ -23,37 +23,65 @@ namespace {{packageName}}.Client /// Gets or sets the default API client for making HTTP calls. /// /// The API client. - public static ApiClient DefaultApiClient = new ApiClient(); + public static Configuration DefaultConfiguration = new Configuration(); + + /// + /// Gets or sets the default API client for making HTTP calls. + /// + /// The API client. + public ApiClient ApiClient = new ApiClient(); + + /// + /// Gets or sets the base path. + /// + /// The base path. + public String BasePath { get; set; } /// /// Gets or sets the username (HTTP basic authentication). /// /// The username. - public static String Username { get; set; } + public String Username { get; set; } /// /// Gets or sets the password (HTTP basic authentication). /// /// The password. - public static String Password { get; set; } + public String Password { get; set; } /// /// Gets or sets the access token for OAuth2 authentication. /// /// The access token. - public static String AccessToken { get; set; } + public String AccessToken { get; set; } /// /// Gets or sets the API key based on the authentication name. /// /// The API key. - public static Dictionary ApiKey = new Dictionary(); + public Dictionary ApiKey = new Dictionary(); /// /// Gets or sets the prefix (e.g. Token) of the API key based on the authentication name. /// /// The prefix of the API key. - public static Dictionary ApiKeyPrefix = new Dictionary(); + public Dictionary ApiKeyPrefix = new Dictionary(); + + /// + /// Get the API key with prefix. + /// + /// API key identifier (authentication scheme). + /// API key with prefix. + public string GetApiKeyWithPrefix (string apiKeyIdentifier) + { + var apiKeyValue = ""; + ApiKey.TryGetValue (apiKeyIdentifier, out apiKeyValue); + var apiKeyPrefix = ""; + if (ApiKeyPrefix.TryGetValue (apiKeyIdentifier, out apiKeyPrefix)) + return apiKeyPrefix + " " + apiKeyValue; + else + return apiKeyValue; + } private static string _tempFolderPath = Path.GetTempPath(); diff --git a/modules/swagger-codegen/src/main/resources/csharp/api.mustache b/modules/swagger-codegen/src/main/resources/csharp/api.mustache index 11d2ffe81bb..0853c9f95ea 100644 --- a/modules/swagger-codegen/src/main/resources/csharp/api.mustache +++ b/modules/swagger-codegen/src/main/resources/csharp/api.mustache @@ -42,28 +42,30 @@ namespace {{packageName}}.Api /// public class {{classname}} : I{{classname}} { - /// - /// Initializes a new instance of the class. - /// - /// an instance of ApiClient (optional) - /// - public {{classname}}(ApiClient apiClient = null) - { - if (apiClient == null) // use the default one in Configuration - this.ApiClient = Configuration.DefaultApiClient; - else - this.ApiClient = apiClient; - } - /// /// Initializes a new instance of the class. /// /// public {{classname}}(String basePath) { - this.ApiClient = new ApiClient(basePath); + this.Configuration = Configuration.DefaultConfiguration; + this.SetBasePath(basePath); } + /// + /// Initializes a new instance of the class + /// using Configuration object + /// + /// An instance of Configuration + /// + public {{classname}}(Configuration configuration = null) + { + if (configuration == null) // use the default one in Configuration + this.Configuration = Configuration.DefaultConfiguration; + else + this.Configuration = configuration; + } + /// /// Sets the base path of the API client. /// @@ -71,7 +73,7 @@ namespace {{packageName}}.Api /// The base path public void SetBasePath(String basePath) { - this.ApiClient.BasePath = basePath; + this.Configuration.ApiClient.BasePath = basePath; } /// @@ -80,15 +82,15 @@ namespace {{packageName}}.Api /// The base path public String GetBasePath() { - return this.ApiClient.BasePath; + return this.Configuration.ApiClient.BasePath; } /// - /// Gets or sets the API client. + /// Gets or sets the configuration object /// - /// An instance of the ApiClient - public ApiClient ApiClient {get; set;} - + /// An instance of the Configuration + public Configuration Configuration {get; set;} + {{#operation}} /// /// {{summary}} {{notes}} @@ -115,36 +117,58 @@ namespace {{packageName}}.Api String[] http_header_accepts = new String[] { {{#produces}}"{{mediaType}}"{{#hasMore}}, {{/hasMore}}{{/produces}} }; - String http_header_accept = ApiClient.SelectHeaderAccept(http_header_accepts); + String http_header_accept = Configuration.ApiClient.SelectHeaderAccept(http_header_accepts); if (http_header_accept != null) - headerParams.Add("Accept", ApiClient.SelectHeaderAccept(http_header_accepts)); + headerParams.Add("Accept", Configuration.ApiClient.SelectHeaderAccept(http_header_accepts)); // set "format" to json by default // e.g. /pet/{petId}.{format} becomes /pet/{petId}.json pathParams.Add("format", "json"); - {{#pathParams}}if ({{paramName}} != null) pathParams.Add("{{baseName}}", ApiClient.ParameterToString({{paramName}})); // path parameter + {{#pathParams}}if ({{paramName}} != null) pathParams.Add("{{baseName}}", Configuration.ApiClient.ParameterToString({{paramName}})); // path parameter {{/pathParams}} - {{#queryParams}}if ({{paramName}} != null) queryParams.Add("{{baseName}}", ApiClient.ParameterToString({{paramName}})); // query parameter + {{#queryParams}}if ({{paramName}} != null) queryParams.Add("{{baseName}}", Configuration.ApiClient.ParameterToString({{paramName}})); // query parameter {{/queryParams}} - {{#headerParams}}if ({{paramName}} != null) headerParams.Add("{{baseName}}", ApiClient.ParameterToString({{paramName}})); // header parameter + {{#headerParams}}if ({{paramName}} != null) headerParams.Add("{{baseName}}", Configuration.ApiClient.ParameterToString({{paramName}})); // header parameter {{/headerParams}} - {{#formParams}}if ({{paramName}} != null) {{#isFile}}fileParams.Add("{{baseName}}", ApiClient.ParameterToFile("{{baseName}}", {{paramName}}));{{/isFile}}{{^isFile}}formParams.Add("{{baseName}}", ApiClient.ParameterToString({{paramName}})); // form parameter{{/isFile}} + {{#formParams}}if ({{paramName}} != null) {{#isFile}}fileParams.Add("{{baseName}}", Configuration.ApiClient.ParameterToFile("{{baseName}}", {{paramName}}));{{/isFile}}{{^isFile}}formParams.Add("{{baseName}}", Configuration.ApiClient.ParameterToString({{paramName}})); // form parameter{{/isFile}} {{/formParams}} - {{#bodyParam}}postBody = ApiClient.Serialize({{paramName}}); // http body (model) parameter + {{#bodyParam}}postBody = Configuration.ApiClient.Serialize({{paramName}}); // http body (model) parameter {{/bodyParam}} - - // authentication setting, if any - String[] authSettings = new String[] { {{#authMethods}}"{{name}}"{{#hasMore}}, {{/hasMore}}{{/authMethods}} }; + + {{#authMethods}} + // authentication ({{name}}) required + {{#isApiKey}}{{#isKeyInHeader}} + var apiKeyValue = Configuration.GetApiKeyWithPrefix("{{keyParamName}}"); + if (!String.IsNullOrEmpty(apiKeyValue)) + { + headerParams["{{keyParamName}}"] = apiKeyValue; + }{{/isKeyInHeader}}{{#isKeyInQuery}} + var apiKeyValue = Configuration.GetApiKeyWithPrefix("{{keyParamName}}"); + if (!String.IsNullOrEmpty(apiKeyValue)) + { + queryParams["{{keyParamName}}"] = apiKeyValue; + }{{/isKeyInQuery}}{{/isApiKey}}{{#isBasic}} + // http basic authentication required + if (!String.IsNullOrEmpty(Configuration.Username) || !String.IsNullOrEmpty(Configuration.Password)) + { + headerParams["Authorization"] = "Basic " + Base64Encode(Configuration.Username + ":" + Configuration.Password); + }{{/isBasic}}{{#isOAuth}} + // oauth required + if (!String.IsNullOrEmpty(Configuration.AccessToken)) + { + headerParams["Authorization"] = "Bearer " + Configuration.AccessToken; + }{{/isOAuth}} + {{/authMethods}} // make the HTTP request - IRestResponse response = (IRestResponse) ApiClient.CallApi(path_, Method.{{httpMethod}}, queryParams, postBody, headerParams, formParams, fileParams, pathParams, authSettings); + IRestResponse response = (IRestResponse) Configuration.ApiClient.CallApi(path_, Method.{{httpMethod}}, queryParams, postBody, headerParams, formParams, fileParams, pathParams); if (((int)response.StatusCode) >= 400) throw new ApiException ((int)response.StatusCode, "Error calling {{operationId}}: " + response.Content, response.Content); else if (((int)response.StatusCode) == 0) throw new ApiException ((int)response.StatusCode, "Error calling {{operationId}}: " + response.ErrorMessage, response.ErrorMessage); - {{#returnType}}return ({{{returnType}}}) ApiClient.Deserialize(response, typeof({{{returnType}}}));{{/returnType}}{{^returnType}}return;{{/returnType}} + {{#returnType}}return ({{{returnType}}}) Configuration.ApiClient.Deserialize(response, typeof({{{returnType}}}));{{/returnType}}{{^returnType}}return;{{/returnType}} } /// @@ -171,33 +195,55 @@ namespace {{packageName}}.Api String[] http_header_accepts = new String[] { {{#produces}}"{{mediaType}}"{{#hasMore}}, {{/hasMore}}{{/produces}} }; - String http_header_accept = ApiClient.SelectHeaderAccept(http_header_accepts); + String http_header_accept = Configuration.ApiClient.SelectHeaderAccept(http_header_accepts); if (http_header_accept != null) - headerParams.Add("Accept", ApiClient.SelectHeaderAccept(http_header_accepts)); + headerParams.Add("Accept", Configuration.ApiClient.SelectHeaderAccept(http_header_accepts)); // set "format" to json by default // e.g. /pet/{petId}.{format} becomes /pet/{petId}.json pathParams.Add("format", "json"); - {{#pathParams}}if ({{paramName}} != null) pathParams.Add("{{baseName}}", ApiClient.ParameterToString({{paramName}})); // path parameter + {{#pathParams}}if ({{paramName}} != null) pathParams.Add("{{baseName}}", Configuration.ApiClient.ParameterToString({{paramName}})); // path parameter {{/pathParams}} - {{#queryParams}}if ({{paramName}} != null) queryParams.Add("{{baseName}}", ApiClient.ParameterToString({{paramName}})); // query parameter + {{#queryParams}}if ({{paramName}} != null) queryParams.Add("{{baseName}}", Configuration.ApiClient.ParameterToString({{paramName}})); // query parameter {{/queryParams}} - {{#headerParams}}if ({{paramName}} != null) headerParams.Add("{{baseName}}", ApiClient.ParameterToString({{paramName}})); // header parameter + {{#headerParams}}if ({{paramName}} != null) headerParams.Add("{{baseName}}", Configuration.ApiClient.ParameterToString({{paramName}})); // header parameter {{/headerParams}} - {{#formParams}}if ({{paramName}} != null) {{#isFile}}fileParams.Add("{{baseName}}", ApiClient.ParameterToFile("{{baseName}}", {{paramName}}));{{/isFile}}{{^isFile}}formParams.Add("{{baseName}}", ApiClient.ParameterToString({{paramName}})); // form parameter{{/isFile}} + {{#formParams}}if ({{paramName}} != null) {{#isFile}}fileParams.Add("{{baseName}}", Configuration.ApiClient.ParameterToFile("{{baseName}}", {{paramName}}));{{/isFile}}{{^isFile}}formParams.Add("{{baseName}}", Configuration.ApiClient.ParameterToString({{paramName}})); // form parameter{{/isFile}} {{/formParams}} - {{#bodyParam}}postBody = ApiClient.Serialize({{paramName}}); // http body (model) parameter + {{#bodyParam}}postBody = Configuration.ApiClient.Serialize({{paramName}}); // http body (model) parameter {{/bodyParam}} - - // authentication setting, if any - String[] authSettings = new String[] { {{#authMethods}}"{{name}}"{{#hasMore}}, {{/hasMore}}{{/authMethods}} }; - + + {{#authMethods}} + // authentication ({{name}}) required + {{#isApiKey}}{{#isKeyInHeader}} + var apiKeyValue = Configuration.GetApiKeyWithPrefix("{{keyParamName}}"); + if (!String.IsNullOrEmpty(apiKeyValue)) + { + headerParams["{{keyParamName}}"] = apiKeyValue; + }{{/isKeyInHeader}}{{#isKeyInQuery}} + var apiKeyValue = Configuration.GetApiKeyWithPrefix("{{keyParamName}}"); + if (!String.IsNullOrEmpty(apiKeyValue)) + { + queryParams["{{keyParamName}}"] = apiKeyValue; + }{{/isKeyInQuery}}{{/isApiKey}}{{#isBasic}} + // http basic authentication required + if (!String.IsNullOrEmpty(Configuration.Username) || !String.IsNullOrEmpty(Configuration.Password)) + { + headerParams["Authorization"] = "Basic " + Base64Encode(Configuration.Username + ":" + Configuration.Password); + }{{/isBasic}}{{#isOAuth}} + // oauth required + if (!String.IsNullOrEmpty(Configuration.AccessToken)) + { + headerParams["Authorization"] = "Bearer " + Configuration.AccessToken; + }{{/isOAuth}} + {{/authMethods}} + // make the HTTP request - IRestResponse response = (IRestResponse) await ApiClient.CallApiAsync(path_, Method.{{httpMethod}}, queryParams, postBody, headerParams, formParams, fileParams, pathParams, authSettings); + IRestResponse response = (IRestResponse) await Configuration.ApiClient.CallApiAsync(path_, Method.{{httpMethod}}, queryParams, postBody, headerParams, formParams, fileParams, pathParams); if (((int)response.StatusCode) >= 400) throw new ApiException ((int)response.StatusCode, "Error calling {{operationId}}: " + response.Content, response.Content); - {{#returnType}}return ({{{returnType}}}) ApiClient.Deserialize(response, typeof({{{returnType}}}));{{/returnType}}{{^returnType}} + {{#returnType}}return ({{{returnType}}}) Configuration.ApiClient.Deserialize(response, typeof({{{returnType}}}));{{/returnType}}{{^returnType}} return;{{/returnType}} } {{/operation}} diff --git a/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Api/PetApi.cs b/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Api/PetApi.cs index 8344304ee79..02a5cbd53ec 100644 --- a/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Api/PetApi.cs +++ b/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Api/PetApi.cs @@ -191,28 +191,30 @@ namespace IO.Swagger.Api /// public class PetApi : IPetApi { - /// - /// Initializes a new instance of the class. - /// - /// an instance of ApiClient (optional) - /// - public PetApi(ApiClient apiClient = null) - { - if (apiClient == null) // use the default one in Configuration - this.ApiClient = Configuration.DefaultApiClient; - else - this.ApiClient = apiClient; - } - /// /// Initializes a new instance of the class. /// /// public PetApi(String basePath) { - this.ApiClient = new ApiClient(basePath); + this.Configuration = Configuration.DefaultConfiguration; + this.SetBasePath(basePath); } + /// + /// Initializes a new instance of the class + /// using Configuration object + /// + /// An instance of Configuration + /// + public PetApi(Configuration configuration = null) + { + if (configuration == null) // use the default one in Configuration + this.Configuration = Configuration.DefaultConfiguration; + else + this.Configuration = configuration; + } + /// /// Sets the base path of the API client. /// @@ -220,7 +222,7 @@ namespace IO.Swagger.Api /// The base path public void SetBasePath(String basePath) { - this.ApiClient.BasePath = basePath; + this.Configuration.ApiClient.BasePath = basePath; } /// @@ -229,15 +231,15 @@ namespace IO.Swagger.Api /// The base path public String GetBasePath() { - return this.ApiClient.BasePath; + return this.Configuration.ApiClient.BasePath; } /// - /// Gets or sets the API client. + /// Gets or sets the configuration object /// - /// An instance of the ApiClient - public ApiClient ApiClient {get; set;} - + /// An instance of the Configuration + public Configuration Configuration {get; set;} + /// /// Update an existing pet @@ -261,9 +263,9 @@ namespace IO.Swagger.Api String[] http_header_accepts = new String[] { "application/json", "application/xml" }; - String http_header_accept = ApiClient.SelectHeaderAccept(http_header_accepts); + String http_header_accept = Configuration.ApiClient.SelectHeaderAccept(http_header_accepts); if (http_header_accept != null) - headerParams.Add("Accept", ApiClient.SelectHeaderAccept(http_header_accepts)); + headerParams.Add("Accept", Configuration.ApiClient.SelectHeaderAccept(http_header_accepts)); // set "format" to json by default // e.g. /pet/{petId}.{format} becomes /pet/{petId}.json @@ -272,14 +274,21 @@ namespace IO.Swagger.Api - postBody = ApiClient.Serialize(body); // http body (model) parameter + postBody = Configuration.ApiClient.Serialize(body); // http body (model) parameter + + + + // authentication (petstore_auth) required + + // oauth required + if (!String.IsNullOrEmpty(Configuration.AccessToken)) + { + headerParams["Authorization"] = "Bearer " + Configuration.AccessToken; + } - // authentication setting, if any - String[] authSettings = new String[] { "petstore_auth" }; - // make the HTTP request - IRestResponse response = (IRestResponse) ApiClient.CallApi(path_, Method.PUT, queryParams, postBody, headerParams, formParams, fileParams, pathParams, authSettings); + IRestResponse response = (IRestResponse) Configuration.ApiClient.CallApi(path_, Method.PUT, queryParams, postBody, headerParams, formParams, fileParams, pathParams); if (((int)response.StatusCode) >= 400) throw new ApiException ((int)response.StatusCode, "Error calling UpdatePet: " + response.Content, response.Content); @@ -311,9 +320,9 @@ namespace IO.Swagger.Api String[] http_header_accepts = new String[] { "application/json", "application/xml" }; - String http_header_accept = ApiClient.SelectHeaderAccept(http_header_accepts); + String http_header_accept = Configuration.ApiClient.SelectHeaderAccept(http_header_accepts); if (http_header_accept != null) - headerParams.Add("Accept", ApiClient.SelectHeaderAccept(http_header_accepts)); + headerParams.Add("Accept", Configuration.ApiClient.SelectHeaderAccept(http_header_accepts)); // set "format" to json by default // e.g. /pet/{petId}.{format} becomes /pet/{petId}.json @@ -322,14 +331,21 @@ namespace IO.Swagger.Api - postBody = ApiClient.Serialize(body); // http body (model) parameter + postBody = Configuration.ApiClient.Serialize(body); // http body (model) parameter - - // authentication setting, if any - String[] authSettings = new String[] { "petstore_auth" }; - + + + // authentication (petstore_auth) required + + // oauth required + if (!String.IsNullOrEmpty(Configuration.AccessToken)) + { + headerParams["Authorization"] = "Bearer " + Configuration.AccessToken; + } + + // make the HTTP request - IRestResponse response = (IRestResponse) await ApiClient.CallApiAsync(path_, Method.PUT, queryParams, postBody, headerParams, formParams, fileParams, pathParams, authSettings); + IRestResponse response = (IRestResponse) await Configuration.ApiClient.CallApiAsync(path_, Method.PUT, queryParams, postBody, headerParams, formParams, fileParams, pathParams); if (((int)response.StatusCode) >= 400) throw new ApiException ((int)response.StatusCode, "Error calling UpdatePet: " + response.Content, response.Content); @@ -359,9 +375,9 @@ namespace IO.Swagger.Api String[] http_header_accepts = new String[] { "application/json", "application/xml" }; - String http_header_accept = ApiClient.SelectHeaderAccept(http_header_accepts); + String http_header_accept = Configuration.ApiClient.SelectHeaderAccept(http_header_accepts); if (http_header_accept != null) - headerParams.Add("Accept", ApiClient.SelectHeaderAccept(http_header_accepts)); + headerParams.Add("Accept", Configuration.ApiClient.SelectHeaderAccept(http_header_accepts)); // set "format" to json by default // e.g. /pet/{petId}.{format} becomes /pet/{petId}.json @@ -370,14 +386,21 @@ namespace IO.Swagger.Api - postBody = ApiClient.Serialize(body); // http body (model) parameter + postBody = Configuration.ApiClient.Serialize(body); // http body (model) parameter + + + + // authentication (petstore_auth) required + + // oauth required + if (!String.IsNullOrEmpty(Configuration.AccessToken)) + { + headerParams["Authorization"] = "Bearer " + Configuration.AccessToken; + } - // authentication setting, if any - String[] authSettings = new String[] { "petstore_auth" }; - // make the HTTP request - IRestResponse response = (IRestResponse) ApiClient.CallApi(path_, Method.POST, queryParams, postBody, headerParams, formParams, fileParams, pathParams, authSettings); + IRestResponse response = (IRestResponse) Configuration.ApiClient.CallApi(path_, Method.POST, queryParams, postBody, headerParams, formParams, fileParams, pathParams); if (((int)response.StatusCode) >= 400) throw new ApiException ((int)response.StatusCode, "Error calling AddPet: " + response.Content, response.Content); @@ -409,9 +432,9 @@ namespace IO.Swagger.Api String[] http_header_accepts = new String[] { "application/json", "application/xml" }; - String http_header_accept = ApiClient.SelectHeaderAccept(http_header_accepts); + String http_header_accept = Configuration.ApiClient.SelectHeaderAccept(http_header_accepts); if (http_header_accept != null) - headerParams.Add("Accept", ApiClient.SelectHeaderAccept(http_header_accepts)); + headerParams.Add("Accept", Configuration.ApiClient.SelectHeaderAccept(http_header_accepts)); // set "format" to json by default // e.g. /pet/{petId}.{format} becomes /pet/{petId}.json @@ -420,14 +443,21 @@ namespace IO.Swagger.Api - postBody = ApiClient.Serialize(body); // http body (model) parameter + postBody = Configuration.ApiClient.Serialize(body); // http body (model) parameter - - // authentication setting, if any - String[] authSettings = new String[] { "petstore_auth" }; - + + + // authentication (petstore_auth) required + + // oauth required + if (!String.IsNullOrEmpty(Configuration.AccessToken)) + { + headerParams["Authorization"] = "Bearer " + Configuration.AccessToken; + } + + // make the HTTP request - IRestResponse response = (IRestResponse) await ApiClient.CallApiAsync(path_, Method.POST, queryParams, postBody, headerParams, formParams, fileParams, pathParams, authSettings); + IRestResponse response = (IRestResponse) await Configuration.ApiClient.CallApiAsync(path_, Method.POST, queryParams, postBody, headerParams, formParams, fileParams, pathParams); if (((int)response.StatusCode) >= 400) throw new ApiException ((int)response.StatusCode, "Error calling AddPet: " + response.Content, response.Content); @@ -457,32 +487,39 @@ namespace IO.Swagger.Api String[] http_header_accepts = new String[] { "application/json", "application/xml" }; - String http_header_accept = ApiClient.SelectHeaderAccept(http_header_accepts); + String http_header_accept = Configuration.ApiClient.SelectHeaderAccept(http_header_accepts); if (http_header_accept != null) - headerParams.Add("Accept", ApiClient.SelectHeaderAccept(http_header_accepts)); + headerParams.Add("Accept", Configuration.ApiClient.SelectHeaderAccept(http_header_accepts)); // set "format" to json by default // e.g. /pet/{petId}.{format} becomes /pet/{petId}.json pathParams.Add("format", "json"); - if (status != null) queryParams.Add("status", ApiClient.ParameterToString(status)); // query parameter + if (status != null) queryParams.Add("status", Configuration.ApiClient.ParameterToString(status)); // query parameter - - // authentication setting, if any - String[] authSettings = new String[] { "petstore_auth" }; + + + // authentication (petstore_auth) required + + // oauth required + if (!String.IsNullOrEmpty(Configuration.AccessToken)) + { + headerParams["Authorization"] = "Bearer " + Configuration.AccessToken; + } + // make the HTTP request - IRestResponse response = (IRestResponse) ApiClient.CallApi(path_, Method.GET, queryParams, postBody, headerParams, formParams, fileParams, pathParams, authSettings); + IRestResponse response = (IRestResponse) Configuration.ApiClient.CallApi(path_, Method.GET, queryParams, postBody, headerParams, formParams, fileParams, pathParams); if (((int)response.StatusCode) >= 400) throw new ApiException ((int)response.StatusCode, "Error calling FindPetsByStatus: " + response.Content, response.Content); else if (((int)response.StatusCode) == 0) throw new ApiException ((int)response.StatusCode, "Error calling FindPetsByStatus: " + response.ErrorMessage, response.ErrorMessage); - return (List) ApiClient.Deserialize(response, typeof(List)); + return (List) Configuration.ApiClient.Deserialize(response, typeof(List)); } /// @@ -507,29 +544,36 @@ namespace IO.Swagger.Api String[] http_header_accepts = new String[] { "application/json", "application/xml" }; - String http_header_accept = ApiClient.SelectHeaderAccept(http_header_accepts); + String http_header_accept = Configuration.ApiClient.SelectHeaderAccept(http_header_accepts); if (http_header_accept != null) - headerParams.Add("Accept", ApiClient.SelectHeaderAccept(http_header_accepts)); + headerParams.Add("Accept", Configuration.ApiClient.SelectHeaderAccept(http_header_accepts)); // set "format" to json by default // e.g. /pet/{petId}.{format} becomes /pet/{petId}.json pathParams.Add("format", "json"); - if (status != null) queryParams.Add("status", ApiClient.ParameterToString(status)); // query parameter + if (status != null) queryParams.Add("status", Configuration.ApiClient.ParameterToString(status)); // query parameter - - // authentication setting, if any - String[] authSettings = new String[] { "petstore_auth" }; - + + + // authentication (petstore_auth) required + + // oauth required + if (!String.IsNullOrEmpty(Configuration.AccessToken)) + { + headerParams["Authorization"] = "Bearer " + Configuration.AccessToken; + } + + // make the HTTP request - IRestResponse response = (IRestResponse) await ApiClient.CallApiAsync(path_, Method.GET, queryParams, postBody, headerParams, formParams, fileParams, pathParams, authSettings); + IRestResponse response = (IRestResponse) await Configuration.ApiClient.CallApiAsync(path_, Method.GET, queryParams, postBody, headerParams, formParams, fileParams, pathParams); if (((int)response.StatusCode) >= 400) throw new ApiException ((int)response.StatusCode, "Error calling FindPetsByStatus: " + response.Content, response.Content); - return (List) ApiClient.Deserialize(response, typeof(List)); + return (List) Configuration.ApiClient.Deserialize(response, typeof(List)); } /// @@ -554,32 +598,39 @@ namespace IO.Swagger.Api String[] http_header_accepts = new String[] { "application/json", "application/xml" }; - String http_header_accept = ApiClient.SelectHeaderAccept(http_header_accepts); + String http_header_accept = Configuration.ApiClient.SelectHeaderAccept(http_header_accepts); if (http_header_accept != null) - headerParams.Add("Accept", ApiClient.SelectHeaderAccept(http_header_accepts)); + headerParams.Add("Accept", Configuration.ApiClient.SelectHeaderAccept(http_header_accepts)); // set "format" to json by default // e.g. /pet/{petId}.{format} becomes /pet/{petId}.json pathParams.Add("format", "json"); - if (tags != null) queryParams.Add("tags", ApiClient.ParameterToString(tags)); // query parameter + if (tags != null) queryParams.Add("tags", Configuration.ApiClient.ParameterToString(tags)); // query parameter - - // authentication setting, if any - String[] authSettings = new String[] { "petstore_auth" }; + + + // authentication (petstore_auth) required + + // oauth required + if (!String.IsNullOrEmpty(Configuration.AccessToken)) + { + headerParams["Authorization"] = "Bearer " + Configuration.AccessToken; + } + // make the HTTP request - IRestResponse response = (IRestResponse) ApiClient.CallApi(path_, Method.GET, queryParams, postBody, headerParams, formParams, fileParams, pathParams, authSettings); + IRestResponse response = (IRestResponse) Configuration.ApiClient.CallApi(path_, Method.GET, queryParams, postBody, headerParams, formParams, fileParams, pathParams); if (((int)response.StatusCode) >= 400) throw new ApiException ((int)response.StatusCode, "Error calling FindPetsByTags: " + response.Content, response.Content); else if (((int)response.StatusCode) == 0) throw new ApiException ((int)response.StatusCode, "Error calling FindPetsByTags: " + response.ErrorMessage, response.ErrorMessage); - return (List) ApiClient.Deserialize(response, typeof(List)); + return (List) Configuration.ApiClient.Deserialize(response, typeof(List)); } /// @@ -604,29 +655,36 @@ namespace IO.Swagger.Api String[] http_header_accepts = new String[] { "application/json", "application/xml" }; - String http_header_accept = ApiClient.SelectHeaderAccept(http_header_accepts); + String http_header_accept = Configuration.ApiClient.SelectHeaderAccept(http_header_accepts); if (http_header_accept != null) - headerParams.Add("Accept", ApiClient.SelectHeaderAccept(http_header_accepts)); + headerParams.Add("Accept", Configuration.ApiClient.SelectHeaderAccept(http_header_accepts)); // set "format" to json by default // e.g. /pet/{petId}.{format} becomes /pet/{petId}.json pathParams.Add("format", "json"); - if (tags != null) queryParams.Add("tags", ApiClient.ParameterToString(tags)); // query parameter + if (tags != null) queryParams.Add("tags", Configuration.ApiClient.ParameterToString(tags)); // query parameter - - // authentication setting, if any - String[] authSettings = new String[] { "petstore_auth" }; - + + + // authentication (petstore_auth) required + + // oauth required + if (!String.IsNullOrEmpty(Configuration.AccessToken)) + { + headerParams["Authorization"] = "Bearer " + Configuration.AccessToken; + } + + // make the HTTP request - IRestResponse response = (IRestResponse) await ApiClient.CallApiAsync(path_, Method.GET, queryParams, postBody, headerParams, formParams, fileParams, pathParams, authSettings); + IRestResponse response = (IRestResponse) await Configuration.ApiClient.CallApiAsync(path_, Method.GET, queryParams, postBody, headerParams, formParams, fileParams, pathParams); if (((int)response.StatusCode) >= 400) throw new ApiException ((int)response.StatusCode, "Error calling FindPetsByTags: " + response.Content, response.Content); - return (List) ApiClient.Deserialize(response, typeof(List)); + return (List) Configuration.ApiClient.Deserialize(response, typeof(List)); } /// @@ -654,32 +712,39 @@ namespace IO.Swagger.Api String[] http_header_accepts = new String[] { "application/json", "application/xml" }; - String http_header_accept = ApiClient.SelectHeaderAccept(http_header_accepts); + String http_header_accept = Configuration.ApiClient.SelectHeaderAccept(http_header_accepts); if (http_header_accept != null) - headerParams.Add("Accept", ApiClient.SelectHeaderAccept(http_header_accepts)); + headerParams.Add("Accept", Configuration.ApiClient.SelectHeaderAccept(http_header_accepts)); // set "format" to json by default // e.g. /pet/{petId}.{format} becomes /pet/{petId}.json pathParams.Add("format", "json"); - if (petId != null) pathParams.Add("petId", ApiClient.ParameterToString(petId)); // path parameter + if (petId != null) pathParams.Add("petId", Configuration.ApiClient.ParameterToString(petId)); // path parameter - - // authentication setting, if any - String[] authSettings = new String[] { "api_key" }; + + + // authentication (api_key) required + + var apiKeyValue = Configuration.GetApiKeyWithPrefix("api_key"); + if (!String.IsNullOrEmpty(apiKeyValue)) + { + headerParams["api_key"] = apiKeyValue; + } + // make the HTTP request - IRestResponse response = (IRestResponse) ApiClient.CallApi(path_, Method.GET, queryParams, postBody, headerParams, formParams, fileParams, pathParams, authSettings); + IRestResponse response = (IRestResponse) Configuration.ApiClient.CallApi(path_, Method.GET, queryParams, postBody, headerParams, formParams, fileParams, pathParams); if (((int)response.StatusCode) >= 400) throw new ApiException ((int)response.StatusCode, "Error calling GetPetById: " + response.Content, response.Content); else if (((int)response.StatusCode) == 0) throw new ApiException ((int)response.StatusCode, "Error calling GetPetById: " + response.ErrorMessage, response.ErrorMessage); - return (Pet) ApiClient.Deserialize(response, typeof(Pet)); + return (Pet) Configuration.ApiClient.Deserialize(response, typeof(Pet)); } /// @@ -706,29 +771,36 @@ namespace IO.Swagger.Api String[] http_header_accepts = new String[] { "application/json", "application/xml" }; - String http_header_accept = ApiClient.SelectHeaderAccept(http_header_accepts); + String http_header_accept = Configuration.ApiClient.SelectHeaderAccept(http_header_accepts); if (http_header_accept != null) - headerParams.Add("Accept", ApiClient.SelectHeaderAccept(http_header_accepts)); + headerParams.Add("Accept", Configuration.ApiClient.SelectHeaderAccept(http_header_accepts)); // set "format" to json by default // e.g. /pet/{petId}.{format} becomes /pet/{petId}.json pathParams.Add("format", "json"); - if (petId != null) pathParams.Add("petId", ApiClient.ParameterToString(petId)); // path parameter + if (petId != null) pathParams.Add("petId", Configuration.ApiClient.ParameterToString(petId)); // path parameter - - // authentication setting, if any - String[] authSettings = new String[] { "api_key" }; - + + + // authentication (api_key) required + + var apiKeyValue = Configuration.GetApiKeyWithPrefix("api_key"); + if (!String.IsNullOrEmpty(apiKeyValue)) + { + headerParams["api_key"] = apiKeyValue; + } + + // make the HTTP request - IRestResponse response = (IRestResponse) await ApiClient.CallApiAsync(path_, Method.GET, queryParams, postBody, headerParams, formParams, fileParams, pathParams, authSettings); + IRestResponse response = (IRestResponse) await Configuration.ApiClient.CallApiAsync(path_, Method.GET, queryParams, postBody, headerParams, formParams, fileParams, pathParams); if (((int)response.StatusCode) >= 400) throw new ApiException ((int)response.StatusCode, "Error calling GetPetById: " + response.Content, response.Content); - return (Pet) ApiClient.Deserialize(response, typeof(Pet)); + return (Pet) Configuration.ApiClient.Deserialize(response, typeof(Pet)); } /// @@ -758,27 +830,34 @@ namespace IO.Swagger.Api String[] http_header_accepts = new String[] { "application/json", "application/xml" }; - String http_header_accept = ApiClient.SelectHeaderAccept(http_header_accepts); + String http_header_accept = Configuration.ApiClient.SelectHeaderAccept(http_header_accepts); if (http_header_accept != null) - headerParams.Add("Accept", ApiClient.SelectHeaderAccept(http_header_accepts)); + headerParams.Add("Accept", Configuration.ApiClient.SelectHeaderAccept(http_header_accepts)); // set "format" to json by default // e.g. /pet/{petId}.{format} becomes /pet/{petId}.json pathParams.Add("format", "json"); - if (petId != null) pathParams.Add("petId", ApiClient.ParameterToString(petId)); // path parameter + if (petId != null) pathParams.Add("petId", Configuration.ApiClient.ParameterToString(petId)); // path parameter - if (name != null) formParams.Add("name", ApiClient.ParameterToString(name)); // form parameter - if (status != null) formParams.Add("status", ApiClient.ParameterToString(status)); // form parameter + if (name != null) formParams.Add("name", Configuration.ApiClient.ParameterToString(name)); // form parameter + if (status != null) formParams.Add("status", Configuration.ApiClient.ParameterToString(status)); // form parameter - - // authentication setting, if any - String[] authSettings = new String[] { "petstore_auth" }; + + + // authentication (petstore_auth) required + + // oauth required + if (!String.IsNullOrEmpty(Configuration.AccessToken)) + { + headerParams["Authorization"] = "Bearer " + Configuration.AccessToken; + } + // make the HTTP request - IRestResponse response = (IRestResponse) ApiClient.CallApi(path_, Method.POST, queryParams, postBody, headerParams, formParams, fileParams, pathParams, authSettings); + IRestResponse response = (IRestResponse) Configuration.ApiClient.CallApi(path_, Method.POST, queryParams, postBody, headerParams, formParams, fileParams, pathParams); if (((int)response.StatusCode) >= 400) throw new ApiException ((int)response.StatusCode, "Error calling UpdatePetWithForm: " + response.Content, response.Content); @@ -814,27 +893,34 @@ namespace IO.Swagger.Api String[] http_header_accepts = new String[] { "application/json", "application/xml" }; - String http_header_accept = ApiClient.SelectHeaderAccept(http_header_accepts); + String http_header_accept = Configuration.ApiClient.SelectHeaderAccept(http_header_accepts); if (http_header_accept != null) - headerParams.Add("Accept", ApiClient.SelectHeaderAccept(http_header_accepts)); + headerParams.Add("Accept", Configuration.ApiClient.SelectHeaderAccept(http_header_accepts)); // set "format" to json by default // e.g. /pet/{petId}.{format} becomes /pet/{petId}.json pathParams.Add("format", "json"); - if (petId != null) pathParams.Add("petId", ApiClient.ParameterToString(petId)); // path parameter + if (petId != null) pathParams.Add("petId", Configuration.ApiClient.ParameterToString(petId)); // path parameter - if (name != null) formParams.Add("name", ApiClient.ParameterToString(name)); // form parameter - if (status != null) formParams.Add("status", ApiClient.ParameterToString(status)); // form parameter + if (name != null) formParams.Add("name", Configuration.ApiClient.ParameterToString(name)); // form parameter + if (status != null) formParams.Add("status", Configuration.ApiClient.ParameterToString(status)); // form parameter - - // authentication setting, if any - String[] authSettings = new String[] { "petstore_auth" }; - + + + // authentication (petstore_auth) required + + // oauth required + if (!String.IsNullOrEmpty(Configuration.AccessToken)) + { + headerParams["Authorization"] = "Bearer " + Configuration.AccessToken; + } + + // make the HTTP request - IRestResponse response = (IRestResponse) await ApiClient.CallApiAsync(path_, Method.POST, queryParams, postBody, headerParams, formParams, fileParams, pathParams, authSettings); + IRestResponse response = (IRestResponse) await Configuration.ApiClient.CallApiAsync(path_, Method.POST, queryParams, postBody, headerParams, formParams, fileParams, pathParams); if (((int)response.StatusCode) >= 400) throw new ApiException ((int)response.StatusCode, "Error calling UpdatePetWithForm: " + response.Content, response.Content); @@ -868,26 +954,33 @@ namespace IO.Swagger.Api String[] http_header_accepts = new String[] { "application/json", "application/xml" }; - String http_header_accept = ApiClient.SelectHeaderAccept(http_header_accepts); + String http_header_accept = Configuration.ApiClient.SelectHeaderAccept(http_header_accepts); if (http_header_accept != null) - headerParams.Add("Accept", ApiClient.SelectHeaderAccept(http_header_accepts)); + headerParams.Add("Accept", Configuration.ApiClient.SelectHeaderAccept(http_header_accepts)); // set "format" to json by default // e.g. /pet/{petId}.{format} becomes /pet/{petId}.json pathParams.Add("format", "json"); - if (petId != null) pathParams.Add("petId", ApiClient.ParameterToString(petId)); // path parameter + if (petId != null) pathParams.Add("petId", Configuration.ApiClient.ParameterToString(petId)); // path parameter - if (apiKey != null) headerParams.Add("api_key", ApiClient.ParameterToString(apiKey)); // header parameter + if (apiKey != null) headerParams.Add("api_key", Configuration.ApiClient.ParameterToString(apiKey)); // header parameter - - // authentication setting, if any - String[] authSettings = new String[] { "petstore_auth" }; + + + // authentication (petstore_auth) required + + // oauth required + if (!String.IsNullOrEmpty(Configuration.AccessToken)) + { + headerParams["Authorization"] = "Bearer " + Configuration.AccessToken; + } + // make the HTTP request - IRestResponse response = (IRestResponse) ApiClient.CallApi(path_, Method.DELETE, queryParams, postBody, headerParams, formParams, fileParams, pathParams, authSettings); + IRestResponse response = (IRestResponse) Configuration.ApiClient.CallApi(path_, Method.DELETE, queryParams, postBody, headerParams, formParams, fileParams, pathParams); if (((int)response.StatusCode) >= 400) throw new ApiException ((int)response.StatusCode, "Error calling DeletePet: " + response.Content, response.Content); @@ -922,26 +1015,33 @@ namespace IO.Swagger.Api String[] http_header_accepts = new String[] { "application/json", "application/xml" }; - String http_header_accept = ApiClient.SelectHeaderAccept(http_header_accepts); + String http_header_accept = Configuration.ApiClient.SelectHeaderAccept(http_header_accepts); if (http_header_accept != null) - headerParams.Add("Accept", ApiClient.SelectHeaderAccept(http_header_accepts)); + headerParams.Add("Accept", Configuration.ApiClient.SelectHeaderAccept(http_header_accepts)); // set "format" to json by default // e.g. /pet/{petId}.{format} becomes /pet/{petId}.json pathParams.Add("format", "json"); - if (petId != null) pathParams.Add("petId", ApiClient.ParameterToString(petId)); // path parameter + if (petId != null) pathParams.Add("petId", Configuration.ApiClient.ParameterToString(petId)); // path parameter - if (apiKey != null) headerParams.Add("api_key", ApiClient.ParameterToString(apiKey)); // header parameter + if (apiKey != null) headerParams.Add("api_key", Configuration.ApiClient.ParameterToString(apiKey)); // header parameter - - // authentication setting, if any - String[] authSettings = new String[] { "petstore_auth" }; - + + + // authentication (petstore_auth) required + + // oauth required + if (!String.IsNullOrEmpty(Configuration.AccessToken)) + { + headerParams["Authorization"] = "Bearer " + Configuration.AccessToken; + } + + // make the HTTP request - IRestResponse response = (IRestResponse) await ApiClient.CallApiAsync(path_, Method.DELETE, queryParams, postBody, headerParams, formParams, fileParams, pathParams, authSettings); + IRestResponse response = (IRestResponse) await Configuration.ApiClient.CallApiAsync(path_, Method.DELETE, queryParams, postBody, headerParams, formParams, fileParams, pathParams); if (((int)response.StatusCode) >= 400) throw new ApiException ((int)response.StatusCode, "Error calling DeletePet: " + response.Content, response.Content); @@ -976,27 +1076,34 @@ namespace IO.Swagger.Api String[] http_header_accepts = new String[] { "application/json", "application/xml" }; - String http_header_accept = ApiClient.SelectHeaderAccept(http_header_accepts); + String http_header_accept = Configuration.ApiClient.SelectHeaderAccept(http_header_accepts); if (http_header_accept != null) - headerParams.Add("Accept", ApiClient.SelectHeaderAccept(http_header_accepts)); + headerParams.Add("Accept", Configuration.ApiClient.SelectHeaderAccept(http_header_accepts)); // set "format" to json by default // e.g. /pet/{petId}.{format} becomes /pet/{petId}.json pathParams.Add("format", "json"); - if (petId != null) pathParams.Add("petId", ApiClient.ParameterToString(petId)); // path parameter + if (petId != null) pathParams.Add("petId", Configuration.ApiClient.ParameterToString(petId)); // path parameter - if (additionalMetadata != null) formParams.Add("additionalMetadata", ApiClient.ParameterToString(additionalMetadata)); // form parameter - if (file != null) fileParams.Add("file", ApiClient.ParameterToFile("file", file)); + if (additionalMetadata != null) formParams.Add("additionalMetadata", Configuration.ApiClient.ParameterToString(additionalMetadata)); // form parameter + if (file != null) fileParams.Add("file", Configuration.ApiClient.ParameterToFile("file", file)); - - // authentication setting, if any - String[] authSettings = new String[] { "petstore_auth" }; + + + // authentication (petstore_auth) required + + // oauth required + if (!String.IsNullOrEmpty(Configuration.AccessToken)) + { + headerParams["Authorization"] = "Bearer " + Configuration.AccessToken; + } + // make the HTTP request - IRestResponse response = (IRestResponse) ApiClient.CallApi(path_, Method.POST, queryParams, postBody, headerParams, formParams, fileParams, pathParams, authSettings); + IRestResponse response = (IRestResponse) Configuration.ApiClient.CallApi(path_, Method.POST, queryParams, postBody, headerParams, formParams, fileParams, pathParams); if (((int)response.StatusCode) >= 400) throw new ApiException ((int)response.StatusCode, "Error calling UploadFile: " + response.Content, response.Content); @@ -1032,27 +1139,34 @@ namespace IO.Swagger.Api String[] http_header_accepts = new String[] { "application/json", "application/xml" }; - String http_header_accept = ApiClient.SelectHeaderAccept(http_header_accepts); + String http_header_accept = Configuration.ApiClient.SelectHeaderAccept(http_header_accepts); if (http_header_accept != null) - headerParams.Add("Accept", ApiClient.SelectHeaderAccept(http_header_accepts)); + headerParams.Add("Accept", Configuration.ApiClient.SelectHeaderAccept(http_header_accepts)); // set "format" to json by default // e.g. /pet/{petId}.{format} becomes /pet/{petId}.json pathParams.Add("format", "json"); - if (petId != null) pathParams.Add("petId", ApiClient.ParameterToString(petId)); // path parameter + if (petId != null) pathParams.Add("petId", Configuration.ApiClient.ParameterToString(petId)); // path parameter - if (additionalMetadata != null) formParams.Add("additionalMetadata", ApiClient.ParameterToString(additionalMetadata)); // form parameter - if (file != null) fileParams.Add("file", ApiClient.ParameterToFile("file", file)); + if (additionalMetadata != null) formParams.Add("additionalMetadata", Configuration.ApiClient.ParameterToString(additionalMetadata)); // form parameter + if (file != null) fileParams.Add("file", Configuration.ApiClient.ParameterToFile("file", file)); - - // authentication setting, if any - String[] authSettings = new String[] { "petstore_auth" }; - + + + // authentication (petstore_auth) required + + // oauth required + if (!String.IsNullOrEmpty(Configuration.AccessToken)) + { + headerParams["Authorization"] = "Bearer " + Configuration.AccessToken; + } + + // make the HTTP request - IRestResponse response = (IRestResponse) await ApiClient.CallApiAsync(path_, Method.POST, queryParams, postBody, headerParams, formParams, fileParams, pathParams, authSettings); + IRestResponse response = (IRestResponse) await Configuration.ApiClient.CallApiAsync(path_, Method.POST, queryParams, postBody, headerParams, formParams, fileParams, pathParams); if (((int)response.StatusCode) >= 400) throw new ApiException ((int)response.StatusCode, "Error calling UploadFile: " + response.Content, response.Content); diff --git a/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Api/StoreApi.cs b/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Api/StoreApi.cs index 952987dfad4..90f59746fca 100644 --- a/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Api/StoreApi.cs +++ b/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Api/StoreApi.cs @@ -99,28 +99,30 @@ namespace IO.Swagger.Api /// public class StoreApi : IStoreApi { - /// - /// Initializes a new instance of the class. - /// - /// an instance of ApiClient (optional) - /// - public StoreApi(ApiClient apiClient = null) - { - if (apiClient == null) // use the default one in Configuration - this.ApiClient = Configuration.DefaultApiClient; - else - this.ApiClient = apiClient; - } - /// /// Initializes a new instance of the class. /// /// public StoreApi(String basePath) { - this.ApiClient = new ApiClient(basePath); + this.Configuration = Configuration.DefaultConfiguration; + this.SetBasePath(basePath); } + /// + /// Initializes a new instance of the class + /// using Configuration object + /// + /// An instance of Configuration + /// + public StoreApi(Configuration configuration = null) + { + if (configuration == null) // use the default one in Configuration + this.Configuration = Configuration.DefaultConfiguration; + else + this.Configuration = configuration; + } + /// /// Sets the base path of the API client. /// @@ -128,7 +130,7 @@ namespace IO.Swagger.Api /// The base path public void SetBasePath(String basePath) { - this.ApiClient.BasePath = basePath; + this.Configuration.ApiClient.BasePath = basePath; } /// @@ -137,15 +139,15 @@ namespace IO.Swagger.Api /// The base path public String GetBasePath() { - return this.ApiClient.BasePath; + return this.Configuration.ApiClient.BasePath; } /// - /// Gets or sets the API client. + /// Gets or sets the configuration object /// - /// An instance of the ApiClient - public ApiClient ApiClient {get; set;} - + /// An instance of the Configuration + public Configuration Configuration {get; set;} + /// /// Returns pet inventories by status Returns a map of status codes to quantities @@ -168,9 +170,9 @@ namespace IO.Swagger.Api String[] http_header_accepts = new String[] { "application/json", "application/xml" }; - String http_header_accept = ApiClient.SelectHeaderAccept(http_header_accepts); + String http_header_accept = Configuration.ApiClient.SelectHeaderAccept(http_header_accepts); if (http_header_accept != null) - headerParams.Add("Accept", ApiClient.SelectHeaderAccept(http_header_accepts)); + headerParams.Add("Accept", Configuration.ApiClient.SelectHeaderAccept(http_header_accepts)); // set "format" to json by default // e.g. /pet/{petId}.{format} becomes /pet/{petId}.json @@ -180,19 +182,26 @@ namespace IO.Swagger.Api - - // authentication setting, if any - String[] authSettings = new String[] { "api_key" }; + + + // authentication (api_key) required + + var apiKeyValue = Configuration.GetApiKeyWithPrefix("api_key"); + if (!String.IsNullOrEmpty(apiKeyValue)) + { + headerParams["api_key"] = apiKeyValue; + } + // make the HTTP request - IRestResponse response = (IRestResponse) ApiClient.CallApi(path_, Method.GET, queryParams, postBody, headerParams, formParams, fileParams, pathParams, authSettings); + IRestResponse response = (IRestResponse) Configuration.ApiClient.CallApi(path_, Method.GET, queryParams, postBody, headerParams, formParams, fileParams, pathParams); if (((int)response.StatusCode) >= 400) throw new ApiException ((int)response.StatusCode, "Error calling GetInventory: " + response.Content, response.Content); else if (((int)response.StatusCode) == 0) throw new ApiException ((int)response.StatusCode, "Error calling GetInventory: " + response.ErrorMessage, response.ErrorMessage); - return (Dictionary) ApiClient.Deserialize(response, typeof(Dictionary)); + return (Dictionary) Configuration.ApiClient.Deserialize(response, typeof(Dictionary)); } /// @@ -216,9 +225,9 @@ namespace IO.Swagger.Api String[] http_header_accepts = new String[] { "application/json", "application/xml" }; - String http_header_accept = ApiClient.SelectHeaderAccept(http_header_accepts); + String http_header_accept = Configuration.ApiClient.SelectHeaderAccept(http_header_accepts); if (http_header_accept != null) - headerParams.Add("Accept", ApiClient.SelectHeaderAccept(http_header_accepts)); + headerParams.Add("Accept", Configuration.ApiClient.SelectHeaderAccept(http_header_accepts)); // set "format" to json by default // e.g. /pet/{petId}.{format} becomes /pet/{petId}.json @@ -228,16 +237,23 @@ namespace IO.Swagger.Api - - // authentication setting, if any - String[] authSettings = new String[] { "api_key" }; - + + + // authentication (api_key) required + + var apiKeyValue = Configuration.GetApiKeyWithPrefix("api_key"); + if (!String.IsNullOrEmpty(apiKeyValue)) + { + headerParams["api_key"] = apiKeyValue; + } + + // make the HTTP request - IRestResponse response = (IRestResponse) await ApiClient.CallApiAsync(path_, Method.GET, queryParams, postBody, headerParams, formParams, fileParams, pathParams, authSettings); + IRestResponse response = (IRestResponse) await Configuration.ApiClient.CallApiAsync(path_, Method.GET, queryParams, postBody, headerParams, formParams, fileParams, pathParams); if (((int)response.StatusCode) >= 400) throw new ApiException ((int)response.StatusCode, "Error calling GetInventory: " + response.Content, response.Content); - return (Dictionary) ApiClient.Deserialize(response, typeof(Dictionary)); + return (Dictionary) Configuration.ApiClient.Deserialize(response, typeof(Dictionary)); } /// @@ -262,9 +278,9 @@ namespace IO.Swagger.Api String[] http_header_accepts = new String[] { "application/json", "application/xml" }; - String http_header_accept = ApiClient.SelectHeaderAccept(http_header_accepts); + String http_header_accept = Configuration.ApiClient.SelectHeaderAccept(http_header_accepts); if (http_header_accept != null) - headerParams.Add("Accept", ApiClient.SelectHeaderAccept(http_header_accepts)); + headerParams.Add("Accept", Configuration.ApiClient.SelectHeaderAccept(http_header_accepts)); // set "format" to json by default // e.g. /pet/{petId}.{format} becomes /pet/{petId}.json @@ -273,21 +289,20 @@ namespace IO.Swagger.Api - postBody = ApiClient.Serialize(body); // http body (model) parameter + postBody = Configuration.ApiClient.Serialize(body); // http body (model) parameter + + - // authentication setting, if any - String[] authSettings = new String[] { }; - // make the HTTP request - IRestResponse response = (IRestResponse) ApiClient.CallApi(path_, Method.POST, queryParams, postBody, headerParams, formParams, fileParams, pathParams, authSettings); + IRestResponse response = (IRestResponse) Configuration.ApiClient.CallApi(path_, Method.POST, queryParams, postBody, headerParams, formParams, fileParams, pathParams); if (((int)response.StatusCode) >= 400) throw new ApiException ((int)response.StatusCode, "Error calling PlaceOrder: " + response.Content, response.Content); else if (((int)response.StatusCode) == 0) throw new ApiException ((int)response.StatusCode, "Error calling PlaceOrder: " + response.ErrorMessage, response.ErrorMessage); - return (Order) ApiClient.Deserialize(response, typeof(Order)); + return (Order) Configuration.ApiClient.Deserialize(response, typeof(Order)); } /// @@ -312,9 +327,9 @@ namespace IO.Swagger.Api String[] http_header_accepts = new String[] { "application/json", "application/xml" }; - String http_header_accept = ApiClient.SelectHeaderAccept(http_header_accepts); + String http_header_accept = Configuration.ApiClient.SelectHeaderAccept(http_header_accepts); if (http_header_accept != null) - headerParams.Add("Accept", ApiClient.SelectHeaderAccept(http_header_accepts)); + headerParams.Add("Accept", Configuration.ApiClient.SelectHeaderAccept(http_header_accepts)); // set "format" to json by default // e.g. /pet/{petId}.{format} becomes /pet/{petId}.json @@ -323,18 +338,17 @@ namespace IO.Swagger.Api - postBody = ApiClient.Serialize(body); // http body (model) parameter + postBody = Configuration.ApiClient.Serialize(body); // http body (model) parameter - - // authentication setting, if any - String[] authSettings = new String[] { }; - + + + // make the HTTP request - IRestResponse response = (IRestResponse) await ApiClient.CallApiAsync(path_, Method.POST, queryParams, postBody, headerParams, formParams, fileParams, pathParams, authSettings); + IRestResponse response = (IRestResponse) await Configuration.ApiClient.CallApiAsync(path_, Method.POST, queryParams, postBody, headerParams, formParams, fileParams, pathParams); if (((int)response.StatusCode) >= 400) throw new ApiException ((int)response.StatusCode, "Error calling PlaceOrder: " + response.Content, response.Content); - return (Order) ApiClient.Deserialize(response, typeof(Order)); + return (Order) Configuration.ApiClient.Deserialize(response, typeof(Order)); } /// @@ -362,32 +376,31 @@ namespace IO.Swagger.Api String[] http_header_accepts = new String[] { "application/json", "application/xml" }; - String http_header_accept = ApiClient.SelectHeaderAccept(http_header_accepts); + String http_header_accept = Configuration.ApiClient.SelectHeaderAccept(http_header_accepts); if (http_header_accept != null) - headerParams.Add("Accept", ApiClient.SelectHeaderAccept(http_header_accepts)); + headerParams.Add("Accept", Configuration.ApiClient.SelectHeaderAccept(http_header_accepts)); // set "format" to json by default // e.g. /pet/{petId}.{format} becomes /pet/{petId}.json pathParams.Add("format", "json"); - if (orderId != null) pathParams.Add("orderId", ApiClient.ParameterToString(orderId)); // path parameter + if (orderId != null) pathParams.Add("orderId", Configuration.ApiClient.ParameterToString(orderId)); // path parameter - - // authentication setting, if any - String[] authSettings = new String[] { }; + + // make the HTTP request - IRestResponse response = (IRestResponse) ApiClient.CallApi(path_, Method.GET, queryParams, postBody, headerParams, formParams, fileParams, pathParams, authSettings); + IRestResponse response = (IRestResponse) Configuration.ApiClient.CallApi(path_, Method.GET, queryParams, postBody, headerParams, formParams, fileParams, pathParams); if (((int)response.StatusCode) >= 400) throw new ApiException ((int)response.StatusCode, "Error calling GetOrderById: " + response.Content, response.Content); else if (((int)response.StatusCode) == 0) throw new ApiException ((int)response.StatusCode, "Error calling GetOrderById: " + response.ErrorMessage, response.ErrorMessage); - return (Order) ApiClient.Deserialize(response, typeof(Order)); + return (Order) Configuration.ApiClient.Deserialize(response, typeof(Order)); } /// @@ -414,29 +427,28 @@ namespace IO.Swagger.Api String[] http_header_accepts = new String[] { "application/json", "application/xml" }; - String http_header_accept = ApiClient.SelectHeaderAccept(http_header_accepts); + String http_header_accept = Configuration.ApiClient.SelectHeaderAccept(http_header_accepts); if (http_header_accept != null) - headerParams.Add("Accept", ApiClient.SelectHeaderAccept(http_header_accepts)); + headerParams.Add("Accept", Configuration.ApiClient.SelectHeaderAccept(http_header_accepts)); // set "format" to json by default // e.g. /pet/{petId}.{format} becomes /pet/{petId}.json pathParams.Add("format", "json"); - if (orderId != null) pathParams.Add("orderId", ApiClient.ParameterToString(orderId)); // path parameter + if (orderId != null) pathParams.Add("orderId", Configuration.ApiClient.ParameterToString(orderId)); // path parameter - - // authentication setting, if any - String[] authSettings = new String[] { }; - + + + // make the HTTP request - IRestResponse response = (IRestResponse) await ApiClient.CallApiAsync(path_, Method.GET, queryParams, postBody, headerParams, formParams, fileParams, pathParams, authSettings); + IRestResponse response = (IRestResponse) await Configuration.ApiClient.CallApiAsync(path_, Method.GET, queryParams, postBody, headerParams, formParams, fileParams, pathParams); if (((int)response.StatusCode) >= 400) throw new ApiException ((int)response.StatusCode, "Error calling GetOrderById: " + response.Content, response.Content); - return (Order) ApiClient.Deserialize(response, typeof(Order)); + return (Order) Configuration.ApiClient.Deserialize(response, typeof(Order)); } /// @@ -464,25 +476,24 @@ namespace IO.Swagger.Api String[] http_header_accepts = new String[] { "application/json", "application/xml" }; - String http_header_accept = ApiClient.SelectHeaderAccept(http_header_accepts); + String http_header_accept = Configuration.ApiClient.SelectHeaderAccept(http_header_accepts); if (http_header_accept != null) - headerParams.Add("Accept", ApiClient.SelectHeaderAccept(http_header_accepts)); + headerParams.Add("Accept", Configuration.ApiClient.SelectHeaderAccept(http_header_accepts)); // set "format" to json by default // e.g. /pet/{petId}.{format} becomes /pet/{petId}.json pathParams.Add("format", "json"); - if (orderId != null) pathParams.Add("orderId", ApiClient.ParameterToString(orderId)); // path parameter + if (orderId != null) pathParams.Add("orderId", Configuration.ApiClient.ParameterToString(orderId)); // path parameter - - // authentication setting, if any - String[] authSettings = new String[] { }; + + // make the HTTP request - IRestResponse response = (IRestResponse) ApiClient.CallApi(path_, Method.DELETE, queryParams, postBody, headerParams, formParams, fileParams, pathParams, authSettings); + IRestResponse response = (IRestResponse) Configuration.ApiClient.CallApi(path_, Method.DELETE, queryParams, postBody, headerParams, formParams, fileParams, pathParams); if (((int)response.StatusCode) >= 400) throw new ApiException ((int)response.StatusCode, "Error calling DeleteOrder: " + response.Content, response.Content); @@ -516,25 +527,24 @@ namespace IO.Swagger.Api String[] http_header_accepts = new String[] { "application/json", "application/xml" }; - String http_header_accept = ApiClient.SelectHeaderAccept(http_header_accepts); + String http_header_accept = Configuration.ApiClient.SelectHeaderAccept(http_header_accepts); if (http_header_accept != null) - headerParams.Add("Accept", ApiClient.SelectHeaderAccept(http_header_accepts)); + headerParams.Add("Accept", Configuration.ApiClient.SelectHeaderAccept(http_header_accepts)); // set "format" to json by default // e.g. /pet/{petId}.{format} becomes /pet/{petId}.json pathParams.Add("format", "json"); - if (orderId != null) pathParams.Add("orderId", ApiClient.ParameterToString(orderId)); // path parameter + if (orderId != null) pathParams.Add("orderId", Configuration.ApiClient.ParameterToString(orderId)); // path parameter - - // authentication setting, if any - String[] authSettings = new String[] { }; - + + + // make the HTTP request - IRestResponse response = (IRestResponse) await ApiClient.CallApiAsync(path_, Method.DELETE, queryParams, postBody, headerParams, formParams, fileParams, pathParams, authSettings); + IRestResponse response = (IRestResponse) await Configuration.ApiClient.CallApiAsync(path_, Method.DELETE, queryParams, postBody, headerParams, formParams, fileParams, pathParams); if (((int)response.StatusCode) >= 400) throw new ApiException ((int)response.StatusCode, "Error calling DeleteOrder: " + response.Content, response.Content); diff --git a/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Api/UserApi.cs b/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Api/UserApi.cs index 3890e98b17f..01127fb340f 100644 --- a/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Api/UserApi.cs +++ b/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Api/UserApi.cs @@ -183,28 +183,30 @@ namespace IO.Swagger.Api /// public class UserApi : IUserApi { - /// - /// Initializes a new instance of the class. - /// - /// an instance of ApiClient (optional) - /// - public UserApi(ApiClient apiClient = null) - { - if (apiClient == null) // use the default one in Configuration - this.ApiClient = Configuration.DefaultApiClient; - else - this.ApiClient = apiClient; - } - /// /// Initializes a new instance of the class. /// /// public UserApi(String basePath) { - this.ApiClient = new ApiClient(basePath); + this.Configuration = Configuration.DefaultConfiguration; + this.SetBasePath(basePath); } + /// + /// Initializes a new instance of the class + /// using Configuration object + /// + /// An instance of Configuration + /// + public UserApi(Configuration configuration = null) + { + if (configuration == null) // use the default one in Configuration + this.Configuration = Configuration.DefaultConfiguration; + else + this.Configuration = configuration; + } + /// /// Sets the base path of the API client. /// @@ -212,7 +214,7 @@ namespace IO.Swagger.Api /// The base path public void SetBasePath(String basePath) { - this.ApiClient.BasePath = basePath; + this.Configuration.ApiClient.BasePath = basePath; } /// @@ -221,15 +223,15 @@ namespace IO.Swagger.Api /// The base path public String GetBasePath() { - return this.ApiClient.BasePath; + return this.Configuration.ApiClient.BasePath; } /// - /// Gets or sets the API client. + /// Gets or sets the configuration object /// - /// An instance of the ApiClient - public ApiClient ApiClient {get; set;} - + /// An instance of the Configuration + public Configuration Configuration {get; set;} + /// /// Create user This can only be done by the logged in user. @@ -253,9 +255,9 @@ namespace IO.Swagger.Api String[] http_header_accepts = new String[] { "application/json", "application/xml" }; - String http_header_accept = ApiClient.SelectHeaderAccept(http_header_accepts); + String http_header_accept = Configuration.ApiClient.SelectHeaderAccept(http_header_accepts); if (http_header_accept != null) - headerParams.Add("Accept", ApiClient.SelectHeaderAccept(http_header_accepts)); + headerParams.Add("Accept", Configuration.ApiClient.SelectHeaderAccept(http_header_accepts)); // set "format" to json by default // e.g. /pet/{petId}.{format} becomes /pet/{petId}.json @@ -264,14 +266,13 @@ namespace IO.Swagger.Api - postBody = ApiClient.Serialize(body); // http body (model) parameter + postBody = Configuration.ApiClient.Serialize(body); // http body (model) parameter + + - // authentication setting, if any - String[] authSettings = new String[] { }; - // make the HTTP request - IRestResponse response = (IRestResponse) ApiClient.CallApi(path_, Method.POST, queryParams, postBody, headerParams, formParams, fileParams, pathParams, authSettings); + IRestResponse response = (IRestResponse) Configuration.ApiClient.CallApi(path_, Method.POST, queryParams, postBody, headerParams, formParams, fileParams, pathParams); if (((int)response.StatusCode) >= 400) throw new ApiException ((int)response.StatusCode, "Error calling CreateUser: " + response.Content, response.Content); @@ -303,9 +304,9 @@ namespace IO.Swagger.Api String[] http_header_accepts = new String[] { "application/json", "application/xml" }; - String http_header_accept = ApiClient.SelectHeaderAccept(http_header_accepts); + String http_header_accept = Configuration.ApiClient.SelectHeaderAccept(http_header_accepts); if (http_header_accept != null) - headerParams.Add("Accept", ApiClient.SelectHeaderAccept(http_header_accepts)); + headerParams.Add("Accept", Configuration.ApiClient.SelectHeaderAccept(http_header_accepts)); // set "format" to json by default // e.g. /pet/{petId}.{format} becomes /pet/{petId}.json @@ -314,14 +315,13 @@ namespace IO.Swagger.Api - postBody = ApiClient.Serialize(body); // http body (model) parameter + postBody = Configuration.ApiClient.Serialize(body); // http body (model) parameter - - // authentication setting, if any - String[] authSettings = new String[] { }; - + + + // make the HTTP request - IRestResponse response = (IRestResponse) await ApiClient.CallApiAsync(path_, Method.POST, queryParams, postBody, headerParams, formParams, fileParams, pathParams, authSettings); + IRestResponse response = (IRestResponse) await Configuration.ApiClient.CallApiAsync(path_, Method.POST, queryParams, postBody, headerParams, formParams, fileParams, pathParams); if (((int)response.StatusCode) >= 400) throw new ApiException ((int)response.StatusCode, "Error calling CreateUser: " + response.Content, response.Content); @@ -351,9 +351,9 @@ namespace IO.Swagger.Api String[] http_header_accepts = new String[] { "application/json", "application/xml" }; - String http_header_accept = ApiClient.SelectHeaderAccept(http_header_accepts); + String http_header_accept = Configuration.ApiClient.SelectHeaderAccept(http_header_accepts); if (http_header_accept != null) - headerParams.Add("Accept", ApiClient.SelectHeaderAccept(http_header_accepts)); + headerParams.Add("Accept", Configuration.ApiClient.SelectHeaderAccept(http_header_accepts)); // set "format" to json by default // e.g. /pet/{petId}.{format} becomes /pet/{petId}.json @@ -362,14 +362,13 @@ namespace IO.Swagger.Api - postBody = ApiClient.Serialize(body); // http body (model) parameter + postBody = Configuration.ApiClient.Serialize(body); // http body (model) parameter + + - // authentication setting, if any - String[] authSettings = new String[] { }; - // make the HTTP request - IRestResponse response = (IRestResponse) ApiClient.CallApi(path_, Method.POST, queryParams, postBody, headerParams, formParams, fileParams, pathParams, authSettings); + IRestResponse response = (IRestResponse) Configuration.ApiClient.CallApi(path_, Method.POST, queryParams, postBody, headerParams, formParams, fileParams, pathParams); if (((int)response.StatusCode) >= 400) throw new ApiException ((int)response.StatusCode, "Error calling CreateUsersWithArrayInput: " + response.Content, response.Content); @@ -401,9 +400,9 @@ namespace IO.Swagger.Api String[] http_header_accepts = new String[] { "application/json", "application/xml" }; - String http_header_accept = ApiClient.SelectHeaderAccept(http_header_accepts); + String http_header_accept = Configuration.ApiClient.SelectHeaderAccept(http_header_accepts); if (http_header_accept != null) - headerParams.Add("Accept", ApiClient.SelectHeaderAccept(http_header_accepts)); + headerParams.Add("Accept", Configuration.ApiClient.SelectHeaderAccept(http_header_accepts)); // set "format" to json by default // e.g. /pet/{petId}.{format} becomes /pet/{petId}.json @@ -412,14 +411,13 @@ namespace IO.Swagger.Api - postBody = ApiClient.Serialize(body); // http body (model) parameter + postBody = Configuration.ApiClient.Serialize(body); // http body (model) parameter - - // authentication setting, if any - String[] authSettings = new String[] { }; - + + + // make the HTTP request - IRestResponse response = (IRestResponse) await ApiClient.CallApiAsync(path_, Method.POST, queryParams, postBody, headerParams, formParams, fileParams, pathParams, authSettings); + IRestResponse response = (IRestResponse) await Configuration.ApiClient.CallApiAsync(path_, Method.POST, queryParams, postBody, headerParams, formParams, fileParams, pathParams); if (((int)response.StatusCode) >= 400) throw new ApiException ((int)response.StatusCode, "Error calling CreateUsersWithArrayInput: " + response.Content, response.Content); @@ -449,9 +447,9 @@ namespace IO.Swagger.Api String[] http_header_accepts = new String[] { "application/json", "application/xml" }; - String http_header_accept = ApiClient.SelectHeaderAccept(http_header_accepts); + String http_header_accept = Configuration.ApiClient.SelectHeaderAccept(http_header_accepts); if (http_header_accept != null) - headerParams.Add("Accept", ApiClient.SelectHeaderAccept(http_header_accepts)); + headerParams.Add("Accept", Configuration.ApiClient.SelectHeaderAccept(http_header_accepts)); // set "format" to json by default // e.g. /pet/{petId}.{format} becomes /pet/{petId}.json @@ -460,14 +458,13 @@ namespace IO.Swagger.Api - postBody = ApiClient.Serialize(body); // http body (model) parameter + postBody = Configuration.ApiClient.Serialize(body); // http body (model) parameter + + - // authentication setting, if any - String[] authSettings = new String[] { }; - // make the HTTP request - IRestResponse response = (IRestResponse) ApiClient.CallApi(path_, Method.POST, queryParams, postBody, headerParams, formParams, fileParams, pathParams, authSettings); + IRestResponse response = (IRestResponse) Configuration.ApiClient.CallApi(path_, Method.POST, queryParams, postBody, headerParams, formParams, fileParams, pathParams); if (((int)response.StatusCode) >= 400) throw new ApiException ((int)response.StatusCode, "Error calling CreateUsersWithListInput: " + response.Content, response.Content); @@ -499,9 +496,9 @@ namespace IO.Swagger.Api String[] http_header_accepts = new String[] { "application/json", "application/xml" }; - String http_header_accept = ApiClient.SelectHeaderAccept(http_header_accepts); + String http_header_accept = Configuration.ApiClient.SelectHeaderAccept(http_header_accepts); if (http_header_accept != null) - headerParams.Add("Accept", ApiClient.SelectHeaderAccept(http_header_accepts)); + headerParams.Add("Accept", Configuration.ApiClient.SelectHeaderAccept(http_header_accepts)); // set "format" to json by default // e.g. /pet/{petId}.{format} becomes /pet/{petId}.json @@ -510,14 +507,13 @@ namespace IO.Swagger.Api - postBody = ApiClient.Serialize(body); // http body (model) parameter + postBody = Configuration.ApiClient.Serialize(body); // http body (model) parameter - - // authentication setting, if any - String[] authSettings = new String[] { }; - + + + // make the HTTP request - IRestResponse response = (IRestResponse) await ApiClient.CallApiAsync(path_, Method.POST, queryParams, postBody, headerParams, formParams, fileParams, pathParams, authSettings); + IRestResponse response = (IRestResponse) await Configuration.ApiClient.CallApiAsync(path_, Method.POST, queryParams, postBody, headerParams, formParams, fileParams, pathParams); if (((int)response.StatusCode) >= 400) throw new ApiException ((int)response.StatusCode, "Error calling CreateUsersWithListInput: " + response.Content, response.Content); @@ -548,33 +544,32 @@ namespace IO.Swagger.Api String[] http_header_accepts = new String[] { "application/json", "application/xml" }; - String http_header_accept = ApiClient.SelectHeaderAccept(http_header_accepts); + String http_header_accept = Configuration.ApiClient.SelectHeaderAccept(http_header_accepts); if (http_header_accept != null) - headerParams.Add("Accept", ApiClient.SelectHeaderAccept(http_header_accepts)); + headerParams.Add("Accept", Configuration.ApiClient.SelectHeaderAccept(http_header_accepts)); // set "format" to json by default // e.g. /pet/{petId}.{format} becomes /pet/{petId}.json pathParams.Add("format", "json"); - if (username != null) queryParams.Add("username", ApiClient.ParameterToString(username)); // query parameter - if (password != null) queryParams.Add("password", ApiClient.ParameterToString(password)); // query parameter + if (username != null) queryParams.Add("username", Configuration.ApiClient.ParameterToString(username)); // query parameter + if (password != null) queryParams.Add("password", Configuration.ApiClient.ParameterToString(password)); // query parameter - - // authentication setting, if any - String[] authSettings = new String[] { }; + + // make the HTTP request - IRestResponse response = (IRestResponse) ApiClient.CallApi(path_, Method.GET, queryParams, postBody, headerParams, formParams, fileParams, pathParams, authSettings); + IRestResponse response = (IRestResponse) Configuration.ApiClient.CallApi(path_, Method.GET, queryParams, postBody, headerParams, formParams, fileParams, pathParams); if (((int)response.StatusCode) >= 400) throw new ApiException ((int)response.StatusCode, "Error calling LoginUser: " + response.Content, response.Content); else if (((int)response.StatusCode) == 0) throw new ApiException ((int)response.StatusCode, "Error calling LoginUser: " + response.ErrorMessage, response.ErrorMessage); - return (string) ApiClient.Deserialize(response, typeof(string)); + return (string) Configuration.ApiClient.Deserialize(response, typeof(string)); } /// @@ -600,30 +595,29 @@ namespace IO.Swagger.Api String[] http_header_accepts = new String[] { "application/json", "application/xml" }; - String http_header_accept = ApiClient.SelectHeaderAccept(http_header_accepts); + String http_header_accept = Configuration.ApiClient.SelectHeaderAccept(http_header_accepts); if (http_header_accept != null) - headerParams.Add("Accept", ApiClient.SelectHeaderAccept(http_header_accepts)); + headerParams.Add("Accept", Configuration.ApiClient.SelectHeaderAccept(http_header_accepts)); // set "format" to json by default // e.g. /pet/{petId}.{format} becomes /pet/{petId}.json pathParams.Add("format", "json"); - if (username != null) queryParams.Add("username", ApiClient.ParameterToString(username)); // query parameter - if (password != null) queryParams.Add("password", ApiClient.ParameterToString(password)); // query parameter + if (username != null) queryParams.Add("username", Configuration.ApiClient.ParameterToString(username)); // query parameter + if (password != null) queryParams.Add("password", Configuration.ApiClient.ParameterToString(password)); // query parameter - - // authentication setting, if any - String[] authSettings = new String[] { }; - + + + // make the HTTP request - IRestResponse response = (IRestResponse) await ApiClient.CallApiAsync(path_, Method.GET, queryParams, postBody, headerParams, formParams, fileParams, pathParams, authSettings); + IRestResponse response = (IRestResponse) await Configuration.ApiClient.CallApiAsync(path_, Method.GET, queryParams, postBody, headerParams, formParams, fileParams, pathParams); if (((int)response.StatusCode) >= 400) throw new ApiException ((int)response.StatusCode, "Error calling LoginUser: " + response.Content, response.Content); - return (string) ApiClient.Deserialize(response, typeof(string)); + return (string) Configuration.ApiClient.Deserialize(response, typeof(string)); } /// @@ -647,9 +641,9 @@ namespace IO.Swagger.Api String[] http_header_accepts = new String[] { "application/json", "application/xml" }; - String http_header_accept = ApiClient.SelectHeaderAccept(http_header_accepts); + String http_header_accept = Configuration.ApiClient.SelectHeaderAccept(http_header_accepts); if (http_header_accept != null) - headerParams.Add("Accept", ApiClient.SelectHeaderAccept(http_header_accepts)); + headerParams.Add("Accept", Configuration.ApiClient.SelectHeaderAccept(http_header_accepts)); // set "format" to json by default // e.g. /pet/{petId}.{format} becomes /pet/{petId}.json @@ -659,12 +653,11 @@ namespace IO.Swagger.Api - - // authentication setting, if any - String[] authSettings = new String[] { }; + + // make the HTTP request - IRestResponse response = (IRestResponse) ApiClient.CallApi(path_, Method.GET, queryParams, postBody, headerParams, formParams, fileParams, pathParams, authSettings); + IRestResponse response = (IRestResponse) Configuration.ApiClient.CallApi(path_, Method.GET, queryParams, postBody, headerParams, formParams, fileParams, pathParams); if (((int)response.StatusCode) >= 400) throw new ApiException ((int)response.StatusCode, "Error calling LogoutUser: " + response.Content, response.Content); @@ -695,9 +688,9 @@ namespace IO.Swagger.Api String[] http_header_accepts = new String[] { "application/json", "application/xml" }; - String http_header_accept = ApiClient.SelectHeaderAccept(http_header_accepts); + String http_header_accept = Configuration.ApiClient.SelectHeaderAccept(http_header_accepts); if (http_header_accept != null) - headerParams.Add("Accept", ApiClient.SelectHeaderAccept(http_header_accepts)); + headerParams.Add("Accept", Configuration.ApiClient.SelectHeaderAccept(http_header_accepts)); // set "format" to json by default // e.g. /pet/{petId}.{format} becomes /pet/{petId}.json @@ -707,12 +700,11 @@ namespace IO.Swagger.Api - - // authentication setting, if any - String[] authSettings = new String[] { }; - + + + // make the HTTP request - IRestResponse response = (IRestResponse) await ApiClient.CallApiAsync(path_, Method.GET, queryParams, postBody, headerParams, formParams, fileParams, pathParams, authSettings); + IRestResponse response = (IRestResponse) await Configuration.ApiClient.CallApiAsync(path_, Method.GET, queryParams, postBody, headerParams, formParams, fileParams, pathParams); if (((int)response.StatusCode) >= 400) throw new ApiException ((int)response.StatusCode, "Error calling LogoutUser: " + response.Content, response.Content); @@ -745,32 +737,31 @@ namespace IO.Swagger.Api String[] http_header_accepts = new String[] { "application/json", "application/xml" }; - String http_header_accept = ApiClient.SelectHeaderAccept(http_header_accepts); + String http_header_accept = Configuration.ApiClient.SelectHeaderAccept(http_header_accepts); if (http_header_accept != null) - headerParams.Add("Accept", ApiClient.SelectHeaderAccept(http_header_accepts)); + headerParams.Add("Accept", Configuration.ApiClient.SelectHeaderAccept(http_header_accepts)); // set "format" to json by default // e.g. /pet/{petId}.{format} becomes /pet/{petId}.json pathParams.Add("format", "json"); - if (username != null) pathParams.Add("username", ApiClient.ParameterToString(username)); // path parameter + if (username != null) pathParams.Add("username", Configuration.ApiClient.ParameterToString(username)); // path parameter - - // authentication setting, if any - String[] authSettings = new String[] { }; + + // make the HTTP request - IRestResponse response = (IRestResponse) ApiClient.CallApi(path_, Method.GET, queryParams, postBody, headerParams, formParams, fileParams, pathParams, authSettings); + IRestResponse response = (IRestResponse) Configuration.ApiClient.CallApi(path_, Method.GET, queryParams, postBody, headerParams, formParams, fileParams, pathParams); if (((int)response.StatusCode) >= 400) throw new ApiException ((int)response.StatusCode, "Error calling GetUserByName: " + response.Content, response.Content); else if (((int)response.StatusCode) == 0) throw new ApiException ((int)response.StatusCode, "Error calling GetUserByName: " + response.ErrorMessage, response.ErrorMessage); - return (User) ApiClient.Deserialize(response, typeof(User)); + return (User) Configuration.ApiClient.Deserialize(response, typeof(User)); } /// @@ -797,29 +788,28 @@ namespace IO.Swagger.Api String[] http_header_accepts = new String[] { "application/json", "application/xml" }; - String http_header_accept = ApiClient.SelectHeaderAccept(http_header_accepts); + String http_header_accept = Configuration.ApiClient.SelectHeaderAccept(http_header_accepts); if (http_header_accept != null) - headerParams.Add("Accept", ApiClient.SelectHeaderAccept(http_header_accepts)); + headerParams.Add("Accept", Configuration.ApiClient.SelectHeaderAccept(http_header_accepts)); // set "format" to json by default // e.g. /pet/{petId}.{format} becomes /pet/{petId}.json pathParams.Add("format", "json"); - if (username != null) pathParams.Add("username", ApiClient.ParameterToString(username)); // path parameter + if (username != null) pathParams.Add("username", Configuration.ApiClient.ParameterToString(username)); // path parameter - - // authentication setting, if any - String[] authSettings = new String[] { }; - + + + // make the HTTP request - IRestResponse response = (IRestResponse) await ApiClient.CallApiAsync(path_, Method.GET, queryParams, postBody, headerParams, formParams, fileParams, pathParams, authSettings); + IRestResponse response = (IRestResponse) await Configuration.ApiClient.CallApiAsync(path_, Method.GET, queryParams, postBody, headerParams, formParams, fileParams, pathParams); if (((int)response.StatusCode) >= 400) throw new ApiException ((int)response.StatusCode, "Error calling GetUserByName: " + response.Content, response.Content); - return (User) ApiClient.Deserialize(response, typeof(User)); + return (User) Configuration.ApiClient.Deserialize(response, typeof(User)); } /// @@ -848,26 +838,25 @@ namespace IO.Swagger.Api String[] http_header_accepts = new String[] { "application/json", "application/xml" }; - String http_header_accept = ApiClient.SelectHeaderAccept(http_header_accepts); + String http_header_accept = Configuration.ApiClient.SelectHeaderAccept(http_header_accepts); if (http_header_accept != null) - headerParams.Add("Accept", ApiClient.SelectHeaderAccept(http_header_accepts)); + headerParams.Add("Accept", Configuration.ApiClient.SelectHeaderAccept(http_header_accepts)); // set "format" to json by default // e.g. /pet/{petId}.{format} becomes /pet/{petId}.json pathParams.Add("format", "json"); - if (username != null) pathParams.Add("username", ApiClient.ParameterToString(username)); // path parameter + if (username != null) pathParams.Add("username", Configuration.ApiClient.ParameterToString(username)); // path parameter - postBody = ApiClient.Serialize(body); // http body (model) parameter + postBody = Configuration.ApiClient.Serialize(body); // http body (model) parameter + + - - // authentication setting, if any - String[] authSettings = new String[] { }; // make the HTTP request - IRestResponse response = (IRestResponse) ApiClient.CallApi(path_, Method.PUT, queryParams, postBody, headerParams, formParams, fileParams, pathParams, authSettings); + IRestResponse response = (IRestResponse) Configuration.ApiClient.CallApi(path_, Method.PUT, queryParams, postBody, headerParams, formParams, fileParams, pathParams); if (((int)response.StatusCode) >= 400) throw new ApiException ((int)response.StatusCode, "Error calling UpdateUser: " + response.Content, response.Content); @@ -902,26 +891,25 @@ namespace IO.Swagger.Api String[] http_header_accepts = new String[] { "application/json", "application/xml" }; - String http_header_accept = ApiClient.SelectHeaderAccept(http_header_accepts); + String http_header_accept = Configuration.ApiClient.SelectHeaderAccept(http_header_accepts); if (http_header_accept != null) - headerParams.Add("Accept", ApiClient.SelectHeaderAccept(http_header_accepts)); + headerParams.Add("Accept", Configuration.ApiClient.SelectHeaderAccept(http_header_accepts)); // set "format" to json by default // e.g. /pet/{petId}.{format} becomes /pet/{petId}.json pathParams.Add("format", "json"); - if (username != null) pathParams.Add("username", ApiClient.ParameterToString(username)); // path parameter + if (username != null) pathParams.Add("username", Configuration.ApiClient.ParameterToString(username)); // path parameter - postBody = ApiClient.Serialize(body); // http body (model) parameter + postBody = Configuration.ApiClient.Serialize(body); // http body (model) parameter - - // authentication setting, if any - String[] authSettings = new String[] { }; - + + + // make the HTTP request - IRestResponse response = (IRestResponse) await ApiClient.CallApiAsync(path_, Method.PUT, queryParams, postBody, headerParams, formParams, fileParams, pathParams, authSettings); + IRestResponse response = (IRestResponse) await Configuration.ApiClient.CallApiAsync(path_, Method.PUT, queryParams, postBody, headerParams, formParams, fileParams, pathParams); if (((int)response.StatusCode) >= 400) throw new ApiException ((int)response.StatusCode, "Error calling UpdateUser: " + response.Content, response.Content); @@ -954,25 +942,24 @@ namespace IO.Swagger.Api String[] http_header_accepts = new String[] { "application/json", "application/xml" }; - String http_header_accept = ApiClient.SelectHeaderAccept(http_header_accepts); + String http_header_accept = Configuration.ApiClient.SelectHeaderAccept(http_header_accepts); if (http_header_accept != null) - headerParams.Add("Accept", ApiClient.SelectHeaderAccept(http_header_accepts)); + headerParams.Add("Accept", Configuration.ApiClient.SelectHeaderAccept(http_header_accepts)); // set "format" to json by default // e.g. /pet/{petId}.{format} becomes /pet/{petId}.json pathParams.Add("format", "json"); - if (username != null) pathParams.Add("username", ApiClient.ParameterToString(username)); // path parameter + if (username != null) pathParams.Add("username", Configuration.ApiClient.ParameterToString(username)); // path parameter - - // authentication setting, if any - String[] authSettings = new String[] { }; + + // make the HTTP request - IRestResponse response = (IRestResponse) ApiClient.CallApi(path_, Method.DELETE, queryParams, postBody, headerParams, formParams, fileParams, pathParams, authSettings); + IRestResponse response = (IRestResponse) Configuration.ApiClient.CallApi(path_, Method.DELETE, queryParams, postBody, headerParams, formParams, fileParams, pathParams); if (((int)response.StatusCode) >= 400) throw new ApiException ((int)response.StatusCode, "Error calling DeleteUser: " + response.Content, response.Content); @@ -1006,25 +993,24 @@ namespace IO.Swagger.Api String[] http_header_accepts = new String[] { "application/json", "application/xml" }; - String http_header_accept = ApiClient.SelectHeaderAccept(http_header_accepts); + String http_header_accept = Configuration.ApiClient.SelectHeaderAccept(http_header_accepts); if (http_header_accept != null) - headerParams.Add("Accept", ApiClient.SelectHeaderAccept(http_header_accepts)); + headerParams.Add("Accept", Configuration.ApiClient.SelectHeaderAccept(http_header_accepts)); // set "format" to json by default // e.g. /pet/{petId}.{format} becomes /pet/{petId}.json pathParams.Add("format", "json"); - if (username != null) pathParams.Add("username", ApiClient.ParameterToString(username)); // path parameter + if (username != null) pathParams.Add("username", Configuration.ApiClient.ParameterToString(username)); // path parameter - - // authentication setting, if any - String[] authSettings = new String[] { }; - + + + // make the HTTP request - IRestResponse response = (IRestResponse) await ApiClient.CallApiAsync(path_, Method.DELETE, queryParams, postBody, headerParams, formParams, fileParams, pathParams, authSettings); + IRestResponse response = (IRestResponse) await Configuration.ApiClient.CallApiAsync(path_, Method.DELETE, queryParams, postBody, headerParams, formParams, fileParams, pathParams); if (((int)response.StatusCode) >= 400) throw new ApiException ((int)response.StatusCode, "Error calling DeleteUser: " + response.Content, response.Content); diff --git a/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Client/ApiClient.cs b/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Client/ApiClient.cs index a4f9276c882..4aadca23673 100644 --- a/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Client/ApiClient.cs +++ b/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Client/ApiClient.cs @@ -64,12 +64,10 @@ namespace IO.Swagger.Client private RestRequest PrepareRequest( String path, RestSharp.Method method, Dictionary queryParams, String postBody, Dictionary headerParams, Dictionary formParams, - Dictionary fileParams, Dictionary pathParams, String[] authSettings) + Dictionary fileParams, Dictionary pathParams) { var request = new RestRequest(path, method); - UpdateParamsForAuth(queryParams, headerParams, authSettings); - // add default header, if any foreach(var defaultHeader in _defaultHeaderMap) request.AddHeader(defaultHeader.Key, defaultHeader.Value); @@ -111,15 +109,14 @@ namespace IO.Swagger.Client /// Form parameters. /// File parameters. /// Path parameters. - /// Authentication settings. /// Object public Object CallApi( String path, RestSharp.Method method, Dictionary queryParams, String postBody, Dictionary headerParams, Dictionary formParams, - Dictionary fileParams, Dictionary pathParams, String[] authSettings) + Dictionary fileParams, Dictionary pathParams) { var request = PrepareRequest( - path, method, queryParams, postBody, headerParams, formParams, fileParams, pathParams, authSettings); + path, method, queryParams, postBody, headerParams, formParams, fileParams, pathParams); var response = RestClient.Execute(request); StatusCode = (int) response.StatusCode; ResponseHeaders = response.Headers.ToDictionary(x => x.Name, x => x.Value.ToString()); @@ -137,15 +134,14 @@ namespace IO.Swagger.Client /// Form parameters. /// File parameters. /// Path parameters. - /// Authentication settings. /// The Task instance. public async System.Threading.Tasks.Task CallApiAsync( String path, RestSharp.Method method, Dictionary queryParams, String postBody, Dictionary headerParams, Dictionary formParams, - Dictionary fileParams, Dictionary pathParams, String[] authSettings) + Dictionary fileParams, Dictionary pathParams) { var request = PrepareRequest( - path, method, queryParams, postBody, headerParams, formParams, fileParams, pathParams, authSettings); + path, method, queryParams, postBody, headerParams, formParams, fileParams, pathParams); var response = await RestClient.ExecuteTaskAsync(request); StatusCode = (int)response.StatusCode; ResponseHeaders = response.Headers.ToDictionary(x => x.Name, x => x.Value.ToString()); @@ -286,63 +282,6 @@ namespace IO.Swagger.Client } } - /// - /// Get the API key with prefix. - /// - /// API key identifier (authentication scheme). - /// API key with prefix. - public string GetApiKeyWithPrefix (string apiKeyIdentifier) - { - var apiKeyValue = ""; - Configuration.ApiKey.TryGetValue (apiKeyIdentifier, out apiKeyValue); - var apiKeyPrefix = ""; - if (Configuration.ApiKeyPrefix.TryGetValue (apiKeyIdentifier, out apiKeyPrefix)) - return apiKeyPrefix + " " + apiKeyValue; - else - return apiKeyValue; - } - - /// - /// Update parameters based on authentication. - /// - /// Query parameters. - /// Header parameters. - /// Authentication settings. - public void UpdateParamsForAuth(Dictionary queryParams, Dictionary headerParams, string[] authSettings) - { - if (authSettings == null || authSettings.Length == 0) - return; - - foreach (string auth in authSettings) - { - // determine which one to use - switch(auth) - { - - case "api_key": - - var apiKeyValue = GetApiKeyWithPrefix("api_key"); - if (!String.IsNullOrEmpty(apiKeyValue)) - { - headerParams["api_key"] = apiKeyValue; - } - break; - - case "petstore_auth": - - if (!String.IsNullOrEmpty(Configuration.AccessToken)) - { - headerParams["Authorization"] = "Bearer " + Configuration.AccessToken; - } - break; - - default: - //show warning about security definition not found - break; - } - } - } - /// /// Select the Accept header's value from the given accepts array: /// if JSON exists in the given array, use it; diff --git a/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Client/Configuration.cs b/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Client/Configuration.cs index 4168d69a2ea..9a6f7aac3aa 100644 --- a/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Client/Configuration.cs +++ b/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Client/Configuration.cs @@ -23,37 +23,65 @@ namespace IO.Swagger.Client /// Gets or sets the default API client for making HTTP calls. /// /// The API client. - public static ApiClient DefaultApiClient = new ApiClient(); + public static Configuration DefaultConfiguration = new Configuration(); + + /// + /// Gets or sets the default API client for making HTTP calls. + /// + /// The API client. + public ApiClient ApiClient = new ApiClient(); + + /// + /// Gets or sets the base path. + /// + /// The base path. + public String BasePath { get; set; } /// /// Gets or sets the username (HTTP basic authentication). /// /// The username. - public static String Username { get; set; } + public String Username { get; set; } /// /// Gets or sets the password (HTTP basic authentication). /// /// The password. - public static String Password { get; set; } + public String Password { get; set; } /// /// Gets or sets the access token for OAuth2 authentication. /// /// The access token. - public static String AccessToken { get; set; } + public String AccessToken { get; set; } /// /// Gets or sets the API key based on the authentication name. /// /// The API key. - public static Dictionary ApiKey = new Dictionary(); + public Dictionary ApiKey = new Dictionary(); /// /// Gets or sets the prefix (e.g. Token) of the API key based on the authentication name. /// /// The prefix of the API key. - public static Dictionary ApiKeyPrefix = new Dictionary(); + public Dictionary ApiKeyPrefix = new Dictionary(); + + /// + /// Get the API key with prefix. + /// + /// API key identifier (authentication scheme). + /// API key with prefix. + public string GetApiKeyWithPrefix (string apiKeyIdentifier) + { + var apiKeyValue = ""; + ApiKey.TryGetValue (apiKeyIdentifier, out apiKeyValue); + var apiKeyPrefix = ""; + if (ApiKeyPrefix.TryGetValue (apiKeyIdentifier, out apiKeyPrefix)) + return apiKeyPrefix + " " + apiKeyValue; + else + return apiKeyValue; + } private static string _tempFolderPath = Path.GetTempPath(); diff --git a/samples/client/petstore/csharp/SwaggerClientTest/bin/Debug/SwaggerClientTest.dll b/samples/client/petstore/csharp/SwaggerClientTest/bin/Debug/SwaggerClientTest.dll index 3e3230fe96b0ef4d060a947da417add0a8f6f663..ae066cb249554168371a07caca13bb036d9641e7 100755 GIT binary patch literal 69120 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 R$6Nh8Z-w3U?s3OS;2#X7)~Wyi literal 68096 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 literal 21165 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 O0+`j~4rcXufd3CxL^^2z diff --git a/samples/client/petstore/csharp/SwaggerClientTest/obj/Debug/SwaggerClientTest.dll b/samples/client/petstore/csharp/SwaggerClientTest/obj/Debug/SwaggerClientTest.dll index 3e3230fe96b0ef4d060a947da417add0a8f6f663..ae066cb249554168371a07caca13bb036d9641e7 100755 GIT binary patch literal 69120 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 R$6Nh8Z-w3U?s3OS;2#X7)~Wyi literal 68096 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 literal 21165 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 O0+`j~4rcXufd3CxL^^2z From 6405fba66384be6762db026edeb02814397f39c1 Mon Sep 17 00:00:00 2001 From: wing328 Date: Mon, 30 Nov 2015 20:12:58 +0800 Subject: [PATCH 078/211] add test cases for configuration --- .../resources/csharp/Configuration.mustache | 6 -- .../csharp/IO/Swagger/Client/Configuration.cs | 6 -- .../SwaggerClientTest.csproj | 1 + .../SwaggerClientTest/TestConfiguration.cs | 54 ++++++++++++++++++ .../bin/Debug/SwaggerClientTest.dll | Bin 69120 -> 69632 bytes .../bin/Debug/SwaggerClientTest.dll.mdb | Bin 21310 -> 21678 bytes .../obj/Debug/SwaggerClientTest.dll | Bin 69120 -> 69632 bytes .../obj/Debug/SwaggerClientTest.dll.mdb | Bin 21310 -> 21678 bytes 8 files changed, 55 insertions(+), 12 deletions(-) create mode 100644 samples/client/petstore/csharp/SwaggerClientTest/TestConfiguration.cs diff --git a/modules/swagger-codegen/src/main/resources/csharp/Configuration.mustache b/modules/swagger-codegen/src/main/resources/csharp/Configuration.mustache index 71e4e51c458..be02678bcbf 100644 --- a/modules/swagger-codegen/src/main/resources/csharp/Configuration.mustache +++ b/modules/swagger-codegen/src/main/resources/csharp/Configuration.mustache @@ -31,12 +31,6 @@ namespace {{packageName}}.Client /// The API client. public ApiClient ApiClient = new ApiClient(); - /// - /// Gets or sets the base path. - /// - /// The base path. - public String BasePath { get; set; } - /// /// Gets or sets the username (HTTP basic authentication). /// diff --git a/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Client/Configuration.cs b/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Client/Configuration.cs index 9a6f7aac3aa..a1b79cec0c5 100644 --- a/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Client/Configuration.cs +++ b/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Client/Configuration.cs @@ -31,12 +31,6 @@ namespace IO.Swagger.Client /// The API client. public ApiClient ApiClient = new ApiClient(); - /// - /// Gets or sets the base path. - /// - /// The base path. - public String BasePath { get; set; } - /// /// Gets or sets the username (HTTP basic authentication). /// diff --git a/samples/client/petstore/csharp/SwaggerClientTest/SwaggerClientTest.csproj b/samples/client/petstore/csharp/SwaggerClientTest/SwaggerClientTest.csproj index 00467e845ea..3452fb823b6 100644 --- a/samples/client/petstore/csharp/SwaggerClientTest/SwaggerClientTest.csproj +++ b/samples/client/petstore/csharp/SwaggerClientTest/SwaggerClientTest.csproj @@ -56,6 +56,7 @@ + diff --git a/samples/client/petstore/csharp/SwaggerClientTest/TestConfiguration.cs b/samples/client/petstore/csharp/SwaggerClientTest/TestConfiguration.cs new file mode 100644 index 00000000000..9a41dbbbf38 --- /dev/null +++ b/samples/client/petstore/csharp/SwaggerClientTest/TestConfiguration.cs @@ -0,0 +1,54 @@ +using NUnit.Framework; +using System; +using System.Collections.Generic; +using IO.Swagger.Client; +using IO.Swagger.Api; +using IO.Swagger.Model; + +namespace SwaggerClient.TestConfiguration +{ + public class TestConfiguration + { + [Test ()] + public void TestAuthentication () + { + Configuration c = new Configuration (); + c.Username = "test_username"; + c.Password = "test_password"; + + c.ApiKey ["api_key_identifier"] = "1233456778889900"; + c.ApiKeyPrefix ["api_key_identifier"] = "PREFIX"; + Assert.AreEqual (c.GetApiKeyWithPrefix("api_key_identifier"), "PREFIX 1233456778889900"); + + } + + [Test ()] + public void TestBasePath () + { + PetApi p = new PetApi ("http://new-basepath.com"); + Assert.AreEqual (p.Configuration.ApiClient.BasePath, "http://new-basepath.com"); + Assert.AreSame (p.Configuration, Configuration.DefaultConfiguration); + + } + + [Test ()] + public void TestDefautlConfiguration () + { + PetApi p1 = new PetApi (); + PetApi p2 = new PetApi (); + Assert.AreSame (p1.Configuration, p2.Configuration); + // same as the default + Assert.AreSame (p1.Configuration, Configuration.DefaultConfiguration); + + Configuration c = new Configuration (); + Assert.AreNotSame (c, p1.Configuration); + + PetApi p3 = new PetApi (c); + // same as c + Assert.AreSame (p3.Configuration, c); + // not same as default + Assert.AreNotSame (p3.Configuration, p1.Configuration); + + } + } +} \ No newline at end of file diff --git a/samples/client/petstore/csharp/SwaggerClientTest/bin/Debug/SwaggerClientTest.dll b/samples/client/petstore/csharp/SwaggerClientTest/bin/Debug/SwaggerClientTest.dll index ae066cb249554168371a07caca13bb036d9641e7..955673ab9a4c4eadbfa919ec3f3189c07b3961a4 100755 GIT binary patch literal 69632 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 R$6Nh8Z-w3U?s3OS;2#X7)~Wyi diff --git a/samples/client/petstore/csharp/SwaggerClientTest/bin/Debug/SwaggerClientTest.dll.mdb b/samples/client/petstore/csharp/SwaggerClientTest/bin/Debug/SwaggerClientTest.dll.mdb index 0d05b783eb133d2be42d86fa4af7ee5a4106bc70..bf97cbbd6cb5fa4980158579343115d41bb7152c 100644 GIT binary patch delta 7924 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 NG(c`cDv!4V`9FnPU0whH delta 7710 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 PB6VbG(m<9Woyq?JneQSZ diff --git a/samples/client/petstore/csharp/SwaggerClientTest/obj/Debug/SwaggerClientTest.dll b/samples/client/petstore/csharp/SwaggerClientTest/obj/Debug/SwaggerClientTest.dll index ae066cb249554168371a07caca13bb036d9641e7..955673ab9a4c4eadbfa919ec3f3189c07b3961a4 100755 GIT binary patch literal 69632 zcmd?S31C~*l{bF%WXY0j%a&w2&PJS&fJh(<2@r<>aaK$NNyx$$NQA8<2FD7r3<=K) z4m)k2P@tt#mat8sEp4G2p<4n>3N59fbfZJs0EM=6??;)o)1m+0@7$~Ro)!nvGV?Lt zKcI8ZcDHlSx!Ze^Pd)oahs}mkA2j)_}gPw zZ0PQ5-IUF&&!#rEcBXoJGr89D)2-S5-q!Bk*7-}8w{FaIr6Cyv2B(Ls4E{tU3sO7bBfA4 z0vA|GWQ{0mYZPrwHe&!Se=>n&;)jjMKMOw|^7}Js=7cyg z)u)CdMd2~8My3l2k(rRVdZ?M*k6AXfs|vz#mOoE=BFYM@PM|PpOl5&=iu3`G)CjB< zSSK)1)rY`{Bm#|zV9WJkR6n6PTZ0VuOc<6uifN+S)7)5f=3=xX5sHP{Mxzno?5WTx zSI7iVXm$1+2(#S)LVMKwnSK@%)U3>PAd-lK$gFYfXE@u(j30E0)(S9UBmqsZp9$ zAp>mUWFW3H$gt4fel-o1z?8AL^5@%t#+8*nUeaV8^z*X?A7C;euINLPlJJ0t9{d0Q zjMuP(8?WaNcDzi6cQjt`QW>ufGhXlWjMrj4UQ9S%2)E+#`Upl4F3b4xy*J{^-!=+9 z7|KpSdpr^1&mfwDo(TM>!mat>hHpCBa!}!BGE^QuPp@L(y_nHPCSwSp4Az-oj$}g5 zg)u}`Atn*zGR9|_F~*#P*i6P5ldJU@GvOGcgh|OpPfWUF-2WaM<6GZDV|>@aj%9@?rk!nL(a7rTMzqQk7XIy+(?*s?e0B@8G9N%UxH9UM7HbbzT1pV0Wy@;C zIFH04rOT>jWUpf}5zn%!akH#yCB3W`XK;NWk|C}$csdk|?8WkFdE%U8qDEHUSdAO! zSkc7?HW?on&_00uStO6`9{gf}34H)2nv`tu#QC%E0R(?c>7AP%`mdu)@3EoRGkp1= zyW?FY+p<_ycD}#JFREOXKtZKsod~!p+W!C4I&qN8{Ap2LO6~}BL)}t6i_(#(x==TcIOf8jRMm59P+kpf*kajYG+Rs} zU9oI2m@T%F7H2Ya;gK}piO6FO5GHZnip)BMtr#YwWy$eg3#}w}m6P`UE2UZ+iV?Y< zsIjW^C$SXEW|E&pyiv1k5}r*K%!NKWOu4@>v~!2yq4oZ0A2O+Z2sl-1{7APflpKRL z?2EHZ?O&RoYy}$^5$)&@|G^K{9JtzP_^=f0m3+r)Rey4v)-CqgQ_*VrEYkz{>>Tz~ z`z+$8fX;Q%c`iC%Q1RIXL>u!9nGE5xizu_~_aX86EZN#;Po{!RXndAc8J`_8m+@J) zwcKY*b9F#V`>Zt7ZA-b&O5Glxb&AreMLz4uvq3FYf+ zG!I?LXWf<+`>e}LJ|v#iSa?2x&P&$6whK5L)l z7R3(etD>?7P|I@|aOLHWEDh>&Cts&k6&%@-8AqmJn=M-`X^Wj~F{Le5w8elnyWw%< z^FUeyghh_bA+!c~kE4ZFvWAZQU5=vGE^_2GRJ3d+`Ll^P=7nXGD05_ondRk_rIkF6 zEOOH3@ao#jbd(B}ZmVkDdAiQ{q3%RDIUdFBOR)LcKQ%v;oFJ30cb*=EtKNW*XP%}V z{K>;aRdJqneSRZE^m(S0eV#X6`Lz%mpHI2y`7YY&qFsWD&!>qt=GQS9!spjhX4w}a z@%lX3+UGY=!6r05&#H{i51GsOJlk64^WAPy>_Aqo&dM47V# zN&W)jjd@|&B+7i=VP<(*XK5w+xI8rR&;_3_?I;U)2R`q1qS)tM{yX$}+M&qjUqwtb z$UMIlBKka2*XQ5lJpTlgFhgvDgx)yh<)0Gw~1w~pm|E~ z6+LZrZx{2ILesJd^(A8qibmPeR^BvfnYnHB6k(!+_C<7vL2WUYWVLKDrY&}qhI*po zGFCZ2SQH%`Y)fwZw9w)ytgs@8c2RT;Qr)td_vl0?=?$S1h*66WD>;{Rs@$HN*)3JL|ECoCVT>J{U|=3H6f20{YfZNnQKC` zzi{5X5hBJ1Q#U?v-L3Y$A@N~vgG8Qbm)?w;xVRj06Bk#w=#?&dm5W|2sKmuJL>u$h zG8rN+uA|JdZ$RRW3$k@wyq^j-p@|DtW#VGUTqZ8q*3!6;zM7&$u0x`g2C{`Sqi4_jaaLbmFu*J@{423PDV9Nm5?4c)C?g42H5EjJ> zy~G;W;Rr3h6;e2Zi*`}0+)G8vW|F^?cw=5zHi@!WahO@&iCbF96DuMgDpuT<6~~Ip zuM{g>clO}pi4}IPC{~X07h>ge5HVJmy0LNr^6#sG5@O{(NGimNd#P?^d8?kkA9^NM z{?$c4?xGL4=!1evtbBrKWB!v&hKQ9Bk{%x**aDpqJm9mVue+iSQ#>xi50fB zELNO8n^+Mg9V?~fQMD{qKJ7MzUDX%&WgVcFH&#BwTvKUun^w_x`6amwld7IueOIYG z%)}O+FmpPfRg1#Rk(n^#m|{tiL9}IvY#Bvc22fgQ*))zP%svm&8XznRGdh?hx9?hL zB^%r@6YWDV?>pDCU!b~WGs%CJcw=5zHi@z@bC_8^J+QQrC(J}XRG7IfD-JW4UkJ0J zJ>LI8jPSKmPnQFP=7 zen$}vEqX_hw0=kNLLU}P{+~S=cKhcZj5&=N>K(;W1qs0NcND4So@n0YeF>+`;6c7G zaRDDo9nAX@CPPhOpM%WA%>g6nGz9NUgp1#cB3bgj#1RPcIPA`M6nA4Z@H}b~3d=t( z_y7|=qr%WkN*)ElMCkLK(q$O0gpAjH@2T-JPTG&5<2$8}F@gvAu<&afm4kUX)MRi+ z#rqb5ry+P-t+x2IN7D1Q8ttp!A#Id#@#nuIV`1f=)8jLlH#;-_N4ZgBnDW;awQS!WcH0 zG5moU!h4`{#`x`93ne^1 z;;NSaBE)86`Xv{A)J1o?=wpJ)#`McX8}nabGQ`I8tCU&xZY1uUXW3-yjp^5@U=x~+ zDXTIY(;;)2jVaq&x-s?C7ccO!B*kH|B+9lPKHdIm|5A zVoNJ|HhCgmws+1!pWoIk%db?mmlJ2mp-pw1eaTh&v4~DuYVjB z`jgns74H1#mM!AD&qGAtW$OCwMfBYhp#$_xY-+h(}HlgudR%Lv5$Xv#E+17I3EzQLhRzI(ohL$&my~puG zx@(J$E&a8ntG4vgW?df7{2oYafUw9jX=iKTyN=M}cYz9?DcVJz`F$!{Hk15b;*EJ> z*(Az5(_v=0AF;HO$1_Fl^~_RBP@&QWrNlGcPK1-kdOXwRhmyz9+q`#Y6W~tM@$vX2 z&EQXBRxbGEjgDWw0ulX^sq2?_(=U6)FYO;d;<<}p1zk$e5P)TmT=2Y&2!qS%jJeg!|~+}eqc z$B$`-B0uheJSy|+|AB~p%(TRh=RyfrEZlo|{Mg;$89)9x#Kjjd@|&B+C5QVP?54wX_ob);ysQIq6DIDBPA6UkADTWNYahI}t856CaOn zvTK#^f=z?t+}g40RV&svyo=ei!7Zx!+fHSO&3=a zKIXA|T-%)q?GDwU?7kK){D05i-+!=nHyPfE-A5X`k1=*1>#_SdZFeTLJ5-D9emUlu zQ8LfG_#Ux);d{GppgmU7nP5D(VftG+p=>Z*q~TpH-F%g=qKCdOYeAt0bzf#OR30c# z2XN^b#xn}fSNBMIFFiSbwP7L~ZN_toj9pb8KZPLk*wK9y^Y-cw`=>>(Y|xFeVNd{ z7?R?+;ob5W#*O!G`F6C^+)Iv$yf>^~xLY1NnmjIgu;bE>P99XOm<*N2#nTYPN(DS8Y|N7Rq>8dE6Ist)I;?JYA0=6OJKYn@MUNsIS+^h0*lYbK%b#u7?4;THji~hw$|0<{)?*Ef$WBzYU zhB(~+7iIWeAk^>1gJqMg5BG0T!6q~(a#m#y_e16~hkLfQ^l)EZ7f&JjUR4@euE5^o zURAnli;gY*wWX`J^wMTso^yN^I%EwH7MiIrm$=hW#@Q@ndMo`(n_9lyvT<-$Ga^nKF7O!`cd&+>0dEFhlW> zUt79rOD}EKkN*-Sm`B1**wyfCKT>d-qHFmAY*FK4P4}HXQ^%)S+*O+=|a|cxa3M zzWj95=TFWRRr$_M0&=}ioCgtooT=;MOX=f(0DzD479)Qg#AZI7>7s2eI?F|m7gT(F zHqplX2~38VPfw)GvfGh(eVlCV<0nzUCNz%8s*H~hnalV%+gj@5<#n-h@H^>^Ep4@> zJGS)1mQL6#%HwzQL0SWZMSe#!S_5+(p~WxC7M5nwF7mqtRJ3d+`8mWJ^TM)8l=+>* z%<`56U%;o5$L}1v(&HSrWyRB_%h%Io(Yw7bzy*GekH?qTx1#xy&&&~Am@k(@L|CG*UDAtat>jqa_DmF2Zfei7ux%}#dF4i`PeMc*f=xY=T&jrmiV4B=*{QD)i8 zka*pUZ0%-Cs9+NsH)B=C&4$cn+>C84bu*iNHARVBPo0{xqRi19W|o(4M#H?wf@_h{b-w>t|T z&ph0TwiV68?mHhji0HpeUH`qC{%hX(SPzNEf885A5XyXB|kr})d6M0cZ zLsC+rY9>5F#jB*Kx?tR|i}FiREt#cKR+TR62Toa4#bpI_SwUS^P|8XKg7JVZEZ}Wd zu(YgTQCX&_kS;2ui>eOBt94P;x+pvbK^H@%MTLrriUxJFBD$=IE-M_2hjm$DT^8Q| zL0OT~vLeN0RcDq%FHt*l4$W1YTtNz^uSu>1mRSW*z|ZjDXL|6nsCYKOVaR_D(pjH( z3|jkEbAvND(W*AOSWteYK3X+Gk3uj}HxpbHtAjf$ABNge&1!mwxHa&UnsI9Ze@M-E zseu1k%{bCW4}i{m-;B)#{6^oZ*EG&&%a=ob1pUqOR|TR~(Lgj9t&WD08_^E@rr|my z!OUtj8o%r&GehzMuz;Tn-qtYu_NZ9nTR|JlzVpBuBun^PBL(4rBP2`s{B4Ix$sP!* zYo&J~bdJv}deI)B^3KmC2>LjtsLhfF@>?X0R^>0%NFZ-(B$yx2NOeB1kx+iCAXa{x zq{+2tTmEvv2bl0-2kM!WJRgFICz>epSIN9DZSnE9v}E2;{^X@-sVCn3Y7u0UXt%0< zgsZP@9B6-4atrjTa^&z2Iz%`hML0J_A~T1%8rhdHks3C*oTx^k@1F;HB+K;oV}9|q zac%bBPc#x&*}7Wf!FWV!W?oN0KU(Q)yBMg-#vrTBCIIV{KSx1kJv0-6nIj;M1u`2* zRjE*{D$@-#%u$TgQgR`XSwE&jvVpNce=BlNNCew3Z>d;NPaC0724fW&c2)*{fdwO8UbUEE4g{(Xz%bzEfMZH;9_#v2bz| z#BCudscz<6WUJcSSS-As!cf}{Op@DSGWkMATZH6A$UPHNxfUdklvf)Q)v@Ye@)Ag6)x-NXBdweH zQ5F*H!924bls{!s$UWP0)ky|zD>!2E4Shc4t_@^!lf5&5lO0X=(>O5p( zwaR}(_bj?gV`SzumMIfhau5ac%a@a+BH=}5qGBbE>Q7?oL0EvM|0mEk`n!~uyaFOC zb0rJ7%B#gWBCKEs_9LdYUV})U#j$M8{to79+zTJlZyF50ehvzo&^%^rWAYjlfj|1u zT)seeRWi9Lma4T9cUOelq9hf zS5xQmXIS;T_+g~5E#~Q23_g_&)WOGZL@AeA5}U1WVIWTseJgnr_>q}i(9^<}v->^- zR!wv5%;T6_b3yu72gsSVcz!3?Nne#7a2|1n z&)EZU{HzRGTOv!KRxSGoWD=52Wv{sy!I6s37$2Wx@Qgce;=+X(00q_oNn1% z9xR)S1AaY9AlC)_WRXCw2$s#|z_Pg($cmP~jI=I5);7x~CvzLygm8}JucX2NVe(%< z7k&bjjj?3m&_XMDBpiF+PHB%;zn$3!sb|_p+_PkQxw3d(1-UGqExy9yN!C^YR~LlC z9U)m;3EagKKkEd#W*?g2o(SExhLU%nQH4uhmtUQ{6a1q4jA=0KN%$}Z8Q=I#R4$YL z#Odp%j=t!_;#PwYICp1^{PcfYX-aQjq zk`Ex$Jrjm!HSy-ls|I)<^c3ahl^(Huo#kNXz6uJXkmk8!02o2CblJZ5ijm9fzea6+g1zN%`QrKNkI4mgED(vN0KRjLLYyAFm@=Kn+QpVw? zJrKwJ@B%A|nbX}J)5k3Jb?6*N9l!Wdb7Uq41*&Xs4Nk0&qD+5=R4tCIq^8HgM$r+_ zOy2TM@-@$z>Ex=z8I}CDH4ZCL6~~_$b4>77bAV?lOv;hAS)#;#`?;(IWx!^Qb+~O@ zkgTMuka-N*P~#-uFu=mlN?*=^D%yd-9&-fFM1?L$V@5z09Mg8TW}`2r5no1WXF{13 zv>~TaBAL-LY~{dKVaI(?m)CzV6BqdgY1e;_L3=D4wHN7-c6HiBXJm;EX;){K=!`1S zA?@nud2V!x4ry2Ccq!+Q5*^aiu~aPzDe~uUxX$PGXRM+_`SYuV92S?ap|t+uYVDvF z%r-Jp78{9r6DL*@6K!xi3|B$xC|3*9V1)>p=PF=M3~q;QD-`o?#2MyjD~UO;8;o8(Ty`w?Cx5@P1L^&?dsT(fNv0C}aeeIV3TWgp*$d z0-A}QNOXmwSc4lI3fk~w02K1x(iAi!70B1Da5GkNOUM~f-?S;Db#6&~9K^HGR`Bt-d zrZfbj4<$OHKSSu9(nzgZ>7I#LJeJ%o?H4j0j|&Nd#gdP+sc}iX1{1|Z zJRt(P<*<^%Ym7JgGsMK{-)a`uXFDs;p^dQO3G`Dvhtikmo+WcA+2wO6y~OcK)MMsS zaUQGyB{S|0$i)|Bh+TEz!zsW1T6zW7v#XUx$44)8=4U)sEeW9`JAMg&y8K^ zl(eO%D6tp3(HKb=6?A{NsPg_{OvzkI+MRDtl=-%`M2EDi1CwKo7+a!4+SNHpbjFqF zkal(Eh|ZxUI;344UDx;$9n#dX)Sp$!{C{p?>O8DyKl5oAbcp@TC50RocXYw>N!_#I zd4vkLVi<}xJU6)|e7<4{54j3hGAdNzSrIVRRjA_KnCo$fw>UwS&h^`25^e9#5FS4kgQ^Fk?N<(}Wjsv>+rBSc4u(HN z=$*1iw_zAif~%mXEJQZA93p>)&{RaU?eY>?5~sgOZ9T%}nEB}!g&aiNmX^r)yHb

M%ru;U4_aUMEdqOP{B;Zh?(08!%;G~nQP#%rAzi97sYHi#sm_rlI;2Z=aP3gkFVe0Kc6(TZCzt4urj8|dZbfnNLgl#l zCJa49T>Pn!!%9BG;V4`7>KmNH&a)L2CbT!kN0RJg`f z_z@I_IJXV8yoxOw5F=Qka4&J-JBxaT(mqt;obvUZ#XJk|$S}WiXTe|hv68gC8{?$j zNsLp^iSbut=_E_XII*%A|C%Uq4E-5GZ;X>}yQ4%wuapDZAyuP&W8JF6h<%bX9&I7NVol2W-3=fXM0(=^bLQ8(3_2P+wKwt zolT#4=rR5bp*I_8bLMdsbhexnMn961fIcJ&$y2F0BnI>$F<5p;6h$5hg%1AmgT7zC*a@Z0R%GqoLx2U~ew>js0_`#Dj3PSCFs#hEkMcN0KO^_ZC#Xw92JR%f3x zQ%Z2y^|reIyzTRvPc7|xD~q0lFQ4!b@ISD(-vzNhagVEK7TY^lp}PNVdY+FHrwz=FOyMHN}&OY$Av^Jv0uj z8PFOtbNe|`CE4z6t*(q?6q3_~zNTdhCcG7l@;}m<68Tg8Q4O(UG{~+pUtlak6EQKCd z$Fr6ydH>*Kk4>@c-#Db>?p1G>4AfY)R=ivtPDJPxEau}gTiuCAXHF-9j{A$ zo^nLqB+Ukg7d1LZF#9|lko)hTQxq1`NZjEiWO>KnYO`ag6>_zl zS~&-wi#jdwzbnx#JUKlA+L^0?2eS)^UQ1M-T4z(Bv)7OrVh81^wPrr(FoovZG{Nkb zz?5d``QGCBTCbPcpF<=|D$LXbUHN%7`S~>wNiHqfib$zS{*cC!Gr)S3vDg#Cdg-mv z%GFYsXqV=ehrhKU%}!$b5(&woT^E)-A<3k1kIqCjcljxJUkyQuf3^5rJY(|I$*VjcsY4g7 z?7+T3T??Aew-24$lR2Nt_=mA*IAhE`;cx`RUwzZ@DyY<+0-3~zhXHQUUjsfGpC9A1 z5T8T9gI)Od;`t6U{YY`<0$X9USPY-(;@^ixk_V%!b9@_o5w+9zq%VlS5%ec3sLu5h ze%rqRoQJB2KUMWgRYZjY)EO4|lNC{OfJfE2fu2B6-4b{h@V4M9RYCQ1@Y!Hcy(+k> zX5PsHQ`MAST21MRp#`C!S`uQe3j}^3MCrZ|_1_ZC^e}52R`Vpyq0~LQcL}lYyV`$)p@nuwLx_`_(ApETGqQy;D6To>Vm4V zj<8kWiFJRnqH0UsWpz;%(g#R1hL6vA= z$&&!1s$K9^4Sz=YU4nnRf$jONz|k>kjuSXr;NlqDcDca$7}G=4$75fO9in~=*sOjV zJ2yH`9UWg3AE(X`xK7|^fj0pL)u-bu^Q(Zv#O6U&-$>4w7Q&Gu9}ZmRo5D3xojCH9 zDteOkCq~KLpoU|V$m4$vYAmSXz+xgxip)}ni|lBT@tsBHJ6>ddJVj!@`6BbHQ-wMY zzCB!3sZOCbfJ(vB`8ya5s$XPv>Pn$*QCC27n7T=*JA@jpJ|@(?LXA-m3H5QICg4QE zQa&lv;p%Cj_NdRIlqu?`LcOk@1vORuLZ}wspM`o|`SBv(lL4jreN)wMg$h)YnxlR% z)EuFfsy_;~O{lf%4WS+qYLj|XsGke94Np;6W*7n6@4H$3Rj5OSx=;O0sMB!L>GypR zduM81DAXR9o7B}p{Xkhl-7C~Lj5K^VJG< zmQcs}qC)YH%=G&f`Wl4#kWj09aiJa(YQ3*fs2ed^_WLeDsaK$7bL;6B*Z4;Gd}<;- zUN}~D_yXWu;j06@1KK|ItgjL9b?{@Vt+qWBQ%eASs>UM!FnH#w!TDAlX0^o@-k($F zsS)6(!0{D{py#20N`H)MuNmg2|P0Re&Dl%)Hx-1GhnCSnW~Qfw}T%8ye@bb;0J^E0)8e) zTWt#k{66*l5T)4(OKM{W(=-q0+{f^7;t~%r&w$fA89G4fWy`%7lioNK@ zxc{SLF(`R+0*ftHdBp#j9$oc6QpMkZFyj9+<-eQu&s6=%W1qhOf4AqTwt#E@|9$0uUA*EcfrU}l zz4#IORqjRqSQHeOTzPzTOWuw0&kI&+`9D+sJNKf0rj~bNrKfNe}I??t#q z?-$N51%FeZuZHV&Z4IRl)LswGFVyPQVFWlI4BiAzVPubqc=tKYYEAuzutVd&J%Lx_ zOQL#*P3m{?l~J4#<=>vbTafu3Dv($il?^#Kdjhe<>L@m+@^4RIT;c+pAPUq>$gt&< ze|rLpAmbU4|MmpVNeo0y<)GFju8v}3C;#>YE>7GM@L=MhXu_c$O*|UKIp4^hNIV&BQA=A%UfuHfs-4v%)rAiATy&JWNmJ_i#Lnu` z>H$OjG;uY4|8=jXLcdD+0j^3i7F)l43zLD6Ot)Qg8}iZ(k;jY?{YHalGHKSEQqSyHu5 z)D&%Yg!MfYiZ+{~S|)3XHk+o_8j3cXu2xLdGTIE+3-WJIV0h!h^>P6L zdQaf6#;t3 zZ=Ots9;1^~tfN3Z7oDSy)0B)+yIO20j?r9|)0B+STy=w?I7V~TZ9=`~V;|{5Jaw|6*oS%Q0bXc8#y-qfzc3X0ut4>kre*BILiH&_u@8$>?NTjcAEW~y_XIxJ zcy)tRE!4j>Zf`h+YWTM&@QKEobwh-Dvhj`vsZ6L>AUl<6__rtUH^`(ip++(rkx(@w5CTIT-oZTM;lf+nwh4@8&*2hrA<#aoZ(RKZ`xUX zmP6gz^oRPhm4!RM!Wf;SMmyAV(ba06reuuHRc9KCV|1Px)Rc_TdFo#b#W6Zh-6zy* zKH6-JdT}*tc+E$ftyQCVWeAEkOQ{v-X^J*GU)^FT+N@JOvqsBkvo2M;R#UWDTHT(~ z6m7O%{mf9bS+}a~)H2$vTg^8VZPu-x>e4dW>;e@^Yl=3zQ0~{*GTLmT+O-^BX#rn2r|uDITj+O9qa!)>DIagb9Vi&79gVGjtOmi&0 zRqZv@3C(ljSF2ODY1t{w7sYQ-s||Hd^RGfTs?CPl(0ob!CiRS=HaA}xzggXWxz6|g z=G)@8sHscfzISPd9zNAu(HkEmya`mp+3^S;n+>J3BfYJMvIQMLIh=KHXEruq5! z?dlhX`VlnmP}{Gj>?ZYc^Y7w!ss{}9dr)_&k6%j}ZM{nEP@i?E|BCNWyB*4(xJSLH zsZi}OU-*9YrlCd*8y&e{sq3VaP;%Itp?_5)gxVHr8x~1?Tpg-qQo{pkh0#1^*wyL* z)oZ9ThV86=Ky5Zu7i15r4;ktr$R1R;8)_?LpHN>k)D4h*LhaI&x^vjCLZ4JE?`K;+ z9C~EfsPL!M3`70fu%^VP)P0&#KZ5Kbb=n80c~i@4!$u??QeB!-zZrH2sB4ANcKNir zQBxsb%MpoBt4|mz)Y1m(^M-n^=4$mB^{k=lTXt4|M*T>rJ?f9OSL4p=%x#ZYrvwkAHWjyBY(EjNIgZK$(bK9cx?T4kv9Ef0cPYp5Jr z{Y7=Dp)N!JzNoG=)cadLm-v#p(@-C2c>>e}Lg~Igs&;))+9G{_RJ|ya?)#%k-AEbx z{!C)0df-E(bl)FSPu)yP_x&-oS5wmW$JFbFV&5NAZy4&nmdhHytfIF_zR<%h*MVv= z6vyZ*>S#l8jJ~2~8|rHQY0!(()LnD-A`vd|lmX zDB9)g>H(p2-*>4`-70O7zVA{`38nkKOZ{3X_WjAm-RjDZP*eB)adpORl20P%akW-c z()Y*JrG{ePA6Hiziv4>+-DxQH?+NvQP`WKosw5t<6@2hXHD4&*mM7H)q1cx1HvXHM z@h{ZWZP}wfB9tD7J!*%hq%C{YV}@c|_NXTf#R&g~`iY?!;onfdFx0PMv!|5xF=MHL@SW99tEq+>2iZ5(DTX={vTv#thT^R8E!Ar%&KloR zn+kkw2X1PSABU0DQ&a8YOki$hT*H!UUmE3B2ycMddg7!LcMs8mR%>* zFYeXUZ9@I+K23dEsKuCiIhtP;YQLeL6YAxUi%h&{ullv7)W3`D%m=)(wVG0Y5ZN<^ zsv5y|Haw_nhzWI{+3#LcL)ppGDSOR#Xt>?KSDk4n%AQkyJI0kgr)p(${F;xl@2cO= zbY*xZ-=-xCR-jzMC-Y^tp-&43M#6Ml%_f(^yDEq!zG1rxSUv(LZvLC3y1+MG| z>PACR_CxiHlU>;l)ncB?SEI}AnHkJXuHy0Rau z4ThrZ-_;vuyRv^*Yd5%MzNo%(fh&7aJ!2^5+o$*i`a)awshNhN>?i7$j4S(zy3bIQ z{Zwtvy0V|DYYj!&e)VL|mF-vGGZbYnsqL4zvX|8DhNA3cwfIt3_Oe=SD9T<@zmUC~ z9-~*(Q?l34tO<4|!ExYpB4m-^E{34Glh(sj3Wf!q?CioIlaz z!!5lRHZ)jj5K_O&8GdEXRUWAq-!6IY@<_d$`=s8-M0%e@EL5_}8Insi#E0fV0f6OM42CI=HhHz87~j->#ki-ECm`g>h%A{DD&V zRD^E}d>fE=PQOow|c76l6579x+w*>#K zz=d_>ECKW>&G}fA`0IfBpHCfIPn{D0eX6d(g zRqw|S-rRtf-#&!j-ukdg;B?=JPZK`P_zc6R1)t&gjKF6kKBMp%jn5(YjKQZBpRxFi z!{<p6u{5Z;cEchwFUBR7d3;17C+tjG)<9y>GT?t6(ct|^aN2(pwzwylw{tV&I z5PqX#y$>Sqo7Qag(NNq!U)>k_jjvmMJ~S5iw?fDIyVcJ_#{<3*T7`Wn+mF6s$1`4Z z#*1`3r00M`{tV&I5dI9|&k+6!seOgizCvnWEu7WDSuLCul6QsVT_Jf_NZ!@LUoHIA z!e1@?E-9f)O6ZajdW6#>oF3tHN!~8W+a-CsByW%KdxYO3{2t-Q(8rzCFVLRVwQ7FN zzg6ed=`}yB9#H4i9P1xY>uP=p>86_Bf`3iTZ+t%A?O6F=Q1{jR3H+~vPyFxIjgt3D z$-7;0wJV-a+SQM1nnUgCw}SsC;0vmzwl#F6lonHo+9{!BYGm!Pp<8I}&@^9v?ds6& z(y!a4U$;xY+I=jo!}oISK9u&k;LD-0IA{MVl=985`F-dt-|01PhNj8Mn;!L7aM;=o zb!43{+@X%E3xvCUf2@s!m#GzX_2F$QRo58q@NKLc6~4$v3tZ&8v#vF~&G(7A-}tWc ztz%v4YjuZ*Z}NSs?x=7(bY_I_2Amy!P`5ayt7YPatL z(Mb4d-y_kp!_$0EMc1PCSEF0PFZinJ2LbEquSQFn>$itrLTRg%&w_7LPcmLmHaEIkcfZJk4U8+pGl*umiKhc6hr9Qf40RgrFMa_j?w-xS$mt&DvH@PgPK zktfZVelWH(GR=2u?1jiS>tnIkMDy3cWlS*^Z$xfFFIK6K3S^H~DfVJ+4ei-cbENuv z>{$OaIfZoq&J9nK+mdI5|BS@@_Y9=wSd=-f_C=AtDEw)@@$rXiAC!_G7I-Auc8>pN zfWNBywZNUi-!1SBb#?q$|I^lO@v7+4*8TB@D0JduqRf-i zP~bxXzaVg@z}*6$7WkaN?+e@~@Fjt-3jC!&pN}=x35*GxAn*u*M+uxJ@ECz@0#6Xw zE^vXs4uNM0ObNV5U|!%hfmaEf;NL*U&49~QV1FslB|x3xO1ZnBnP zZA+-L0iVZvMw8XIf-{;YtLK9!G`9=CUHB=%Q-a?u_}zl<7JRqhFA4sV;6A)3e75rW zSms#4+XZ&`rdOSb-?eh*&+D70v`nD z*_vH~?-uxkz^B3gQ_V|)za(Y8BKR-C|7%3~J5iVNU!k7F>v7UTzqC;Bu>ambTkTlE z#|r;Y!H)ocbj=*eI|q5+QtiTT7oB;6cR=U-+LYia;dct&4gU7pLCHIaygj~c!rvx3 zR|tL`be^rbTkyMuf3M&Vg8$dZF3GzKc^~ra7XEJ0c|!1~p)2K8)Dq#7lq`y_tU%|sw_XeJ>9V_@);U6ma5#ax^c8=togS>OBcHy^+&OE_8pfjp2 zC3s5soq~6Rzo2eV@(v>J<<>UgZxfv>1iubC7uMY^_}#+4SMUeHzol-M%2>vv59;5)PRf}z_uTU*ja|E9Qd}Y<3;Df+#scMZd?;L@H5$X>{u25EB zm*BgAFAAs{DW~QNb#q{j;B$cgDljPcAn?P3y9D0_yf4T{VesMFE3it>5qu8t-v|$DR58&M zI7gt0OI-rj3LF%;L*V!X=a%^b2NTrXA#j(#{Q^~^lqqnIz_kJg1zy?65_Sl_OW>2j z*)RCd1mD%f67~yJ%~G1cIRe)T92B@i;4Xpt1*&19FHp4zE^v;(wHhBz{#t>90(S`9 zC2+q$HA3l89OhwF}5xC{@AYA%=m@z%i`C?cf`LE z|4#hJ@mJ$-#_JOk64MfM6H5~76IUm8B)**ZZsNqoD;q!3_;BNEjq#@GO&v|AHJ#IR ze$$0bcGE3QJDZ+r^5gU#z&$~=;z_g$`<^h~DzCwR^*H^-a26egwRbeAF}N=1SI;*U z!-*q)1kO(1i-6Ndyad=j;&s5qg0B{Q-H6|U(_hZ47APH^-ZRUjb-gw>J#<)qs||1}A%;x)#vFQ+EY;fw(M4nPaPH_5lO?*g>c4*4#@-GG+52fuXg zQ}+T|>OTB>w@=*G~Vj>;VJ4A;Ge~9floaQXsJhF51;xRpoQP* zJ_h&~04+R^JP!Dm04?>XY6HF#&{DhbeFdM|4QQ#ynH|zeZZg#XIdU4{C#&0(MsBuzL)u6s1b76QS?-1R8tD9GYqcGw=m#LlPEtwN8vLXpF{8&1CMUSXDmMB@HrHp@%T)@=P-N@$GnilXEerqwE7F^ z^L&S^2Ygdd{b+SOK6!k;Y#pzT^dGMl`4_2W_@w+x)P-=Y_-TpNyQME=b zts1R9h+WOMt1eVO#OI}|LGky4<4@$uRdN) z!)JE&Woi-9)2pvh=OW#JPamH5ZVTb5Ysl~G4%by83(4C#sGmlb2tTTE9M>o!q{uTXif==a`zLV|gxQX1KNcZJLY|?V6+XCvkRJmqxqo`fXnO#Jlc;T8gb5orc;`@6G zyVE^gYE4&qU8=t)cXB#~MxUD6q~>>bvVW=UmbFK#5Y@;WqNwj!tR^ADBYXR zc6X}Tb5nikrK#M8vNC6%&Q^#i%Ve%d5na9^mEELfFVCfN{eAOb#z+S_9i|TA1m9b@<#ohNp#S(73%Rn6XnXjpUNnl%QM4)%eDlU&rF&TerSN2}Qz zWae@>)79*Cne0Y~o&maGBNlNCN=F0cVnjh5i~Q*A8ePbm6asitj%vqM5`aHb&CZ$$ z2~?XJpWD#gr^cV(-_0mi(vuabz6;?B8!}yU4SW33d1_uZjoxC2Qdw<0s$qoyFcyZ< z&=*Y2lgaJVg>fL#r=~hLboZuRbFSF33E_!xF0RTl~IvXuQU30f|bQSAiY;+8X zp4iiC-FAwCIQe6y?;!MXeOwy^1%9y=liQ~F+ zvzbf!INQ3GE_k&gk^xcUQoShz&ZhsOhP)O9_8vZ(nL%dP%R# zMh*lbmS8o$FNdXhs&aQ6%hS0c!YCHnbaHoBSGw12EAl(OqL5dbYJ5j^h!u)hSj5s< zOm7^Zj^2wA)!4oi8w(M*v?tY>mOV|e2u^@}A}AkP1g0LD3K^%XezUl$O=c}svvqjL zo~(2>a7BG|gZ6ATwWXtXQ-8_4f%cSWa$%{Uh_)@xtncnEuMCq1B$@tPxd^_B-jY9e z3s<9JTfhau8o>O~&Hd~n5xmh7khcIRuz5gn# z9Hx%U#p%=1n{%pTem8b$5<1vG5>0azl4i-uClhSalfN>8%;|Jv}|x+ZB5Sf+wp-19O`YdMgWRnz|4M?#pHQ z;bg=%%(L9F6vM9VCN_c3O1_Jtkcu$)0+#mufWhx2B*I# zm0hrT6N=-8x=)>&%5`o~i?9XQB&9CzmyIz_NSku~S*%CtO`KDt&q@Zny{AXl%Rcis z1^3;E$;em)#QB)1de>zNRiB<-XHFz~MU|OBVVvQ39b70C0eF)@C^^eMt`8$gImvCL5~*qQ0BDX|t81sS4X3Y{-ga zW)ETZVw~qwSu}!KFc)_Brg}QC1c@#93O4G6&aq%j-6pVW&RdyQ@cAo>qDkL3$u4|df>T`PQV!A*2^d_ zN90Xa8q%kUp(zq4$6x?8N6nLiTYGjrW|Lmbu^55qo!_0s`G7YE3pQiL>N8tKm+fF;XnN8-oSXYF z)0&LS({M6Q>f|c{3wkf^&SrW!Jlgk`7tXs&HgN%fH|apYR<94?)gy7P`vsYoiC9Zx zUFgK=M5}fqiV6xcC!eta3J7PM)TFXPRkST#Je%swxo&6zuyC>|1dt9yX3=ioX3+7> zCaX*iRng%)f z7^XuGU%k2MM?-Z*76-VFzJ;kCu9n&Ka;|?!Ps`*4b|EU%$?rtIrIyAau2HW!1je3C06X< zG%|e1bMw|$#t~Ee>6GAF=^gfr z4_&f(9a>Uaret*XvZeVPfzIaaY?XsK0<*ED#Jk63Z{3Y;F{Sgmds{Q&ZvWi9tuc!$ zT90vZhLMBj5R`DQYHnF6^N^I9xHg+kD)8i@?+7K5pzpmFl&g(W9Gz=i@riOuMWjBGMJw9)Wv4lsR~tpG6YPIT*eE4T^kQ;JKotmMuP zOk9?$RXYyi+;-u9%xDyLlqYVKt)po>DV%c*Q&TjTx#+~KM^m|!N2V7dkJ!D&;gDgg zpffuJ^A_$prC5ic#BT#34kY?*Lh? z_DAu>!eL(Y9fJCW>rgGhK2#nMP~u#NipZrXlet-}!%3PP=Mq%3U5c{8EvSebf)cp} z6}HC6LruMUpfyGwhun0BwR*@7tdDA5Pde3$tvnaMMb7G=XNF>)sFbe~RPxOHB+Wup zxPFq1?m}H2X3W#xkHsGwDBNW7-kvOHMj;__oa-rGEF6vEDEG`JrL%?`JqFW(;>3j$ z240sh@nblf_@nkV$GIF|GS+r{#T|dME}J`V<&38uK|N-k0V;YRL?d7p<~3}kODyc4 zc(m#(+y}~0BiDU?H&1!)u4iLkXC~XzeZDgLw0StJl)frAeh8;$bT(vi zS5FWAKHLJd(2Q8o7G0-Q+4gg ziLEwDL3wrSkShxb%Ti&dl#%Ut*CB`J`IL66OFea|`nkxR0zZvUD_(n8fHW(btiWD?`+>?|Xv)y-!Re`_ENS7G%5|mp{6W88^wNU;H`KHtv#Xxwm2O0B^awTN+=(JMUqSRl|5w+HQeo;?I{UA zGf?A}tLo`X-FTzmLX@#Zsbdb*(@OP74+pRK@9tu`lbwNP(|s2j_g3LvV?Z_UK%IE| zlB7$0|J^;B4}QLOiySjlys`}pArUn3L(efml_V}h?UwT))+elVU`n*NMp)mz+H?wa6KeEI5_?$ z{LoXGcJPj}Tv9dy%3C(4%`TLUZ@M0^txM6LluXA`HMli9)5B3i z^=68)#a6m+tN~L-eQ}-d#ERv0O0VtziC%kS#chW=?m%N-IghlthF;zG4#s*OMwkm{ z4sfN(Atg+5OPB&*aJ34vSUY%J0N|m^57f#^HT0?SQs~2*(CVC$`j2?K`WGWs=-q1B zKVEyGjFP&CdF$p(vR>j+;YV+@O`Ul=#$}KT&u8G z4jiYtG_6@w-r%->)MX3JD0J|htm1{L8K|eh9NZBoOlyU*7@h^ZP%Z-W_yY}_p4KXr z{Lh7CX*&+wKkvd@Xv=|zq*9Lm$rgL3gm>2BN;&id&_W*WsB^Gy9Eacb zKM8L)o`c`|BDESh&&B(&M|h;;QRg^(4#yv-Sq{JBM39E(O@;^dBZRnsoe!8+Yt=O5 zI|uu6uhx9XnPUaoB>p<4SYBF+YMO_QTM9kn)?fw7;*M0+aJkl#mh$5Sv0xtF)NDmv z^YQ*`EBer(mY_|`F+Ffo!Ms`YqZM+zMTC}eZ+$v&+9!(^&BA-$D%J`v|678bG8TSt z+X`IvaRJ)Uip@=72d<}|3&C3@bXy9!s8)x~)7NbL+Sgw&*F;B)u;>;SKlJpe3e;kzPq*4)NAr;1#0Qt(}`~ zJoZNYMV6K}^Ox_-Bx2tM=zj`1dpuU5k9n6>sl$v0d)Nyv5Z-9^y3nFB3lE!zQW&>c zSeTxU`!PV3NWs5!orQTqP3i-uFcSL2N`2R>3jKv&jxE;RggT0?UaG;7XRH^>n1(+( z{g1~5-txxp_UXQ~7S6$kavteJKWQCqQ}~MmjE@vP+K1G%Qk}_|N7ypzx!Rts-SOo) zmX`H)h`cA2=PmVIZ_ZMg8p%<<1T8Dv2f6lB_$@@PFg%`dPFACb*2Q>D;CwAmMzgEn%t)pHJ4WtODIPQyGo9skY1w?2+VeaGQ1{_?*z{5KW< zsk)_DVHRMm=ul@WHN{J{Vr_hz+*69ZR9omMtX+&xu3NO!2H3C@J?Bp^ot3;Sx&J?( zSn}mBeeM&Nf9sw@l|L9yRtKBn0V^7{f>DrRD;TnZqky#rgH5qIUqmM%sDX;bG-*NM zNTBg1Uz7zj`QkIJV5AC_aIy7O`GA;$tEK$-*y>ixmrw~`6@DuqiZ2L7qtU8X6*~(0 z(U8`SkM##fvl%n+IRc+re=v3oN{t;;JrzIM&~OO;Y^pD|82RFDfmWX{-af;prg**- zfG13oas7*A($H_ZN+C<9`P7j^6U59dx`so1 z;fN(HaX!fDd?|t5j%cZat)L{K9QsTLTkT+L9jwd2Hbf*?IA9@kv$5Xz7y?vyfONS6 zNh|bJaE!v&ZYCY@9a9=|s&R>_+9js4#7)Qf)X^p5>XumY1m77L#0N9y-mW>tPxzhe z#?3d+^r`7X)~$WQeFebD4KH_W*yCWE94zNxo6+gn_>5v>2affrX(hGsF^^0i?&}4` zE`)j8OnI{dC}VJNfltkO`$9@yL?|v3#*?zHobOX7y~DDKUqNt80YlQIJA6_2Fd^G` zZG}*AI$He7f>RJ@4(8o{AS0E$)Zk>s6k$ATw)QM-s~anLhtm#BH^eKy>8smv%YoYB zzAsU1Tud3#k=qWG*?ps;I5Q>;$9D!Ig-Kv=&_%Cw(Q93FyNllFqPMu{ZL^A(Z*H3K zT@ifrLFzzrd&S5{bh3zk*k^cOh&;9$LkwAG5|qtS4yAIYfL z;8mJ2s#tm=rLd9mWhE<#Lh)Q*d}7>+wi z#_aZz`M`Xa4*{yNNrg8yiboAGTBUqZ`~?Dkd~9@d02Tlhz_wxVAuNQWg3AB@wRbfy zauiX#yQgQWW-@8FYZFbhS9)a=XOl4u*x;^=n88F;+?ePPa|q~QVhrvkYc|0Tgmi-k z1qB5Wk>udTo3eO`IRyL%6m#(4LC8fxFnBQs4}Sc9Ro%1Qv%NZaO?r2#tEykUdhgY% zs@MIhx?z5Jh)Q0O1P&mjDST|paa2$BDwd@gj<28?ZIzk@apSs{di)Is_^B!iJNS4( z#rHiG|KP_z0xIxSuZqum#y@SrC#^E(HT%Cn3Y7+$j@HiV|BS17G>4if!WJi z23SA`iJdCdyIncCHpsBKb0|Xy!xlGb=&c+JE@CV&cQJFO(?&Ij)DAp~F+$(4gFrR_ z$s0NhOp}%rCaEFXoE!Y)735>Kz*$8YIc-PRfnfqRal|e$ucFNy9)Km%)%#|!$mP@l z7U>%k4TAtwmWQ?r1EagX5O9TGa1^( zyMJsd*Km`(#a-jdMRf?j%-}48*Zh>BjMO1ho%ANEYt*I-T8-Xx!3G+ZDuhgQ`UR>5 z8R!lf>KYqJbulS}FV$sTZ&ne+u@2vw9hYKH!@sS=cgN?ms|&oZ!w+@%vDB=3Lk_!Y zKxM3hHdWUOTGtN+sF6~b=JTMk(y-3#dqb&~VA>glU9VAU+FUs(JhilyRvYdMY5D!H zIIyv>npR6YLm7-wFVs{mso7vxDA_LK6w$J|K+}+Y+d&7yJv<~bjVaR$JRx8~d0qhX zOvMQR0(67kU7`WY2*cKUG&W&Z#g`TAF%@5h)(DWy8*p@9m{S1^B?u9Q9gG-ts3BaO z;;XP^>Z0nwZjlmTHp+fbLnjMZ)UlC=p+wU3vte)w8ig(fG!NDv?G)Hu#OeqRdw3Qm z&|W-CYAGW%0g!2`rK8$+h$@~DAa^A2ge%vwB%X&QuiL7fB9$ppnIT0)*XH|F58(5C ztr|L(7IM-;PFBd#By?UDTT4k;tG*c1bd3bQZz>%PHR4<_Cz?67Ho}|7W(sEl=&)O~ zsRV5hp9+L?6?x-X^JXF#={O_l{=&#`nBXMks3?_bq*HTg%3SO27WEBfGQzsthWFi+ zagx#8-74^KQnfXGYR*ulnq;EcM6YP-fi}V{2*qfsNHPxvqT7UvNc^crj`KEAB`~92yV)U>dK>Bfnk0Q?Fiu>DNT#zt&=+9yx)5R}` zR)g(BXag&~MD%0QAIoJy^gZ#I(WUyhO203@p`|?^#>>v@=dD#2FXsmidLg+!nSQDD zn0^IWcp8qs2Y|c7chph_c>9xseB%w~iUj(3u%cJ1>P+q$JuauA~L-;+q600(%d66CrJJ}9XZ@E{Q;#Lw`t24^Hr&lml5XW;FmR19n% z@6xi-<^~5PPRto!LoXXzB)|TmjJ`eat7& zfUHFU0p+okO+ipWWfRmEw1^J`L{yY&5d?90Zs=2=5C6a4ch1~tFzBNkN~tM@?1lp9l>xLDGU=;ncS#NG)l>3)`3^9o zZD^x(G>p{qZ!TItC71hiAQqiOtj@1bpFUmDAO?Vx1&(t(2Ay6puzhtMBej_(ySpe zz$Q)x;yQy23+?S!(@_ab8BZvGaTd^ovWjygP1i%ec(~vLOeQ51eQ0tT9uU=I|No!y z8nI{N_41yMm&veO;{`93@jBX!*AmZo!Lc!h157wx2)FX_`UFN0F3b4xeK6w7-#QjP z7|u^Zdpr^1&mo#Zo(TMx!mWAFhVNjsWskzmWEgt*JiUrXUc`(xCLKoz<*?3#3M7+y zE{r3pN->EbmoYxYjPYrDj1!E>)AblL;TWTY$?23QCfzaa|A3A04IiK}zI{)}*kpMB z#u$r&jPY4!jJrK!yk3tn6OJ*a=<+ds6mg8DBCZ;ITvejY@A+D}e9O|2-+{jMUBI;= zzry-pgt=*F>jX5iCchr7@`QzdGv>50l@Xuc2(8@J=mu9tz0zXs;Yv#h0<>yb9Wu_N z@o43;su}q!SWMKjtZLjWt6E7ftK}J7ABg6N>kOU_#iK9QW3%IlbCStgS$X5NZk%I9 z7auss_&`zn0QP6mA_kCiITQK-Of)$?(i7+3h7Tb4<4W(`^w56|UHX6xy`JH#2i+a- zfNaa+f&2o0nO_84m0(GwVx0)OD%$@4(mJt+%lt8D?jEfZCWGrg5s&|vZJDeAZE$mF ziEmsaeh?^bmNZyIM94l3J58i|pLUJl15D^ESmMjq{jZjMWytyBI`rcM<}`aWUj$?i zp{E5;6nfm}eejJ@d$xxN1@_Q4Ooo5#8?EpSoF~OMu9tBS6mOH%DsGWf`@|iB4=|xm zU`tW%6L0U*CuX7j#wQ*G`aw8~?V(SMgPky^{1mMp+9`sqJh;V!`EamIMd)BI&kZOJ zx6${(dG>H(NuWV{G_jZryL2AzE!)sxEJflw_lSQ4il3J>SbR`YtM~;;wGVw!@Bt?D zAuPDA4~>}?Rp;Y`fpb01^hZD?YBd#^h8BX2TMMPQPuX!2DN9cDMI1N-mK@@X2f66M zE;_?S4-u3n{o6V4lfRM@mZ%Rty<=@j!Z5LEt@tRVcB9dTh}C3v&CSx*ve*$JwAIZ zNNa$w%x5`TmRxaYp_PVDm3&sT%Y1ej)h(Mz@x#PZMPb<_s(jXA=3nMTo>ubstjI|Z z<+EP|(pCw!S?8#KH360OPD&w=m<}yCZwpRMA%}Wqd z6g!}=imDnwEze=Vl~+5mG|1z~POFA+WJhKknTBn)Y_X&*cCy8kwph^?1KR9{$B|co zv<3*v9GOFC4e%aE3$1i59r-&PMXg=t$g8Pn*-VP35>FL{Ws|6KWQUpO<&>qBJdP}K z*O99SlnO)LR@J%lbiMII-HAwgBIoHOo3H&-^TX*$GWmMv=|Q;aNAdB@)3k#>y{|h@ zyFT9o5q+NN&_2(bu3`paosO9x}r>bh7mj-!!zCyKZ@^)m#=V@5@ zyjao}JK17NTdZh{0d01}P$xc&aEY zn?#k*JIp*U>nyG0@p+MZeZI1zRM-ulcRNw;^DcikeV%qG^ZB14CK_d)zYrq&JX6=_ z|HOIzX((ZaI0q7X1mfZdo^UyP4f$=Y)1sCmi(Q^frusDxssoKY7&ey)3%0c~EZjb~PNNNMQIgxls#efEmG_FCwz{{AMH`xy zO{gy!N1|wyEp6pZqn4T5Mo$qYI%r=+hZxirb4gaq7Gv6CM`@@hItE$g0AX2laIh`8 z@zX+!r?AqBAlhZov5D%I&7?R$JXI8yO`<9~9H!iRT3X2y9U}KeN971n;YBp4@?NuI zMQ}S2NvAz4g3Ax5_tVpS+1~v#aO=nL@vI3Kphkase|Jr2_Lt6^*FwbjVCu#PuDjKa zcO^dTiy)C_+Lbq>CN3_9+{DEtF8UD{z0^f76I9~ja-yl?6-!(5JTZ0SX)5G9UIf5;b3G(O ztT*oEv5Bi2pl9OhMi>2ri+<8YZxU4E>feZ_iZ?SECa!Lw%(Ay2@x~R|I<9V|f=y_G zfmNBf8a9`SE4H;VuG~JG^+uF*a8;H^^Hi=k_H7kS(aT9?R%&@;#gSLXigd^mD;26` zvEs-~tZ-mPS+p4?VGR7f5S>uq;;SC6-(*YoW!rLP}?F(JqUX zyQyy3Op3P?PZfn_lci{9&^_qph21eI91 zpJ=N10Fz;2<+GGo_7{+NV})!TE1#o+O=x0;Rhd{BHkXMNwzVo&oIaaa5hWcfmE}>j zDpo%4Hicc)7xz^ipq4jQ9%L@P8KhP8U4BI_!=$R`R^L^s4l}WZC(N7}(px6J`&Cv<3*v!i)}P$?dxqTIohN%tX5^%pRe-Wiu&0 zL_Ad#mQA86%p7K(PY*1u#IQ0;lE_I96=rVB%EQd%r(5)rRJOJAXW;f4?;lP_GW1)DR4BcrNL=1hJQ#?KMCmQXigy$p`L5qlL_^EoQ6#P3Q9Rp+ z1(W~hkAmI)wFhHPV}^T2u~I<-u=*WEs<|hcfAGG9Q)Xxn-AHw&YaE zOk6vZm3A6}_a!3b??sWUcwb^a%&ZC6o$n|`W@1gjElecqKt)A{Ei-oMK%HC9T2XV;I8vYI62T|xA4Wh~LJ`7@M44cdte&3AYPd#J!h8{yE z9K&Sg7&6BEj4|&R{sMjaKRt$f_{ztcnmrstlVRvFoQdg9?T=4se45Spyluwk_j-Kl z8DoFY#grKr9eUfOZ_!TC@Y)rpOnPqbZcjr9ICR=YzzeWX{&}>XumD!jMo6BrW+1AR9 zsi!V?i7alFS_sQ7{iH5^N~6rV^sB6x_Q9o}7{r$D+F}t~jA4r%Y_`U;$@>OKYk;t9 zlgE*;WckuUdEKOR=_lG{o4oB*w`?ZGZNyVWVc8_AHhB&+&$ZanN}f%g$lXnz$5v)H zONF5p=ZZ@|w-b@{LGZ}ZV<49w=4e+wuU`z8J02g;evs?9KaK4ib@{xWZaGqX_q!0$ zcbU4rdyWsjdjyo=yIkRm&p>Q^_nR*Itc!ljMgLt;@!jW$ri#xq8OC?NO_^nLb@Tcz z+1htspn^?ke3w-j-yJrW@m;pH+IK5+afQ{->!qR9jbZO`{E+V2qGL;cZRx5ly|h`E z$1`66X$=sTc_!^_4ZQ3KEq)iM1=nq}=M=tuBpyIMSh^C4^ zW-^S+{)95i{wWf#%aW~Kb|)2VLgTWm%DC*Xxs1!Qt(7h-eKkdiT=q*<4WLCl=lJRt z(j=H+#Rj(Y&=w=u(tlgJZnFZ9AO8%bH9%PA#~c@HfSVUBw9+G7KNjsWKYojfmd&L2 zI`LFdST>0&KX#aTZpkdIfj*I@nMStm{zYE-so3+ThDD-`E`)XPq$RgvHQcNW|sRV zyEgP)&~Z2=<1Xk}Btzc?QK57fL|pEImIK+5H zBkv*O%fs@021`=?-mzcs0VX`pK-E3Z@J`3I`_BJQ+PyBkhet`1VR!64+St9(*gfH~ zds5q-3GEKm;q1N|E&TtUzhAkhb~hPz$L?c{-CK;^_x9L*A8mIgv^!MG?S2vFnX$;P z@~?eB>|Xlb?z?D@m3Af=&uy6gR!%q{ij--1S4%hF&{xsJ-+W-<&tP@WFp z(ldgMlIN>?B)ylOoWEKzk&QFsiJw5g{1qrpm((iaeM{a=LnT_AA@~3jjw^<6a(Xrw zLgeQ>Hp*E)mY_o)uz1?jF+M41?@EVlH;Qv46B#!mWPifkBjcU=x}XIjb^<`(bmL!#&$tdAP5xi>DBMuPP0#R$%XOuPWWO zMaP!@+R{~9dTFyR&pAGbLahP9vU5D`Y{}t93#~Nbt#pnTZA^mhx9;$JTeJ?7BEH;1 zV+zYAQFV@Yn0cPX@MB9<@|@!xdZ^br+?JJ}<6S=esQj+z=m>MVPA%JsDr zMD#VLL;D&}bj2Eojj!QnwMuBjMWZfSE2#Jyep-v>sb?~buf-^{Y@T|&zDBn8wFWBK zgvQrcmGQM0&UvrpwoftP8oM@(uT6xAzQ%NDU*jpZI09nhYa?A0Tk{fkw2O`rRD5kL(Nu99lVN;qFUl-? zZzNt{BU}60cq-V0#@ASt@wH)d8DC>tt9`997f+ko*QBA{^+x-H&+>eZ+J1Lm;BBF?D_INz9Eq@G~=9LwRy9eh6aY zYiSqV&qeol(aC~}ui?In<~fkbFupd0GJGo>iPzW2*1k5C3O1qfHCAPOZP;AK*Vxud zU$c4eHAS%lc{#jPHGo>43vzpUMJ~A>sLDkxPp;~I(U5pNB$l(qF1DD?7OUA}Fq_Tx zxb2}JtpUO^x8;yoaz@uei(h0cJ?0ecGPga9>Xyx?E&&spM3vh*%sg)(jFQJ~ zMee$7bw{Z%)RjcVV@|gdk@Q?F(WS?nEiA!DJX8 zKaw)bo`=Ni<78_epGyUs&^RWmGCn?RF5}~DYo(7@*Tv4k@1!@jwAGgG*wPbQI$^UY zkKZi>X$=sT`5nz@4a|3h7QZN4TAD?>%$J`JKbe^Ogl)z^9VO z?;LulZJ^t-^6Ap$>*=!W-QHK>0&nBv@g?@HY`)|(a|9RW%ast(mzcV~bO(LOJTqSm ziRW3PduwCmd2LfX3UcFS?Jjz>i+7gw~u%-XDblqkJ z9_KtBq%}ZT=A0ZCYhZ;VwD{HR(xfQbWzKm56)l@daXIl+QCK#KD(7^Vd0sVHTFK*_ zBKJ;;l^vzRP_3$65r+*w$(%N%_z)h(Mz@l4|Q z$sBn_0O0H*h`-w>udh&ph0Tww2Ap z?mHj-5Yc~`y8bKkuzBZW9V8zAb#L&D|8_xc{P!#uJ=;aQU39&m;=esaQ^g#UVf?q3 zGJMG!iPwM0*8Y1A6>LJ|bgatw@36Uy|FW%B{>#3aqC~F!x3VZ|mHBU_0!@N?eZA(tJll>r4`zP=yX@t%K(l3hNtw!`x=&rGlLN zm=aJ&jYq`aEhp{P!TgpTuFxU9Klaf<)r6SD*x^}JpzkR31HT9^mF3z&)Xf}+CM2x% z(I9F=319ldK#(j!l3NO}FNDV+o%Q{{|NZYf*ztt*UNh1$IlL7UeNDx}Qc^N76CR-w z0V%3Jl<@1K{8H4&+%hREpv(H6Q&yn7te`F{q{|9PS;=515!8hRz3mEBmK7>1%M=yX zMTK=yHK9a}E~-Wsg~uT1Vz{!Xa9L5YkZx8~mlf4zMM8;)E-RwT!uvlcD_U7rw7jgE z+zRL=>t@cSx$4p@Nx}5B>EnUrP5>z3CwlOcJow2}JOyB1nRt$VMz(HWdr zpp`Bbl3%Hh1xD*p2qo)hf~(^7aA)PiP+O{59o#N%4LqY}+)%7z@Q}V&U|9v;)6sxCTimcN!XvUv`t3 zA$=BDz)uJ7f(ZQfzo=j&d&w}J)fCxlr&g8U(#5hXlo=`9MDLpSky>O@dAy6ix&!F6)%!By&7#RUM%TGsl-cj^K!hES6{7Ebp<+!~gW>SxYF zw!n+2a^XD`hFd?%Bn_zls6uO$u>5=WCEbg00( z7P1`tX@w9skkR}mWDp~A#}Lhbq>PkT)RHyvno#;YNaHo5`Zge~pLr7t3H4#jqx`cG z^)oLA9mv5~qWLROL=I6AZ5>IinpDdmk~Bggx|t(dKNB;7_s&LaFsq47UBU}a2{ABL zO(2b0L-jLplPFXXMb+iHwHCNPeIc^ozCx*#z7DF@h1Gb5CzM?@6t zz<$Kl1(zd|XK^f>^S^<)QZK@X^qU5wuAYm+CN+MBJf8)noHQo5e7?Rz@q6Z z00vo-6lY%vQm_}{yV^f3KflrKG?u=-9F*?ybf96>P?E$_LQR{;pJCPW;*CgQ zTg=n57#!$2M``d0c{@S`(3p{Io-PwBf3tlH+fnTIjA=7vv} zOzDraEmk;^yBa2|1n&)EZU{Hz>WTOmuL zRxSGkWD=52W50=fv0lyw4km~|| zvPd9T1k2`fVA)&?WJN0ulGX*t+Gg40GtH``(9*#Ucmdq7_B zDS)}02~8$0RF-fzFM)rhKMlDQ$36xX9Mbf$35|}1YDZtq?ZKqx8vePaQ^C7)(#Z6^ z$aLqVQTg?x)AxajhVtitNPh-+?tXv^u>H_sbsfgM?*Xs|$r3)l@;^C^^>1?S^UT0G zObSas2n=Q2&$6(T5r4!s*gqU^z1( zfJ^VCkE(dDUEBQ-@h{{m8*|c?eu0QA(;-bAOBGP^q4bNshjojKs8!F}q5K^s+)7`M z2IwDBd4z4F@k&~sceQSWmaxkdwv`n24T-f%`#si=Xwd7mH6s0}r>~T8xM>f>dOy6t zO5cp)OU8hVI$uM27E4VwsO(3(yl`8 z%gBZrC;LVKI=x|EPJ}Ajf#4s%AI?psE=XfWLlzp}dWvSFFQySsptO^q%nDkO(`*W=(%vO z3LVm}&TJ`Xe1#5a>R74{g&YbU$Df~ZozLsfm@9_!=bx2w$eJ^p)?ZvLOrfF82&pl- zM=%;?uAgi$aUv63XfupEgw}zs7N)!*B51y=faxo=8TKEdnD-;jFh^VI&!P^;Gj*KZ zY$-K|c6H+HDsU`r0z7d>YIov{dQP0pb_&vQ<_wKD&YDGO3-Tp{xEo?1`*T8u5}{ID z2X$PBJaG-*L@PzH1{XmROW%Tz7+yFL*2T!&=B@A^QM!{AMsVx%q*N$m6c;`uF_A>l zUjYJ|iJnMwg`!xCTOA5o@q7Rk3a>6v=jZaO9p=4eahu1fG((iI4C1mTQJ?-Qc>bJ_ zu|!PBx!A}kBbvnx|A?8*nuA#|3MD4#tpJ?SbVHcWRpnz4NXP2~hF13?$$z_z;T!iO805h$sPq22kMq?yl+ zUFejwrKc#d7rfCJNf#Azf81#3{X?X;%j(#~QJBg$`*~=Sb1n zr$UFct20-0CRXT>c6D@JlPYvbQ^!(&Ru%LA>7}W2-?IG-_G-h;?B|toSoHi*^`!3E z@O+61H((gbX8mj360jl+QNm|k1#65N)d5aHdaied!8`TVh!Sn@&k@d^fI-!R(fUgV)w0~pP-uNcxEu_B zj?g=0k!}S*39f>kvM>#R%OUb}luH#6ZM~>Mmc|Kja%;D6IcEMGp=lb?)@2nk{`S;l zvq9t_`dMjN(@2{QqN_0U29dt~3@Vt37%_7jZ8yZ+Mt1ewMmu`;hvL|!xkfDH&NU>R zxkhZ^%1Amg>9s2(>ByvOu8gFS{iFTpz7?@ex-$N;5SHy(N$dD8z($ACMy2!2*Gi#Q z9{-p+hl_ttcz>PEt_tt>Bld9ov(nF^_={z;aO zJz`bco>`*Ae*1HT-bf;C+|^YW+FfNXt~k%Iz9IaT>}r3Nx?KMuxtsozuJ8@gmHx9| zg%0UTo&76xNLT7iuFxS}sdGSu4(UoATq%_KGwDhl+&Gl!kal&j+rt`+IjT&DG<7Vw zmn(~lSBH*^=V0hz&iQ{V<*?G<=5SQSMMI-=*m-eCg~_hMcZO70=qh}7NQIMKh3^fi z(B~@rU`U0_T!kM(VVHBptJo{xbzKwj?kNp zbnCVX1)WWwdFV0z9HBQGX>;ar6?C?O6h=RiQ>i{A3dvKcIV9>60_e&^qA2o6ASZ~u z-Lm9V>UgK;kT~?2Cka!{qd)005666nd6w+zc~-{Too7ipYq$)mDBtkD31i|x^!~?KEz2+|pH-ZO znb2IHB8CHUZ#bVe>%;mQiiRwk8hzWbmFMkiD3rg46UD=VeuXH?4)uK;ptffG%(Jv6 zrod25{w0b(0d&OG5xH;9|2H^y_F=ykt?Prsh3X^T@}CALk{=&Ou5U=L7~*D9bL7sx zZz4xB5W?d!oNz;-n%ozegmaG~$+saxAIt+^iwEToM#?i!Kfiab7O*d=z68W&oylLw zYH-dnx;LkU=IR$t4CTlXHwpLfhF$&9RLSNIe-B{7#3x4$;(nZ7B1jdC;DvVK6VT>Br z7&XHiLyLwtMw#3(Mve5l!Wf$AF-DE_t;!ghJ(Mwwb}+QD&98n)+}mk|Ue%=-{0e_*=WD zJZIWqT)naIy~?Op;^uOc3YWUh$ofK>VplxDr)ydj3+!^oJ| z_w;)h7T&6vy-s1~(c}InjQi1S)Blc-#Mb>?p1G>`!TFk#Bb0v`4k#;*Qxq22Xx}RU_(^uBL^A(TiPUi)4app^8b0x1 z`hxr1JL0u9Dipd5(V*B z-@$kVQfkkD#0`SN`#TD+N~pJikHZHW5UvYqJb17N|4zE-Ek(*`1Y3piK{0$ziGQgv zOUtOUxYROEP5T<_B+6k`g8P9UyZ6k*P`mET5`^)WlJs;{ENUt>W{VT%YO@}x$bEz zp$@1!tS+RM)v+&I>R9jn0-vpW0sNl|{11V3^-o(dwYYw1eN1%=%nQ5(Fr==pXWmZ> zd{E$5>c0v8FOe&x{;NJ3YgXf9lVc%uPK=z}W32HjvF)*h`a|p?yxDnh1N(SH16#Ea z_-J)ZL#AQ08Wi|Rz=V20_)h>2sn?+yQhx!AsfI@46C1aq{DTC)xsmO8Qs6Iz^IL(@ zI5kJd*|uc@6ByIIRDb-c_+IK>z-IMid~$4WOwmn=z11XvGXyRYxC$_&1`;giD!>t9 z^N{*hlAIroAiQ<-g~1Db4~?e(Y#sejfS#oNiBWO~s8JXt^7vn)ngD7Pu(-(5BD3J3 zlpQ28zN^Q4vqk2|lM%`mh|I5+3U!8Bf>HviL#TD2GVt`GQ2ipSSCcyr>QQ6#_U#RQxWPmmN zPN;j-UxgZr{d&LeQS~>WT7`NB`$1~16zcmhH>q=kdRtjS-7eIBs(?^m7OKV<66#H% zM)<-))nmZ=eIN2gh5C?CGktYJ%@b;|FDBG#p-%KQ3S|qm&X*AC3`~#xz74*V?_#v2 z5f=-iFk6lE`Oqu+f(s{L1`C3-+*c2HHne@}7GDbRG4SK6rtZjaT#WQxq@0%p{#u}JVIaWr z#{?#!g@*->!Cwk^0Pi^Z)uX{6;4=b$An+Fg{~Ej!{Ah?eBSRktoG$p`flmN$58VuS zV(50j(?fRw7DKe;vEiWKr|t?<`oS!JUf@Wyt-Sq5;LqW_U+r(-?eY%`?DbDu>Bbt4 z%cpC+qwu>SdvO@X{hu9+V)){4$k)AbBR-8*rLk6?ZF+1 zbvQYcs6Rl4&87U?9<-9{Vmur2-}Yd0^8A>o9Mpv5B{6L8_C>l=^7$(VB7UUPJv`@>2ZX>5G~Qe=7NEY%lc-Lp_#!0o1!fz2&3L#;Z;oag=(? zN1L^%yA4H~O;D+cT1K1gtyUU}Hrq%2nFnU%qs=C&nfq#rHk+hg`;ew+vwhXrw5DjY z52>B|X^J*WtCsyWMVsxX{x(@twAle_$pM<8&8Di6Q#3`JO;@W8MVlS0R^mpJZK2I@ ztswul2fv&Ae1lv(fZiT_J^7@E`a|-05A|O1yA89Pe6iF|8fH7xnAFc2<~Y=WsYh!L zcc|9XZyJtJf5KH_X^f6k@%9q+LTs)&Oj9yOZEA_3I7ahSK~pkD^VCNT#W9+vJ}J~& zKK5b0YWy(Ee9Ol^%vVPlihY=`?p>l~?85@}b3?HY3sv_qTE;#sQV$r4eORpOmT4LL zARPd?J$Q8Ll18aosN+*tHXcni{M#PPrmocu5$eL!&5cr-P`5$GTNM7=9()ussZ6L> zQj;RbiiEPCq(0S%YaaQxJ@_A~6VwWa`b+9@4;5*8u+f!`XnLe^rK7oj)7Hl09qN## zXBtm*sD(|B)|~86%bI@EaEh{Ue^nZzQ`I;Uv8QW_Hp{4$XK0ExJ5yb6DB7$;J-15BXtPdL zw^~!QSytVW(G+dAR=sH`+N?{}b!ZuF)}(GTgrU|WUtS$$sPmh$@ji8?p{{7k zf$BEYC!6}?1$DWh#s>c$E~q<&+7$jw)0k*MJz!*yL$hCPH?rrOt^)ObFg?#0Ba_L;bnw@WiF+=uKJ{Z0<>XRGnt1=H_?8*QgDK+NZgYxK=%9sDqm~ zB|ffhxk%?**nC6cdNu75O)ZD)Mm1olQ=7k*_=I{+s2f#J^N+%xRPP$fZvIB%Cbi)s z%y*-@tog;nE$Zin`ZzRiRhuuR>{@ke^RE)Ose27|Kd9T)r!S|Bwmv~^Q4c!QUlUu@ zHiuHlJJoBN3P02Q_wYUHPlkG>c}(;krLK@t!f!Oc8~&6UE!3v)yUjJpPpf^jOlr7S ztu&e(&3jdkp*WiNsttw;j<{6ar>-+pV#K30_o-V9H6F6hs7DNS0A!z0TMg9;+5PH= zhH8iGe)XoN)X5{>2|u9bT*-Fc7+ybObmX(@Bts33NF+b2zNsnoamYTW@>fyw+L3pR z7?J#(x?EH0-VtL!Js^~}+2_@lG!=ew#JSgrdA@xb2wyU4SkF9-3Jt@>%zMsSwCBL99znYrc)m!nu zhrg(PDU@!@7uCC(lD2$N#Xc%!hS`=cs*#3z8}0m(I>=DJgX~Lcj-mc*gq?g?onWZ& z$g4oDHdNEd>ywYD^9{B4$WMW~#86X5UaB5dw;5{I$VY1)RreZd;m8M*kEy2&b==6U zpq>*-_x*A8=EtO+(sw-PxJLJneScg{6pDR+Hu+`s+;v*UzCWRU^>N83p7n%!S5wmW zCsgcukxAd5P$LbsYUDubNp+B+x<_6LYL1~eMqg1U7>Z-`6}8$>8%J(VeN~-rsLMv) z0_qY&-7xZ=)YsH)hPrL!qoD3J6z#HAJ!L4`WvhBlDBbsM>ctzRoznMh>Q_SPao?sI zZ={TU-@QAGs3^Au>HorOT(Xr&7M{J8tP%#>{&I-*;XN~97Er$9X@;$E}G1Pw{-}7p#p@O6A;=^;6m7O6^`hE(J2kbq{X^*dE?MEF<&9{8N3%B`SQYRUTvhS$B9pcKqqv~V>jC}}XFRS0qbY(9q z`QsDZqd@ju_2z6>_FeU^p(uMr;W`libbYU=l%Xj5o?1E2m3>cj8j7;-tHFh??EC5( zLs9kv_4A`#*$>nbv;U;*RrTlNT-mECyh2ly{ZL&a8$I2YAF3^eqU=ZNq?6oyKT_)q zMcHfW-BVoIYijj6x6B>t$+KM94)vU&nD57mUkWev{l{vip(y)_x<2R1exmL+6lFWr zhP*4=sV+AZWv{ER7hKuv>br)b?5Aq;d9LiI>J~#$_J&$=zAJk}on|P?-c&!A{h7AQ zo9dggpU`9bGj-bKZoZ$XZlSJKk7KX#mb%ED%32-wY z@0sv!6YiP#w!x!-A@y~@8ubET823!f^*^nDZ5`XA+j#?UAEJYtn*@JSV5**+aezLh zIbAX0j{)j`_??9Y>eK@I)Q>!HNh3KLt^#hUF5#4LM&dcbVH--NRol(WxxmpcmF$)3 z7CsYayU;*-Ls37=+sM&L6NpHcXX#%ByZWAPb>&tCY9$EO9K3Ha=d&p!A}#Agyd z`{FZQ@kH4wuufpg;J*s=;GMPK2F?Y1FJPlJ!C()5!Dei56X3$&rGU!;Gos(6HibTo z@-7cO0Qk|+<7y-LUsapbFG7d;CPI2VAf*!_?eHC-dTM^{n<4xe!k;1hlw!U2A@858 zIcjY<;a{Ng;a~f@)J5S5z;6m4>hDqyhi3ym6+QtwP`1BIao;mhbS8>)BBZB+L;eim z&k+6$;m;8MN~wLN)V@+`KTSBN3FkE7tdzVfCGSefyHfI=Cj8Tcf12=56MmVb^ zfZ9X-18PR?+mIen`z!E|ul=>p=Q|7Q|Enrr`v>r^2A}wU*Q6xxC6afu0=}wVt=%hpiIf&suh$+JUasD$oe{nsZCDwe?wenCO86G(*DcboTclrY zK9<(*d$8_DC~Z?{XLtfm&F_RWzC`VRgirRh)V>>@F6U@^)Stm&YunXd>;4{YSHXIJ zq|3LpE*x2|_O7pwY*JI}6One`?E2A>b9}VGIlk`ty&{`@8|r`UyTUhvb*atulOosp zZmORgX@kx|kvjlqMefrrQ9rDo8=0VfR=+T^%{M!?JhDwKja{m?`A&|7BhUH4+AHJ*TXZr*CBjozVt)sT$d;rm@fePp`DHn&>IMpy&*m}t9oSYu1HUCnOX zH`-<`Y&;-3LE1S1eR&t}XdKfxJNhN@`6tEaZxMfZQhfdv@rql-D{c|5*e0G&_$a*M zV~uA=ms|HVo~xEy4>T4~%eNZsXuI#bjf2473tSxSvi{b1h2S5HZnXA^-vBr>eslEe zW=v0yKN_9x>xh3py2#>JoyI2PVME%rBf`=S27i6=j6U7MH( z%})Zdv=i_)4@>?FN*muC@spFl47?mLBCuXyTws&HQ3A&aoFH&IU<_{quEx*p9U`2= z1-1!n7l@e>Wu7eXbb(ocT>{S$SQN;)HK9Ht@Ct!f3%pj~4FYcxc%Q(}3Vc}L;{vw{ zd{*E~0$&lhL*VNIe3r z0?!dx6u3#?M+9CW@M?kA3cNw!O#*Kfc!$7;1U?QJQ{V6n)Fjlk)^e<6Np%X~%j$2| z6!k=C-{vXm>Cn{XHsQAkKO=ZX@H+&*L-1{aZxj4=!Cx2Lhc{YJQ9d8boFI6cz;@rk zfm2jQ@Qg@1d^ZPAQJaLnN%)(Df3fiI68N;hHw5}DDcNGleruo5DJo*!75sB_g77B@ ze?M@>)V2wyO*r!fZx_vs;2Gg}2;K$$%G!$szXJIAwOa(gOW=Lr+*P|(@TUbn3(j-3 zuM7T$z<0p;L#^_6px4TOF>aiEercy)+9`O%FYOe3g7Ehdd_V9HtD7r%=OXWWs!jN9 zqBCFccIb?$%?O?meuv;);IFP5l)Qt;+wI#V{7s^BvEWxg=gPV}1iwT0cL{zU_|MgD zmAqS#_p`oj!rvx3PYeDmbp9NDUGUe1|Ayf2fIp^I1*E@$i&fC_1*E?L>963Cfb>`J z3Bun;@cqDlrf#m}or}D4tv2DeiOzh%+oAK@x{Tl%;dcn$1^(#zLCHIaycb!Uguh92 zE*AU>=*+LbL-0FA^07FZxei*;I9k*y5OrrEPqho)(~yGHFUAs z?pHNp=bDSv$iQ5|=K?=IFevyS@aqFDQRba1a4<^!!RW=x3T_pAEAT}@RV(GxUX1rd z=L$X-_%DKkf)4`UH?&pot-$jkKJ5SlCaT;RV64c4(PytfRvRp3s6E%nj{ zfvW`$3fx)Ga(32VtnLi2ZlKPfK-EaRMc`b4s|9WmxK-dzfhsPV0_O@`EpSkC5>lqX zEdsX++$nHkl5@@ifm@T*+$m6{q)dTx1+Er2DDaXLb8QiPtH7@dXQ$wA3a*-@1c9nq zaDj6Lt`;~baErjL0(S~jBSc@|T!E`KK9c;^0tW?d(fBCxw+P%SaHl{uTFMbPSKw-a zg95h*+$wOVKs8461?iAQEUibpH2;3>KrA7Dxw+P%Ruw{bq1#S_zQ((*9!WXzj;485o$KHt5 zHN+d58x}Sk-EeG!-7whjk%lW9KGyJwhI<zY;$ru`V%?xHNHV;_<|DiSH+Vn)pMaF1dGd zO7h6$l4NJ{;^eJKJc~}wPHjqEpZZ+tjZ{O^w5CN(A8tCSX;ss@rVUNkHa*hh$JsZC zTY?(J6KDW?p9tO;uf>0jIQ3y~fD>j6r^yDKB=J_V`bJYZd|=eKz`4x#ZNP^|y$tyD zsMi3$E%=WG|M{q$;AqW1ivD{7Yeq9~a`c;kdyoD(;3VN_e1G9g8~t1GTSxyHaGprp zNBi&<46Sp$iU8NSjvI}y52({dHv?+T>N0ih87b#%fdzrOJ?9HPh#L88bhJz}prsCm zh47BD*l9T|{E|1z#dp zgV=faa5hc?zX z_{RV(bv<@OK6L{iZuM}^_o+_+TKJ7bzKwl5pry9RcLnYMwA7vW1#i653}~sl@vGE6 zbq}DWK85dz`P8QYEj;<13j97m3(rNT1Ahq6QeS{QeCmsU7Jh&F5a163TIvz}l7$aX z7!L#fm}&+7IH0AzjPE1()DwV~dP=^N@HC)>T?gO){sy3h=RR$~p9i$?4T1Tff#ZuliZB#j(C*A@xk^l~lSZFo+;1`*+o7-YL5Oj%ofeI0~chbD8QoA*v*5-TVj9^YV^qz6v*RyzdL4%$Pjc>1qy)Auj@|wI4fW#d(>vYqR+&ZM|KpeOb1^)FkaI3b}li3S0AKSZ0sv!*H4+B>+a49yKl}d)uHCh%k*WJ zWeV%6%A9i?TA&+VC38iJ=!$ije6O0bqL3-{_sxe0%dkmb2!#Lne{_7Xj!JO@4Q^Tv#P*3Z5Yv$H)_ zLX60Vvm5CsNS5WZYq~b5Rj_UEqFgsDPeZCX?bU@I)8E~lIkP*vdb$}5HRqV2o0TmL zk$ukc{!CAytFW=EL338D>*`$q53G`qxw310wlpqP3h=4*z1`U%vd$^FbakF(>vDzM z@%irR5nR&MS3vjX!1t?#a~5^w`wByMc}ZqC$-?!SuI?e*&{N%C8Efr=RatszRdr^r zbEE1LCshTsQqeP1Mh|JGv$IPgrh93&km<}6GHOj%cUGNg;zJ#K=2-|HHKhYHi|Qzw z5@<;1<|U|L_Rh8fz7~6Ce<526z2o{ZeCx9aL9MwWn?JV;Zl=!7boXb~BII6{$)h<1 z%pm$ZwW_VNQ?>WebB@g~T;E&R$cd;UQ&4@`!m4&SooZ+Bl_E>61=|flbyT6y>mkh? za13TADxxTcli(6xOX2gGwOPc`nf;tqR}`|nE7#?7{cG1%^=3g=W^GTduh7-ehY;(9 zv9g?Z`!@D;9MQ3ARffnkHK!NRu;nxaIj29H-{>$7QghbH%;j(nR&&|B zns{b^7o%87PgZ97&W0dCt1T)D9q;fZmsvfgyHI9s52Q9if+s7y~MJkj_NxrT$N>S5l#c^mae zmk+@~!*m2u%BC?`-2xc4<=GDw=Qt|UcY^rn9JB~^&D+@CS+0k%(J>@?Vo$Gi+dM9E zVpn0^B8+Q!0T|2$Sx!V%X28H6-`kzbbTUB7Gabe-$!69oWA^rA9oL~>5T)_-g7RZ z8k>=FV<7^Ub!R%VvO_5s!3mI01l2=}z|XJOTu~q0 zpe>)zY;5o8?XQ?O(4GoSE-XVRqHRlZYrA@?E5qagNv^+8ErPG2x8%>;$knLa7H~v8 zn^k9oCu&Pniw;BovFu~+#$2I1GaG&sLQhf3JG&`&Vv`j{&v8n4?TTl-YI*;+WYt2sxk!7{UcVh3i_>@>Bgzo!FMDdSEr842@%GIPX| zuAXz$%AC75R_(@idTWM#Pj@%=cI94y;K}RJz}zN;-pYcSuFi&m`wDq}I2o}IW?quL z;Non->2mJOvrsvtSQ~VoO6~G&%$*i-Y(1?LgDlDRtc9l?mtBt$<8I*GELNe?N~Q{2 zPH4E}GUv_PSitTg*Sl)rIsKV#>>Oo5!A4b@bzF9Bc0;N5l^FUd;PiKA@(VZgqBw4- z`_$4*p<|s|j4eQ~l)9o{HpV#b^cMQ_SdX&3oKvLFN(Q^FyIa@GKJ#z{_g#<4$XEo# znV6}1*5pc6AD3NYP9%Com6<_doZ)!wTqrVyW%=B>U0jqGU{>UQc12-hH@aqqbTNKU z1pPZ-pUsZ$%VAE|W;rH%UIE?6ttm_)8><7NzKgn9vz4Q%O4}Z6$jW494`KFVoaZxn zG=f<$7k2ezy4$e@%4g?ed&rR}WV&Fo_L8+r8Q}Iu=el}Sf#J2Vrz6LWL8UI%f{oawc6E5xhg^RiX7A+mz;hv;fHB0amr-7U$eX4#q)!t= zQzT9f!2oKGnlA^pw)|SmCOw#AF)&NJI`TO&niftmyN-F-X`uhrITm$uCvC)7esFBk zf&0UXaem_@UKiK0!9`JRca)+!|q~we7;L9?CZ$%X5k$f zV=$eRHf`|Yb?8-(TG4-IpN_q@-rj6aC;sM?nQXWjYU6UHvZX^PW^=tAHXOZK*4vzR ztk#9DHC-^r%KSzQo1R=3bmehA;61>?4Op@I%vRB5JD3=no-`ll=041{CgX}MoQ#t? z`AWdTo^!kMxgHLW_PrIQ^X{>|TmaxrIuNkc>qB^TOPuR|LFQ#5*0NX^I&eDCs$Gbp zl7h_1C$576!WkzusjO5LZA%x=XF3Y58=3$tooq@0qyv#zv>Uh?bUd@kDpx>N^msAd zv3YZNR}wyb6kyxAj<*5W0AZ0rt3{-EE3&9-1Lq&N;A4*O=_*WF#N!iA^k*YW;rL!x zyfT}~FUXze*>7BUsk^tnZo^6(t?2B)F;RN=;?OT`z&)tW14Eatk65vT)1q(~&!t&k6-P#1mVV@PwyiA2 zA#^3~##Onf7D3tBxH6|hc)KJ_(<#BV(A{L3Ky@~D9=c+uI=rN^Ov&hMTr2ZA0-ep- z#wrJM1ZEdYiFZTG-nzTka!TiQH?n5L-Tt{7Sz{Jgv=-y!3?m24At>R-)Lf8K<{>FH zL2P!IRNyg1UkFOrK;L@@DEAnZJlv^qr7dlL&4x_YlG4VEK~!FsUINVYkKF?%0_;3j z=440dp^b)TCxE%atoy*Y716Ed6<{wGqYT$!S+iRWTdgkE~F zT%Y5(z*)guY%4G^3_5@=DjBQiwxPQo05ei9?7)U-+?F?T_M%rIWkpI|TJhcb{535Lrpz;pfyGwhun0BwR*^Q zEQV@+cQ(_5eLGjW#m?%WXNGc~s8p{KRPxOHB+Wupx@(e*?y6iJX3o@69;}{8p)&a0 zATXHrcgMXQZ}xg_g*(D$#I3Z`I6mUIgfW^k|FNnhW5c^ z%B$0%E}pRG;c=+1bcZL$gF@GtT|Ak&JC*f)9l3mW*O|)ft>)u^QMDsiJ^kG7tZ}zH z`Z1WEnAwmio!#AhtQeW9dhzrdUssxt0oIG>+g+*y?}QhS=J0o!r{d{14vG8=&EtpD z*r3)UpQ>*|PHd1-3d*ZrgIsw?SeA-7rHpCA8wdqFU#GN7o$skjHOxcq4ER}mTJWa< z7b4AzW{b3{TiVxyXY?)Vc+}G=xwC4S^kEkB9Js4IZOGB-)!wJn|EYMs+=X6t;&&T1 zsugG<+ue`8tNK1K)wZkh7nw42dvNBdC`(#6e&{+^qQ{*y2N=&%;<{Q9|_yES6lluk0yv zs8Me3Y)?t}dVj53u4XT0*(hV9QitrSr$f~vJsiCFf4Ym+PIe-iP4``7+*?I@ zi~-gBU3KCgmn2>4`=9R70vNno2Cft~yAHEz{r?^3qP@Cd;|!dNVZ}D9>BBkKRJgUP z-!9Y6TIQI<{GBppdP2*fq@~h-N*LrBgdBrkYS^VC4%H^H#)PQ|vx0a;7E>kz?p)M? zOC90C!ST1pho8!{gSS`ZlClv{-m*DucA{*2`*fFWU55T-WI8_9$sy$x|5*=nYu??d z!L8Yu9u6F?H&c}@w$goL4VW?-%In-6D^}Mjy|({1dhLxBw;k%RU5)+Fd8Ey?^y35wH@NAab=gugN*&ytRlHO+1N9h~gF6C+X{}Ti!?T2! z%0+F*I|Fw{;Y{#zq=UsS9ZQ1pZ43*=5v&G&iVfR`*R1Q4>^uP)E?xbGc zRv|p~*semDa%X)mB%K&*?A-kQ{1PpG^;dPxhlGolUcwGk3nWZ?!R2nUbT*i!rl|d$ zvP&f&u1>|iac^}x-U>|vKSQX~kn?oBpSqt%IuUj5jSqfIZs7{}9Vdb;JZ}m-upc4B z1?)_~tXi$6Bj2gmmwUAqK+YU1(I)ZN@#XT$QdHA?Y}_*F8Mg*2Q5JWks+P;Op0t!7 zCy0gf@up-8>RN#JQCrZ5cD#Q&1@w8yyH@h%(T^6$@$L^=%Dwe*z-ga6S~QEl-5qZM zm;W7$oH7=Ea9c}U_HiNF(1OiPX$P*SpR>U`0j1%AA^OE}klcrta+b?lps@xyxFyXZ zZNurNU2;rEo2SVK^&VNuUFy{`^rZv4Z}y1!%1dR9W%==kCkptl7bQ={e|jhHZcC=1 ztzPR)k(N(|cO8Tu=r11?`W6==wNHnPFely?yeX{5l9Og0Bh!NU2JNnAySW(<8;DIy zvy*UwMQV-nmgFwHri>)Z(5Doqq*3H8$Jo&u=+6bzDJ6A>?DklNKIUCkr5rOF>|qbQKzQTW z>r#uVEIeX9N@3jQVPSeYF1i3!G6Vn8b(ZD{HMtL*(n#nNEA?HkD)kqBIiXy)7j=|d zy;6fC&sZ;&F&%%n_@9ppylIW!%hP>nDV>A&;XKlZe$qPJrtrJ}jE@XH+K1HiN}VZ~ zNA!(>SKHl`soB*zmR0q3n7l_;=dJWyZ_Y}Y8pBaO53MiV2f6lB4V*`K=fW9yE#i21 zU5wWx&L{MOsTh5ZF^>}TI<6E`kiQFcsC`OhbU-rn*sBO{w7R+GjjQ&d15m1w;v3Kh z;5!nB;i62bf%V&$-mvK}3%+{8V-GKWWG#OBHk3%$gqjjTD;BdtF^~}}6t+TRfwhD} zP4RkPR3~Amfr`g9X+hxtpou15j0H6L5;Lt(G{9Q00QmwwAg16NDL*lxrp59lRniy0 zx7lO(vQI1)3$&>CfzXeIwQgd9KQxZbn1RoJ_|*AB@k3B*{E(Vy_)&qzz3`_deet7^ zFVPxo@%a*MGkj{Q=Vf&~KAD0`Q6!Uxe`iw)Su)+H4j3kGY86kyw z;|ptHk#?W-eMZzp@jD(Ql2XaCaEoe6ECn^&rw$#aHuu@5zP2r|7jDBouWZG4fBsM4FEPU;Ecc{Cd}`V-hST}@Yl)er!d6#cX(vZ`POH9))F^wg5ALdgBRg9}!V#VWWXJ8N? z%-s8rnp6Jx+R1L*yfD+J4j#5{?Gx_vZ6`Op+_B+02kUmQUI#0n({u0{%f@av)TgFb z)W(M&GJUwu&dXhB8h)%v&jfQ=#=t_Kn){E-sCdX;ULXCnm(k1z`bDL2McZKZ|8>Y)JXB`G^4x zQxc}~SXgOXutr%{qAk(pS4uiO_!VU1P9>yZZpg*zgU@q%9~VSs3qPapkH=$)!B^vh zJD@c-mS_v&%Z`ITOW}_yl{zooe+O3ZM=^BV`;5aD2wJ~JNoZgYEf^O}(V%~%f&LOq z4E}ebZ7lxB*LoA1eDO`e7``Bx*i;|i6z8Daiaki8O(XaXkRdYGDVFp{EJMiU4c~j!7a#m&)IETQTP(O_Bm5AXr~jwD>-lY?h{C%Y$1`@_B_0%L#j0{pTAb8W zmRJb~8E8d|05v56tMpI_3=JhBNllW9A3~}vaR3PX5Q|b*&RI07MX&fIYm1#iYSV~k_f@ZA1|Uc z%;1buvB8-jQ8C1h&iGEQ!v9dW0w@g%Rc3svZ&W+B`rw@M3T$!6Ie_dR^szy;6Bg(~ z57w`Af|+xh>$`~q->!3!BY?&PZgZ*adk&t$$AP(W9_nR zd;3?won#kW9^i=-#^R2w2FU}u#@J9%KgPM%QlL%LB|b_ZoNd zG}v2(uQqXy~mR3%?BW)PZ3F7IDljv1H=I93Frr zmg=i^ut?>U02a$_i9llfu&E-3A#_uWLS_l)5{6rW0tbOvve83;u`#n+A)reL1@$TA zV|4LMy`X$kud6bKJ>K6Q5ORVDL$d&AnDz+HpHhbo0=D_Ch~&n z0+$$EX7CDwD@sk3aIJe-6>zrLO}8W|6Ps>@Q?E1qXP8)qlwAfT-!x4(Fe3_im?mTh zAPBgLnG9_cJ~AP2>ShnNeK=G{sRd=oSe7Ln3pSF~cZS z3I5=1O#c>?MuBABeWUNfnu=g2L5Q&H zV8fWzvMS)zzXe04q^3idEm{N2N7>Jc=wlI!20rpIl4x3fKI~0Jo3McKEQIk#GX-WB zu?C8x9v*}#v=`5sO3Fx40c4I^8JNcXY8np+kUJKHc(cbSOXFeK;9cJ|5~MmosvS~9 zq_%36>H&P!s;Gv2BRAAynrm>`2Ny=VppH!s- zWirOPKB9_aJXr`wb9+|d$)srreWqopG8HmWsi0R>WSosL2|_U{Cf3YDf%qO(K&1bT zhzaK-YMQ{{Qg8qwnNH_bd4C1tHHJW28n za|nlx7TaexHkPsf%#-z_Yin-(r}y`9uXZ|H@NVjVBmsUM+QVCbyndEwYMTfD@BVzk zJ%j(H)4sPCFlCRu0MDJ^2YwOj1unuj{Q_e2d|yENS%gm`&f}-TAAfP7!1y7bkU(Yu z{}fsQJB!ca{p-+g%yp-zTD*dterj+<@toNJOZ+LqJyvQCn=pE#`Vfu^q zWBLtb;fXwcj{Z9L(N0w93N93wlnEm0nTg4yABzSyv(j%%S#q!T#7XU->FB< R$6Nh8Z-w3U?s3OS;2#X7)~Wyi diff --git a/samples/client/petstore/csharp/SwaggerClientTest/obj/Debug/SwaggerClientTest.dll.mdb b/samples/client/petstore/csharp/SwaggerClientTest/obj/Debug/SwaggerClientTest.dll.mdb index 0d05b783eb133d2be42d86fa4af7ee5a4106bc70..bf97cbbd6cb5fa4980158579343115d41bb7152c 100644 GIT binary patch delta 7924 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 NG(c`cDv!4V`9FnPU0whH delta 7710 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 PB6VbG(m<9Woyq?JneQSZ From 845dd229420c29d2ab9daab260971e7f49c791bc Mon Sep 17 00:00:00 2001 From: 317959997 Date: Mon, 30 Nov 2015 10:18:29 -0500 Subject: [PATCH 079/211] added missing JMeter files --- gen-config.json | 1 + modules/swagger-codegen/pom.xml | 4 +++- pom.xml | 6 +++++- 3 files changed, 9 insertions(+), 2 deletions(-) create mode 100644 gen-config.json diff --git a/gen-config.json b/gen-config.json new file mode 100644 index 00000000000..4ec9b5eb26b --- /dev/null +++ b/gen-config.json @@ -0,0 +1 @@ +{ "library": "feign" } \ No newline at end of file diff --git a/modules/swagger-codegen/pom.xml b/modules/swagger-codegen/pom.xml index fc51a41fcdf..ebdab1e8024 100644 --- a/modules/swagger-codegen/pom.xml +++ b/modules/swagger-codegen/pom.xml @@ -154,6 +154,7 @@ target/site + @@ -274,7 +276,7 @@ sonatype-snapshots - https://oss.sonatype.org/content/repositories/snapshots + http://oss.sonatype.org/content/repositories/snapshots true diff --git a/pom.xml b/pom.xml index ada3dc0dc4a..43611eed67d 100644 --- a/pom.xml +++ b/pom.xml @@ -118,6 +118,7 @@ + maven-compiler-plugin 3.0 @@ -200,7 +202,9 @@ attach-javadocs + jar @@ -536,7 +540,7 @@ sonatype-snapshots - https://oss.sonatype.org/content/repositories/snapshots + http://oss.sonatype.org/content/repositories/snapshots true From ff7d177de38c7a2c867e8467fd0e8e261b03f862 Mon Sep 17 00:00:00 2001 From: David Kiss Date: Mon, 30 Nov 2015 10:21:00 -0500 Subject: [PATCH 080/211] Delete gen-config.json --- gen-config.json | 1 - 1 file changed, 1 deletion(-) delete mode 100644 gen-config.json diff --git a/gen-config.json b/gen-config.json deleted file mode 100644 index 4ec9b5eb26b..00000000000 --- a/gen-config.json +++ /dev/null @@ -1 +0,0 @@ -{ "library": "feign" } \ No newline at end of file From 83223ae6d0bc3d7b2b1331bfec2728d374e7ecd4 Mon Sep 17 00:00:00 2001 From: 317959997 Date: Mon, 30 Nov 2015 10:25:12 -0500 Subject: [PATCH 081/211] rolling back previous accidental push on changes to pom.xml files --- modules/swagger-codegen/pom.xml | 3 +-- pom.xml | 6 +----- 2 files changed, 2 insertions(+), 7 deletions(-) diff --git a/modules/swagger-codegen/pom.xml b/modules/swagger-codegen/pom.xml index ebdab1e8024..0eb6cf02716 100644 --- a/modules/swagger-codegen/pom.xml +++ b/modules/swagger-codegen/pom.xml @@ -154,7 +154,7 @@ target/site - diff --git a/pom.xml b/pom.xml index 43611eed67d..ada3dc0dc4a 100644 --- a/pom.xml +++ b/pom.xml @@ -118,7 +118,6 @@ - maven-compiler-plugin 3.0 @@ -202,9 +200,7 @@ attach-javadocs - jar @@ -540,7 +536,7 @@ sonatype-snapshots - http://oss.sonatype.org/content/repositories/snapshots + https://oss.sonatype.org/content/repositories/snapshots true From 44c2751d80e02d9317d0071543850a8d18c0c4b6 Mon Sep 17 00:00:00 2001 From: 317959997 Date: Mon, 30 Nov 2015 10:27:16 -0500 Subject: [PATCH 082/211] added missing files to support JMeter --- .../codegen/languages/JMeterCodegen.java | 183 ++++++++++++++++++ .../main/resources/JMeterCodegen/api.mustache | 28 +++ .../services/io.swagger.codegen.CodegenConfig | 1 + 3 files changed, 212 insertions(+) create mode 100644 modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/JMeterCodegen.java create mode 100644 output/swagger-codegen-jmeter/src/main/resources/JMeterCodegen/api.mustache create mode 100644 output/swagger-codegen-jmeter/src/main/resources/META-INF/services/io.swagger.codegen.CodegenConfig diff --git a/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/JMeterCodegen.java b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/JMeterCodegen.java new file mode 100644 index 00000000000..fb167477214 --- /dev/null +++ b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/JMeterCodegen.java @@ -0,0 +1,183 @@ +package io.swagger.codegen.languages; + +import io.swagger.codegen.*; +import io.swagger.models.Operation; +import io.swagger.models.Path; +import io.swagger.models.Swagger; +import io.swagger.models.properties.*; +import org.apache.commons.lang.StringUtils; + +import java.util.*; +import java.io.File; + +public class JMeterCodegen extends DefaultCodegen implements CodegenConfig { + + // source folder where to write the files + protected String sourceFolder = ""; + protected String apiVersion = "1.0.0"; + + /** + * Configures the type of generator. + * + * @return the CodegenType for this generator + * @see io.swagger.codegen.CodegenType + */ + public CodegenType getTag() { + return CodegenType.CLIENT; + } + + /** + * Configures a friendly name for the generator. This will be used by the generator + * to select the library with the -l flag. + * + * @return the friendly name for the generator + */ + public String getName() { + return "jmeter"; + } + + /** + * Returns human-friendly help for the generator. Provide the consumer with help + * tips, parameters here + * + * @return A string value for the help message + */ + public String getHelp() { + return "Generates a JMeter .jmx file."; + } + + public JMeterCodegen() { + super(); + + // set the output folder here + outputFolder = "generated-code/JMeterCodegen"; + + /** + * Api classes. You can write classes for each Api file with the apiTemplateFiles map. + * as with models, add multiple entries with different extensions for multiple files per + * class + */ + apiTemplateFiles.put( + "api.mustache", // the template to use + ".jmx"); // the extension for each file to write + + apiTemplateFiles.put("testdata-localhost.mustache", ".csv"); + + /** + * Template Location. This is the location which templates will be read from. The generator + * will use the resource stream to attempt to read the templates. + */ + templateDir = "JMeter"; + + /** + * Api Package. Optional, if needed, this can be used in templates + */ + apiPackage = ""; + + /** + * Model Package. Optional, if needed, this can be used in templates + */ + modelPackage = ""; + + /** + * Reserved words. Override this with reserved words specific to your language + */ + reservedWords = new HashSet ( + Arrays.asList( + "sample1", // replace with static values + "sample2") + ); + + /** + * Additional Properties. These values can be passed to the templates and + * are available in models, apis, and supporting files + */ + additionalProperties.put("apiVersion", apiVersion); + +// supportingFiles.add(new SupportingFile("testdata-localhost.mustache", "input", "testdata-localhost.csv")); + } + + public void preprocessSwagger(Swagger swagger) { + if (swagger != null && swagger.getPaths() != null) { + for (String pathname : swagger.getPaths().keySet()) { + Path path = swagger.getPath(pathname); + if (path.getOperations() != null) { + for (Operation operation : path.getOperations()) { + String pathWithDollars = pathname.replaceAll("\\{", "\\$\\{"); + operation.setVendorExtension("x-path", pathWithDollars); + } + } + } + } + } + + /** + * Escapes a reserved word as defined in the `reservedWords` array. Handle escaping + * those terms here. This logic is only called if a variable matches the reseved words + * + * @return the escaped term + */ + @Override + public String escapeReservedWord(String name) { + return "_" + name; // add an underscore to the name + } + + /** + * Location to write model files. You can use the modelPackage() as defined when the class is + * instantiated + */ + public String modelFileFolder() { + return outputFolder + "/" + sourceFolder + "/" + modelPackage().replace('.', File.separatorChar); + } + + /** + * Location to write api files. You can use the apiPackage() as defined when the class is + * instantiated + */ + @Override + public String apiFileFolder() { + return outputFolder + "/" + sourceFolder + "/" + apiPackage().replace('.', File.separatorChar); + } + + /** + * Optional - type declaration. This is a String which is used by the templates to instantiate your + * types. There is typically special handling for different property types + * + * @return a string value used as the `dataType` field for model templates, `returnType` for api templates + */ + @Override + public String getTypeDeclaration(Property p) { + if(p instanceof ArrayProperty) { + ArrayProperty ap = (ArrayProperty) p; + Property inner = ap.getItems(); + return getSwaggerType(p) + "[" + getTypeDeclaration(inner) + "]"; + } + else if (p instanceof MapProperty) { + MapProperty mp = (MapProperty) p; + Property inner = mp.getAdditionalProperties(); + return getSwaggerType(p) + "[String, " + getTypeDeclaration(inner) + "]"; + } + return super.getTypeDeclaration(p); + } + + /** + * Optional - swagger type conversion. This is used to map swagger types in a `Property` into + * either language specific types via `typeMapping` or into complex models if there is not a mapping. + * + * @return a string value of the type or complex model for this property + * @see io.swagger.models.properties.Property + */ + @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 toModelName(type); + } + else + type = swaggerType; + return toModelName(type); + } +} \ No newline at end of file diff --git a/output/swagger-codegen-jmeter/src/main/resources/JMeterCodegen/api.mustache b/output/swagger-codegen-jmeter/src/main/resources/JMeterCodegen/api.mustache new file mode 100644 index 00000000000..9dbc8dd4ba1 --- /dev/null +++ b/output/swagger-codegen-jmeter/src/main/resources/JMeterCodegen/api.mustache @@ -0,0 +1,28 @@ + +# This is a sample api mustache template. It is representing a ficticous +# language and won't be usable or compile to anything without lots of changes. +# Use it as an example. You can access the variables in the generator object +# like such: + +# use the package from the `apiPackage` variable +package: {{package}} + +# operations block +{{#operations}} +classname: {{classname}} + +# loop over each operation in the API: +{{#operation}} + +# each operation has a `nickname`: +nickname: {{nickname}} + +# and parameters: +{{#allParams}} +{{paramName}}: {{dataType}} +{{/allParams}} + +{{/operation}} + +# end of operations block +{{/operations}} \ No newline at end of file diff --git a/output/swagger-codegen-jmeter/src/main/resources/META-INF/services/io.swagger.codegen.CodegenConfig b/output/swagger-codegen-jmeter/src/main/resources/META-INF/services/io.swagger.codegen.CodegenConfig new file mode 100644 index 00000000000..4ea2512a9e8 --- /dev/null +++ b/output/swagger-codegen-jmeter/src/main/resources/META-INF/services/io.swagger.codegen.CodegenConfig @@ -0,0 +1 @@ +com.kaviddiss.codegen.JmetercodegenGenerator \ No newline at end of file From 9cfb1c91db1270f14c5adf16808ba47d9d9983c2 Mon Sep 17 00:00:00 2001 From: 317959997 Date: Mon, 30 Nov 2015 10:31:01 -0500 Subject: [PATCH 083/211] removing references to fork in te main README.md file --- README.md | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index ba1266e0ef4..333566f6d24 100644 --- a/README.md +++ b/README.md @@ -1,9 +1,6 @@ # Swagger Code Generator - -This is a fork with added support for generating - - - Java client using [Netflix Feign](https://github.com/Netflix/feign). - - [Apache JMeter](http://jmeter.apache.org/) project for testing REST endpoints. +-[![Build Status](https://travis-ci.org/swagger-api/swagger-codegen.png)](https://travis-ci.org/swagger-api/swagger-codegen) +-[![Maven Central](https://maven-badges.herokuapp.com/maven-central/io.swagger/swagger-codegen-project/badge.svg?style=plastic)](https://maven-badges.herokuapp.com/maven-central/io.swagger/swagger-codegen-project) ## Overview This is the swagger codegen project, which allows generation of client libraries automatically from a Swagger-compliant server. From bb4589dca1e82f06ace709bf0040295d3d570b92 Mon Sep 17 00:00:00 2001 From: davidkiss Date: Mon, 30 Nov 2015 10:40:12 -0500 Subject: [PATCH 084/211] cleaned up README.md --- README.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 333566f6d24..4738f114cea 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,7 @@ # Swagger Code Generator --[![Build Status](https://travis-ci.org/swagger-api/swagger-codegen.png)](https://travis-ci.org/swagger-api/swagger-codegen) --[![Maven Central](https://maven-badges.herokuapp.com/maven-central/io.swagger/swagger-codegen-project/badge.svg?style=plastic)](https://maven-badges.herokuapp.com/maven-central/io.swagger/swagger-codegen-project) + +[![Build Status](https://travis-ci.org/swagger-api/swagger-codegen.png)](https://travis-ci.org/swagger-api/swagger-codegen) +[![Maven Central](https://maven-badges.herokuapp.com/maven-central/io.swagger/swagger-codegen-project/badge.svg?style=plastic)](https://maven-badges.herokuapp.com/maven-central/io.swagger/swagger-codegen-project) ## Overview This is the swagger codegen project, which allows generation of client libraries automatically from a Swagger-compliant server. From 340e8b367102a1af15f45bffbe1fcec2d9a6615c Mon Sep 17 00:00:00 2001 From: davidkiss Date: Mon, 30 Nov 2015 10:41:44 -0500 Subject: [PATCH 085/211] reverting changes to swagger-codegen pom.xml --- modules/swagger-codegen/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/swagger-codegen/pom.xml b/modules/swagger-codegen/pom.xml index 0eb6cf02716..656223ff42b 100644 --- a/modules/swagger-codegen/pom.xml +++ b/modules/swagger-codegen/pom.xml @@ -275,7 +275,7 @@ sonatype-snapshots - http://oss.sonatype.org/content/repositories/snapshots + https://oss.sonatype.org/content/repositories/snapshots true From 21e88223431cd5d22db213326942d9838751fbf3 Mon Sep 17 00:00:00 2001 From: David Date: Mon, 30 Nov 2015 10:44:32 -0500 Subject: [PATCH 086/211] cleaned up output folder from repo --- .../main/resources/JMeterCodegen/api.mustache | 28 ------------------- .../services/io.swagger.codegen.CodegenConfig | 1 - 2 files changed, 29 deletions(-) delete mode 100644 output/swagger-codegen-jmeter/src/main/resources/JMeterCodegen/api.mustache delete mode 100644 output/swagger-codegen-jmeter/src/main/resources/META-INF/services/io.swagger.codegen.CodegenConfig diff --git a/output/swagger-codegen-jmeter/src/main/resources/JMeterCodegen/api.mustache b/output/swagger-codegen-jmeter/src/main/resources/JMeterCodegen/api.mustache deleted file mode 100644 index 9dbc8dd4ba1..00000000000 --- a/output/swagger-codegen-jmeter/src/main/resources/JMeterCodegen/api.mustache +++ /dev/null @@ -1,28 +0,0 @@ - -# This is a sample api mustache template. It is representing a ficticous -# language and won't be usable or compile to anything without lots of changes. -# Use it as an example. You can access the variables in the generator object -# like such: - -# use the package from the `apiPackage` variable -package: {{package}} - -# operations block -{{#operations}} -classname: {{classname}} - -# loop over each operation in the API: -{{#operation}} - -# each operation has a `nickname`: -nickname: {{nickname}} - -# and parameters: -{{#allParams}} -{{paramName}}: {{dataType}} -{{/allParams}} - -{{/operation}} - -# end of operations block -{{/operations}} \ No newline at end of file diff --git a/output/swagger-codegen-jmeter/src/main/resources/META-INF/services/io.swagger.codegen.CodegenConfig b/output/swagger-codegen-jmeter/src/main/resources/META-INF/services/io.swagger.codegen.CodegenConfig deleted file mode 100644 index 4ea2512a9e8..00000000000 --- a/output/swagger-codegen-jmeter/src/main/resources/META-INF/services/io.swagger.codegen.CodegenConfig +++ /dev/null @@ -1 +0,0 @@ -com.kaviddiss.codegen.JmetercodegenGenerator \ No newline at end of file From 88d8ea23e315f6f2e81fcd78174dde02a9f323e0 Mon Sep 17 00:00:00 2001 From: Tony Tam Date: Mon, 30 Nov 2015 10:24:15 -0800 Subject: [PATCH 087/211] updated templates, files --- .../languages/JavaInflectorServerCodegen.java | 47 +- .../JavaInflector/inflector.mustache | 2 +- .../main/resources/JavaInflector/pom.mustache | 4 +- .../resources/JavaInflector/swagger.mustache | 1 + .../petstore/java-inflector/inflector.yaml | 6 +- .../server/petstore/java-inflector/pom.xml | 6 +- .../io/swagger/handler/PetController.java | 2 +- .../io/swagger/handler/StoreController.java | 2 +- .../io/swagger/handler/UserController.java | 2 +- .../main/java/io/swagger/model/Category.java | 2 +- .../src/main/java/io/swagger/model/Order.java | 2 +- .../src/main/java/io/swagger/model/Pet.java | 2 +- .../src/main/java/io/swagger/model/Tag.java | 2 +- .../src/main/java/io/swagger/model/User.java | 2 +- .../src/main/swagger/swagger.json | 770 ------------------ .../src/main/swagger/swagger.yaml | 667 +++++++++++++++ 16 files changed, 705 insertions(+), 814 deletions(-) create mode 100644 modules/swagger-codegen/src/main/resources/JavaInflector/swagger.mustache delete mode 100644 samples/server/petstore/java-inflector/src/main/swagger/swagger.json create mode 100644 samples/server/petstore/java-inflector/src/main/swagger/swagger.yaml diff --git a/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/JavaInflectorServerCodegen.java b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/JavaInflectorServerCodegen.java index c0061bf39e7..a7a0420d984 100644 --- a/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/JavaInflectorServerCodegen.java +++ b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/JavaInflectorServerCodegen.java @@ -1,27 +1,15 @@ package io.swagger.codegen.languages; -import io.swagger.codegen.CodegenConfig; -import io.swagger.codegen.CodegenConstants; -import io.swagger.codegen.CodegenModel; -import io.swagger.codegen.CodegenOperation; -import io.swagger.codegen.CodegenProperty; -import io.swagger.codegen.CodegenType; -import io.swagger.codegen.SupportingFile; +import com.fasterxml.jackson.core.JsonProcessingException; +import io.swagger.codegen.*; import io.swagger.models.Operation; import io.swagger.models.Swagger; import io.swagger.models.properties.ArrayProperty; import io.swagger.models.properties.MapProperty; import io.swagger.models.properties.Property; -import io.swagger.util.Json; +import io.swagger.util.Yaml; -import java.io.File; -import java.io.FileWriter; -import java.io.IOException; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.HashSet; -import java.util.List; -import java.util.Map; +import java.util.*; public class JavaInflectorServerCodegen extends JavaClientCodegen implements CodegenConfig { protected String title = "Swagger Inflector"; @@ -78,6 +66,10 @@ public class JavaInflectorServerCodegen extends JavaClientCodegen implements Cod supportingFiles.add(new SupportingFile("README.mustache", "", "README.md")); supportingFiles.add(new SupportingFile("web.mustache", "src/main/webapp/WEB-INF", "web.xml")); supportingFiles.add(new SupportingFile("inflector.mustache", "", "inflector.yaml")); + supportingFiles.add(new SupportingFile("swagger.mustache", + "src/main/swagger", + "swagger.yaml") + ); } @Override @@ -173,21 +165,18 @@ public class JavaInflectorServerCodegen extends JavaClientCodegen implements Cod return objs; } + @Override - public void processSwagger(Swagger swagger) { - super.processSwagger(swagger); - - try { - File file = new File( outputFolder + "/src/main/swagger/swagger.json" ); - file.getParentFile().mkdirs(); - - FileWriter swaggerFile = new FileWriter(file); - swaggerFile.write( Json.pretty( swagger )); - swaggerFile.flush(); - swaggerFile.close(); - } catch (IOException e) { - e.printStackTrace(); + public Map postProcessSupportingFileData(Map objs) { + Swagger swagger = (Swagger)objs.get("swagger"); + if(swagger != null) { + try { + objs.put("swagger-yaml", Yaml.mapper().writeValueAsString(swagger)); + } catch (JsonProcessingException e) { + e.printStackTrace(); + } } + return super.postProcessSupportingFileData(objs); } @Override diff --git a/modules/swagger-codegen/src/main/resources/JavaInflector/inflector.mustache b/modules/swagger-codegen/src/main/resources/JavaInflector/inflector.mustache index 99ace468103..c61fa2054b8 100644 --- a/modules/swagger-codegen/src/main/resources/JavaInflector/inflector.mustache +++ b/modules/swagger-codegen/src/main/resources/JavaInflector/inflector.mustache @@ -1,6 +1,6 @@ controllerPackage: {{invokerPackage}} modelPackage: {{modelPackage}} -swaggerUrl: ./src/main/swagger/swagger.json +swaggerUrl: ./src/main/swagger/swagger.yaml modelMappings: {{#models}}{{#model}}{{classname}} : {{modelPackage}}.{{classname}}{{/model}} {{/models}} diff --git a/modules/swagger-codegen/src/main/resources/JavaInflector/pom.mustache b/modules/swagger-codegen/src/main/resources/JavaInflector/pom.mustache index 0f489f4923d..c4b5fdf4922 100644 --- a/modules/swagger-codegen/src/main/resources/JavaInflector/pom.mustache +++ b/modules/swagger-codegen/src/main/resources/JavaInflector/pom.mustache @@ -74,11 +74,11 @@ - + io.swagger swagger-inflector - 1.0.0-SNAPSHOT + 1.0.0 diff --git a/modules/swagger-codegen/src/main/resources/JavaInflector/swagger.mustache b/modules/swagger-codegen/src/main/resources/JavaInflector/swagger.mustache new file mode 100644 index 00000000000..51560926bba --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/JavaInflector/swagger.mustache @@ -0,0 +1 @@ +{{{swagger-yaml}}} \ No newline at end of file diff --git a/samples/server/petstore/java-inflector/inflector.yaml b/samples/server/petstore/java-inflector/inflector.yaml index 25ec6dde3f2..8a11ca3b659 100644 --- a/samples/server/petstore/java-inflector/inflector.yaml +++ b/samples/server/petstore/java-inflector/inflector.yaml @@ -1,6 +1,6 @@ controllerPackage: io.swagger.handler modelPackage: io.swagger.model -swaggerUrl: ./src/main/swagger/swagger.json +swaggerUrl: ./src/main/swagger/swagger.yaml modelMappings: User : io.swagger.model.User Category : io.swagger.model.Category @@ -8,3 +8,7 @@ modelMappings: Tag : io.swagger.model.Tag Order : io.swagger.model.Order +entityProcessors: + - json + - xml + - yaml \ No newline at end of file diff --git a/samples/server/petstore/java-inflector/pom.xml b/samples/server/petstore/java-inflector/pom.xml index 7b7ec1d8b3d..681c0c874c0 100644 --- a/samples/server/petstore/java-inflector/pom.xml +++ b/samples/server/petstore/java-inflector/pom.xml @@ -74,16 +74,16 @@ - + io.swagger swagger-inflector - 1.0.0-SNAPSHOT + 1.0.0 1.0.0 - 1.5.3 + 1.5.4 9.2.9.v20150224 1.0.1 4.8.2 diff --git a/samples/server/petstore/java-inflector/src/main/java/io/swagger/handler/PetController.java b/samples/server/petstore/java-inflector/src/main/java/io/swagger/handler/PetController.java index 9f31acf53da..fe5735bbdbe 100644 --- a/samples/server/petstore/java-inflector/src/main/java/io/swagger/handler/PetController.java +++ b/samples/server/petstore/java-inflector/src/main/java/io/swagger/handler/PetController.java @@ -13,7 +13,7 @@ import io.swagger.model.*; import io.swagger.model.Pet; import java.io.File; -@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaInflectorServerCodegen", date = "2015-08-24T17:25:49.737-07:00") +@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaInflectorServerCodegen", date = "2015-11-30T10:22:45.081-08:00") public class PetController { /** * Uncomment and implement as you see fit. These operations will map diff --git a/samples/server/petstore/java-inflector/src/main/java/io/swagger/handler/StoreController.java b/samples/server/petstore/java-inflector/src/main/java/io/swagger/handler/StoreController.java index 3506b6b920c..4d7b6ddaaf5 100644 --- a/samples/server/petstore/java-inflector/src/main/java/io/swagger/handler/StoreController.java +++ b/samples/server/petstore/java-inflector/src/main/java/io/swagger/handler/StoreController.java @@ -13,7 +13,7 @@ import io.swagger.model.*; import java.util.Map; import io.swagger.model.Order; -@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaInflectorServerCodegen", date = "2015-08-24T17:25:49.737-07:00") +@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaInflectorServerCodegen", date = "2015-11-30T10:22:45.081-08:00") public class StoreController { /** * Uncomment and implement as you see fit. These operations will map diff --git a/samples/server/petstore/java-inflector/src/main/java/io/swagger/handler/UserController.java b/samples/server/petstore/java-inflector/src/main/java/io/swagger/handler/UserController.java index 3ca4fa0e394..73fc2e202be 100644 --- a/samples/server/petstore/java-inflector/src/main/java/io/swagger/handler/UserController.java +++ b/samples/server/petstore/java-inflector/src/main/java/io/swagger/handler/UserController.java @@ -13,7 +13,7 @@ import io.swagger.model.*; import io.swagger.model.User; import java.util.*; -@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaInflectorServerCodegen", date = "2015-08-24T17:25:49.737-07:00") +@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaInflectorServerCodegen", date = "2015-11-30T10:22:45.081-08:00") public class UserController { /** * Uncomment and implement as you see fit. These operations will map diff --git a/samples/server/petstore/java-inflector/src/main/java/io/swagger/model/Category.java b/samples/server/petstore/java-inflector/src/main/java/io/swagger/model/Category.java index 03a37fef5b0..cd5f99dc6cc 100644 --- a/samples/server/petstore/java-inflector/src/main/java/io/swagger/model/Category.java +++ b/samples/server/petstore/java-inflector/src/main/java/io/swagger/model/Category.java @@ -6,7 +6,7 @@ import com.fasterxml.jackson.annotation.JsonProperty; @ApiModel(description = "") -@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaInflectorServerCodegen", date = "2015-08-24T17:25:49.737-07:00") +@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaInflectorServerCodegen", date = "2015-11-30T10:22:45.081-08:00") public class Category { private Long id = null; diff --git a/samples/server/petstore/java-inflector/src/main/java/io/swagger/model/Order.java b/samples/server/petstore/java-inflector/src/main/java/io/swagger/model/Order.java index de3a2f8b9eb..4b56d2bd164 100644 --- a/samples/server/petstore/java-inflector/src/main/java/io/swagger/model/Order.java +++ b/samples/server/petstore/java-inflector/src/main/java/io/swagger/model/Order.java @@ -7,7 +7,7 @@ import com.fasterxml.jackson.annotation.JsonProperty; @ApiModel(description = "") -@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaInflectorServerCodegen", date = "2015-08-24T17:25:49.737-07:00") +@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaInflectorServerCodegen", date = "2015-11-30T10:22:45.081-08:00") public class Order { private Long id = null; diff --git a/samples/server/petstore/java-inflector/src/main/java/io/swagger/model/Pet.java b/samples/server/petstore/java-inflector/src/main/java/io/swagger/model/Pet.java index eb81026f601..374a529a538 100644 --- a/samples/server/petstore/java-inflector/src/main/java/io/swagger/model/Pet.java +++ b/samples/server/petstore/java-inflector/src/main/java/io/swagger/model/Pet.java @@ -9,7 +9,7 @@ import com.fasterxml.jackson.annotation.JsonProperty; @ApiModel(description = "") -@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaInflectorServerCodegen", date = "2015-08-24T17:25:49.737-07:00") +@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaInflectorServerCodegen", date = "2015-11-30T10:22:45.081-08:00") public class Pet { private Long id = null; diff --git a/samples/server/petstore/java-inflector/src/main/java/io/swagger/model/Tag.java b/samples/server/petstore/java-inflector/src/main/java/io/swagger/model/Tag.java index 8c8f2597461..4bcc82f7749 100644 --- a/samples/server/petstore/java-inflector/src/main/java/io/swagger/model/Tag.java +++ b/samples/server/petstore/java-inflector/src/main/java/io/swagger/model/Tag.java @@ -6,7 +6,7 @@ import com.fasterxml.jackson.annotation.JsonProperty; @ApiModel(description = "") -@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaInflectorServerCodegen", date = "2015-08-24T17:25:49.737-07:00") +@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaInflectorServerCodegen", date = "2015-11-30T10:22:45.081-08:00") public class Tag { private Long id = null; diff --git a/samples/server/petstore/java-inflector/src/main/java/io/swagger/model/User.java b/samples/server/petstore/java-inflector/src/main/java/io/swagger/model/User.java index be5261cdb70..cdc4debe376 100644 --- a/samples/server/petstore/java-inflector/src/main/java/io/swagger/model/User.java +++ b/samples/server/petstore/java-inflector/src/main/java/io/swagger/model/User.java @@ -6,7 +6,7 @@ import com.fasterxml.jackson.annotation.JsonProperty; @ApiModel(description = "") -@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaInflectorServerCodegen", date = "2015-08-24T17:25:49.737-07:00") +@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaInflectorServerCodegen", date = "2015-11-30T10:22:45.081-08:00") public class User { private Long id = null; diff --git a/samples/server/petstore/java-inflector/src/main/swagger/swagger.json b/samples/server/petstore/java-inflector/src/main/swagger/swagger.json deleted file mode 100644 index 36ecd60503e..00000000000 --- a/samples/server/petstore/java-inflector/src/main/swagger/swagger.json +++ /dev/null @@ -1,770 +0,0 @@ -{ - "swagger" : "2.0", - "info" : { - "description" : "This is a sample server Petstore server. You can find out more about Swagger at http://swagger.io or on irc.freenode.net, #swagger. For this sample, you can use the api key \"special-key\" to test the authorization filters", - "version" : "1.0.0", - "title" : "Swagger Petstore", - "termsOfService" : "http://swagger.io/terms/", - "contact" : { - "email" : "apiteam@swagger.io" - }, - "license" : { - "name" : "Apache 2.0", - "url" : "http://www.apache.org/licenses/LICENSE-2.0.html" - } - }, - "host" : "petstore.swagger.io", - "basePath" : "/v2", - "schemes" : [ "http" ], - "paths" : { - "/pet" : { - "post" : { - "tags" : [ "pet" ], - "summary" : "Add a new pet to the store", - "description" : "", - "operationId" : "addPet", - "consumes" : [ "application/json", "application/xml" ], - "produces" : [ "application/json", "application/xml" ], - "parameters" : [ { - "in" : "body", - "name" : "body", - "description" : "Pet object that needs to be added to the store", - "required" : false, - "schema" : { - "$ref" : "#/definitions/Pet" - } - } ], - "responses" : { - "405" : { - "description" : "Invalid input" - } - }, - "security" : [ { - "petstore_auth" : [ "write:pets", "read:pets" ] - } ] - }, - "put" : { - "tags" : [ "pet" ], - "summary" : "Update an existing pet", - "description" : "", - "operationId" : "updatePet", - "consumes" : [ "application/json", "application/xml" ], - "produces" : [ "application/json", "application/xml" ], - "parameters" : [ { - "in" : "body", - "name" : "body", - "description" : "Pet object that needs to be added to the store", - "required" : false, - "schema" : { - "$ref" : "#/definitions/Pet" - } - } ], - "responses" : { - "405" : { - "description" : "Validation exception" - }, - "404" : { - "description" : "Pet not found" - }, - "400" : { - "description" : "Invalid ID supplied" - } - }, - "security" : [ { - "petstore_auth" : [ "write:pets", "read:pets" ] - } ] - } - }, - "/pet/findByStatus" : { - "get" : { - "tags" : [ "pet" ], - "summary" : "Finds Pets by status", - "description" : "Multiple status values can be provided with comma seperated strings", - "operationId" : "findPetsByStatus", - "produces" : [ "application/json", "application/xml" ], - "parameters" : [ { - "name" : "status", - "in" : "query", - "description" : "Status values that need to be considered for filter", - "required" : false, - "type" : "array", - "items" : { - "type" : "string" - }, - "collectionFormat" : "multi", - "default" : "available" - } ], - "responses" : { - "200" : { - "description" : "successful operation", - "schema" : { - "type" : "array", - "items" : { - "$ref" : "#/definitions/Pet" - } - } - }, - "400" : { - "description" : "Invalid status value" - } - }, - "security" : [ { - "petstore_auth" : [ "write:pets", "read:pets" ] - } ] - } - }, - "/pet/findByTags" : { - "get" : { - "tags" : [ "pet" ], - "summary" : "Finds Pets by tags", - "description" : "Muliple tags can be provided with comma seperated strings. Use tag1, tag2, tag3 for testing.", - "operationId" : "findPetsByTags", - "produces" : [ "application/json", "application/xml" ], - "parameters" : [ { - "name" : "tags", - "in" : "query", - "description" : "Tags to filter by", - "required" : false, - "type" : "array", - "items" : { - "type" : "string" - }, - "collectionFormat" : "multi" - } ], - "responses" : { - "200" : { - "description" : "successful operation", - "schema" : { - "type" : "array", - "items" : { - "$ref" : "#/definitions/Pet" - } - } - }, - "400" : { - "description" : "Invalid tag value" - } - }, - "security" : [ { - "petstore_auth" : [ "write:pets", "read:pets" ] - } ] - } - }, - "/pet/{petId}" : { - "get" : { - "tags" : [ "pet" ], - "summary" : "Find pet by ID", - "description" : "Returns a pet when ID < 10. ID > 10 or nonintegers will simulate API error conditions", - "operationId" : "getPetById", - "produces" : [ "application/json", "application/xml" ], - "parameters" : [ { - "name" : "petId", - "in" : "path", - "description" : "ID of pet that needs to be fetched", - "required" : true, - "type" : "integer", - "format" : "int64" - } ], - "responses" : { - "404" : { - "description" : "Pet not found" - }, - "200" : { - "description" : "successful operation", - "schema" : { - "$ref" : "#/definitions/Pet" - } - }, - "400" : { - "description" : "Invalid ID supplied" - } - }, - "security" : [ { - "api_key" : [ ] - }, { - "petstore_auth" : [ "write:pets", "read:pets" ] - } ] - }, - "post" : { - "tags" : [ "pet" ], - "summary" : "Updates a pet in the store with form data", - "description" : "", - "operationId" : "updatePetWithForm", - "consumes" : [ "application/x-www-form-urlencoded" ], - "produces" : [ "application/json", "application/xml" ], - "parameters" : [ { - "name" : "petId", - "in" : "path", - "description" : "ID of pet that needs to be updated", - "required" : true, - "type" : "string" - }, { - "name" : "name", - "in" : "formData", - "description" : "Updated name of the pet", - "required" : false, - "type" : "string" - }, { - "name" : "status", - "in" : "formData", - "description" : "Updated status of the pet", - "required" : false, - "type" : "string" - } ], - "responses" : { - "405" : { - "description" : "Invalid input" - } - }, - "security" : [ { - "petstore_auth" : [ "write:pets", "read:pets" ] - } ] - }, - "delete" : { - "tags" : [ "pet" ], - "summary" : "Deletes a pet", - "description" : "", - "operationId" : "deletePet", - "produces" : [ "application/json", "application/xml" ], - "parameters" : [ { - "name" : "api_key", - "in" : "header", - "description" : "", - "required" : false, - "type" : "string" - }, { - "name" : "petId", - "in" : "path", - "description" : "Pet id to delete", - "required" : true, - "type" : "integer", - "format" : "int64" - } ], - "responses" : { - "400" : { - "description" : "Invalid pet value" - } - }, - "security" : [ { - "petstore_auth" : [ "write:pets", "read:pets" ] - } ] - } - }, - "/pet/{petId}/uploadImage" : { - "post" : { - "tags" : [ "pet" ], - "summary" : "uploads an image", - "description" : "", - "operationId" : "uploadFile", - "consumes" : [ "multipart/form-data" ], - "produces" : [ "application/json", "application/xml" ], - "parameters" : [ { - "name" : "petId", - "in" : "path", - "description" : "ID of pet to update", - "required" : true, - "type" : "integer", - "format" : "int64" - }, { - "name" : "additionalMetadata", - "in" : "formData", - "description" : "Additional data to pass to server", - "required" : false, - "type" : "string" - }, { - "name" : "file", - "in" : "formData", - "description" : "file to upload", - "required" : false, - "type" : "file" - } ], - "responses" : { - "default" : { - "description" : "successful operation" - } - }, - "security" : [ { - "petstore_auth" : [ "write:pets", "read:pets" ] - } ] - } - }, - "/store/inventory" : { - "get" : { - "tags" : [ "store" ], - "summary" : "Returns pet inventories by status", - "description" : "Returns a map of status codes to quantities", - "operationId" : "getInventory", - "produces" : [ "application/json", "application/xml" ], - "parameters" : [ ], - "responses" : { - "200" : { - "description" : "successful operation", - "schema" : { - "type" : "object", - "additionalProperties" : { - "type" : "integer", - "format" : "int32" - } - } - } - }, - "security" : [ { - "api_key" : [ ] - } ] - } - }, - "/store/order" : { - "post" : { - "tags" : [ "store" ], - "summary" : "Place an order for a pet", - "description" : "", - "operationId" : "placeOrder", - "produces" : [ "application/json", "application/xml" ], - "parameters" : [ { - "in" : "body", - "name" : "body", - "description" : "order placed for purchasing the pet", - "required" : false, - "schema" : { - "$ref" : "#/definitions/Order" - } - } ], - "responses" : { - "200" : { - "description" : "successful operation", - "schema" : { - "$ref" : "#/definitions/Order" - } - }, - "400" : { - "description" : "Invalid Order" - } - } - } - }, - "/store/order/{orderId}" : { - "get" : { - "tags" : [ "store" ], - "summary" : "Find purchase order by ID", - "description" : "For valid response try integer IDs with value <= 5 or > 10. Other values will generated exceptions", - "operationId" : "getOrderById", - "produces" : [ "application/json", "application/xml" ], - "parameters" : [ { - "name" : "orderId", - "in" : "path", - "description" : "ID of pet that needs to be fetched", - "required" : true, - "type" : "string" - } ], - "responses" : { - "404" : { - "description" : "Order not found" - }, - "200" : { - "description" : "successful operation", - "schema" : { - "$ref" : "#/definitions/Order" - } - }, - "400" : { - "description" : "Invalid ID supplied" - } - } - }, - "delete" : { - "tags" : [ "store" ], - "summary" : "Delete purchase order by ID", - "description" : "For valid response try integer IDs with value < 1000. Anything above 1000 or nonintegers will generate API errors", - "operationId" : "deleteOrder", - "produces" : [ "application/json", "application/xml" ], - "parameters" : [ { - "name" : "orderId", - "in" : "path", - "description" : "ID of the order that needs to be deleted", - "required" : true, - "type" : "string" - } ], - "responses" : { - "404" : { - "description" : "Order not found" - }, - "400" : { - "description" : "Invalid ID supplied" - } - } - } - }, - "/user" : { - "post" : { - "tags" : [ "user" ], - "summary" : "Create user", - "description" : "This can only be done by the logged in user.", - "operationId" : "createUser", - "produces" : [ "application/json", "application/xml" ], - "parameters" : [ { - "in" : "body", - "name" : "body", - "description" : "Created user object", - "required" : false, - "schema" : { - "$ref" : "#/definitions/User" - } - } ], - "responses" : { - "default" : { - "description" : "successful operation" - } - } - } - }, - "/user/createWithArray" : { - "post" : { - "tags" : [ "user" ], - "summary" : "Creates list of users with given input array", - "description" : "", - "operationId" : "createUsersWithArrayInput", - "produces" : [ "application/json", "application/xml" ], - "parameters" : [ { - "in" : "body", - "name" : "body", - "description" : "List of user object", - "required" : false, - "schema" : { - "type" : "array", - "items" : { - "$ref" : "#/definitions/User" - } - } - } ], - "responses" : { - "default" : { - "description" : "successful operation" - } - } - } - }, - "/user/createWithList" : { - "post" : { - "tags" : [ "user" ], - "summary" : "Creates list of users with given input array", - "description" : "", - "operationId" : "createUsersWithListInput", - "produces" : [ "application/json", "application/xml" ], - "parameters" : [ { - "in" : "body", - "name" : "body", - "description" : "List of user object", - "required" : false, - "schema" : { - "type" : "array", - "items" : { - "$ref" : "#/definitions/User" - } - } - } ], - "responses" : { - "default" : { - "description" : "successful operation" - } - } - } - }, - "/user/login" : { - "get" : { - "tags" : [ "user" ], - "summary" : "Logs user into the system", - "description" : "", - "operationId" : "loginUser", - "produces" : [ "application/json", "application/xml" ], - "parameters" : [ { - "name" : "username", - "in" : "query", - "description" : "The user name for login", - "required" : false, - "type" : "string" - }, { - "name" : "password", - "in" : "query", - "description" : "The password for login in clear text", - "required" : false, - "type" : "string" - } ], - "responses" : { - "200" : { - "description" : "successful operation", - "schema" : { - "type" : "string" - } - }, - "400" : { - "description" : "Invalid username/password supplied" - } - } - } - }, - "/user/logout" : { - "get" : { - "tags" : [ "user" ], - "summary" : "Logs out current logged in user session", - "description" : "", - "operationId" : "logoutUser", - "produces" : [ "application/json", "application/xml" ], - "parameters" : [ ], - "responses" : { - "default" : { - "description" : "successful operation" - } - } - } - }, - "/user/{username}" : { - "get" : { - "tags" : [ "user" ], - "summary" : "Get user by user name", - "description" : "", - "operationId" : "getUserByName", - "produces" : [ "application/json", "application/xml" ], - "parameters" : [ { - "name" : "username", - "in" : "path", - "description" : "The name that needs to be fetched. Use user1 for testing. ", - "required" : true, - "type" : "string" - } ], - "responses" : { - "404" : { - "description" : "User not found" - }, - "200" : { - "description" : "successful operation", - "schema" : { - "$ref" : "#/definitions/User" - }, - "examples" : { - "application/json" : { - "id" : 1, - "username" : "johnp", - "firstName" : "John", - "lastName" : "Public", - "email" : "johnp@swagger.io", - "password" : "-secret-", - "phone" : "0123456789", - "userStatus" : 0 - } - } - }, - "400" : { - "description" : "Invalid username supplied" - } - } - }, - "put" : { - "tags" : [ "user" ], - "summary" : "Updated user", - "description" : "This can only be done by the logged in user.", - "operationId" : "updateUser", - "produces" : [ "application/json", "application/xml" ], - "parameters" : [ { - "name" : "username", - "in" : "path", - "description" : "name that need to be deleted", - "required" : true, - "type" : "string" - }, { - "in" : "body", - "name" : "body", - "description" : "Updated user object", - "required" : false, - "schema" : { - "$ref" : "#/definitions/User" - } - } ], - "responses" : { - "404" : { - "description" : "User not found" - }, - "400" : { - "description" : "Invalid user supplied" - } - } - }, - "delete" : { - "tags" : [ "user" ], - "summary" : "Delete user", - "description" : "This can only be done by the logged in user.", - "operationId" : "deleteUser", - "produces" : [ "application/json", "application/xml" ], - "parameters" : [ { - "name" : "username", - "in" : "path", - "description" : "The name that needs to be deleted", - "required" : true, - "type" : "string" - } ], - "responses" : { - "404" : { - "description" : "User not found" - }, - "400" : { - "description" : "Invalid username supplied" - } - } - } - } - }, - "securityDefinitions" : { - "api_key" : { - "type" : "apiKey", - "name" : "api_key", - "in" : "header" - }, - "petstore_auth" : { - "type" : "oauth2", - "authorizationUrl" : "http://petstore.swagger.io/api/oauth/dialog", - "flow" : "implicit", - "scopes" : { - "write:pets" : "modify pets in your account", - "read:pets" : "read your pets" - } - } - }, - "definitions" : { - "User" : { - "properties" : { - "id" : { - "type" : "integer", - "format" : "int64" - }, - "username" : { - "type" : "string" - }, - "firstName" : { - "type" : "string" - }, - "lastName" : { - "type" : "string" - }, - "email" : { - "type" : "string" - }, - "password" : { - "type" : "string" - }, - "phone" : { - "type" : "string" - }, - "userStatus" : { - "type" : "integer", - "format" : "int32", - "description" : "User Status" - } - }, - "xml" : { - "name" : "User" - } - }, - "Category" : { - "properties" : { - "id" : { - "type" : "integer", - "format" : "int64" - }, - "name" : { - "type" : "string" - } - }, - "xml" : { - "name" : "Category" - } - }, - "Pet" : { - "required" : [ "name", "photoUrls" ], - "properties" : { - "id" : { - "type" : "integer", - "format" : "int64" - }, - "category" : { - "$ref" : "#/definitions/Category" - }, - "name" : { - "type" : "string", - "example" : "doggie" - }, - "photoUrls" : { - "type" : "array", - "xml" : { - "name" : "photoUrl", - "wrapped" : true - }, - "items" : { - "type" : "string" - } - }, - "tags" : { - "type" : "array", - "xml" : { - "name" : "tag", - "wrapped" : true - }, - "items" : { - "$ref" : "#/definitions/Tag" - } - }, - "status" : { - "type" : "string", - "description" : "pet status in the store", - "enum" : [ "available", "pending", "sold" ] - } - }, - "xml" : { - "name" : "Pet" - } - }, - "Tag" : { - "properties" : { - "id" : { - "type" : "integer", - "format" : "int64" - }, - "name" : { - "type" : "string" - } - }, - "xml" : { - "name" : "Tag" - } - }, - "Order" : { - "properties" : { - "id" : { - "type" : "integer", - "format" : "int64" - }, - "petId" : { - "type" : "integer", - "format" : "int64" - }, - "quantity" : { - "type" : "integer", - "format" : "int32" - }, - "shipDate" : { - "type" : "string", - "format" : "date-time" - }, - "status" : { - "type" : "string", - "description" : "Order Status", - "enum" : [ "placed", "approved", "delivered" ] - }, - "complete" : { - "type" : "boolean" - } - }, - "xml" : { - "name" : "Order" - } - } - } -} \ No newline at end of file diff --git a/samples/server/petstore/java-inflector/src/main/swagger/swagger.yaml b/samples/server/petstore/java-inflector/src/main/swagger/swagger.yaml new file mode 100644 index 00000000000..49a3405de09 --- /dev/null +++ b/samples/server/petstore/java-inflector/src/main/swagger/swagger.yaml @@ -0,0 +1,667 @@ +--- +swagger: "2.0" +info: + description: "This is a sample server Petstore server. You can find out more about\ + \ Swagger at http://swagger.io or on irc.freenode.net,\ + \ #swagger. For this sample, you can use the api key \"special-key\" to test\ + \ the authorization filters" + version: "1.0.0" + title: "Swagger Petstore" + termsOfService: "http://swagger.io/terms/" + contact: + email: "apiteam@swagger.io" + license: + name: "Apache 2.0" + url: "http://www.apache.org/licenses/LICENSE-2.0.html" +host: "petstore.swagger.io" +basePath: "/v2" +schemes: +- "http" +paths: + /pet: + post: + tags: + - "pet" + summary: "Add a new pet to the store" + description: "" + operationId: "addPet" + consumes: + - "application/json" + - "application/xml" + produces: + - "application/json" + - "application/xml" + parameters: + - in: "body" + name: "body" + description: "Pet object that needs to be added to the store" + required: false + schema: + $ref: "#/definitions/Pet" + responses: + 405: + description: "Invalid input" + security: + - petstore_auth: + - "write:pets" + - "read:pets" + put: + tags: + - "pet" + summary: "Update an existing pet" + description: "" + operationId: "updatePet" + consumes: + - "application/json" + - "application/xml" + produces: + - "application/json" + - "application/xml" + parameters: + - in: "body" + name: "body" + description: "Pet object that needs to be added to the store" + required: false + schema: + $ref: "#/definitions/Pet" + responses: + 400: + description: "Invalid ID supplied" + 404: + description: "Pet not found" + 405: + description: "Validation exception" + security: + - petstore_auth: + - "write:pets" + - "read:pets" + /pet/findByStatus: + get: + tags: + - "pet" + summary: "Finds Pets by status" + description: "Multiple status values can be provided with comma seperated strings" + operationId: "findPetsByStatus" + produces: + - "application/json" + - "application/xml" + parameters: + - name: "status" + in: "query" + description: "Status values that need to be considered for filter" + required: false + type: "array" + items: + type: "string" + collectionFormat: "multi" + default: "available" + responses: + 200: + description: "successful operation" + schema: + type: "array" + items: + $ref: "#/definitions/Pet" + 400: + description: "Invalid status value" + security: + - petstore_auth: + - "write:pets" + - "read:pets" + /pet/findByTags: + get: + tags: + - "pet" + summary: "Finds Pets by tags" + description: "Muliple tags can be provided with comma seperated strings. Use\ + \ tag1, tag2, tag3 for testing." + operationId: "findPetsByTags" + produces: + - "application/json" + - "application/xml" + parameters: + - name: "tags" + in: "query" + description: "Tags to filter by" + required: false + type: "array" + items: + type: "string" + collectionFormat: "multi" + responses: + 200: + description: "successful operation" + schema: + type: "array" + items: + $ref: "#/definitions/Pet" + 400: + description: "Invalid tag value" + security: + - petstore_auth: + - "write:pets" + - "read:pets" + /pet/{petId}: + get: + tags: + - "pet" + summary: "Find pet by ID" + description: "Returns a pet when ID < 10. ID > 10 or nonintegers will simulate\ + \ API error conditions" + operationId: "getPetById" + produces: + - "application/json" + - "application/xml" + parameters: + - name: "petId" + in: "path" + description: "ID of pet that needs to be fetched" + required: true + type: "integer" + format: "int64" + responses: + 200: + description: "successful operation" + schema: + $ref: "#/definitions/Pet" + 400: + description: "Invalid ID supplied" + 404: + description: "Pet not found" + security: + - api_key: [] + - petstore_auth: + - "write:pets" + - "read:pets" + post: + tags: + - "pet" + summary: "Updates a pet in the store with form data" + description: "" + operationId: "updatePetWithForm" + consumes: + - "application/x-www-form-urlencoded" + produces: + - "application/json" + - "application/xml" + parameters: + - name: "petId" + in: "path" + description: "ID of pet that needs to be updated" + required: true + type: "string" + - name: "name" + in: "formData" + description: "Updated name of the pet" + required: false + type: "string" + - name: "status" + in: "formData" + description: "Updated status of the pet" + required: false + type: "string" + responses: + 405: + description: "Invalid input" + security: + - petstore_auth: + - "write:pets" + - "read:pets" + delete: + tags: + - "pet" + summary: "Deletes a pet" + description: "" + operationId: "deletePet" + produces: + - "application/json" + - "application/xml" + parameters: + - name: "api_key" + in: "header" + description: "" + required: false + type: "string" + - name: "petId" + in: "path" + description: "Pet id to delete" + required: true + type: "integer" + format: "int64" + responses: + 400: + description: "Invalid pet value" + security: + - petstore_auth: + - "write:pets" + - "read:pets" + /pet/{petId}/uploadImage: + post: + tags: + - "pet" + summary: "uploads an image" + description: "" + operationId: "uploadFile" + consumes: + - "multipart/form-data" + produces: + - "application/json" + - "application/xml" + parameters: + - name: "petId" + in: "path" + description: "ID of pet to update" + required: true + type: "integer" + format: "int64" + - name: "additionalMetadata" + in: "formData" + description: "Additional data to pass to server" + required: false + type: "string" + - name: "file" + in: "formData" + description: "file to upload" + required: false + type: "file" + responses: + default: + description: "successful operation" + security: + - petstore_auth: + - "write:pets" + - "read:pets" + /store/inventory: + get: + tags: + - "store" + summary: "Returns pet inventories by status" + description: "Returns a map of status codes to quantities" + operationId: "getInventory" + produces: + - "application/json" + - "application/xml" + parameters: [] + responses: + 200: + description: "successful operation" + schema: + type: "object" + additionalProperties: + type: "integer" + format: "int32" + security: + - api_key: [] + /store/order: + post: + tags: + - "store" + summary: "Place an order for a pet" + description: "" + operationId: "placeOrder" + produces: + - "application/json" + - "application/xml" + parameters: + - in: "body" + name: "body" + description: "order placed for purchasing the pet" + required: false + schema: + $ref: "#/definitions/Order" + responses: + 200: + description: "successful operation" + schema: + $ref: "#/definitions/Order" + 400: + description: "Invalid Order" + /store/order/{orderId}: + get: + tags: + - "store" + summary: "Find purchase order by ID" + description: "For valid response try integer IDs with value <= 5 or > 10. Other\ + \ values will generated exceptions" + operationId: "getOrderById" + produces: + - "application/json" + - "application/xml" + parameters: + - name: "orderId" + in: "path" + description: "ID of pet that needs to be fetched" + required: true + type: "string" + responses: + 200: + description: "successful operation" + schema: + $ref: "#/definitions/Order" + 400: + description: "Invalid ID supplied" + 404: + description: "Order not found" + delete: + tags: + - "store" + summary: "Delete purchase order by ID" + description: "For valid response try integer IDs with value < 1000. Anything\ + \ above 1000 or nonintegers will generate API errors" + operationId: "deleteOrder" + produces: + - "application/json" + - "application/xml" + parameters: + - name: "orderId" + in: "path" + description: "ID of the order that needs to be deleted" + required: true + type: "string" + responses: + 400: + description: "Invalid ID supplied" + 404: + description: "Order not found" + /user: + post: + tags: + - "user" + summary: "Create user" + description: "This can only be done by the logged in user." + operationId: "createUser" + produces: + - "application/json" + - "application/xml" + parameters: + - in: "body" + name: "body" + description: "Created user object" + required: false + schema: + $ref: "#/definitions/User" + responses: + default: + description: "successful operation" + /user/createWithArray: + post: + tags: + - "user" + summary: "Creates list of users with given input array" + description: "" + operationId: "createUsersWithArrayInput" + produces: + - "application/json" + - "application/xml" + parameters: + - in: "body" + name: "body" + description: "List of user object" + required: false + schema: + type: "array" + items: + $ref: "#/definitions/User" + responses: + default: + description: "successful operation" + /user/createWithList: + post: + tags: + - "user" + summary: "Creates list of users with given input array" + description: "" + operationId: "createUsersWithListInput" + produces: + - "application/json" + - "application/xml" + parameters: + - in: "body" + name: "body" + description: "List of user object" + required: false + schema: + type: "array" + items: + $ref: "#/definitions/User" + responses: + default: + description: "successful operation" + /user/login: + get: + tags: + - "user" + summary: "Logs user into the system" + description: "" + operationId: "loginUser" + produces: + - "application/json" + - "application/xml" + parameters: + - name: "username" + in: "query" + description: "The user name for login" + required: false + type: "string" + - name: "password" + in: "query" + description: "The password for login in clear text" + required: false + type: "string" + responses: + 200: + description: "successful operation" + schema: + type: "string" + 400: + description: "Invalid username/password supplied" + /user/logout: + get: + tags: + - "user" + summary: "Logs out current logged in user session" + description: "" + operationId: "logoutUser" + produces: + - "application/json" + - "application/xml" + parameters: [] + responses: + default: + description: "successful operation" + /user/{username}: + get: + tags: + - "user" + summary: "Get user by user name" + description: "" + operationId: "getUserByName" + produces: + - "application/json" + - "application/xml" + parameters: + - name: "username" + in: "path" + description: "The name that needs to be fetched. Use user1 for testing. " + required: true + type: "string" + responses: + 200: + description: "successful operation" + schema: + $ref: "#/definitions/User" + examples: + application/json: + id: 1 + username: "johnp" + firstName: "John" + lastName: "Public" + email: "johnp@swagger.io" + password: "-secret-" + phone: "0123456789" + userStatus: 0 + 400: + description: "Invalid username supplied" + 404: + description: "User not found" + put: + tags: + - "user" + summary: "Updated user" + description: "This can only be done by the logged in user." + operationId: "updateUser" + produces: + - "application/json" + - "application/xml" + parameters: + - name: "username" + in: "path" + description: "name that need to be deleted" + required: true + type: "string" + - in: "body" + name: "body" + description: "Updated user object" + required: false + schema: + $ref: "#/definitions/User" + responses: + 400: + description: "Invalid user supplied" + 404: + description: "User not found" + delete: + tags: + - "user" + summary: "Delete user" + description: "This can only be done by the logged in user." + operationId: "deleteUser" + produces: + - "application/json" + - "application/xml" + parameters: + - name: "username" + in: "path" + description: "The name that needs to be deleted" + required: true + type: "string" + responses: + 400: + description: "Invalid username supplied" + 404: + description: "User not found" +securityDefinitions: + api_key: + type: "apiKey" + name: "api_key" + in: "header" + petstore_auth: + type: "oauth2" + authorizationUrl: "http://petstore.swagger.io/api/oauth/dialog" + flow: "implicit" + scopes: + write:pets: "modify pets in your account" + read:pets: "read your pets" +definitions: + User: + properties: + id: + type: "integer" + format: "int64" + username: + type: "string" + firstName: + type: "string" + lastName: + type: "string" + email: + type: "string" + password: + type: "string" + phone: + type: "string" + userStatus: + type: "integer" + format: "int32" + description: "User Status" + xml: + name: "User" + Category: + properties: + id: + type: "integer" + format: "int64" + name: + type: "string" + xml: + name: "Category" + Pet: + required: + - "name" + - "photoUrls" + properties: + id: + type: "integer" + format: "int64" + category: + $ref: "#/definitions/Category" + name: + type: "string" + example: "doggie" + photoUrls: + type: "array" + xml: + name: "photoUrl" + wrapped: true + items: + type: "string" + tags: + type: "array" + xml: + name: "tag" + wrapped: true + items: + $ref: "#/definitions/Tag" + status: + type: "string" + description: "pet status in the store" + enum: + - "available" + - "pending" + - "sold" + xml: + name: "Pet" + Tag: + properties: + id: + type: "integer" + format: "int64" + name: + type: "string" + xml: + name: "Tag" + Order: + properties: + id: + type: "integer" + format: "int64" + petId: + type: "integer" + format: "int64" + quantity: + type: "integer" + format: "int32" + shipDate: + type: "string" + format: "date-time" + status: + type: "string" + description: "Order Status" + enum: + - "placed" + - "approved" + - "delivered" + complete: + type: "boolean" + xml: + name: "Order" From c9f2380f0fd0c14db45dd7733fcce0a9cd53540d Mon Sep 17 00:00:00 2001 From: wing328 Date: Tue, 1 Dec 2015 14:08:20 +0800 Subject: [PATCH 088/211] add test case for status code and response header --- .../src/main/resources/csharp/api.mustache | 28 +++- .../src/main/csharp/IO/Swagger/Api/PetApi.cs | 152 +++++++++++++----- .../main/csharp/IO/Swagger/Api/StoreApi.cs | 79 ++++++--- .../src/main/csharp/IO/Swagger/Api/UserApi.cs | 147 ++++++++++++----- .../csharp/SwaggerClientTest/TestPet.cs | 13 ++ .../bin/Debug/SwaggerClientTest.dll | Bin 69632 -> 80384 bytes .../bin/Debug/SwaggerClientTest.dll.mdb | Bin 21678 -> 25931 bytes .../obj/Debug/SwaggerClientTest.dll | Bin 69632 -> 80384 bytes .../obj/Debug/SwaggerClientTest.dll.mdb | Bin 21678 -> 25931 bytes 9 files changed, 311 insertions(+), 108 deletions(-) diff --git a/modules/swagger-codegen/src/main/resources/csharp/api.mustache b/modules/swagger-codegen/src/main/resources/csharp/api.mustache index 0853c9f95ea..bb72037bad9 100644 --- a/modules/swagger-codegen/src/main/resources/csharp/api.mustache +++ b/modules/swagger-codegen/src/main/resources/csharp/api.mustache @@ -1,6 +1,7 @@ using System; using System.IO; using System.Collections.Generic; +using System.Linq; using RestSharp; using {{packageName}}.Client; {{#hasImport}}using {{packageName}}.Model; @@ -90,6 +91,16 @@ namespace {{packageName}}.Api /// /// An instance of the Configuration public Configuration Configuration {get; set;} + + ///

+ /// 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; } {{#operation}} /// @@ -162,11 +173,14 @@ namespace {{packageName}}.Api // make the HTTP request IRestResponse response = (IRestResponse) Configuration.ApiClient.CallApi(path_, Method.{{httpMethod}}, queryParams, postBody, headerParams, formParams, fileParams, pathParams); + + StatusCode = (int) response.StatusCode; + ResponseHeaders = response.Headers.ToDictionary(x => x.Name, x => x.Value.ToString()); - if (((int)response.StatusCode) >= 400) - throw new ApiException ((int)response.StatusCode, "Error calling {{operationId}}: " + response.Content, response.Content); + if (StatusCode >= 400) + throw new ApiException (StatusCode, "Error calling {{operationId}}: " + response.Content, response.Content); else if (((int)response.StatusCode) == 0) - throw new ApiException ((int)response.StatusCode, "Error calling {{operationId}}: " + response.ErrorMessage, response.ErrorMessage); + throw new ApiException (StatusCode, "Error calling {{operationId}}: " + response.ErrorMessage, response.ErrorMessage); {{#returnType}}return ({{{returnType}}}) Configuration.ApiClient.Deserialize(response, typeof({{{returnType}}}));{{/returnType}}{{^returnType}}return;{{/returnType}} } @@ -240,8 +254,12 @@ namespace {{packageName}}.Api // make the HTTP request IRestResponse response = (IRestResponse) await Configuration.ApiClient.CallApiAsync(path_, Method.{{httpMethod}}, queryParams, postBody, headerParams, formParams, fileParams, pathParams); - if (((int)response.StatusCode) >= 400) - throw new ApiException ((int)response.StatusCode, "Error calling {{operationId}}: " + response.Content, response.Content); + + StatusCode = (int) response.StatusCode; + ResponseHeaders = response.Headers.ToDictionary(x => x.Name, x => x.Value.ToString()); + + if (StatusCode >= 400) + throw new ApiException (StatusCode, "Error calling {{operationId}}: " + response.Content, response.Content); {{#returnType}}return ({{{returnType}}}) Configuration.ApiClient.Deserialize(response, typeof({{{returnType}}}));{{/returnType}}{{^returnType}} return;{{/returnType}} diff --git a/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Api/PetApi.cs b/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Api/PetApi.cs index 02a5cbd53ec..2b4f77bf4de 100644 --- a/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Api/PetApi.cs +++ b/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Api/PetApi.cs @@ -1,6 +1,7 @@ using System; using System.IO; using System.Collections.Generic; +using System.Linq; using RestSharp; using IO.Swagger.Client; using IO.Swagger.Model; @@ -203,7 +204,7 @@ namespace IO.Swagger.Api /// /// Initializes a new instance of the class - /// using Configuration object + /// using Configuration object. /// /// An instance of Configuration /// @@ -235,11 +236,20 @@ namespace IO.Swagger.Api } /// - /// Gets or sets the configuration object + /// Gets or sets the configuration object. /// /// An instance of the Configuration public Configuration Configuration {get; set;} - + + /// + /// 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; } /// /// Update an existing pet @@ -289,11 +299,14 @@ namespace IO.Swagger.Api // make the HTTP request IRestResponse response = (IRestResponse) Configuration.ApiClient.CallApi(path_, Method.PUT, queryParams, postBody, headerParams, formParams, fileParams, pathParams); + + StatusCode = (int) response.StatusCode; + ResponseHeaders = response.Headers.ToDictionary(x => x.Name, x => x.Value.ToString()); - if (((int)response.StatusCode) >= 400) - throw new ApiException ((int)response.StatusCode, "Error calling UpdatePet: " + response.Content, response.Content); + if (StatusCode >= 400) + throw new ApiException (StatusCode, "Error calling UpdatePet: " + response.Content, response.Content); else if (((int)response.StatusCode) == 0) - throw new ApiException ((int)response.StatusCode, "Error calling UpdatePet: " + response.ErrorMessage, response.ErrorMessage); + throw new ApiException (StatusCode, "Error calling UpdatePet: " + response.ErrorMessage, response.ErrorMessage); return; } @@ -346,8 +359,12 @@ namespace IO.Swagger.Api // make the HTTP request IRestResponse response = (IRestResponse) await Configuration.ApiClient.CallApiAsync(path_, Method.PUT, queryParams, postBody, headerParams, formParams, fileParams, pathParams); - if (((int)response.StatusCode) >= 400) - throw new ApiException ((int)response.StatusCode, "Error calling UpdatePet: " + response.Content, response.Content); + + StatusCode = (int) response.StatusCode; + ResponseHeaders = response.Headers.ToDictionary(x => x.Name, x => x.Value.ToString()); + + if (StatusCode >= 400) + throw new ApiException (StatusCode, "Error calling UpdatePet: " + response.Content, response.Content); return; @@ -401,11 +418,14 @@ namespace IO.Swagger.Api // make the HTTP request IRestResponse response = (IRestResponse) Configuration.ApiClient.CallApi(path_, Method.POST, queryParams, postBody, headerParams, formParams, fileParams, pathParams); + + StatusCode = (int) response.StatusCode; + ResponseHeaders = response.Headers.ToDictionary(x => x.Name, x => x.Value.ToString()); - if (((int)response.StatusCode) >= 400) - throw new ApiException ((int)response.StatusCode, "Error calling AddPet: " + response.Content, response.Content); + if (StatusCode >= 400) + throw new ApiException (StatusCode, "Error calling AddPet: " + response.Content, response.Content); else if (((int)response.StatusCode) == 0) - throw new ApiException ((int)response.StatusCode, "Error calling AddPet: " + response.ErrorMessage, response.ErrorMessage); + throw new ApiException (StatusCode, "Error calling AddPet: " + response.ErrorMessage, response.ErrorMessage); return; } @@ -458,8 +478,12 @@ namespace IO.Swagger.Api // make the HTTP request IRestResponse response = (IRestResponse) await Configuration.ApiClient.CallApiAsync(path_, Method.POST, queryParams, postBody, headerParams, formParams, fileParams, pathParams); - if (((int)response.StatusCode) >= 400) - throw new ApiException ((int)response.StatusCode, "Error calling AddPet: " + response.Content, response.Content); + + StatusCode = (int) response.StatusCode; + ResponseHeaders = response.Headers.ToDictionary(x => x.Name, x => x.Value.ToString()); + + if (StatusCode >= 400) + throw new ApiException (StatusCode, "Error calling AddPet: " + response.Content, response.Content); return; @@ -513,11 +537,14 @@ namespace IO.Swagger.Api // make the HTTP request IRestResponse response = (IRestResponse) Configuration.ApiClient.CallApi(path_, Method.GET, queryParams, postBody, headerParams, formParams, fileParams, pathParams); + + StatusCode = (int) response.StatusCode; + ResponseHeaders = response.Headers.ToDictionary(x => x.Name, x => x.Value.ToString()); - if (((int)response.StatusCode) >= 400) - throw new ApiException ((int)response.StatusCode, "Error calling FindPetsByStatus: " + response.Content, response.Content); + if (StatusCode >= 400) + throw new ApiException (StatusCode, "Error calling FindPetsByStatus: " + response.Content, response.Content); else if (((int)response.StatusCode) == 0) - throw new ApiException ((int)response.StatusCode, "Error calling FindPetsByStatus: " + response.ErrorMessage, response.ErrorMessage); + throw new ApiException (StatusCode, "Error calling FindPetsByStatus: " + response.ErrorMessage, response.ErrorMessage); return (List) Configuration.ApiClient.Deserialize(response, typeof(List)); } @@ -570,8 +597,12 @@ namespace IO.Swagger.Api // make the HTTP request IRestResponse response = (IRestResponse) await Configuration.ApiClient.CallApiAsync(path_, Method.GET, queryParams, postBody, headerParams, formParams, fileParams, pathParams); - if (((int)response.StatusCode) >= 400) - throw new ApiException ((int)response.StatusCode, "Error calling FindPetsByStatus: " + response.Content, response.Content); + + StatusCode = (int) response.StatusCode; + ResponseHeaders = response.Headers.ToDictionary(x => x.Name, x => x.Value.ToString()); + + if (StatusCode >= 400) + throw new ApiException (StatusCode, "Error calling FindPetsByStatus: " + response.Content, response.Content); return (List) Configuration.ApiClient.Deserialize(response, typeof(List)); } @@ -624,11 +655,14 @@ namespace IO.Swagger.Api // make the HTTP request IRestResponse response = (IRestResponse) Configuration.ApiClient.CallApi(path_, Method.GET, queryParams, postBody, headerParams, formParams, fileParams, pathParams); + + StatusCode = (int) response.StatusCode; + ResponseHeaders = response.Headers.ToDictionary(x => x.Name, x => x.Value.ToString()); - if (((int)response.StatusCode) >= 400) - throw new ApiException ((int)response.StatusCode, "Error calling FindPetsByTags: " + response.Content, response.Content); + if (StatusCode >= 400) + throw new ApiException (StatusCode, "Error calling FindPetsByTags: " + response.Content, response.Content); else if (((int)response.StatusCode) == 0) - throw new ApiException ((int)response.StatusCode, "Error calling FindPetsByTags: " + response.ErrorMessage, response.ErrorMessage); + throw new ApiException (StatusCode, "Error calling FindPetsByTags: " + response.ErrorMessage, response.ErrorMessage); return (List) Configuration.ApiClient.Deserialize(response, typeof(List)); } @@ -681,8 +715,12 @@ namespace IO.Swagger.Api // make the HTTP request IRestResponse response = (IRestResponse) await Configuration.ApiClient.CallApiAsync(path_, Method.GET, queryParams, postBody, headerParams, formParams, fileParams, pathParams); - if (((int)response.StatusCode) >= 400) - throw new ApiException ((int)response.StatusCode, "Error calling FindPetsByTags: " + response.Content, response.Content); + + StatusCode = (int) response.StatusCode; + ResponseHeaders = response.Headers.ToDictionary(x => x.Name, x => x.Value.ToString()); + + if (StatusCode >= 400) + throw new ApiException (StatusCode, "Error calling FindPetsByTags: " + response.Content, response.Content); return (List) Configuration.ApiClient.Deserialize(response, typeof(List)); } @@ -738,11 +776,14 @@ namespace IO.Swagger.Api // make the HTTP request IRestResponse response = (IRestResponse) Configuration.ApiClient.CallApi(path_, Method.GET, queryParams, postBody, headerParams, formParams, fileParams, pathParams); + + StatusCode = (int) response.StatusCode; + ResponseHeaders = response.Headers.ToDictionary(x => x.Name, x => x.Value.ToString()); - if (((int)response.StatusCode) >= 400) - throw new ApiException ((int)response.StatusCode, "Error calling GetPetById: " + response.Content, response.Content); + if (StatusCode >= 400) + throw new ApiException (StatusCode, "Error calling GetPetById: " + response.Content, response.Content); else if (((int)response.StatusCode) == 0) - throw new ApiException ((int)response.StatusCode, "Error calling GetPetById: " + response.ErrorMessage, response.ErrorMessage); + throw new ApiException (StatusCode, "Error calling GetPetById: " + response.ErrorMessage, response.ErrorMessage); return (Pet) Configuration.ApiClient.Deserialize(response, typeof(Pet)); } @@ -797,8 +838,12 @@ namespace IO.Swagger.Api // make the HTTP request IRestResponse response = (IRestResponse) await Configuration.ApiClient.CallApiAsync(path_, Method.GET, queryParams, postBody, headerParams, formParams, fileParams, pathParams); - if (((int)response.StatusCode) >= 400) - throw new ApiException ((int)response.StatusCode, "Error calling GetPetById: " + response.Content, response.Content); + + StatusCode = (int) response.StatusCode; + ResponseHeaders = response.Headers.ToDictionary(x => x.Name, x => x.Value.ToString()); + + if (StatusCode >= 400) + throw new ApiException (StatusCode, "Error calling GetPetById: " + response.Content, response.Content); return (Pet) Configuration.ApiClient.Deserialize(response, typeof(Pet)); } @@ -858,11 +903,14 @@ namespace IO.Swagger.Api // make the HTTP request IRestResponse response = (IRestResponse) Configuration.ApiClient.CallApi(path_, Method.POST, queryParams, postBody, headerParams, formParams, fileParams, pathParams); + + StatusCode = (int) response.StatusCode; + ResponseHeaders = response.Headers.ToDictionary(x => x.Name, x => x.Value.ToString()); - if (((int)response.StatusCode) >= 400) - throw new ApiException ((int)response.StatusCode, "Error calling UpdatePetWithForm: " + response.Content, response.Content); + if (StatusCode >= 400) + throw new ApiException (StatusCode, "Error calling UpdatePetWithForm: " + response.Content, response.Content); else if (((int)response.StatusCode) == 0) - throw new ApiException ((int)response.StatusCode, "Error calling UpdatePetWithForm: " + response.ErrorMessage, response.ErrorMessage); + throw new ApiException (StatusCode, "Error calling UpdatePetWithForm: " + response.ErrorMessage, response.ErrorMessage); return; } @@ -921,8 +969,12 @@ namespace IO.Swagger.Api // make the HTTP request IRestResponse response = (IRestResponse) await Configuration.ApiClient.CallApiAsync(path_, Method.POST, queryParams, postBody, headerParams, formParams, fileParams, pathParams); - if (((int)response.StatusCode) >= 400) - throw new ApiException ((int)response.StatusCode, "Error calling UpdatePetWithForm: " + response.Content, response.Content); + + StatusCode = (int) response.StatusCode; + ResponseHeaders = response.Headers.ToDictionary(x => x.Name, x => x.Value.ToString()); + + if (StatusCode >= 400) + throw new ApiException (StatusCode, "Error calling UpdatePetWithForm: " + response.Content, response.Content); return; @@ -981,11 +1033,14 @@ namespace IO.Swagger.Api // make the HTTP request IRestResponse response = (IRestResponse) Configuration.ApiClient.CallApi(path_, Method.DELETE, queryParams, postBody, headerParams, formParams, fileParams, pathParams); + + StatusCode = (int) response.StatusCode; + ResponseHeaders = response.Headers.ToDictionary(x => x.Name, x => x.Value.ToString()); - if (((int)response.StatusCode) >= 400) - throw new ApiException ((int)response.StatusCode, "Error calling DeletePet: " + response.Content, response.Content); + if (StatusCode >= 400) + throw new ApiException (StatusCode, "Error calling DeletePet: " + response.Content, response.Content); else if (((int)response.StatusCode) == 0) - throw new ApiException ((int)response.StatusCode, "Error calling DeletePet: " + response.ErrorMessage, response.ErrorMessage); + throw new ApiException (StatusCode, "Error calling DeletePet: " + response.ErrorMessage, response.ErrorMessage); return; } @@ -1042,8 +1097,12 @@ namespace IO.Swagger.Api // make the HTTP request IRestResponse response = (IRestResponse) await Configuration.ApiClient.CallApiAsync(path_, Method.DELETE, queryParams, postBody, headerParams, formParams, fileParams, pathParams); - if (((int)response.StatusCode) >= 400) - throw new ApiException ((int)response.StatusCode, "Error calling DeletePet: " + response.Content, response.Content); + + StatusCode = (int) response.StatusCode; + ResponseHeaders = response.Headers.ToDictionary(x => x.Name, x => x.Value.ToString()); + + if (StatusCode >= 400) + throw new ApiException (StatusCode, "Error calling DeletePet: " + response.Content, response.Content); return; @@ -1104,11 +1163,14 @@ namespace IO.Swagger.Api // make the HTTP request IRestResponse response = (IRestResponse) Configuration.ApiClient.CallApi(path_, Method.POST, queryParams, postBody, headerParams, formParams, fileParams, pathParams); + + StatusCode = (int) response.StatusCode; + ResponseHeaders = response.Headers.ToDictionary(x => x.Name, x => x.Value.ToString()); - if (((int)response.StatusCode) >= 400) - throw new ApiException ((int)response.StatusCode, "Error calling UploadFile: " + response.Content, response.Content); + if (StatusCode >= 400) + throw new ApiException (StatusCode, "Error calling UploadFile: " + response.Content, response.Content); else if (((int)response.StatusCode) == 0) - throw new ApiException ((int)response.StatusCode, "Error calling UploadFile: " + response.ErrorMessage, response.ErrorMessage); + throw new ApiException (StatusCode, "Error calling UploadFile: " + response.ErrorMessage, response.ErrorMessage); return; } @@ -1167,8 +1229,12 @@ namespace IO.Swagger.Api // make the HTTP request IRestResponse response = (IRestResponse) await Configuration.ApiClient.CallApiAsync(path_, Method.POST, queryParams, postBody, headerParams, formParams, fileParams, pathParams); - if (((int)response.StatusCode) >= 400) - throw new ApiException ((int)response.StatusCode, "Error calling UploadFile: " + response.Content, response.Content); + + StatusCode = (int) response.StatusCode; + ResponseHeaders = response.Headers.ToDictionary(x => x.Name, x => x.Value.ToString()); + + if (StatusCode >= 400) + throw new ApiException (StatusCode, "Error calling UploadFile: " + response.Content, response.Content); return; diff --git a/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Api/StoreApi.cs b/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Api/StoreApi.cs index 90f59746fca..dafb93d9458 100644 --- a/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Api/StoreApi.cs +++ b/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Api/StoreApi.cs @@ -1,6 +1,7 @@ using System; using System.IO; using System.Collections.Generic; +using System.Linq; using RestSharp; using IO.Swagger.Client; using IO.Swagger.Model; @@ -147,6 +148,16 @@ namespace IO.Swagger.Api /// /// An instance of the Configuration public Configuration Configuration {get; set;} + + /// + /// 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; } /// @@ -195,11 +206,14 @@ namespace IO.Swagger.Api // make the HTTP request IRestResponse response = (IRestResponse) Configuration.ApiClient.CallApi(path_, Method.GET, queryParams, postBody, headerParams, formParams, fileParams, pathParams); + + StatusCode = (int) response.StatusCode; + ResponseHeaders = response.Headers.ToDictionary(x => x.Name, x => x.Value.ToString()); - if (((int)response.StatusCode) >= 400) - throw new ApiException ((int)response.StatusCode, "Error calling GetInventory: " + response.Content, response.Content); + if (StatusCode >= 400) + throw new ApiException (StatusCode, "Error calling GetInventory: " + response.Content, response.Content); else if (((int)response.StatusCode) == 0) - throw new ApiException ((int)response.StatusCode, "Error calling GetInventory: " + response.ErrorMessage, response.ErrorMessage); + throw new ApiException (StatusCode, "Error calling GetInventory: " + response.ErrorMessage, response.ErrorMessage); return (Dictionary) Configuration.ApiClient.Deserialize(response, typeof(Dictionary)); } @@ -250,8 +264,12 @@ namespace IO.Swagger.Api // make the HTTP request IRestResponse response = (IRestResponse) await Configuration.ApiClient.CallApiAsync(path_, Method.GET, queryParams, postBody, headerParams, formParams, fileParams, pathParams); - if (((int)response.StatusCode) >= 400) - throw new ApiException ((int)response.StatusCode, "Error calling GetInventory: " + response.Content, response.Content); + + StatusCode = (int) response.StatusCode; + ResponseHeaders = response.Headers.ToDictionary(x => x.Name, x => x.Value.ToString()); + + if (StatusCode >= 400) + throw new ApiException (StatusCode, "Error calling GetInventory: " + response.Content, response.Content); return (Dictionary) Configuration.ApiClient.Deserialize(response, typeof(Dictionary)); } @@ -296,11 +314,14 @@ namespace IO.Swagger.Api // make the HTTP request IRestResponse response = (IRestResponse) Configuration.ApiClient.CallApi(path_, Method.POST, queryParams, postBody, headerParams, formParams, fileParams, pathParams); + + StatusCode = (int) response.StatusCode; + ResponseHeaders = response.Headers.ToDictionary(x => x.Name, x => x.Value.ToString()); - if (((int)response.StatusCode) >= 400) - throw new ApiException ((int)response.StatusCode, "Error calling PlaceOrder: " + response.Content, response.Content); + if (StatusCode >= 400) + throw new ApiException (StatusCode, "Error calling PlaceOrder: " + response.Content, response.Content); else if (((int)response.StatusCode) == 0) - throw new ApiException ((int)response.StatusCode, "Error calling PlaceOrder: " + response.ErrorMessage, response.ErrorMessage); + throw new ApiException (StatusCode, "Error calling PlaceOrder: " + response.ErrorMessage, response.ErrorMessage); return (Order) Configuration.ApiClient.Deserialize(response, typeof(Order)); } @@ -345,8 +366,12 @@ namespace IO.Swagger.Api // make the HTTP request IRestResponse response = (IRestResponse) await Configuration.ApiClient.CallApiAsync(path_, Method.POST, queryParams, postBody, headerParams, formParams, fileParams, pathParams); - if (((int)response.StatusCode) >= 400) - throw new ApiException ((int)response.StatusCode, "Error calling PlaceOrder: " + response.Content, response.Content); + + StatusCode = (int) response.StatusCode; + ResponseHeaders = response.Headers.ToDictionary(x => x.Name, x => x.Value.ToString()); + + if (StatusCode >= 400) + throw new ApiException (StatusCode, "Error calling PlaceOrder: " + response.Content, response.Content); return (Order) Configuration.ApiClient.Deserialize(response, typeof(Order)); } @@ -394,11 +419,14 @@ namespace IO.Swagger.Api // make the HTTP request IRestResponse response = (IRestResponse) Configuration.ApiClient.CallApi(path_, Method.GET, queryParams, postBody, headerParams, formParams, fileParams, pathParams); + + StatusCode = (int) response.StatusCode; + ResponseHeaders = response.Headers.ToDictionary(x => x.Name, x => x.Value.ToString()); - if (((int)response.StatusCode) >= 400) - throw new ApiException ((int)response.StatusCode, "Error calling GetOrderById: " + response.Content, response.Content); + if (StatusCode >= 400) + throw new ApiException (StatusCode, "Error calling GetOrderById: " + response.Content, response.Content); else if (((int)response.StatusCode) == 0) - throw new ApiException ((int)response.StatusCode, "Error calling GetOrderById: " + response.ErrorMessage, response.ErrorMessage); + throw new ApiException (StatusCode, "Error calling GetOrderById: " + response.ErrorMessage, response.ErrorMessage); return (Order) Configuration.ApiClient.Deserialize(response, typeof(Order)); } @@ -445,8 +473,12 @@ namespace IO.Swagger.Api // make the HTTP request IRestResponse response = (IRestResponse) await Configuration.ApiClient.CallApiAsync(path_, Method.GET, queryParams, postBody, headerParams, formParams, fileParams, pathParams); - if (((int)response.StatusCode) >= 400) - throw new ApiException ((int)response.StatusCode, "Error calling GetOrderById: " + response.Content, response.Content); + + StatusCode = (int) response.StatusCode; + ResponseHeaders = response.Headers.ToDictionary(x => x.Name, x => x.Value.ToString()); + + if (StatusCode >= 400) + throw new ApiException (StatusCode, "Error calling GetOrderById: " + response.Content, response.Content); return (Order) Configuration.ApiClient.Deserialize(response, typeof(Order)); } @@ -494,11 +526,14 @@ namespace IO.Swagger.Api // make the HTTP request IRestResponse response = (IRestResponse) Configuration.ApiClient.CallApi(path_, Method.DELETE, queryParams, postBody, headerParams, formParams, fileParams, pathParams); + + StatusCode = (int) response.StatusCode; + ResponseHeaders = response.Headers.ToDictionary(x => x.Name, x => x.Value.ToString()); - if (((int)response.StatusCode) >= 400) - throw new ApiException ((int)response.StatusCode, "Error calling DeleteOrder: " + response.Content, response.Content); + if (StatusCode >= 400) + throw new ApiException (StatusCode, "Error calling DeleteOrder: " + response.Content, response.Content); else if (((int)response.StatusCode) == 0) - throw new ApiException ((int)response.StatusCode, "Error calling DeleteOrder: " + response.ErrorMessage, response.ErrorMessage); + throw new ApiException (StatusCode, "Error calling DeleteOrder: " + response.ErrorMessage, response.ErrorMessage); return; } @@ -545,8 +580,12 @@ namespace IO.Swagger.Api // make the HTTP request IRestResponse response = (IRestResponse) await Configuration.ApiClient.CallApiAsync(path_, Method.DELETE, queryParams, postBody, headerParams, formParams, fileParams, pathParams); - if (((int)response.StatusCode) >= 400) - throw new ApiException ((int)response.StatusCode, "Error calling DeleteOrder: " + response.Content, response.Content); + + StatusCode = (int) response.StatusCode; + ResponseHeaders = response.Headers.ToDictionary(x => x.Name, x => x.Value.ToString()); + + if (StatusCode >= 400) + throw new ApiException (StatusCode, "Error calling DeleteOrder: " + response.Content, response.Content); return; diff --git a/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Api/UserApi.cs b/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Api/UserApi.cs index 01127fb340f..c2c23cddfc2 100644 --- a/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Api/UserApi.cs +++ b/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Api/UserApi.cs @@ -1,6 +1,7 @@ using System; using System.IO; using System.Collections.Generic; +using System.Linq; using RestSharp; using IO.Swagger.Client; using IO.Swagger.Model; @@ -231,6 +232,16 @@ namespace IO.Swagger.Api /// /// An instance of the Configuration public Configuration Configuration {get; set;} + + /// + /// 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; } /// @@ -273,11 +284,14 @@ namespace IO.Swagger.Api // make the HTTP request IRestResponse response = (IRestResponse) Configuration.ApiClient.CallApi(path_, Method.POST, queryParams, postBody, headerParams, formParams, fileParams, pathParams); + + StatusCode = (int) response.StatusCode; + ResponseHeaders = response.Headers.ToDictionary(x => x.Name, x => x.Value.ToString()); - if (((int)response.StatusCode) >= 400) - throw new ApiException ((int)response.StatusCode, "Error calling CreateUser: " + response.Content, response.Content); + if (StatusCode >= 400) + throw new ApiException (StatusCode, "Error calling CreateUser: " + response.Content, response.Content); else if (((int)response.StatusCode) == 0) - throw new ApiException ((int)response.StatusCode, "Error calling CreateUser: " + response.ErrorMessage, response.ErrorMessage); + throw new ApiException (StatusCode, "Error calling CreateUser: " + response.ErrorMessage, response.ErrorMessage); return; } @@ -322,8 +336,12 @@ namespace IO.Swagger.Api // make the HTTP request IRestResponse response = (IRestResponse) await Configuration.ApiClient.CallApiAsync(path_, Method.POST, queryParams, postBody, headerParams, formParams, fileParams, pathParams); - if (((int)response.StatusCode) >= 400) - throw new ApiException ((int)response.StatusCode, "Error calling CreateUser: " + response.Content, response.Content); + + StatusCode = (int) response.StatusCode; + ResponseHeaders = response.Headers.ToDictionary(x => x.Name, x => x.Value.ToString()); + + if (StatusCode >= 400) + throw new ApiException (StatusCode, "Error calling CreateUser: " + response.Content, response.Content); return; @@ -369,11 +387,14 @@ namespace IO.Swagger.Api // make the HTTP request IRestResponse response = (IRestResponse) Configuration.ApiClient.CallApi(path_, Method.POST, queryParams, postBody, headerParams, formParams, fileParams, pathParams); + + StatusCode = (int) response.StatusCode; + ResponseHeaders = response.Headers.ToDictionary(x => x.Name, x => x.Value.ToString()); - if (((int)response.StatusCode) >= 400) - throw new ApiException ((int)response.StatusCode, "Error calling CreateUsersWithArrayInput: " + response.Content, response.Content); + if (StatusCode >= 400) + throw new ApiException (StatusCode, "Error calling CreateUsersWithArrayInput: " + response.Content, response.Content); else if (((int)response.StatusCode) == 0) - throw new ApiException ((int)response.StatusCode, "Error calling CreateUsersWithArrayInput: " + response.ErrorMessage, response.ErrorMessage); + throw new ApiException (StatusCode, "Error calling CreateUsersWithArrayInput: " + response.ErrorMessage, response.ErrorMessage); return; } @@ -418,8 +439,12 @@ namespace IO.Swagger.Api // make the HTTP request IRestResponse response = (IRestResponse) await Configuration.ApiClient.CallApiAsync(path_, Method.POST, queryParams, postBody, headerParams, formParams, fileParams, pathParams); - if (((int)response.StatusCode) >= 400) - throw new ApiException ((int)response.StatusCode, "Error calling CreateUsersWithArrayInput: " + response.Content, response.Content); + + StatusCode = (int) response.StatusCode; + ResponseHeaders = response.Headers.ToDictionary(x => x.Name, x => x.Value.ToString()); + + if (StatusCode >= 400) + throw new ApiException (StatusCode, "Error calling CreateUsersWithArrayInput: " + response.Content, response.Content); return; @@ -465,11 +490,14 @@ namespace IO.Swagger.Api // make the HTTP request IRestResponse response = (IRestResponse) Configuration.ApiClient.CallApi(path_, Method.POST, queryParams, postBody, headerParams, formParams, fileParams, pathParams); + + StatusCode = (int) response.StatusCode; + ResponseHeaders = response.Headers.ToDictionary(x => x.Name, x => x.Value.ToString()); - if (((int)response.StatusCode) >= 400) - throw new ApiException ((int)response.StatusCode, "Error calling CreateUsersWithListInput: " + response.Content, response.Content); + if (StatusCode >= 400) + throw new ApiException (StatusCode, "Error calling CreateUsersWithListInput: " + response.Content, response.Content); else if (((int)response.StatusCode) == 0) - throw new ApiException ((int)response.StatusCode, "Error calling CreateUsersWithListInput: " + response.ErrorMessage, response.ErrorMessage); + throw new ApiException (StatusCode, "Error calling CreateUsersWithListInput: " + response.ErrorMessage, response.ErrorMessage); return; } @@ -514,8 +542,12 @@ namespace IO.Swagger.Api // make the HTTP request IRestResponse response = (IRestResponse) await Configuration.ApiClient.CallApiAsync(path_, Method.POST, queryParams, postBody, headerParams, formParams, fileParams, pathParams); - if (((int)response.StatusCode) >= 400) - throw new ApiException ((int)response.StatusCode, "Error calling CreateUsersWithListInput: " + response.Content, response.Content); + + StatusCode = (int) response.StatusCode; + ResponseHeaders = response.Headers.ToDictionary(x => x.Name, x => x.Value.ToString()); + + if (StatusCode >= 400) + throw new ApiException (StatusCode, "Error calling CreateUsersWithListInput: " + response.Content, response.Content); return; @@ -563,11 +595,14 @@ namespace IO.Swagger.Api // make the HTTP request IRestResponse response = (IRestResponse) Configuration.ApiClient.CallApi(path_, Method.GET, queryParams, postBody, headerParams, formParams, fileParams, pathParams); + + StatusCode = (int) response.StatusCode; + ResponseHeaders = response.Headers.ToDictionary(x => x.Name, x => x.Value.ToString()); - if (((int)response.StatusCode) >= 400) - throw new ApiException ((int)response.StatusCode, "Error calling LoginUser: " + response.Content, response.Content); + if (StatusCode >= 400) + throw new ApiException (StatusCode, "Error calling LoginUser: " + response.Content, response.Content); else if (((int)response.StatusCode) == 0) - throw new ApiException ((int)response.StatusCode, "Error calling LoginUser: " + response.ErrorMessage, response.ErrorMessage); + throw new ApiException (StatusCode, "Error calling LoginUser: " + response.ErrorMessage, response.ErrorMessage); return (string) Configuration.ApiClient.Deserialize(response, typeof(string)); } @@ -614,8 +649,12 @@ namespace IO.Swagger.Api // make the HTTP request IRestResponse response = (IRestResponse) await Configuration.ApiClient.CallApiAsync(path_, Method.GET, queryParams, postBody, headerParams, formParams, fileParams, pathParams); - if (((int)response.StatusCode) >= 400) - throw new ApiException ((int)response.StatusCode, "Error calling LoginUser: " + response.Content, response.Content); + + StatusCode = (int) response.StatusCode; + ResponseHeaders = response.Headers.ToDictionary(x => x.Name, x => x.Value.ToString()); + + if (StatusCode >= 400) + throw new ApiException (StatusCode, "Error calling LoginUser: " + response.Content, response.Content); return (string) Configuration.ApiClient.Deserialize(response, typeof(string)); } @@ -658,11 +697,14 @@ namespace IO.Swagger.Api // make the HTTP request IRestResponse response = (IRestResponse) Configuration.ApiClient.CallApi(path_, Method.GET, queryParams, postBody, headerParams, formParams, fileParams, pathParams); + + StatusCode = (int) response.StatusCode; + ResponseHeaders = response.Headers.ToDictionary(x => x.Name, x => x.Value.ToString()); - if (((int)response.StatusCode) >= 400) - throw new ApiException ((int)response.StatusCode, "Error calling LogoutUser: " + response.Content, response.Content); + if (StatusCode >= 400) + throw new ApiException (StatusCode, "Error calling LogoutUser: " + response.Content, response.Content); else if (((int)response.StatusCode) == 0) - throw new ApiException ((int)response.StatusCode, "Error calling LogoutUser: " + response.ErrorMessage, response.ErrorMessage); + throw new ApiException (StatusCode, "Error calling LogoutUser: " + response.ErrorMessage, response.ErrorMessage); return; } @@ -705,8 +747,12 @@ namespace IO.Swagger.Api // make the HTTP request IRestResponse response = (IRestResponse) await Configuration.ApiClient.CallApiAsync(path_, Method.GET, queryParams, postBody, headerParams, formParams, fileParams, pathParams); - if (((int)response.StatusCode) >= 400) - throw new ApiException ((int)response.StatusCode, "Error calling LogoutUser: " + response.Content, response.Content); + + StatusCode = (int) response.StatusCode; + ResponseHeaders = response.Headers.ToDictionary(x => x.Name, x => x.Value.ToString()); + + if (StatusCode >= 400) + throw new ApiException (StatusCode, "Error calling LogoutUser: " + response.Content, response.Content); return; @@ -755,11 +801,14 @@ namespace IO.Swagger.Api // make the HTTP request IRestResponse response = (IRestResponse) Configuration.ApiClient.CallApi(path_, Method.GET, queryParams, postBody, headerParams, formParams, fileParams, pathParams); + + StatusCode = (int) response.StatusCode; + ResponseHeaders = response.Headers.ToDictionary(x => x.Name, x => x.Value.ToString()); - if (((int)response.StatusCode) >= 400) - throw new ApiException ((int)response.StatusCode, "Error calling GetUserByName: " + response.Content, response.Content); + if (StatusCode >= 400) + throw new ApiException (StatusCode, "Error calling GetUserByName: " + response.Content, response.Content); else if (((int)response.StatusCode) == 0) - throw new ApiException ((int)response.StatusCode, "Error calling GetUserByName: " + response.ErrorMessage, response.ErrorMessage); + throw new ApiException (StatusCode, "Error calling GetUserByName: " + response.ErrorMessage, response.ErrorMessage); return (User) Configuration.ApiClient.Deserialize(response, typeof(User)); } @@ -806,8 +855,12 @@ namespace IO.Swagger.Api // make the HTTP request IRestResponse response = (IRestResponse) await Configuration.ApiClient.CallApiAsync(path_, Method.GET, queryParams, postBody, headerParams, formParams, fileParams, pathParams); - if (((int)response.StatusCode) >= 400) - throw new ApiException ((int)response.StatusCode, "Error calling GetUserByName: " + response.Content, response.Content); + + StatusCode = (int) response.StatusCode; + ResponseHeaders = response.Headers.ToDictionary(x => x.Name, x => x.Value.ToString()); + + if (StatusCode >= 400) + throw new ApiException (StatusCode, "Error calling GetUserByName: " + response.Content, response.Content); return (User) Configuration.ApiClient.Deserialize(response, typeof(User)); } @@ -857,11 +910,14 @@ namespace IO.Swagger.Api // make the HTTP request IRestResponse response = (IRestResponse) Configuration.ApiClient.CallApi(path_, Method.PUT, queryParams, postBody, headerParams, formParams, fileParams, pathParams); + + StatusCode = (int) response.StatusCode; + ResponseHeaders = response.Headers.ToDictionary(x => x.Name, x => x.Value.ToString()); - if (((int)response.StatusCode) >= 400) - throw new ApiException ((int)response.StatusCode, "Error calling UpdateUser: " + response.Content, response.Content); + if (StatusCode >= 400) + throw new ApiException (StatusCode, "Error calling UpdateUser: " + response.Content, response.Content); else if (((int)response.StatusCode) == 0) - throw new ApiException ((int)response.StatusCode, "Error calling UpdateUser: " + response.ErrorMessage, response.ErrorMessage); + throw new ApiException (StatusCode, "Error calling UpdateUser: " + response.ErrorMessage, response.ErrorMessage); return; } @@ -910,8 +966,12 @@ namespace IO.Swagger.Api // make the HTTP request IRestResponse response = (IRestResponse) await Configuration.ApiClient.CallApiAsync(path_, Method.PUT, queryParams, postBody, headerParams, formParams, fileParams, pathParams); - if (((int)response.StatusCode) >= 400) - throw new ApiException ((int)response.StatusCode, "Error calling UpdateUser: " + response.Content, response.Content); + + StatusCode = (int) response.StatusCode; + ResponseHeaders = response.Headers.ToDictionary(x => x.Name, x => x.Value.ToString()); + + if (StatusCode >= 400) + throw new ApiException (StatusCode, "Error calling UpdateUser: " + response.Content, response.Content); return; @@ -960,11 +1020,14 @@ namespace IO.Swagger.Api // make the HTTP request IRestResponse response = (IRestResponse) Configuration.ApiClient.CallApi(path_, Method.DELETE, queryParams, postBody, headerParams, formParams, fileParams, pathParams); + + StatusCode = (int) response.StatusCode; + ResponseHeaders = response.Headers.ToDictionary(x => x.Name, x => x.Value.ToString()); - if (((int)response.StatusCode) >= 400) - throw new ApiException ((int)response.StatusCode, "Error calling DeleteUser: " + response.Content, response.Content); + if (StatusCode >= 400) + throw new ApiException (StatusCode, "Error calling DeleteUser: " + response.Content, response.Content); else if (((int)response.StatusCode) == 0) - throw new ApiException ((int)response.StatusCode, "Error calling DeleteUser: " + response.ErrorMessage, response.ErrorMessage); + throw new ApiException (StatusCode, "Error calling DeleteUser: " + response.ErrorMessage, response.ErrorMessage); return; } @@ -1011,8 +1074,12 @@ namespace IO.Swagger.Api // make the HTTP request IRestResponse response = (IRestResponse) await Configuration.ApiClient.CallApiAsync(path_, Method.DELETE, queryParams, postBody, headerParams, formParams, fileParams, pathParams); - if (((int)response.StatusCode) >= 400) - throw new ApiException ((int)response.StatusCode, "Error calling DeleteUser: " + response.Content, response.Content); + + StatusCode = (int) response.StatusCode; + ResponseHeaders = response.Headers.ToDictionary(x => x.Name, x => x.Value.ToString()); + + if (StatusCode >= 400) + throw new ApiException (StatusCode, "Error calling DeleteUser: " + response.Content, response.Content); return; diff --git a/samples/client/petstore/csharp/SwaggerClientTest/TestPet.cs b/samples/client/petstore/csharp/SwaggerClientTest/TestPet.cs index e9169da9832..2bd9b8ac733 100644 --- a/samples/client/petstore/csharp/SwaggerClientTest/TestPet.cs +++ b/samples/client/petstore/csharp/SwaggerClientTest/TestPet.cs @@ -229,6 +229,19 @@ namespace SwaggerClient.TestPet } + /// + /// Test status code + /// + [Test ()] + public void TestStatusCodeAndHeader () + { + PetApi petApi = new PetApi (); + petApi.GetPetById (petId); + Assert.AreEqual (petApi.StatusCode, 200); + Assert.IsTrue (petApi.ResponseHeaders.ContainsKey("Content-Type")); + Assert.AreEqual (petApi.ResponseHeaders["Content-Type"], "application/json"); + } + } } diff --git a/samples/client/petstore/csharp/SwaggerClientTest/bin/Debug/SwaggerClientTest.dll b/samples/client/petstore/csharp/SwaggerClientTest/bin/Debug/SwaggerClientTest.dll index 955673ab9a4c4eadbfa919ec3f3189c07b3961a4..e26e6d019c28970ce8d0386d6104a2d1d975d246 100755 GIT binary patch literal 80384 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 Jf4qg@{{a~Gw_*SQ literal 21678 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 EAH2NcRsaA1 diff --git a/samples/client/petstore/csharp/SwaggerClientTest/obj/Debug/SwaggerClientTest.dll b/samples/client/petstore/csharp/SwaggerClientTest/obj/Debug/SwaggerClientTest.dll index 955673ab9a4c4eadbfa919ec3f3189c07b3961a4..e26e6d019c28970ce8d0386d6104a2d1d975d246 100755 GIT binary patch literal 80384 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 Jf4qg@{{a~Gw_*SQ literal 21678 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 EAH2NcRsaA1 From eb0e47461c09e442384a7034bce215525be9279d Mon Sep 17 00:00:00 2001 From: xhh Date: Tue, 1 Dec 2015 16:13:31 +0800 Subject: [PATCH 089/211] Add petstore client sample for Java-feign --- bin/java-petstore-feign.json | 4 + bin/java-petstore-feign.sh | 31 +++ samples/client/petstore/java/feign/README.md | 43 ++++ .../client/petstore/java/feign/build.gradle | 113 +++++++++++ .../petstore/java/feign/gradle.properties | 2 + samples/client/petstore/java/feign/pom.xml | 183 ++++++++++++++++++ .../petstore/java/feign/settings.gradle | 1 + .../java/feign/src/main/AndroidManifest.xml | 3 + .../java/io/swagger/client/ApiClient.java | 86 ++++++++ .../java/io/swagger/client/StringUtil.java | 51 +++++ .../java/io/swagger/client/api/PetApi.java | 120 ++++++++++++ .../java/io/swagger/client/api/StoreApi.java | 66 +++++++ .../java/io/swagger/client/api/UserApi.java | 116 +++++++++++ .../io/swagger/client/model/Category.java | 73 +++++++ .../java/io/swagger/client/model/Order.java | 153 +++++++++++++++ .../java/io/swagger/client/model/Pet.java | 155 +++++++++++++++ .../java/io/swagger/client/model/Tag.java | 73 +++++++ .../java/io/swagger/client/model/User.java | 164 ++++++++++++++++ 18 files changed, 1437 insertions(+) create mode 100644 bin/java-petstore-feign.json create mode 100755 bin/java-petstore-feign.sh create mode 100644 samples/client/petstore/java/feign/README.md create mode 100644 samples/client/petstore/java/feign/build.gradle create mode 100644 samples/client/petstore/java/feign/gradle.properties create mode 100644 samples/client/petstore/java/feign/pom.xml create mode 100644 samples/client/petstore/java/feign/settings.gradle create mode 100644 samples/client/petstore/java/feign/src/main/AndroidManifest.xml create mode 100644 samples/client/petstore/java/feign/src/main/java/io/swagger/client/ApiClient.java create mode 100644 samples/client/petstore/java/feign/src/main/java/io/swagger/client/StringUtil.java create mode 100644 samples/client/petstore/java/feign/src/main/java/io/swagger/client/api/PetApi.java create mode 100644 samples/client/petstore/java/feign/src/main/java/io/swagger/client/api/StoreApi.java create mode 100644 samples/client/petstore/java/feign/src/main/java/io/swagger/client/api/UserApi.java create mode 100644 samples/client/petstore/java/feign/src/main/java/io/swagger/client/model/Category.java create mode 100644 samples/client/petstore/java/feign/src/main/java/io/swagger/client/model/Order.java create mode 100644 samples/client/petstore/java/feign/src/main/java/io/swagger/client/model/Pet.java create mode 100644 samples/client/petstore/java/feign/src/main/java/io/swagger/client/model/Tag.java create mode 100644 samples/client/petstore/java/feign/src/main/java/io/swagger/client/model/User.java diff --git a/bin/java-petstore-feign.json b/bin/java-petstore-feign.json new file mode 100644 index 00000000000..5502ee3bbad --- /dev/null +++ b/bin/java-petstore-feign.json @@ -0,0 +1,4 @@ +{ + "library": "feign", + "artifactId": "swagger-petstore-feign" +} diff --git a/bin/java-petstore-feign.sh b/bin/java-petstore-feign.sh new file mode 100755 index 00000000000..6f0a5fdf8ff --- /dev/null +++ b/bin/java-petstore-feign.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 -i modules/swagger-codegen/src/test/resources/2_0/petstore.json -l java -c bin/java-petstore-feign.json -o samples/client/petstore/java/feign" + +java $JAVA_OPTS -jar $executable $ags diff --git a/samples/client/petstore/java/feign/README.md b/samples/client/petstore/java/feign/README.md new file mode 100644 index 00000000000..3ca7abfb557 --- /dev/null +++ b/samples/client/petstore/java/feign/README.md @@ -0,0 +1,43 @@ +# swagger-petstore-feign + +## Requirements + +Building the API client library requires [Maven](https://maven.apache.org/) to be installed. + +## Installation & Usage + +To install the API client library to your local Maven repository, simply execute: + +```shell +mvn install +``` + +To deploy it to a remote Maven repository instead, configure the settings of the repository and execute: + +```shell +mvn deploy +``` + +Refer to the [official documentation](https://maven.apache.org/plugins/maven-deploy-plugin/usage.html) for more information. + +After the client libarary is installed/deployed, you can use it in your Maven project by adding the following to your *pom.xml*: + +```xml + + io.swagger + swagger-petstore-feign + 1.0.0 + compile + + +``` + +## Recommendation + +It's recommended to create an instance of `ApiClient` per thread in a multithreaded environment to avoid any potential issue. + +## Author + +apiteam@swagger.io + + diff --git a/samples/client/petstore/java/feign/build.gradle b/samples/client/petstore/java/feign/build.gradle new file mode 100644 index 00000000000..0bfcfbec71f --- /dev/null +++ b/samples/client/petstore/java/feign/build.gradle @@ -0,0 +1,113 @@ +group = 'io.swagger' +version = '1.0.0' + +buildscript { + repositories { + jcenter() + } + dependencies { + classpath 'com.android.tools.build:gradle:1.2.2' + classpath 'com.github.dcendents:android-maven-plugin:1.2' + } +} + +repositories { + jcenter() +} + + +if(hasProperty('target') && target == 'android') { + + apply plugin: 'com.android.library' + apply plugin: 'com.github.dcendents.android-maven' + + android { + compileSdkVersion 22 + buildToolsVersion '22.0.0' + defaultConfig { + minSdkVersion 14 + targetSdkVersion 22 + } + compileOptions { + sourceCompatibility JavaVersion.VERSION_1_7 + targetCompatibility JavaVersion.VERSION_1_7 + } + + // Rename the aar correctly + libraryVariants.all { variant -> + variant.outputs.each { output -> + def outputFile = output.outputFile + if (outputFile != null && outputFile.name.endsWith('.aar')) { + def fileName = "${project.name}-${variant.baseName}-${version}.aar" + output.outputFile = new File(outputFile.parent, fileName) + } + } + } + + dependencies { + provided 'javax.annotation:jsr250-api:1.0' + } + } + + afterEvaluate { + android.libraryVariants.all { variant -> + def task = project.tasks.create "jar${variant.name.capitalize()}", Jar + task.description = "Create jar artifact for ${variant.name}" + task.dependsOn variant.javaCompile + task.from variant.javaCompile.destinationDir + task.destinationDir = project.file("${project.buildDir}/outputs/jar") + task.archiveName = "${project.name}-${variant.baseName}-${version}.jar" + artifacts.add('archives', task); + } + } + + task sourcesJar(type: Jar) { + from android.sourceSets.main.java.srcDirs + classifier = 'sources' + } + + artifacts { + archives sourcesJar + } + +} else { + + apply plugin: 'java' + apply plugin: 'maven' + + sourceCompatibility = JavaVersion.VERSION_1_7 + targetCompatibility = JavaVersion.VERSION_1_7 + + install { + repositories.mavenInstaller { + pom.artifactId = 'swagger-petstore-feign' + } + } + + task execute(type:JavaExec) { + main = System.getProperty('mainClass') + classpath = sourceSets.main.runtimeClasspath + } +} + +ext { + swagger_annotations_version = "1.5.0" + jackson_version = "2.6.3" + feign_version = "8.1.1" + jodatime_version = "2.5" + junit_version = "4.12" +} + +dependencies { + compile "io.swagger:swagger-annotations:$swagger_annotations_version" + compile "com.netflix.feign:feign-core:$feign_version" + compile "com.netflix.feign:feign-jackson:$feign_version" + compile "com.netflix.feign:feign-slf4j:$feign_version" + compile "com.fasterxml.jackson.core:jackson-core:$jackson_version" + compile "com.fasterxml.jackson.core:jackson-annotations:$jackson_version" + compile "com.fasterxml.jackson.core:jackson-databind:$jackson_version" + compile "com.fasterxml.jackson.datatype:jackson-datatype-joda:2.1.5" + compile "joda-time:joda-time:$jodatime_version" + compile "com.brsanthu:migbase64:2.2" + testCompile "junit:junit:$junit_version" +} diff --git a/samples/client/petstore/java/feign/gradle.properties b/samples/client/petstore/java/feign/gradle.properties new file mode 100644 index 00000000000..05644f0754a --- /dev/null +++ b/samples/client/petstore/java/feign/gradle.properties @@ -0,0 +1,2 @@ +# Uncomment to build for Android +#target = android \ No newline at end of file diff --git a/samples/client/petstore/java/feign/pom.xml b/samples/client/petstore/java/feign/pom.xml new file mode 100644 index 00000000000..5f7e9551862 --- /dev/null +++ b/samples/client/petstore/java/feign/pom.xml @@ -0,0 +1,183 @@ + + 4.0.0 + io.swagger + swagger-petstore-feign + jar + swagger-petstore-feign + 1.0.0 + + scm:git:git@github.com:swagger-api/swagger-mustache.git + scm:git:git@github.com:swagger-api/swagger-codegen.git + https://github.com/swagger-api/swagger-codegen + + + 2.2.0 + + + + + + org.apache.maven.plugins + maven-surefire-plugin + 2.12 + + + + loggerPath + conf/log4j.properties + + + -Xms512m -Xmx1500m + methods + pertest + + + + maven-dependency-plugin + + + package + + copy-dependencies + + + ${project.build.directory}/lib + + + + + + + + org.apache.maven.plugins + maven-jar-plugin + 2.2 + + + + jar + test-jar + + + + + + + + + org.codehaus.mojo + build-helper-maven-plugin + + + add_sources + generate-sources + + add-source + + + + src/main/java + + + + + add_test_sources + generate-test-sources + + add-test-source + + + + src/test/java + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + 2.3.2 + + 1.6 + 1.6 + + + + + + + io.swagger + swagger-annotations + ${swagger-annotations-version} + + + + + com.netflix.feign + feign-core + ${feign-version} + + + com.netflix.feign + feign-jackson + ${feign-version} + + + com.netflix.feign + feign-slf4j + ${feign-version} + + + + + com.fasterxml.jackson.core + jackson-core + ${jackson-version} + + + com.fasterxml.jackson.core + jackson-annotations + ${jackson-version} + + + com.fasterxml.jackson.core + jackson-databind + ${jackson-version} + + + com.fasterxml.jackson.datatype + jackson-datatype-joda + 2.1.5 + + + joda-time + joda-time + ${jodatime-version} + + + + + com.brsanthu + migbase64 + 2.2 + + + + + junit + junit + ${junit-version} + test + + + + 1.5.0 + 8.1.1 + 2.6.3 + 2.5 + 4.12 + 1.0.0 + + diff --git a/samples/client/petstore/java/feign/settings.gradle b/samples/client/petstore/java/feign/settings.gradle new file mode 100644 index 00000000000..a25109c126e --- /dev/null +++ b/samples/client/petstore/java/feign/settings.gradle @@ -0,0 +1 @@ +rootProject.name = "swagger-petstore-feign" \ No newline at end of file diff --git a/samples/client/petstore/java/feign/src/main/AndroidManifest.xml b/samples/client/petstore/java/feign/src/main/AndroidManifest.xml new file mode 100644 index 00000000000..465dcb520c4 --- /dev/null +++ b/samples/client/petstore/java/feign/src/main/AndroidManifest.xml @@ -0,0 +1,3 @@ + + + diff --git a/samples/client/petstore/java/feign/src/main/java/io/swagger/client/ApiClient.java b/samples/client/petstore/java/feign/src/main/java/io/swagger/client/ApiClient.java new file mode 100644 index 00000000000..02f5b7fb982 --- /dev/null +++ b/samples/client/petstore/java/feign/src/main/java/io/swagger/client/ApiClient.java @@ -0,0 +1,86 @@ +package io.swagger.client; + +import com.fasterxml.jackson.databind.DeserializationFeature; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.SerializationFeature; +import feign.Feign; +import feign.jackson.JacksonDecoder; +import feign.jackson.JacksonEncoder; +import feign.slf4j.Slf4jLogger; + +@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-12-01T16:10:23.565+08:00") +public class ApiClient { + public interface Api {} + + private ObjectMapper objectMapper; + private String basePath = "http://petstore.swagger.io/v2"; + + public ApiClient() { + objectMapper = createObjectMapper(); + } + + public String getBasePath() { + return basePath; + } + + public ApiClient setBasePath(String basePath) { + this.basePath = basePath; + return this; + } + + private ObjectMapper createObjectMapper() { + ObjectMapper objectMapper = new ObjectMapper(); + objectMapper.enable(SerializationFeature.WRITE_ENUMS_USING_TO_STRING); + objectMapper.enable(DeserializationFeature.READ_ENUMS_USING_TO_STRING); + return objectMapper; + } + + /** + * Creates a feign client for given API interface. + * + * Usage: + * ApiClient apiClient = new ApiClient(); + * apiClient.setBasePath("http://localhost:8080"); + * XYZApi api = apiClient.buildClient(XYZApi.class); + * XYZResponse response = api.someMethod(...); + */ + public T buildClient(Class clientClass) { + return Feign.builder() + .encoder(new JacksonEncoder(objectMapper)) + .decoder(new JacksonDecoder(objectMapper)) +// enable for basic auth: +// .requestInterceptor(new feign.auth.BasicAuthRequestInterceptor(username, password)) + .logger(new Slf4jLogger()) + .target(clientClass, basePath); + } + + /** + * Select the Accept header's value from the given accepts array: + * if JSON exists in the given array, use it; + * otherwise use all of them (joining into a string) + * + * @param accepts The accepts array to select from + * @return The Accept header to use. If the given array is empty, + * null will be returned (not to set the Accept header explicitly). + */ + public String selectHeaderAccept(String[] accepts) { + if (accepts.length == 0) return null; + if (StringUtil.containsIgnoreCase(accepts, "application/json")) return "application/json"; + return StringUtil.join(accepts, ","); + } + + /** + * Select the Content-Type header's value from the given array: + * if JSON exists in the given array, use it; + * otherwise use the first one of the array. + * + * @param contentTypes The Content-Type array to select from + * @return The Content-Type header to use. If the given array is empty, + * JSON will be used. + */ + public String selectHeaderContentType(String[] contentTypes) { + if (contentTypes.length == 0) return "application/json"; + if (StringUtil.containsIgnoreCase(contentTypes, "application/json")) return "application/json"; + return contentTypes[0]; + } +} diff --git a/samples/client/petstore/java/feign/src/main/java/io/swagger/client/StringUtil.java b/samples/client/petstore/java/feign/src/main/java/io/swagger/client/StringUtil.java new file mode 100644 index 00000000000..82b8d8afa0b --- /dev/null +++ b/samples/client/petstore/java/feign/src/main/java/io/swagger/client/StringUtil.java @@ -0,0 +1,51 @@ +package io.swagger.client; + +@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-12-01T16:10:23.565+08:00") +public class StringUtil { + /** + * Check if the given array contains the given value (with case-insensitive comparison). + * + * @param array The array + * @param value The value to search + * @return true if the array contains the value + */ + public static boolean containsIgnoreCase(String[] array, String value) { + for (String str : array) { + if (value == null && str == null) return true; + if (value != null && value.equalsIgnoreCase(str)) return true; + } + return false; + } + + /** + * Join an array of strings with the given separator. + *

+ * Note: This might be replaced by utility method from commons-lang or guava someday + * if one of those libraries is added as dependency. + *

+ * + * @param array The array of strings + * @param separator The separator + * @return the resulting string + */ + public static String join(String[] array, String separator) { + int len = array.length; + if (len == 0) return ""; + + StringBuilder out = new StringBuilder(); + out.append(array[0]); + for (int i = 1; i < len; i++) { + out.append(separator).append(array[i]); + } + return out.toString(); + } + + /** + * Convert the given object to string with each line indented by 4 spaces + * (except the first line). + */ + public static String toIndentedString(Object o) { + if (o == null) return "null"; + return o.toString().replace("\n", "\n "); + } +} diff --git a/samples/client/petstore/java/feign/src/main/java/io/swagger/client/api/PetApi.java b/samples/client/petstore/java/feign/src/main/java/io/swagger/client/api/PetApi.java new file mode 100644 index 00000000000..54213294eed --- /dev/null +++ b/samples/client/petstore/java/feign/src/main/java/io/swagger/client/api/PetApi.java @@ -0,0 +1,120 @@ +package io.swagger.client.api; + +import io.swagger.client.ApiException; +import io.swagger.client.ApiClient; +import io.swagger.client.Configuration; +import io.swagger.client.Pair; +import io.swagger.client.TypeRef; + +import io.swagger.client.model.Pet; +import java.io.File; + +import java.util.*; +import feign.*; + +@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-12-01T16:10:23.565+08:00") +public interface PetApi extends io.swagger.client.ApiClient.Api { + + + /** + * Update an existing pet + * + * @param body Pet object that needs to be added to the store + * @return void + */ + @RequestLine("PUT /pet") + @Headers({ + + }) + void updatePet (@Param("body") Pet body) throws ApiException; + + /** + * Add a new pet to the store + * + * @param body Pet object that needs to be added to the store + * @return void + */ + @RequestLine("POST /pet") + @Headers({ + + }) + void addPet (@Param("body") Pet body) throws ApiException; + + /** + * Finds Pets by status + * Multiple status values can be provided with comma seperated strings + * @param status Status values that need to be considered for filter + * @return List + */ + @RequestLine("GET /pet/findByStatus?status={status}") + @Headers({ + + }) + List findPetsByStatus (@Param("status") List status) throws ApiException; + + /** + * Finds Pets by tags + * Muliple tags can be provided with comma seperated strings. Use tag1, tag2, tag3 for testing. + * @param tags Tags to filter by + * @return List + */ + @RequestLine("GET /pet/findByTags?tags={tags}") + @Headers({ + + }) + List findPetsByTags (@Param("tags") List tags) throws ApiException; + + /** + * Find pet by ID + * Returns a pet when ID < 10. ID > 10 or nonintegers will simulate API error conditions + * @param petId ID of pet that needs to be fetched + * @return Pet + */ + @RequestLine("GET /pet/{petId}") + @Headers({ + + }) + Pet getPetById (@Param("petId") Long petId) throws ApiException; + + /** + * Updates a pet in the store with form data + * + * @param petId ID of pet that needs to be updated + * @param name Updated name of the pet + * @param status Updated status of the pet + * @return void + */ + @RequestLine("POST /pet/{petId}") + @Headers({ + + }) + void updatePetWithForm (@Param("petId") String petId, @Param("name") String name, @Param("status") String status) throws ApiException; + + /** + * Deletes a pet + * + * @param petId Pet id to delete + * @param apiKey + * @return void + */ + @RequestLine("DELETE /pet/{petId}") + @Headers({ + "apiKey: {apiKey}" + }) + void deletePet (@Param("petId") Long petId, @Param("apiKey") String apiKey) throws ApiException; + + /** + * uploads an image + * + * @param petId ID of pet to update + * @param additionalMetadata Additional data to pass to server + * @param file file to upload + * @return void + */ + @RequestLine("POST /pet/{petId}/uploadImage") + @Headers({ + + }) + void uploadFile (@Param("petId") Long petId, @Param("additionalMetadata") String additionalMetadata, @Param("file") File file) throws ApiException; + +} diff --git a/samples/client/petstore/java/feign/src/main/java/io/swagger/client/api/StoreApi.java b/samples/client/petstore/java/feign/src/main/java/io/swagger/client/api/StoreApi.java new file mode 100644 index 00000000000..c35f8578eeb --- /dev/null +++ b/samples/client/petstore/java/feign/src/main/java/io/swagger/client/api/StoreApi.java @@ -0,0 +1,66 @@ +package io.swagger.client.api; + +import io.swagger.client.ApiException; +import io.swagger.client.ApiClient; +import io.swagger.client.Configuration; +import io.swagger.client.Pair; +import io.swagger.client.TypeRef; + +import java.util.Map; +import io.swagger.client.model.Order; + +import java.util.*; +import feign.*; + +@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-12-01T16:10:23.565+08:00") +public interface StoreApi extends io.swagger.client.ApiClient.Api { + + + /** + * Returns pet inventories by status + * Returns a map of status codes to quantities + * @return Map + */ + @RequestLine("GET /store/inventory") + @Headers({ + + }) + Map getInventory () throws ApiException; + + /** + * Place an order for a pet + * + * @param body order placed for purchasing the pet + * @return Order + */ + @RequestLine("POST /store/order") + @Headers({ + + }) + Order placeOrder (@Param("body") Order body) throws ApiException; + + /** + * Find purchase order by ID + * For valid response try integer IDs with value <= 5 or > 10. Other values will generated exceptions + * @param orderId ID of pet that needs to be fetched + * @return Order + */ + @RequestLine("GET /store/order/{orderId}") + @Headers({ + + }) + Order getOrderById (@Param("orderId") String orderId) throws ApiException; + + /** + * Delete purchase order by ID + * For valid response try integer IDs with value < 1000. Anything above 1000 or nonintegers will generate API errors + * @param orderId ID of the order that needs to be deleted + * @return void + */ + @RequestLine("DELETE /store/order/{orderId}") + @Headers({ + + }) + void deleteOrder (@Param("orderId") String orderId) throws ApiException; + +} diff --git a/samples/client/petstore/java/feign/src/main/java/io/swagger/client/api/UserApi.java b/samples/client/petstore/java/feign/src/main/java/io/swagger/client/api/UserApi.java new file mode 100644 index 00000000000..ed567bc16f2 --- /dev/null +++ b/samples/client/petstore/java/feign/src/main/java/io/swagger/client/api/UserApi.java @@ -0,0 +1,116 @@ +package io.swagger.client.api; + +import io.swagger.client.ApiException; +import io.swagger.client.ApiClient; +import io.swagger.client.Configuration; +import io.swagger.client.Pair; +import io.swagger.client.TypeRef; + +import io.swagger.client.model.User; +import java.util.*; + +import java.util.*; +import feign.*; + +@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-12-01T16:10:23.565+08:00") +public interface UserApi extends io.swagger.client.ApiClient.Api { + + + /** + * Create user + * This can only be done by the logged in user. + * @param body Created user object + * @return void + */ + @RequestLine("POST /user") + @Headers({ + + }) + void createUser (@Param("body") User body) throws ApiException; + + /** + * Creates list of users with given input array + * + * @param body List of user object + * @return void + */ + @RequestLine("POST /user/createWithArray") + @Headers({ + + }) + void createUsersWithArrayInput (@Param("body") List body) throws ApiException; + + /** + * Creates list of users with given input array + * + * @param body List of user object + * @return void + */ + @RequestLine("POST /user/createWithList") + @Headers({ + + }) + void createUsersWithListInput (@Param("body") List body) throws ApiException; + + /** + * Logs user into the system + * + * @param username The user name for login + * @param password The password for login in clear text + * @return String + */ + @RequestLine("GET /user/login?username={username}&password={password}") + @Headers({ + + }) + String loginUser (@Param("username") String username, @Param("password") String password) throws ApiException; + + /** + * Logs out current logged in user session + * + * @return void + */ + @RequestLine("GET /user/logout") + @Headers({ + + }) + void logoutUser () throws ApiException; + + /** + * Get user by user name + * + * @param username The name that needs to be fetched. Use user1 for testing. + * @return User + */ + @RequestLine("GET /user/{username}") + @Headers({ + + }) + User getUserByName (@Param("username") String username) throws ApiException; + + /** + * Updated user + * This can only be done by the logged in user. + * @param username name that need to be deleted + * @param body Updated user object + * @return void + */ + @RequestLine("PUT /user/{username}") + @Headers({ + + }) + void updateUser (@Param("username") String username, @Param("body") User body) throws ApiException; + + /** + * Delete user + * This can only be done by the logged in user. + * @param username The name that needs to be deleted + * @return void + */ + @RequestLine("DELETE /user/{username}") + @Headers({ + + }) + void deleteUser (@Param("username") String username) throws ApiException; + +} diff --git a/samples/client/petstore/java/feign/src/main/java/io/swagger/client/model/Category.java b/samples/client/petstore/java/feign/src/main/java/io/swagger/client/model/Category.java new file mode 100644 index 00000000000..e7608831300 --- /dev/null +++ b/samples/client/petstore/java/feign/src/main/java/io/swagger/client/model/Category.java @@ -0,0 +1,73 @@ +package io.swagger.client.model; + +import io.swagger.client.StringUtil; + + +import java.util.Objects; + +import io.swagger.annotations.*; +import com.fasterxml.jackson.annotation.JsonProperty; + + +@ApiModel(description = "") +@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-12-01T16:10:23.565+08:00") +public class Category { + + private Long id = null; + private String name = null; + + + /** + **/ + @ApiModelProperty(value = "") + @JsonProperty("id") + public Long getId() { + return id; + } + public void setId(Long id) { + this.id = id; + } + + + /** + **/ + @ApiModelProperty(value = "") + @JsonProperty("name") + public String getName() { + return name; + } + public void setName(String name) { + this.name = name; + } + + + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + Category category = (Category) o; + return Objects.equals(id, category.id) && + Objects.equals(name, category.name); + } + + @Override + public int hashCode() { + return Objects.hash(id, name); + } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append("class Category {\n"); + + sb.append(" id: ").append(StringUtil.toIndentedString(id)).append("\n"); + sb.append(" name: ").append(StringUtil.toIndentedString(name)).append("\n"); + sb.append("}"); + return sb.toString(); + } +} diff --git a/samples/client/petstore/java/feign/src/main/java/io/swagger/client/model/Order.java b/samples/client/petstore/java/feign/src/main/java/io/swagger/client/model/Order.java new file mode 100644 index 00000000000..4b6337b44cc --- /dev/null +++ b/samples/client/petstore/java/feign/src/main/java/io/swagger/client/model/Order.java @@ -0,0 +1,153 @@ +package io.swagger.client.model; + +import io.swagger.client.StringUtil; +import java.util.Date; + + +import java.util.Objects; + +import io.swagger.annotations.*; +import com.fasterxml.jackson.annotation.JsonProperty; + + +@ApiModel(description = "") +@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-12-01T16:10:23.565+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("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; + + + /** + **/ + @ApiModelProperty(value = "") + @JsonProperty("id") + public Long getId() { + return id; + } + public void setId(Long id) { + this.id = id; + } + + + /** + **/ + @ApiModelProperty(value = "") + @JsonProperty("petId") + public Long getPetId() { + return petId; + } + public void setPetId(Long petId) { + this.petId = petId; + } + + + /** + **/ + @ApiModelProperty(value = "") + @JsonProperty("quantity") + public Integer getQuantity() { + return quantity; + } + public void setQuantity(Integer quantity) { + this.quantity = quantity; + } + + + /** + **/ + @ApiModelProperty(value = "") + @JsonProperty("shipDate") + public Date getShipDate() { + return shipDate; + } + public void setShipDate(Date shipDate) { + this.shipDate = shipDate; + } + + + /** + * Order Status + **/ + @ApiModelProperty(value = "Order Status") + @JsonProperty("status") + public StatusEnum getStatus() { + return status; + } + public void setStatus(StatusEnum status) { + this.status = status; + } + + + /** + **/ + @ApiModelProperty(value = "") + @JsonProperty("complete") + public Boolean getComplete() { + return complete; + } + public void setComplete(Boolean complete) { + this.complete = complete; + } + + + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + Order order = (Order) o; + return Objects.equals(id, order.id) && + Objects.equals(petId, order.petId) && + Objects.equals(quantity, order.quantity) && + Objects.equals(shipDate, order.shipDate) && + Objects.equals(status, order.status) && + Objects.equals(complete, order.complete); + } + + @Override + public int hashCode() { + return Objects.hash(id, petId, quantity, shipDate, status, complete); + } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append("class Order {\n"); + + sb.append(" id: ").append(StringUtil.toIndentedString(id)).append("\n"); + sb.append(" petId: ").append(StringUtil.toIndentedString(petId)).append("\n"); + sb.append(" quantity: ").append(StringUtil.toIndentedString(quantity)).append("\n"); + sb.append(" shipDate: ").append(StringUtil.toIndentedString(shipDate)).append("\n"); + sb.append(" status: ").append(StringUtil.toIndentedString(status)).append("\n"); + sb.append(" complete: ").append(StringUtil.toIndentedString(complete)).append("\n"); + sb.append("}"); + return sb.toString(); + } +} diff --git a/samples/client/petstore/java/feign/src/main/java/io/swagger/client/model/Pet.java b/samples/client/petstore/java/feign/src/main/java/io/swagger/client/model/Pet.java new file mode 100644 index 00000000000..a3d8218282f --- /dev/null +++ b/samples/client/petstore/java/feign/src/main/java/io/swagger/client/model/Pet.java @@ -0,0 +1,155 @@ +package io.swagger.client.model; + +import io.swagger.client.StringUtil; +import io.swagger.client.model.Category; +import java.util.*; +import io.swagger.client.model.Tag; + + +import java.util.Objects; + +import io.swagger.annotations.*; +import com.fasterxml.jackson.annotation.JsonProperty; + + +@ApiModel(description = "") +@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-12-01T16:10:23.565+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("available"), + PENDING("pending"), + SOLD("sold"); + + private String value; + + StatusEnum(String value) { + this.value = value; + } + + @Override + public String toString() { + return value; + } +} + + private StatusEnum status = null; + + + /** + **/ + @ApiModelProperty(value = "") + @JsonProperty("id") + public Long getId() { + return id; + } + public void setId(Long id) { + this.id = id; + } + + + /** + **/ + @ApiModelProperty(value = "") + @JsonProperty("category") + public Category getCategory() { + return category; + } + public void setCategory(Category category) { + this.category = category; + } + + + /** + **/ + @ApiModelProperty(required = true, value = "") + @JsonProperty("name") + public String getName() { + return name; + } + public void setName(String name) { + this.name = name; + } + + + /** + **/ + @ApiModelProperty(required = true, value = "") + @JsonProperty("photoUrls") + public List getPhotoUrls() { + return photoUrls; + } + public void setPhotoUrls(List photoUrls) { + this.photoUrls = photoUrls; + } + + + /** + **/ + @ApiModelProperty(value = "") + @JsonProperty("tags") + public List getTags() { + return tags; + } + public void setTags(List tags) { + this.tags = tags; + } + + + /** + * pet status in the store + **/ + @ApiModelProperty(value = "pet status in the store") + @JsonProperty("status") + public StatusEnum getStatus() { + return status; + } + public void setStatus(StatusEnum status) { + this.status = status; + } + + + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + Pet pet = (Pet) o; + return Objects.equals(id, pet.id) && + Objects.equals(category, pet.category) && + Objects.equals(name, pet.name) && + Objects.equals(photoUrls, pet.photoUrls) && + Objects.equals(tags, pet.tags) && + Objects.equals(status, pet.status); + } + + @Override + public int hashCode() { + return Objects.hash(id, category, name, photoUrls, tags, status); + } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append("class Pet {\n"); + + sb.append(" id: ").append(StringUtil.toIndentedString(id)).append("\n"); + sb.append(" category: ").append(StringUtil.toIndentedString(category)).append("\n"); + sb.append(" name: ").append(StringUtil.toIndentedString(name)).append("\n"); + sb.append(" photoUrls: ").append(StringUtil.toIndentedString(photoUrls)).append("\n"); + sb.append(" tags: ").append(StringUtil.toIndentedString(tags)).append("\n"); + sb.append(" status: ").append(StringUtil.toIndentedString(status)).append("\n"); + sb.append("}"); + return sb.toString(); + } +} diff --git a/samples/client/petstore/java/feign/src/main/java/io/swagger/client/model/Tag.java b/samples/client/petstore/java/feign/src/main/java/io/swagger/client/model/Tag.java new file mode 100644 index 00000000000..92049ae02dc --- /dev/null +++ b/samples/client/petstore/java/feign/src/main/java/io/swagger/client/model/Tag.java @@ -0,0 +1,73 @@ +package io.swagger.client.model; + +import io.swagger.client.StringUtil; + + +import java.util.Objects; + +import io.swagger.annotations.*; +import com.fasterxml.jackson.annotation.JsonProperty; + + +@ApiModel(description = "") +@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-12-01T16:10:23.565+08:00") +public class Tag { + + private Long id = null; + private String name = null; + + + /** + **/ + @ApiModelProperty(value = "") + @JsonProperty("id") + public Long getId() { + return id; + } + public void setId(Long id) { + this.id = id; + } + + + /** + **/ + @ApiModelProperty(value = "") + @JsonProperty("name") + public String getName() { + return name; + } + public void setName(String name) { + this.name = name; + } + + + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + Tag tag = (Tag) o; + return Objects.equals(id, tag.id) && + Objects.equals(name, tag.name); + } + + @Override + public int hashCode() { + return Objects.hash(id, name); + } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append("class Tag {\n"); + + sb.append(" id: ").append(StringUtil.toIndentedString(id)).append("\n"); + sb.append(" name: ").append(StringUtil.toIndentedString(name)).append("\n"); + sb.append("}"); + return sb.toString(); + } +} diff --git a/samples/client/petstore/java/feign/src/main/java/io/swagger/client/model/User.java b/samples/client/petstore/java/feign/src/main/java/io/swagger/client/model/User.java new file mode 100644 index 00000000000..72cb300602c --- /dev/null +++ b/samples/client/petstore/java/feign/src/main/java/io/swagger/client/model/User.java @@ -0,0 +1,164 @@ +package io.swagger.client.model; + +import io.swagger.client.StringUtil; + + +import java.util.Objects; + +import io.swagger.annotations.*; +import com.fasterxml.jackson.annotation.JsonProperty; + + +@ApiModel(description = "") +@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-12-01T16:10:23.565+08:00") +public class User { + + private Long id = null; + private String username = null; + private String firstName = null; + private String lastName = null; + private String email = null; + private String password = null; + private String phone = null; + private Integer userStatus = null; + + + /** + **/ + @ApiModelProperty(value = "") + @JsonProperty("id") + public Long getId() { + return id; + } + public void setId(Long id) { + this.id = id; + } + + + /** + **/ + @ApiModelProperty(value = "") + @JsonProperty("username") + public String getUsername() { + return username; + } + public void setUsername(String username) { + this.username = username; + } + + + /** + **/ + @ApiModelProperty(value = "") + @JsonProperty("firstName") + public String getFirstName() { + return firstName; + } + public void setFirstName(String firstName) { + this.firstName = firstName; + } + + + /** + **/ + @ApiModelProperty(value = "") + @JsonProperty("lastName") + public String getLastName() { + return lastName; + } + public void setLastName(String lastName) { + this.lastName = lastName; + } + + + /** + **/ + @ApiModelProperty(value = "") + @JsonProperty("email") + public String getEmail() { + return email; + } + public void setEmail(String email) { + this.email = email; + } + + + /** + **/ + @ApiModelProperty(value = "") + @JsonProperty("password") + public String getPassword() { + return password; + } + public void setPassword(String password) { + this.password = password; + } + + + /** + **/ + @ApiModelProperty(value = "") + @JsonProperty("phone") + public String getPhone() { + return phone; + } + public void setPhone(String phone) { + this.phone = phone; + } + + + /** + * User Status + **/ + @ApiModelProperty(value = "User Status") + @JsonProperty("userStatus") + public Integer getUserStatus() { + return userStatus; + } + public void setUserStatus(Integer userStatus) { + this.userStatus = userStatus; + } + + + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + User user = (User) o; + return Objects.equals(id, user.id) && + Objects.equals(username, user.username) && + Objects.equals(firstName, user.firstName) && + Objects.equals(lastName, user.lastName) && + Objects.equals(email, user.email) && + Objects.equals(password, user.password) && + Objects.equals(phone, user.phone) && + Objects.equals(userStatus, user.userStatus); + } + + @Override + public int hashCode() { + return Objects.hash(id, username, firstName, lastName, email, password, phone, userStatus); + } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append("class User {\n"); + + sb.append(" id: ").append(StringUtil.toIndentedString(id)).append("\n"); + sb.append(" username: ").append(StringUtil.toIndentedString(username)).append("\n"); + sb.append(" firstName: ").append(StringUtil.toIndentedString(firstName)).append("\n"); + sb.append(" lastName: ").append(StringUtil.toIndentedString(lastName)).append("\n"); + sb.append(" email: ").append(StringUtil.toIndentedString(email)).append("\n"); + sb.append(" password: ").append(StringUtil.toIndentedString(password)).append("\n"); + sb.append(" phone: ").append(StringUtil.toIndentedString(phone)).append("\n"); + sb.append(" userStatus: ").append(StringUtil.toIndentedString(userStatus)).append("\n"); + sb.append("}"); + return sb.toString(); + } +} From 0abe787b58afc85f507d06646c6ccbec32ae84e1 Mon Sep 17 00:00:00 2001 From: wing328 Date: Tue, 1 Dec 2015 16:17:22 +0800 Subject: [PATCH 090/211] add default api client --- .../main/resources/csharp/ApiClient.mustache | 6 +++++ .../resources/csharp/Configuration.mustache | 19 ++++++++++++--- .../src/main/resources/csharp/api.mustache | 4 +-- .../src/main/csharp/IO/Swagger/Api/PetApi.cs | 15 ++++++------ .../main/csharp/IO/Swagger/Api/StoreApi.cs | 4 +-- .../src/main/csharp/IO/Swagger/Api/UserApi.cs | 4 +-- .../csharp/IO/Swagger/Client/ApiClient.cs | 6 +++++ .../csharp/IO/Swagger/Client/Configuration.cs | 19 ++++++++++++--- .../SwaggerClientTest.userprefs | 23 ++++++++++++++++-- .../SwaggerClientTest/TestConfiguration.cs | 4 +-- .../bin/Debug/SwaggerClientTest.dll | Bin 80384 -> 80384 bytes .../bin/Debug/SwaggerClientTest.dll.mdb | Bin 25931 -> 25989 bytes .../obj/Debug/SwaggerClientTest.dll | Bin 80384 -> 80384 bytes .../obj/Debug/SwaggerClientTest.dll.mdb | Bin 25931 -> 25989 bytes 14 files changed, 79 insertions(+), 25 deletions(-) diff --git a/modules/swagger-codegen/src/main/resources/csharp/ApiClient.mustache b/modules/swagger-codegen/src/main/resources/csharp/ApiClient.mustache index 680375a7499..acc99626c58 100644 --- a/modules/swagger-codegen/src/main/resources/csharp/ApiClient.mustache +++ b/modules/swagger-codegen/src/main/resources/csharp/ApiClient.mustache @@ -29,6 +29,12 @@ namespace {{packageName}}.Client BasePath = basePath; RestClient = new RestClient(BasePath); } + + /// + /// Gets or sets the default API client for making HTTP calls. + /// + /// The default API client. + public static ApiClient Default = new ApiClient(); /// /// Gets or sets the base path. diff --git a/modules/swagger-codegen/src/main/resources/csharp/Configuration.mustache b/modules/swagger-codegen/src/main/resources/csharp/Configuration.mustache index be02678bcbf..a28b395b0db 100644 --- a/modules/swagger-codegen/src/main/resources/csharp/Configuration.mustache +++ b/modules/swagger-codegen/src/main/resources/csharp/Configuration.mustache @@ -12,6 +12,17 @@ namespace {{packageName}}.Client /// public class Configuration { + /// + /// Initializes a new instance of the Configuration class. + /// + /// Api client. + public Configuration(ApiClient apiClient=null) + { + if (apiClient == null) + ApiClient = ApiClient.Default; + else + ApiClient = apiClient; + } /// /// Version of the package. @@ -20,16 +31,16 @@ namespace {{packageName}}.Client public const string Version = "{{packageVersion}}"; /// - /// Gets or sets the default API client for making HTTP calls. + /// Gets or sets the default Configuration. /// - /// The API client. - public static Configuration DefaultConfiguration = new Configuration(); + /// Configuration. + public static Configuration Default = new Configuration(); /// /// Gets or sets the default API client for making HTTP calls. /// /// The API client. - public ApiClient ApiClient = new ApiClient(); + public ApiClient ApiClient; /// /// Gets or sets the username (HTTP basic authentication). diff --git a/modules/swagger-codegen/src/main/resources/csharp/api.mustache b/modules/swagger-codegen/src/main/resources/csharp/api.mustache index bb72037bad9..3689729ce41 100644 --- a/modules/swagger-codegen/src/main/resources/csharp/api.mustache +++ b/modules/swagger-codegen/src/main/resources/csharp/api.mustache @@ -49,7 +49,7 @@ namespace {{packageName}}.Api /// public {{classname}}(String basePath) { - this.Configuration = Configuration.DefaultConfiguration; + this.Configuration = Configuration.Default; this.SetBasePath(basePath); } @@ -62,7 +62,7 @@ namespace {{packageName}}.Api public {{classname}}(Configuration configuration = null) { if (configuration == null) // use the default one in Configuration - this.Configuration = Configuration.DefaultConfiguration; + this.Configuration = Configuration.Default; else this.Configuration = configuration; } diff --git a/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Api/PetApi.cs b/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Api/PetApi.cs index 2b4f77bf4de..989ee05d0d9 100644 --- a/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Api/PetApi.cs +++ b/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Api/PetApi.cs @@ -198,20 +198,20 @@ namespace IO.Swagger.Api /// public PetApi(String basePath) { - this.Configuration = Configuration.DefaultConfiguration; + this.Configuration = Configuration.Default; this.SetBasePath(basePath); } /// /// Initializes a new instance of the class - /// using Configuration object. + /// using Configuration object /// /// An instance of Configuration /// public PetApi(Configuration configuration = null) { if (configuration == null) // use the default one in Configuration - this.Configuration = Configuration.DefaultConfiguration; + this.Configuration = Configuration.Default; else this.Configuration = configuration; } @@ -236,20 +236,21 @@ namespace IO.Swagger.Api } /// - /// Gets or sets the configuration object. + /// Gets or sets the configuration object /// /// An instance of the Configuration public Configuration Configuration {get; set;} /// - /// Gets the status code of the previous request. + /// Gets the status code of the previous request /// public int StatusCode { get; private set; } /// - /// Gets the response headers of the previous request. + /// Gets the response headers of the previous request /// - public Dictionary ResponseHeaders { get; private set; } + public Dictionary ResponseHeaders { get; private set; } + /// /// Update an existing pet diff --git a/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Api/StoreApi.cs b/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Api/StoreApi.cs index dafb93d9458..2eae0cebc46 100644 --- a/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Api/StoreApi.cs +++ b/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Api/StoreApi.cs @@ -106,7 +106,7 @@ namespace IO.Swagger.Api /// public StoreApi(String basePath) { - this.Configuration = Configuration.DefaultConfiguration; + this.Configuration = Configuration.Default; this.SetBasePath(basePath); } @@ -119,7 +119,7 @@ namespace IO.Swagger.Api public StoreApi(Configuration configuration = null) { if (configuration == null) // use the default one in Configuration - this.Configuration = Configuration.DefaultConfiguration; + this.Configuration = Configuration.Default; else this.Configuration = configuration; } diff --git a/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Api/UserApi.cs b/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Api/UserApi.cs index c2c23cddfc2..e3e67eaa9fb 100644 --- a/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Api/UserApi.cs +++ b/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Api/UserApi.cs @@ -190,7 +190,7 @@ namespace IO.Swagger.Api /// public UserApi(String basePath) { - this.Configuration = Configuration.DefaultConfiguration; + this.Configuration = Configuration.Default; this.SetBasePath(basePath); } @@ -203,7 +203,7 @@ namespace IO.Swagger.Api public UserApi(Configuration configuration = null) { if (configuration == null) // use the default one in Configuration - this.Configuration = Configuration.DefaultConfiguration; + this.Configuration = Configuration.Default; else this.Configuration = configuration; } diff --git a/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Client/ApiClient.cs b/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Client/ApiClient.cs index 4aadca23673..1d511e7624b 100644 --- a/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Client/ApiClient.cs +++ b/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Client/ApiClient.cs @@ -29,6 +29,12 @@ namespace IO.Swagger.Client BasePath = basePath; RestClient = new RestClient(BasePath); } + + /// + /// Gets or sets the default API client for making HTTP calls. + /// + /// The default API client. + public static ApiClient Default = new ApiClient(); /// /// Gets or sets the base path. diff --git a/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Client/Configuration.cs b/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Client/Configuration.cs index a1b79cec0c5..a25a2d28fbf 100644 --- a/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Client/Configuration.cs +++ b/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Client/Configuration.cs @@ -12,6 +12,17 @@ namespace IO.Swagger.Client /// public class Configuration { + /// + /// Initializes a new instance of the Configuration class. + /// + /// Api client. + public Configuration(ApiClient apiClient=null) + { + if (apiClient == null) + ApiClient = ApiClient.Default; + else + ApiClient = apiClient; + } /// /// Version of the package. @@ -20,16 +31,16 @@ namespace IO.Swagger.Client public const string Version = "1.0.0"; /// - /// Gets or sets the default API client for making HTTP calls. + /// Gets or sets the default Configuration. /// - /// The API client. - public static Configuration DefaultConfiguration = new Configuration(); + /// Configuration. + public static Configuration Default = new Configuration(); /// /// Gets or sets the default API client for making HTTP calls. /// /// The API client. - public ApiClient ApiClient = new ApiClient(); + public ApiClient ApiClient; /// /// Gets or sets the username (HTTP basic authentication). diff --git a/samples/client/petstore/csharp/SwaggerClientTest/SwaggerClientTest.userprefs b/samples/client/petstore/csharp/SwaggerClientTest/SwaggerClientTest.userprefs index cd6170dd2e8..2774e9b7536 100644 --- a/samples/client/petstore/csharp/SwaggerClientTest/SwaggerClientTest.userprefs +++ b/samples/client/petstore/csharp/SwaggerClientTest/SwaggerClientTest.userprefs @@ -1,9 +1,28 @@  - + - + + + + + + + + + + + + + + + + + + + + diff --git a/samples/client/petstore/csharp/SwaggerClientTest/TestConfiguration.cs b/samples/client/petstore/csharp/SwaggerClientTest/TestConfiguration.cs index 9a41dbbbf38..177fd5bf53f 100644 --- a/samples/client/petstore/csharp/SwaggerClientTest/TestConfiguration.cs +++ b/samples/client/petstore/csharp/SwaggerClientTest/TestConfiguration.cs @@ -27,7 +27,7 @@ namespace SwaggerClient.TestConfiguration { PetApi p = new PetApi ("http://new-basepath.com"); Assert.AreEqual (p.Configuration.ApiClient.BasePath, "http://new-basepath.com"); - Assert.AreSame (p.Configuration, Configuration.DefaultConfiguration); + Assert.AreSame (p.Configuration, Configuration.Default); } @@ -38,7 +38,7 @@ namespace SwaggerClient.TestConfiguration PetApi p2 = new PetApi (); Assert.AreSame (p1.Configuration, p2.Configuration); // same as the default - Assert.AreSame (p1.Configuration, Configuration.DefaultConfiguration); + Assert.AreSame (p1.Configuration, Configuration.Default); Configuration c = new Configuration (); Assert.AreNotSame (c, p1.Configuration); diff --git a/samples/client/petstore/csharp/SwaggerClientTest/bin/Debug/SwaggerClientTest.dll b/samples/client/petstore/csharp/SwaggerClientTest/bin/Debug/SwaggerClientTest.dll index e26e6d019c28970ce8d0386d6104a2d1d975d246..70db74529f5b75d232cb69f96f6ea3b99b3157fd 100755 GIT binary patch literal 80384 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 ZYXtsH{aM8O9#Qu?R(}8g=QmFR{{zwY=2idz literal 80384 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 delta 7844 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 diff --git a/samples/client/petstore/csharp/SwaggerClientTest/obj/Debug/SwaggerClientTest.dll b/samples/client/petstore/csharp/SwaggerClientTest/obj/Debug/SwaggerClientTest.dll index e26e6d019c28970ce8d0386d6104a2d1d975d246..70db74529f5b75d232cb69f96f6ea3b99b3157fd 100755 GIT binary patch literal 80384 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 ZYXtsH{aM8O9#Qu?R(}8g=QmFR{{zwY=2idz literal 80384 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 delta 7844 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 From 70dd3a6e4b7c41c2453b2152cdd83b1a074974f0 Mon Sep 17 00:00:00 2001 From: wing328 Date: Tue, 1 Dec 2015 16:28:23 +0800 Subject: [PATCH 091/211] update to handle model without any properties --- .../swagger-codegen/src/main/resources/csharp/model.mustache | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/swagger-codegen/src/main/resources/csharp/model.mustache b/modules/swagger-codegen/src/main/resources/csharp/model.mustache index 7ab48dc56e2..7b7f1a6aea0 100644 --- a/modules/swagger-codegen/src/main/resources/csharp/model.mustache +++ b/modules/swagger-codegen/src/main/resources/csharp/model.mustache @@ -83,7 +83,7 @@ namespace {{packageName}}.Model this.{{name}} == other.{{name}} || this.{{name}} != null && this.{{name}}.SequenceEqual(other.{{name}}) - ){{#hasMore}} && {{/hasMore}}{{/isNotContainer}}{{/vars}}; + ){{#hasMore}} && {{/hasMore}}{{/isNotContainer}}{{/vars}}{{^vars}}false{{/vars}}; } /// From c64f352ba68072b82f323d27cc476ea39c0b95ee Mon Sep 17 00:00:00 2001 From: wing328 Date: Tue, 1 Dec 2015 17:44:07 +0800 Subject: [PATCH 092/211] escape objc special word with var --- .../codegen/languages/ObjcClientCodegen.java | 13 +++++++++++++ .../src/test/resources/2_0/petstore.json | 8 ++++++++ .../client/petstore/objc/SwaggerClient/SWGOrder.h | 4 ++++ .../client/petstore/objc/SwaggerClient/SWGOrder.m | 4 ++-- .../client/petstore/objc/SwaggerClient/SWGPetApi.m | 2 +- 5 files changed, 28 insertions(+), 3 deletions(-) diff --git a/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/ObjcClientCodegen.java b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/ObjcClientCodegen.java index 4555aa5f216..7037ee06f9b 100644 --- a/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/ObjcClientCodegen.java +++ b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/ObjcClientCodegen.java @@ -34,6 +34,7 @@ public class ObjcClientCodegen extends DefaultCodegen implements CodegenConfig { protected String authorEmail = "apiteam@swagger.io"; protected String license = "MIT"; protected String gitRepoURL = "https://github.com/swagger-api/swagger-codegen"; + protected String[] specialWords = {"new", "copy"}; public ObjcClientCodegen() { super(); @@ -86,6 +87,7 @@ public class ObjcClientCodegen extends DefaultCodegen implements CodegenConfig { typeMapping.put("object", "NSObject"); typeMapping.put("file", "NSURL"); + // ref: http://www.tutorialspoint.com/objective_c/objective_c_basic_syntax.htm reservedWords = new HashSet( Arrays.asList( @@ -375,6 +377,12 @@ public class ObjcClientCodegen extends DefaultCodegen implements CodegenConfig { return name; } + // if name starting with special word, escape with '_' + for(int i =0; i < specialWords.length; i++) { + if (name.matches("(?i:^" + specialWords[i] + ".*)")) + name = escapeSpecialWord(name); + } + // camelize (lower first character) the variable name // e.g. `pet_id` to `petId` name = camelize(name, true); @@ -384,6 +392,7 @@ public class ObjcClientCodegen extends DefaultCodegen implements CodegenConfig { name = escapeReservedWord(name); } + return name; } @@ -397,6 +406,10 @@ public class ObjcClientCodegen extends DefaultCodegen implements CodegenConfig { return "_" + name; } + public String escapeSpecialWord(String name) { + return "var_" + name; + } + @Override public String toOperationId(String operationId) { // throw exception if method name is empty diff --git a/modules/swagger-codegen/src/test/resources/2_0/petstore.json b/modules/swagger-codegen/src/test/resources/2_0/petstore.json index 66762d74b2b..7c0a3bf67ab 100644 --- a/modules/swagger-codegen/src/test/resources/2_0/petstore.json +++ b/modules/swagger-codegen/src/test/resources/2_0/petstore.json @@ -944,6 +944,14 @@ "type": "integer", "format": "int64" }, + "CopyPassword": { + "type": "integer", + "format": "int64" + }, + "newPassword": { + "type": "integer", + "format": "int64" + }, "petId": { "type": "integer", "format": "int64" diff --git a/samples/client/petstore/objc/SwaggerClient/SWGOrder.h b/samples/client/petstore/objc/SwaggerClient/SWGOrder.h index 48a7cf0d6c1..25f881d95c3 100644 --- a/samples/client/petstore/objc/SwaggerClient/SWGOrder.h +++ b/samples/client/petstore/objc/SwaggerClient/SWGOrder.h @@ -17,6 +17,10 @@ @property(nonatomic) NSNumber* _id; +@property(nonatomic) NSNumber* varCopyPassword; + +@property(nonatomic) NSNumber* varNewPassword; + @property(nonatomic) NSNumber* petId; @property(nonatomic) NSNumber* quantity; diff --git a/samples/client/petstore/objc/SwaggerClient/SWGOrder.m b/samples/client/petstore/objc/SwaggerClient/SWGOrder.m index 83fe5741cd7..a120708e22c 100644 --- a/samples/client/petstore/objc/SwaggerClient/SWGOrder.m +++ b/samples/client/petstore/objc/SwaggerClient/SWGOrder.m @@ -8,7 +8,7 @@ */ + (JSONKeyMapper *)keyMapper { - return [[JSONKeyMapper alloc] initWithDictionary:@{ @"id": @"_id", @"petId": @"petId", @"quantity": @"quantity", @"shipDate": @"shipDate", @"status": @"status", @"complete": @"complete" }]; + return [[JSONKeyMapper alloc] initWithDictionary:@{ @"id": @"_id", @"CopyPassword": @"varCopyPassword", @"newPassword": @"varNewPassword", @"petId": @"petId", @"quantity": @"quantity", @"shipDate": @"shipDate", @"status": @"status", @"complete": @"complete" }]; } /** @@ -18,7 +18,7 @@ */ + (BOOL)propertyIsOptional:(NSString *)propertyName { - NSArray *optionalProperties = @[@"_id", @"petId", @"quantity", @"shipDate", @"status", @"complete"]; + NSArray *optionalProperties = @[@"_id", @"varCopyPassword", @"varNewPassword", @"petId", @"quantity", @"shipDate", @"status", @"complete"]; if ([optionalProperties containsObject:propertyName]) { return YES; diff --git a/samples/client/petstore/objc/SwaggerClient/SWGPetApi.m b/samples/client/petstore/objc/SwaggerClient/SWGPetApi.m index 156700c9a76..bff6c3765b1 100644 --- a/samples/client/petstore/objc/SwaggerClient/SWGPetApi.m +++ b/samples/client/petstore/objc/SwaggerClient/SWGPetApi.m @@ -450,7 +450,7 @@ static SWGPetApi* singletonAPI = nil; NSString *requestContentType = [SWGApiClient selectHeaderContentType:@[]]; // Authentication setting - NSArray *authSettings = @[@"api_key", @"petstore_auth"]; + NSArray *authSettings = @[@"api_key"]; id bodyParam = nil; NSMutableDictionary *formParams = [[NSMutableDictionary alloc] init]; From d5e394bfcc121c27f369b12ade22193cf11dd136 Mon Sep 17 00:00:00 2001 From: wing328 Date: Tue, 1 Dec 2015 17:47:37 +0800 Subject: [PATCH 093/211] restore petstore sample --- .../swagger-codegen/src/test/resources/2_0/petstore.json | 8 -------- samples/client/petstore/objc/SwaggerClient/SWGOrder.h | 4 ---- samples/client/petstore/objc/SwaggerClient/SWGOrder.m | 4 ++-- 3 files changed, 2 insertions(+), 14 deletions(-) diff --git a/modules/swagger-codegen/src/test/resources/2_0/petstore.json b/modules/swagger-codegen/src/test/resources/2_0/petstore.json index 7c0a3bf67ab..66762d74b2b 100644 --- a/modules/swagger-codegen/src/test/resources/2_0/petstore.json +++ b/modules/swagger-codegen/src/test/resources/2_0/petstore.json @@ -944,14 +944,6 @@ "type": "integer", "format": "int64" }, - "CopyPassword": { - "type": "integer", - "format": "int64" - }, - "newPassword": { - "type": "integer", - "format": "int64" - }, "petId": { "type": "integer", "format": "int64" diff --git a/samples/client/petstore/objc/SwaggerClient/SWGOrder.h b/samples/client/petstore/objc/SwaggerClient/SWGOrder.h index 25f881d95c3..48a7cf0d6c1 100644 --- a/samples/client/petstore/objc/SwaggerClient/SWGOrder.h +++ b/samples/client/petstore/objc/SwaggerClient/SWGOrder.h @@ -17,10 +17,6 @@ @property(nonatomic) NSNumber* _id; -@property(nonatomic) NSNumber* varCopyPassword; - -@property(nonatomic) NSNumber* varNewPassword; - @property(nonatomic) NSNumber* petId; @property(nonatomic) NSNumber* quantity; diff --git a/samples/client/petstore/objc/SwaggerClient/SWGOrder.m b/samples/client/petstore/objc/SwaggerClient/SWGOrder.m index a120708e22c..83fe5741cd7 100644 --- a/samples/client/petstore/objc/SwaggerClient/SWGOrder.m +++ b/samples/client/petstore/objc/SwaggerClient/SWGOrder.m @@ -8,7 +8,7 @@ */ + (JSONKeyMapper *)keyMapper { - return [[JSONKeyMapper alloc] initWithDictionary:@{ @"id": @"_id", @"CopyPassword": @"varCopyPassword", @"newPassword": @"varNewPassword", @"petId": @"petId", @"quantity": @"quantity", @"shipDate": @"shipDate", @"status": @"status", @"complete": @"complete" }]; + return [[JSONKeyMapper alloc] initWithDictionary:@{ @"id": @"_id", @"petId": @"petId", @"quantity": @"quantity", @"shipDate": @"shipDate", @"status": @"status", @"complete": @"complete" }]; } /** @@ -18,7 +18,7 @@ */ + (BOOL)propertyIsOptional:(NSString *)propertyName { - NSArray *optionalProperties = @[@"_id", @"varCopyPassword", @"varNewPassword", @"petId", @"quantity", @"shipDate", @"status", @"complete"]; + NSArray *optionalProperties = @[@"_id", @"petId", @"quantity", @"shipDate", @"status", @"complete"]; if ([optionalProperties containsObject:propertyName]) { return YES; From f9185c3f6fa6da0d8e97c7d4f8e12447b389bfa5 Mon Sep 17 00:00:00 2001 From: Nick Maynard Date: Wed, 18 Nov 2015 14:05:24 +0000 Subject: [PATCH 094/211] JAXRS server :: Inject SecurityContext into every operation --- .../src/main/resources/JavaJaxRS/api.mustache | 8 ++++---- .../src/main/resources/JavaJaxRS/apiService.mustache | 3 ++- .../src/main/resources/JavaJaxRS/apiServiceImpl.mustache | 3 ++- 3 files changed, 8 insertions(+), 6 deletions(-) diff --git a/modules/swagger-codegen/src/main/resources/JavaJaxRS/api.mustache b/modules/swagger-codegen/src/main/resources/JavaJaxRS/api.mustache index da3eba49461..c8fd2b80800 100644 --- a/modules/swagger-codegen/src/main/resources/JavaJaxRS/api.mustache +++ b/modules/swagger-codegen/src/main/resources/JavaJaxRS/api.mustache @@ -19,7 +19,9 @@ import java.io.InputStream; import com.sun.jersey.core.header.FormDataContentDisposition; import com.sun.jersey.multipart.FormDataParam; +import javax.ws.rs.core.Context; import javax.ws.rs.core.Response; +import javax.ws.rs.core.SecurityContext; import javax.ws.rs.*; @Path("/{{baseName}}") @@ -47,12 +49,10 @@ public class {{classname}} { @io.swagger.annotations.ApiResponse(code = {{{code}}}, message = "{{{message}}}", response = {{{returnType}}}.class{{#returnContainer}}, responseContainer = "{{{returnContainer}}}"{{/returnContainer}}){{#hasMore}}, {{/hasMore}}{{/responses}} }) - public Response {{operationId}}({{#allParams}}{{>queryParams}}{{>pathParams}}{{>headerParams}}{{>bodyParams}}{{>formParams}}{{#hasMore}}, - {{/hasMore}}{{/allParams}}) + public Response {{nickname}}({{#allParams}}{{>queryParams}}{{>pathParams}}{{>headerParams}}{{>bodyParams}}{{>formParams}},{{/allParams}}@Context SecurityContext securityContext) throws NotFoundException { - return delegate.{{operationId}}({{#allParams}}{{#isFile}}fileDetail{{/isFile}}{{^isFile}}{{paramName}}{{/isFile}}{{#hasMore}},{{/hasMore}}{{/allParams}}); + return delegate.{{nickname}}({{#allParams}}{{#isFile}}fileDetail{{/isFile}}{{^isFile}}{{paramName}}{{/isFile}},{{/allParams}}securityContext); } {{/operation}} } {{/operations}} - diff --git a/modules/swagger-codegen/src/main/resources/JavaJaxRS/apiService.mustache b/modules/swagger-codegen/src/main/resources/JavaJaxRS/apiService.mustache index a731da6c11c..2cc7b8c1fec 100644 --- a/modules/swagger-codegen/src/main/resources/JavaJaxRS/apiService.mustache +++ b/modules/swagger-codegen/src/main/resources/JavaJaxRS/apiService.mustache @@ -17,12 +17,13 @@ import com.sun.jersey.core.header.FormDataContentDisposition; import com.sun.jersey.multipart.FormDataParam; import javax.ws.rs.core.Response; +import javax.ws.rs.core.SecurityContext; {{>generatedAnnotation}} {{#operations}} public abstract class {{classname}}Service { {{#operation}} - public abstract Response {{nickname}}({{#allParams}}{{>serviceQueryParams}}{{>servicePathParams}}{{>serviceHeaderParams}}{{>serviceBodyParams}}{{>serviceFormParams}}{{#hasMore}},{{/hasMore}}{{/allParams}}) + public abstract Response {{nickname}}({{#allParams}}{{>serviceQueryParams}}{{>servicePathParams}}{{>serviceHeaderParams}}{{>serviceBodyParams}}{{>serviceFormParams}},{{/allParams}}SecurityContext securityContext) throws NotFoundException; {{/operation}} } diff --git a/modules/swagger-codegen/src/main/resources/JavaJaxRS/apiServiceImpl.mustache b/modules/swagger-codegen/src/main/resources/JavaJaxRS/apiServiceImpl.mustache index 0acd755745e..09741c1e03e 100644 --- a/modules/swagger-codegen/src/main/resources/JavaJaxRS/apiServiceImpl.mustache +++ b/modules/swagger-codegen/src/main/resources/JavaJaxRS/apiServiceImpl.mustache @@ -17,13 +17,14 @@ import com.sun.jersey.core.header.FormDataContentDisposition; import com.sun.jersey.multipart.FormDataParam; import javax.ws.rs.core.Response; +import javax.ws.rs.core.SecurityContext; {{>generatedAnnotation}} {{#operations}} public class {{classname}}ServiceImpl extends {{classname}}Service { {{#operation}} @Override - public Response {{nickname}}({{#allParams}}{{>serviceQueryParams}}{{>servicePathParams}}{{>serviceHeaderParams}}{{>serviceBodyParams}}{{>serviceFormParams}}{{#hasMore}},{{/hasMore}}{{/allParams}}) + public Response {{nickname}}({{#allParams}}{{>serviceQueryParams}}{{>servicePathParams}}{{>serviceHeaderParams}}{{>serviceBodyParams}}{{>serviceFormParams}},{{/allParams}}SecurityContext securityContext) throws NotFoundException { // do some magic! return Response.ok().entity(new ApiResponseMessage(ApiResponseMessage.OK, "magic!")).build(); From acda5d0bc5255157ac95b83b9df62383669bdf2c Mon Sep 17 00:00:00 2001 From: Nick Maynard Date: Mon, 23 Nov 2015 10:26:32 +0000 Subject: [PATCH 095/211] Update samples for JAXRS server SecurityContext Conflicts: samples/server/petstore/jaxrs/src/gen/java/io/swagger/model/Category.java samples/server/petstore/jaxrs/src/gen/java/io/swagger/model/Order.java samples/server/petstore/jaxrs/src/gen/java/io/swagger/model/Pet.java samples/server/petstore/jaxrs/src/gen/java/io/swagger/model/Tag.java samples/server/petstore/jaxrs/src/gen/java/io/swagger/model/User.java --- samples/server/petstore/jaxrs/README.md | 9 ++++ .../gen/java/io/swagger/api/ApiException.java | 2 +- .../java/io/swagger/api/ApiOriginFilter.java | 2 +- .../io/swagger/api/ApiResponseMessage.java | 2 +- .../io/swagger/api/NotFoundException.java | 2 +- .../src/gen/java/io/swagger/api/PetApi.java | 44 +++++++++---------- .../java/io/swagger/api/PetApiService.java | 19 ++++---- .../src/gen/java/io/swagger/api/StoreApi.java | 21 ++++----- .../java/io/swagger/api/StoreApiService.java | 11 ++--- .../src/gen/java/io/swagger/api/UserApi.java | 39 ++++++++-------- .../java/io/swagger/api/UserApiService.java | 19 ++++---- .../gen/java/io/swagger/model/Category.java | 2 +- .../src/gen/java/io/swagger/model/Order.java | 2 +- .../src/gen/java/io/swagger/model/Pet.java | 4 +- .../src/gen/java/io/swagger/model/Tag.java | 2 +- .../src/gen/java/io/swagger/model/User.java | 2 +- .../swagger/api/impl/PetApiServiceImpl.java | 19 ++++---- .../swagger/api/impl/StoreApiServiceImpl.java | 11 ++--- .../swagger/api/impl/UserApiServiceImpl.java | 19 ++++---- 19 files changed, 121 insertions(+), 110 deletions(-) diff --git a/samples/server/petstore/jaxrs/README.md b/samples/server/petstore/jaxrs/README.md index 00431f63dbc..ee5dba41872 100644 --- a/samples/server/petstore/jaxrs/README.md +++ b/samples/server/petstore/jaxrs/README.md @@ -12,3 +12,12 @@ To run the server, please execute the following: ``` mvn clean package jetty:run ``` + +You can then view the swagger listing here: + +``` +http://localhost:8080/v2/swagger.json +``` + +Note that if you have configured the `host` to be something other than localhost, the calls through +swagger-ui will be directed to that host and not localhost! \ No newline at end of file diff --git a/samples/server/petstore/jaxrs/src/gen/java/io/swagger/api/ApiException.java b/samples/server/petstore/jaxrs/src/gen/java/io/swagger/api/ApiException.java index 765ae959367..8774e105037 100644 --- a/samples/server/petstore/jaxrs/src/gen/java/io/swagger/api/ApiException.java +++ b/samples/server/petstore/jaxrs/src/gen/java/io/swagger/api/ApiException.java @@ -1,6 +1,6 @@ package io.swagger.api; -@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JaxRSServerCodegen", date = "2015-11-05T22:31:25.130-08:00") +@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JaxRSServerCodegen", date = "2015-12-01T23:19:25.707+08:00") public class ApiException extends Exception{ private int code; public ApiException (int code, String msg) { diff --git a/samples/server/petstore/jaxrs/src/gen/java/io/swagger/api/ApiOriginFilter.java b/samples/server/petstore/jaxrs/src/gen/java/io/swagger/api/ApiOriginFilter.java index 9559bd394aa..73d2a09bfe0 100644 --- a/samples/server/petstore/jaxrs/src/gen/java/io/swagger/api/ApiOriginFilter.java +++ b/samples/server/petstore/jaxrs/src/gen/java/io/swagger/api/ApiOriginFilter.java @@ -5,7 +5,7 @@ import java.io.IOException; import javax.servlet.*; import javax.servlet.http.HttpServletResponse; -@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JaxRSServerCodegen", date = "2015-11-05T22:31:25.130-08:00") +@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JaxRSServerCodegen", date = "2015-12-01T23:19:25.707+08:00") public class ApiOriginFilter implements javax.servlet.Filter { public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { diff --git a/samples/server/petstore/jaxrs/src/gen/java/io/swagger/api/ApiResponseMessage.java b/samples/server/petstore/jaxrs/src/gen/java/io/swagger/api/ApiResponseMessage.java index 2460847cf6a..f8158c15640 100644 --- a/samples/server/petstore/jaxrs/src/gen/java/io/swagger/api/ApiResponseMessage.java +++ b/samples/server/petstore/jaxrs/src/gen/java/io/swagger/api/ApiResponseMessage.java @@ -3,7 +3,7 @@ package io.swagger.api; import javax.xml.bind.annotation.XmlTransient; @javax.xml.bind.annotation.XmlRootElement -@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JaxRSServerCodegen", date = "2015-11-05T22:31:25.130-08:00") +@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JaxRSServerCodegen", date = "2015-12-01T23:19:25.707+08:00") public class ApiResponseMessage { public static final int ERROR = 1; public static final int WARNING = 2; diff --git a/samples/server/petstore/jaxrs/src/gen/java/io/swagger/api/NotFoundException.java b/samples/server/petstore/jaxrs/src/gen/java/io/swagger/api/NotFoundException.java index 58dc8bcd1ad..10bdc6f8b88 100644 --- a/samples/server/petstore/jaxrs/src/gen/java/io/swagger/api/NotFoundException.java +++ b/samples/server/petstore/jaxrs/src/gen/java/io/swagger/api/NotFoundException.java @@ -1,6 +1,6 @@ package io.swagger.api; -@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JaxRSServerCodegen", date = "2015-11-05T22:31:25.130-08:00") +@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JaxRSServerCodegen", date = "2015-12-01T23:19:25.707+08:00") public class NotFoundException extends ApiException { private int code; public NotFoundException (int code, String msg) { diff --git a/samples/server/petstore/jaxrs/src/gen/java/io/swagger/api/PetApi.java b/samples/server/petstore/jaxrs/src/gen/java/io/swagger/api/PetApi.java index e8db743f900..37f781ba983 100644 --- a/samples/server/petstore/jaxrs/src/gen/java/io/swagger/api/PetApi.java +++ b/samples/server/petstore/jaxrs/src/gen/java/io/swagger/api/PetApi.java @@ -19,14 +19,16 @@ import java.io.InputStream; import com.sun.jersey.core.header.FormDataContentDisposition; import com.sun.jersey.multipart.FormDataParam; +import javax.ws.rs.core.Context; import javax.ws.rs.core.Response; +import javax.ws.rs.core.SecurityContext; import javax.ws.rs.*; @Path("/pet") @io.swagger.annotations.Api(description = "the pet API") -@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JaxRSServerCodegen", date = "2015-11-05T22:31:25.130-08:00") +@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JaxRSServerCodegen", date = "2015-12-01T23:19:25.707+08:00") public class PetApi { private final PetApiService delegate = PetApiServiceFactory.getPetApi(); @@ -47,9 +49,9 @@ public class PetApi { @io.swagger.annotations.ApiResponse(code = 405, message = "Validation exception", response = Void.class) }) - public Response updatePet(@ApiParam(value = "Pet object that needs to be added to the store" ) Pet body) + public Response updatePet(@ApiParam(value = "Pet object that needs to be added to the store" ) Pet body,@Context SecurityContext securityContext) throws NotFoundException { - return delegate.updatePet(body); + return delegate.updatePet(body,securityContext); } @POST @@ -64,9 +66,9 @@ public class PetApi { @io.swagger.annotations.ApiResponses(value = { @io.swagger.annotations.ApiResponse(code = 405, message = "Invalid input", response = Void.class) }) - public Response addPet(@ApiParam(value = "Pet object that needs to be added to the store" ) Pet body) + public Response addPet(@ApiParam(value = "Pet object that needs to be added to the store" ) Pet body,@Context SecurityContext securityContext) throws NotFoundException { - return delegate.addPet(body); + return delegate.addPet(body,securityContext); } @GET @Path("/findByStatus") @@ -83,9 +85,9 @@ public class PetApi { @io.swagger.annotations.ApiResponse(code = 400, message = "Invalid status value", response = Pet.class, responseContainer = "List") }) - public Response findPetsByStatus(@ApiParam(value = "Status values that need to be considered for filter", defaultValue="available") @QueryParam("status") List status) + public Response findPetsByStatus(@ApiParam(value = "Status values that need to be considered for filter", defaultValue="available") @QueryParam("status") List status,@Context SecurityContext securityContext) throws NotFoundException { - return delegate.findPetsByStatus(status); + return delegate.findPetsByStatus(status,securityContext); } @GET @Path("/findByTags") @@ -102,9 +104,9 @@ public class PetApi { @io.swagger.annotations.ApiResponse(code = 400, message = "Invalid tag value", response = Pet.class, responseContainer = "List") }) - public Response findPetsByTags(@ApiParam(value = "Tags to filter by") @QueryParam("tags") List tags) + public Response findPetsByTags(@ApiParam(value = "Tags to filter by") @QueryParam("tags") List tags,@Context SecurityContext securityContext) throws NotFoundException { - return delegate.findPetsByTags(tags); + return delegate.findPetsByTags(tags,securityContext); } @GET @Path("/{petId}") @@ -120,9 +122,9 @@ public class PetApi { @io.swagger.annotations.ApiResponse(code = 404, message = "Pet not found", response = Pet.class) }) - public Response getPetById(@ApiParam(value = "ID of pet that needs to be fetched",required=true) @PathParam("petId") Long petId) + public Response getPetById(@ApiParam(value = "ID of pet that needs to be fetched",required=true) @PathParam("petId") Long petId,@Context SecurityContext securityContext) throws NotFoundException { - return delegate.getPetById(petId); + return delegate.getPetById(petId,securityContext); } @POST @Path("/{petId}") @@ -137,11 +139,9 @@ public class PetApi { @io.swagger.annotations.ApiResponses(value = { @io.swagger.annotations.ApiResponse(code = 405, message = "Invalid input", response = Void.class) }) - public Response updatePetWithForm(@ApiParam(value = "ID of pet that needs to be updated",required=true) @PathParam("petId") String petId, - @ApiParam(value = "Updated name of the pet")@FormParam("name") String name, - @ApiParam(value = "Updated status of the pet")@FormParam("status") String status) + public Response updatePetWithForm(@ApiParam(value = "ID of pet that needs to be updated",required=true) @PathParam("petId") String petId,@ApiParam(value = "Updated name of the pet")@FormParam("name") String name,@ApiParam(value = "Updated status of the pet")@FormParam("status") String status,@Context SecurityContext securityContext) throws NotFoundException { - return delegate.updatePetWithForm(petId,name,status); + return delegate.updatePetWithForm(petId,name,status,securityContext); } @DELETE @Path("/{petId}") @@ -156,10 +156,9 @@ public class PetApi { @io.swagger.annotations.ApiResponses(value = { @io.swagger.annotations.ApiResponse(code = 400, message = "Invalid pet value", response = Void.class) }) - public Response deletePet(@ApiParam(value = "Pet id to delete",required=true) @PathParam("petId") Long petId, - @ApiParam(value = "" )@HeaderParam("api_key") String apiKey) + public Response deletePet(@ApiParam(value = "Pet id to delete",required=true) @PathParam("petId") Long petId,@ApiParam(value = "" )@HeaderParam("api_key") String apiKey,@Context SecurityContext securityContext) throws NotFoundException { - return delegate.deletePet(petId,apiKey); + return delegate.deletePet(petId,apiKey,securityContext); } @POST @Path("/{petId}/uploadImage") @@ -174,12 +173,9 @@ public class PetApi { @io.swagger.annotations.ApiResponses(value = { @io.swagger.annotations.ApiResponse(code = 200, message = "successful operation", response = Void.class) }) - public Response uploadFile(@ApiParam(value = "ID of pet to update",required=true) @PathParam("petId") Long petId, - @ApiParam(value = "Additional data to pass to server")@FormParam("additionalMetadata") String additionalMetadata, - @FormDataParam("file") InputStream inputStream, - @FormDataParam("file") FormDataContentDisposition fileDetail) + public Response uploadFile(@ApiParam(value = "ID of pet to update",required=true) @PathParam("petId") Long petId,@ApiParam(value = "Additional data to pass to server")@FormParam("additionalMetadata") String additionalMetadata, @FormDataParam("file") InputStream inputStream, + @FormDataParam("file") FormDataContentDisposition fileDetail,@Context SecurityContext securityContext) throws NotFoundException { - return delegate.uploadFile(petId,additionalMetadata,fileDetail); + return delegate.uploadFile(petId,additionalMetadata,fileDetail,securityContext); } } - diff --git a/samples/server/petstore/jaxrs/src/gen/java/io/swagger/api/PetApiService.java b/samples/server/petstore/jaxrs/src/gen/java/io/swagger/api/PetApiService.java index b7e1ead74cc..fa43b1f51fb 100644 --- a/samples/server/petstore/jaxrs/src/gen/java/io/swagger/api/PetApiService.java +++ b/samples/server/petstore/jaxrs/src/gen/java/io/swagger/api/PetApiService.java @@ -17,32 +17,33 @@ import com.sun.jersey.core.header.FormDataContentDisposition; import com.sun.jersey.multipart.FormDataParam; import javax.ws.rs.core.Response; +import javax.ws.rs.core.SecurityContext; -@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JaxRSServerCodegen", date = "2015-11-05T22:31:25.130-08:00") +@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JaxRSServerCodegen", date = "2015-12-01T23:19:25.707+08:00") public abstract class PetApiService { - public abstract Response updatePet(Pet body) + public abstract Response updatePet(Pet body,SecurityContext securityContext) throws NotFoundException; - public abstract Response addPet(Pet body) + public abstract Response addPet(Pet body,SecurityContext securityContext) throws NotFoundException; - public abstract Response findPetsByStatus(List status) + public abstract Response findPetsByStatus(List status,SecurityContext securityContext) throws NotFoundException; - public abstract Response findPetsByTags(List tags) + public abstract Response findPetsByTags(List tags,SecurityContext securityContext) throws NotFoundException; - public abstract Response getPetById(Long petId) + public abstract Response getPetById(Long petId,SecurityContext securityContext) throws NotFoundException; - public abstract Response updatePetWithForm(String petId,String name,String status) + public abstract Response updatePetWithForm(String petId,String name,String status,SecurityContext securityContext) throws NotFoundException; - public abstract Response deletePet(Long petId,String apiKey) + public abstract Response deletePet(Long petId,String apiKey,SecurityContext securityContext) throws NotFoundException; - public abstract Response uploadFile(Long petId,String additionalMetadata,FormDataContentDisposition fileDetail) + public abstract Response uploadFile(Long petId,String additionalMetadata,FormDataContentDisposition fileDetail,SecurityContext securityContext) throws NotFoundException; } diff --git a/samples/server/petstore/jaxrs/src/gen/java/io/swagger/api/StoreApi.java b/samples/server/petstore/jaxrs/src/gen/java/io/swagger/api/StoreApi.java index 7c9b500470a..868b1f2c2a8 100644 --- a/samples/server/petstore/jaxrs/src/gen/java/io/swagger/api/StoreApi.java +++ b/samples/server/petstore/jaxrs/src/gen/java/io/swagger/api/StoreApi.java @@ -19,14 +19,16 @@ import java.io.InputStream; import com.sun.jersey.core.header.FormDataContentDisposition; import com.sun.jersey.multipart.FormDataParam; +import javax.ws.rs.core.Context; import javax.ws.rs.core.Response; +import javax.ws.rs.core.SecurityContext; import javax.ws.rs.*; @Path("/store") @io.swagger.annotations.Api(description = "the store API") -@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JaxRSServerCodegen", date = "2015-11-05T22:31:25.130-08:00") +@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JaxRSServerCodegen", date = "2015-12-01T23:19:25.707+08:00") public class StoreApi { private final StoreApiService delegate = StoreApiServiceFactory.getStoreApi(); @@ -40,9 +42,9 @@ public class StoreApi { @io.swagger.annotations.ApiResponses(value = { @io.swagger.annotations.ApiResponse(code = 200, message = "successful operation", response = Integer.class, responseContainer = "Map") }) - public Response getInventory() + public Response getInventory(@Context SecurityContext securityContext) throws NotFoundException { - return delegate.getInventory(); + return delegate.getInventory(securityContext); } @POST @Path("/order") @@ -54,9 +56,9 @@ public class StoreApi { @io.swagger.annotations.ApiResponse(code = 400, message = "Invalid Order", response = Order.class) }) - public Response placeOrder(@ApiParam(value = "order placed for purchasing the pet" ) Order body) + public Response placeOrder(@ApiParam(value = "order placed for purchasing the pet" ) Order body,@Context SecurityContext securityContext) throws NotFoundException { - return delegate.placeOrder(body); + return delegate.placeOrder(body,securityContext); } @GET @Path("/order/{orderId}") @@ -70,9 +72,9 @@ public class StoreApi { @io.swagger.annotations.ApiResponse(code = 404, message = "Order not found", response = Order.class) }) - public Response getOrderById(@ApiParam(value = "ID of pet that needs to be fetched",required=true) @PathParam("orderId") String orderId) + public Response getOrderById(@ApiParam(value = "ID of pet that needs to be fetched",required=true) @PathParam("orderId") String orderId,@Context SecurityContext securityContext) throws NotFoundException { - return delegate.getOrderById(orderId); + return delegate.getOrderById(orderId,securityContext); } @DELETE @Path("/order/{orderId}") @@ -84,9 +86,8 @@ public class StoreApi { @io.swagger.annotations.ApiResponse(code = 404, message = "Order not found", response = Void.class) }) - public Response deleteOrder(@ApiParam(value = "ID of the order that needs to be deleted",required=true) @PathParam("orderId") String orderId) + public Response deleteOrder(@ApiParam(value = "ID of the order that needs to be deleted",required=true) @PathParam("orderId") String orderId,@Context SecurityContext securityContext) throws NotFoundException { - return delegate.deleteOrder(orderId); + return delegate.deleteOrder(orderId,securityContext); } } - diff --git a/samples/server/petstore/jaxrs/src/gen/java/io/swagger/api/StoreApiService.java b/samples/server/petstore/jaxrs/src/gen/java/io/swagger/api/StoreApiService.java index 721117cf3b3..f90a96d8399 100644 --- a/samples/server/petstore/jaxrs/src/gen/java/io/swagger/api/StoreApiService.java +++ b/samples/server/petstore/jaxrs/src/gen/java/io/swagger/api/StoreApiService.java @@ -17,20 +17,21 @@ import com.sun.jersey.core.header.FormDataContentDisposition; import com.sun.jersey.multipart.FormDataParam; import javax.ws.rs.core.Response; +import javax.ws.rs.core.SecurityContext; -@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JaxRSServerCodegen", date = "2015-11-05T22:31:25.130-08:00") +@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JaxRSServerCodegen", date = "2015-12-01T23:19:25.707+08:00") public abstract class StoreApiService { - public abstract Response getInventory() + public abstract Response getInventory(SecurityContext securityContext) throws NotFoundException; - public abstract Response placeOrder(Order body) + public abstract Response placeOrder(Order body,SecurityContext securityContext) throws NotFoundException; - public abstract Response getOrderById(String orderId) + public abstract Response getOrderById(String orderId,SecurityContext securityContext) throws NotFoundException; - public abstract Response deleteOrder(String orderId) + public abstract Response deleteOrder(String orderId,SecurityContext securityContext) throws NotFoundException; } diff --git a/samples/server/petstore/jaxrs/src/gen/java/io/swagger/api/UserApi.java b/samples/server/petstore/jaxrs/src/gen/java/io/swagger/api/UserApi.java index 718fbbe9a9a..4c48e6e3ec6 100644 --- a/samples/server/petstore/jaxrs/src/gen/java/io/swagger/api/UserApi.java +++ b/samples/server/petstore/jaxrs/src/gen/java/io/swagger/api/UserApi.java @@ -19,14 +19,16 @@ import java.io.InputStream; import com.sun.jersey.core.header.FormDataContentDisposition; import com.sun.jersey.multipart.FormDataParam; +import javax.ws.rs.core.Context; import javax.ws.rs.core.Response; +import javax.ws.rs.core.SecurityContext; import javax.ws.rs.*; @Path("/user") @io.swagger.annotations.Api(description = "the user API") -@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JaxRSServerCodegen", date = "2015-11-05T22:31:25.130-08:00") +@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JaxRSServerCodegen", date = "2015-12-01T23:19:25.707+08:00") public class UserApi { private final UserApiService delegate = UserApiServiceFactory.getUserApi(); @@ -38,9 +40,9 @@ public class UserApi { @io.swagger.annotations.ApiResponses(value = { @io.swagger.annotations.ApiResponse(code = 200, message = "successful operation", response = Void.class) }) - public Response createUser(@ApiParam(value = "Created user object" ) User body) + public Response createUser(@ApiParam(value = "Created user object" ) User body,@Context SecurityContext securityContext) throws NotFoundException { - return delegate.createUser(body); + return delegate.createUser(body,securityContext); } @POST @Path("/createWithArray") @@ -50,9 +52,9 @@ public class UserApi { @io.swagger.annotations.ApiResponses(value = { @io.swagger.annotations.ApiResponse(code = 200, message = "successful operation", response = Void.class) }) - public Response createUsersWithArrayInput(@ApiParam(value = "List of user object" ) List body) + public Response createUsersWithArrayInput(@ApiParam(value = "List of user object" ) List body,@Context SecurityContext securityContext) throws NotFoundException { - return delegate.createUsersWithArrayInput(body); + return delegate.createUsersWithArrayInput(body,securityContext); } @POST @Path("/createWithList") @@ -62,9 +64,9 @@ public class UserApi { @io.swagger.annotations.ApiResponses(value = { @io.swagger.annotations.ApiResponse(code = 200, message = "successful operation", response = Void.class) }) - public Response createUsersWithListInput(@ApiParam(value = "List of user object" ) List body) + public Response createUsersWithListInput(@ApiParam(value = "List of user object" ) List body,@Context SecurityContext securityContext) throws NotFoundException { - return delegate.createUsersWithListInput(body); + return delegate.createUsersWithListInput(body,securityContext); } @GET @Path("/login") @@ -76,10 +78,9 @@ public class UserApi { @io.swagger.annotations.ApiResponse(code = 400, message = "Invalid username/password supplied", response = String.class) }) - public Response loginUser(@ApiParam(value = "The user name for login") @QueryParam("username") String username, - @ApiParam(value = "The password for login in clear text") @QueryParam("password") String password) + public Response loginUser(@ApiParam(value = "The user name for login") @QueryParam("username") String username,@ApiParam(value = "The password for login in clear text") @QueryParam("password") String password,@Context SecurityContext securityContext) throws NotFoundException { - return delegate.loginUser(username,password); + return delegate.loginUser(username,password,securityContext); } @GET @Path("/logout") @@ -89,9 +90,9 @@ public class UserApi { @io.swagger.annotations.ApiResponses(value = { @io.swagger.annotations.ApiResponse(code = 200, message = "successful operation", response = Void.class) }) - public Response logoutUser() + public Response logoutUser(@Context SecurityContext securityContext) throws NotFoundException { - return delegate.logoutUser(); + return delegate.logoutUser(securityContext); } @GET @Path("/{username}") @@ -105,9 +106,9 @@ public class UserApi { @io.swagger.annotations.ApiResponse(code = 404, message = "User not found", response = User.class) }) - public Response getUserByName(@ApiParam(value = "The name that needs to be fetched. Use user1 for testing.",required=true) @PathParam("username") String username) + public Response getUserByName(@ApiParam(value = "The name that needs to be fetched. Use user1 for testing.",required=true) @PathParam("username") String username,@Context SecurityContext securityContext) throws NotFoundException { - return delegate.getUserByName(username); + return delegate.getUserByName(username,securityContext); } @PUT @Path("/{username}") @@ -119,10 +120,9 @@ public class UserApi { @io.swagger.annotations.ApiResponse(code = 404, message = "User not found", response = Void.class) }) - public Response updateUser(@ApiParam(value = "name that need to be deleted",required=true) @PathParam("username") String username, - @ApiParam(value = "Updated user object" ) User body) + public Response updateUser(@ApiParam(value = "name that need to be deleted",required=true) @PathParam("username") String username,@ApiParam(value = "Updated user object" ) User body,@Context SecurityContext securityContext) throws NotFoundException { - return delegate.updateUser(username,body); + return delegate.updateUser(username,body,securityContext); } @DELETE @Path("/{username}") @@ -134,9 +134,8 @@ public class UserApi { @io.swagger.annotations.ApiResponse(code = 404, message = "User not found", response = Void.class) }) - public Response deleteUser(@ApiParam(value = "The name that needs to be deleted",required=true) @PathParam("username") String username) + public Response deleteUser(@ApiParam(value = "The name that needs to be deleted",required=true) @PathParam("username") String username,@Context SecurityContext securityContext) throws NotFoundException { - return delegate.deleteUser(username); + return delegate.deleteUser(username,securityContext); } } - diff --git a/samples/server/petstore/jaxrs/src/gen/java/io/swagger/api/UserApiService.java b/samples/server/petstore/jaxrs/src/gen/java/io/swagger/api/UserApiService.java index aebc957e25c..c9f1fef2fb8 100644 --- a/samples/server/petstore/jaxrs/src/gen/java/io/swagger/api/UserApiService.java +++ b/samples/server/petstore/jaxrs/src/gen/java/io/swagger/api/UserApiService.java @@ -17,32 +17,33 @@ import com.sun.jersey.core.header.FormDataContentDisposition; import com.sun.jersey.multipart.FormDataParam; import javax.ws.rs.core.Response; +import javax.ws.rs.core.SecurityContext; -@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JaxRSServerCodegen", date = "2015-11-05T22:31:25.130-08:00") +@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JaxRSServerCodegen", date = "2015-12-01T23:19:25.707+08:00") public abstract class UserApiService { - public abstract Response createUser(User body) + public abstract Response createUser(User body,SecurityContext securityContext) throws NotFoundException; - public abstract Response createUsersWithArrayInput(List body) + public abstract Response createUsersWithArrayInput(List body,SecurityContext securityContext) throws NotFoundException; - public abstract Response createUsersWithListInput(List body) + public abstract Response createUsersWithListInput(List body,SecurityContext securityContext) throws NotFoundException; - public abstract Response loginUser(String username,String password) + public abstract Response loginUser(String username,String password,SecurityContext securityContext) throws NotFoundException; - public abstract Response logoutUser() + public abstract Response logoutUser(SecurityContext securityContext) throws NotFoundException; - public abstract Response getUserByName(String username) + public abstract Response getUserByName(String username,SecurityContext securityContext) throws NotFoundException; - public abstract Response updateUser(String username,User body) + public abstract Response updateUser(String username,User body,SecurityContext securityContext) throws NotFoundException; - public abstract Response deleteUser(String username) + public abstract Response deleteUser(String username,SecurityContext securityContext) throws NotFoundException; } diff --git a/samples/server/petstore/jaxrs/src/gen/java/io/swagger/model/Category.java b/samples/server/petstore/jaxrs/src/gen/java/io/swagger/model/Category.java index 5db3559b5b6..8c97caf5663 100644 --- a/samples/server/petstore/jaxrs/src/gen/java/io/swagger/model/Category.java +++ b/samples/server/petstore/jaxrs/src/gen/java/io/swagger/model/Category.java @@ -8,7 +8,7 @@ import java.util.Objects; @ApiModel(description = "") -@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JaxRSServerCodegen", date = "2015-11-24T12:32:47.191+08:00") +@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JaxRSServerCodegen", date = "2015-12-01T23:19:25.707+08:00") public class Category { private Long id = null; diff --git a/samples/server/petstore/jaxrs/src/gen/java/io/swagger/model/Order.java b/samples/server/petstore/jaxrs/src/gen/java/io/swagger/model/Order.java index 6c70f9086a0..fd7e7a4e7fd 100644 --- a/samples/server/petstore/jaxrs/src/gen/java/io/swagger/model/Order.java +++ b/samples/server/petstore/jaxrs/src/gen/java/io/swagger/model/Order.java @@ -9,7 +9,7 @@ import java.util.Objects; @ApiModel(description = "") -@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JaxRSServerCodegen", date = "2015-11-24T12:32:47.191+08:00") +@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JaxRSServerCodegen", date = "2015-12-01T23:19:25.707+08:00") public class Order { private Long id = null; diff --git a/samples/server/petstore/jaxrs/src/gen/java/io/swagger/model/Pet.java b/samples/server/petstore/jaxrs/src/gen/java/io/swagger/model/Pet.java index 316831faf47..7c9c21f4a0f 100644 --- a/samples/server/petstore/jaxrs/src/gen/java/io/swagger/model/Pet.java +++ b/samples/server/petstore/jaxrs/src/gen/java/io/swagger/model/Pet.java @@ -1,8 +1,8 @@ package io.swagger.model; import io.swagger.model.Category; -import java.util.*; import io.swagger.model.Tag; +import java.util.*; import io.swagger.annotations.*; import com.fasterxml.jackson.annotation.JsonProperty; @@ -11,7 +11,7 @@ import java.util.Objects; @ApiModel(description = "") -@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JaxRSServerCodegen", date = "2015-11-24T12:32:47.191+08:00") +@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JaxRSServerCodegen", date = "2015-12-01T23:19:25.707+08:00") public class Pet { private Long id = null; diff --git a/samples/server/petstore/jaxrs/src/gen/java/io/swagger/model/Tag.java b/samples/server/petstore/jaxrs/src/gen/java/io/swagger/model/Tag.java index de35da0d91c..010842ed2a9 100644 --- a/samples/server/petstore/jaxrs/src/gen/java/io/swagger/model/Tag.java +++ b/samples/server/petstore/jaxrs/src/gen/java/io/swagger/model/Tag.java @@ -8,7 +8,7 @@ import java.util.Objects; @ApiModel(description = "") -@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JaxRSServerCodegen", date = "2015-11-24T12:32:47.191+08:00") +@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JaxRSServerCodegen", date = "2015-12-01T23:19:25.707+08:00") public class Tag { private Long id = null; diff --git a/samples/server/petstore/jaxrs/src/gen/java/io/swagger/model/User.java b/samples/server/petstore/jaxrs/src/gen/java/io/swagger/model/User.java index b30037a0d55..dd8c720b7c6 100644 --- a/samples/server/petstore/jaxrs/src/gen/java/io/swagger/model/User.java +++ b/samples/server/petstore/jaxrs/src/gen/java/io/swagger/model/User.java @@ -8,7 +8,7 @@ import java.util.Objects; @ApiModel(description = "") -@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JaxRSServerCodegen", date = "2015-11-24T12:32:47.191+08:00") +@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JaxRSServerCodegen", date = "2015-12-01T23:19:25.707+08:00") public class User { private Long id = null; diff --git a/samples/server/petstore/jaxrs/src/main/java/io/swagger/api/impl/PetApiServiceImpl.java b/samples/server/petstore/jaxrs/src/main/java/io/swagger/api/impl/PetApiServiceImpl.java index 5137ffe7912..1907ffd40a5 100644 --- a/samples/server/petstore/jaxrs/src/main/java/io/swagger/api/impl/PetApiServiceImpl.java +++ b/samples/server/petstore/jaxrs/src/main/java/io/swagger/api/impl/PetApiServiceImpl.java @@ -17,61 +17,62 @@ import com.sun.jersey.core.header.FormDataContentDisposition; import com.sun.jersey.multipart.FormDataParam; import javax.ws.rs.core.Response; +import javax.ws.rs.core.SecurityContext; -@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JaxRSServerCodegen", date = "2015-11-05T22:31:25.130-08:00") +@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JaxRSServerCodegen", date = "2015-11-23T10:25:42.314Z") public class PetApiServiceImpl extends PetApiService { @Override - public Response updatePet(Pet body) + public Response updatePet(Pet body,SecurityContext securityContext) throws NotFoundException { // do some magic! return Response.ok().entity(new ApiResponseMessage(ApiResponseMessage.OK, "magic!")).build(); } @Override - public Response addPet(Pet body) + public Response addPet(Pet body,SecurityContext securityContext) throws NotFoundException { // do some magic! return Response.ok().entity(new ApiResponseMessage(ApiResponseMessage.OK, "magic!")).build(); } @Override - public Response findPetsByStatus(List status) + public Response findPetsByStatus(List status,SecurityContext securityContext) throws NotFoundException { // do some magic! return Response.ok().entity(new ApiResponseMessage(ApiResponseMessage.OK, "magic!")).build(); } @Override - public Response findPetsByTags(List tags) + public Response findPetsByTags(List tags,SecurityContext securityContext) throws NotFoundException { // do some magic! return Response.ok().entity(new ApiResponseMessage(ApiResponseMessage.OK, "magic!")).build(); } @Override - public Response getPetById(Long petId) + public Response getPetById(Long petId,SecurityContext securityContext) throws NotFoundException { // do some magic! return Response.ok().entity(new ApiResponseMessage(ApiResponseMessage.OK, "magic!")).build(); } @Override - public Response updatePetWithForm(String petId,String name,String status) + public Response updatePetWithForm(String petId,String name,String status,SecurityContext securityContext) throws NotFoundException { // do some magic! return Response.ok().entity(new ApiResponseMessage(ApiResponseMessage.OK, "magic!")).build(); } @Override - public Response deletePet(Long petId,String apiKey) + public Response deletePet(Long petId,String apiKey,SecurityContext securityContext) throws NotFoundException { // do some magic! return Response.ok().entity(new ApiResponseMessage(ApiResponseMessage.OK, "magic!")).build(); } @Override - public Response uploadFile(Long petId,String additionalMetadata,FormDataContentDisposition fileDetail) + public Response uploadFile(Long petId,String additionalMetadata,FormDataContentDisposition fileDetail,SecurityContext securityContext) throws NotFoundException { // do some magic! return Response.ok().entity(new ApiResponseMessage(ApiResponseMessage.OK, "magic!")).build(); diff --git a/samples/server/petstore/jaxrs/src/main/java/io/swagger/api/impl/StoreApiServiceImpl.java b/samples/server/petstore/jaxrs/src/main/java/io/swagger/api/impl/StoreApiServiceImpl.java index 4d9011b4943..c60547a73a0 100644 --- a/samples/server/petstore/jaxrs/src/main/java/io/swagger/api/impl/StoreApiServiceImpl.java +++ b/samples/server/petstore/jaxrs/src/main/java/io/swagger/api/impl/StoreApiServiceImpl.java @@ -17,33 +17,34 @@ import com.sun.jersey.core.header.FormDataContentDisposition; import com.sun.jersey.multipart.FormDataParam; import javax.ws.rs.core.Response; +import javax.ws.rs.core.SecurityContext; -@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JaxRSServerCodegen", date = "2015-11-05T22:31:25.130-08:00") +@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JaxRSServerCodegen", date = "2015-11-23T10:25:42.314Z") public class StoreApiServiceImpl extends StoreApiService { @Override - public Response getInventory() + public Response getInventory(SecurityContext securityContext) throws NotFoundException { // do some magic! return Response.ok().entity(new ApiResponseMessage(ApiResponseMessage.OK, "magic!")).build(); } @Override - public Response placeOrder(Order body) + public Response placeOrder(Order body,SecurityContext securityContext) throws NotFoundException { // do some magic! return Response.ok().entity(new ApiResponseMessage(ApiResponseMessage.OK, "magic!")).build(); } @Override - public Response getOrderById(String orderId) + public Response getOrderById(String orderId,SecurityContext securityContext) throws NotFoundException { // do some magic! return Response.ok().entity(new ApiResponseMessage(ApiResponseMessage.OK, "magic!")).build(); } @Override - public Response deleteOrder(String orderId) + public Response deleteOrder(String orderId,SecurityContext securityContext) throws NotFoundException { // do some magic! return Response.ok().entity(new ApiResponseMessage(ApiResponseMessage.OK, "magic!")).build(); diff --git a/samples/server/petstore/jaxrs/src/main/java/io/swagger/api/impl/UserApiServiceImpl.java b/samples/server/petstore/jaxrs/src/main/java/io/swagger/api/impl/UserApiServiceImpl.java index 991849edc17..2c3f3edd1fd 100644 --- a/samples/server/petstore/jaxrs/src/main/java/io/swagger/api/impl/UserApiServiceImpl.java +++ b/samples/server/petstore/jaxrs/src/main/java/io/swagger/api/impl/UserApiServiceImpl.java @@ -17,61 +17,62 @@ import com.sun.jersey.core.header.FormDataContentDisposition; import com.sun.jersey.multipart.FormDataParam; import javax.ws.rs.core.Response; +import javax.ws.rs.core.SecurityContext; -@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JaxRSServerCodegen", date = "2015-11-05T22:31:25.130-08:00") +@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JaxRSServerCodegen", date = "2015-11-23T10:25:42.314Z") public class UserApiServiceImpl extends UserApiService { @Override - public Response createUser(User body) + public Response createUser(User body,SecurityContext securityContext) throws NotFoundException { // do some magic! return Response.ok().entity(new ApiResponseMessage(ApiResponseMessage.OK, "magic!")).build(); } @Override - public Response createUsersWithArrayInput(List body) + public Response createUsersWithArrayInput(List body,SecurityContext securityContext) throws NotFoundException { // do some magic! return Response.ok().entity(new ApiResponseMessage(ApiResponseMessage.OK, "magic!")).build(); } @Override - public Response createUsersWithListInput(List body) + public Response createUsersWithListInput(List body,SecurityContext securityContext) throws NotFoundException { // do some magic! return Response.ok().entity(new ApiResponseMessage(ApiResponseMessage.OK, "magic!")).build(); } @Override - public Response loginUser(String username,String password) + public Response loginUser(String username,String password,SecurityContext securityContext) throws NotFoundException { // do some magic! return Response.ok().entity(new ApiResponseMessage(ApiResponseMessage.OK, "magic!")).build(); } @Override - public Response logoutUser() + public Response logoutUser(SecurityContext securityContext) throws NotFoundException { // do some magic! return Response.ok().entity(new ApiResponseMessage(ApiResponseMessage.OK, "magic!")).build(); } @Override - public Response getUserByName(String username) + public Response getUserByName(String username,SecurityContext securityContext) throws NotFoundException { // do some magic! return Response.ok().entity(new ApiResponseMessage(ApiResponseMessage.OK, "magic!")).build(); } @Override - public Response updateUser(String username,User body) + public Response updateUser(String username,User body,SecurityContext securityContext) throws NotFoundException { // do some magic! return Response.ok().entity(new ApiResponseMessage(ApiResponseMessage.OK, "magic!")).build(); } @Override - public Response deleteUser(String username) + public Response deleteUser(String username,SecurityContext securityContext) throws NotFoundException { // do some magic! return Response.ok().entity(new ApiResponseMessage(ApiResponseMessage.OK, "magic!")).build(); From b2bfe8de5163c63db12e1e6aaf7b216dd3ddb4b4 Mon Sep 17 00:00:00 2001 From: wing328 Date: Tue, 1 Dec 2015 23:27:52 +0800 Subject: [PATCH 096/211] update sample --- .../jaxrs/src/gen/java/io/swagger/api/ApiException.java | 2 +- .../jaxrs/src/gen/java/io/swagger/api/ApiOriginFilter.java | 2 +- .../jaxrs/src/gen/java/io/swagger/api/ApiResponseMessage.java | 2 +- .../jaxrs/src/gen/java/io/swagger/api/NotFoundException.java | 2 +- .../petstore/jaxrs/src/gen/java/io/swagger/api/PetApi.java | 2 +- .../jaxrs/src/gen/java/io/swagger/api/PetApiService.java | 2 +- .../petstore/jaxrs/src/gen/java/io/swagger/api/StoreApi.java | 2 +- .../jaxrs/src/gen/java/io/swagger/api/StoreApiService.java | 2 +- .../petstore/jaxrs/src/gen/java/io/swagger/api/UserApi.java | 2 +- .../jaxrs/src/gen/java/io/swagger/api/UserApiService.java | 2 +- .../petstore/jaxrs/src/gen/java/io/swagger/model/Category.java | 2 +- .../petstore/jaxrs/src/gen/java/io/swagger/model/Order.java | 2 +- .../petstore/jaxrs/src/gen/java/io/swagger/model/Pet.java | 2 +- .../petstore/jaxrs/src/gen/java/io/swagger/model/Tag.java | 2 +- .../petstore/jaxrs/src/gen/java/io/swagger/model/User.java | 2 +- 15 files changed, 15 insertions(+), 15 deletions(-) diff --git a/samples/server/petstore/jaxrs/src/gen/java/io/swagger/api/ApiException.java b/samples/server/petstore/jaxrs/src/gen/java/io/swagger/api/ApiException.java index 8774e105037..774fb35a355 100644 --- a/samples/server/petstore/jaxrs/src/gen/java/io/swagger/api/ApiException.java +++ b/samples/server/petstore/jaxrs/src/gen/java/io/swagger/api/ApiException.java @@ -1,6 +1,6 @@ package io.swagger.api; -@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JaxRSServerCodegen", date = "2015-12-01T23:19:25.707+08:00") +@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JaxRSServerCodegen", date = "2015-12-01T23:25:59.622+08:00") public class ApiException extends Exception{ private int code; public ApiException (int code, String msg) { diff --git a/samples/server/petstore/jaxrs/src/gen/java/io/swagger/api/ApiOriginFilter.java b/samples/server/petstore/jaxrs/src/gen/java/io/swagger/api/ApiOriginFilter.java index 73d2a09bfe0..384b1f1a7ce 100644 --- a/samples/server/petstore/jaxrs/src/gen/java/io/swagger/api/ApiOriginFilter.java +++ b/samples/server/petstore/jaxrs/src/gen/java/io/swagger/api/ApiOriginFilter.java @@ -5,7 +5,7 @@ import java.io.IOException; import javax.servlet.*; import javax.servlet.http.HttpServletResponse; -@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JaxRSServerCodegen", date = "2015-12-01T23:19:25.707+08:00") +@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JaxRSServerCodegen", date = "2015-12-01T23:25:59.622+08:00") public class ApiOriginFilter implements javax.servlet.Filter { public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { diff --git a/samples/server/petstore/jaxrs/src/gen/java/io/swagger/api/ApiResponseMessage.java b/samples/server/petstore/jaxrs/src/gen/java/io/swagger/api/ApiResponseMessage.java index f8158c15640..af9aceb63cc 100644 --- a/samples/server/petstore/jaxrs/src/gen/java/io/swagger/api/ApiResponseMessage.java +++ b/samples/server/petstore/jaxrs/src/gen/java/io/swagger/api/ApiResponseMessage.java @@ -3,7 +3,7 @@ package io.swagger.api; import javax.xml.bind.annotation.XmlTransient; @javax.xml.bind.annotation.XmlRootElement -@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JaxRSServerCodegen", date = "2015-12-01T23:19:25.707+08:00") +@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JaxRSServerCodegen", date = "2015-12-01T23:25:59.622+08:00") public class ApiResponseMessage { public static final int ERROR = 1; public static final int WARNING = 2; diff --git a/samples/server/petstore/jaxrs/src/gen/java/io/swagger/api/NotFoundException.java b/samples/server/petstore/jaxrs/src/gen/java/io/swagger/api/NotFoundException.java index 10bdc6f8b88..363eb26f8fd 100644 --- a/samples/server/petstore/jaxrs/src/gen/java/io/swagger/api/NotFoundException.java +++ b/samples/server/petstore/jaxrs/src/gen/java/io/swagger/api/NotFoundException.java @@ -1,6 +1,6 @@ package io.swagger.api; -@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JaxRSServerCodegen", date = "2015-12-01T23:19:25.707+08:00") +@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JaxRSServerCodegen", date = "2015-12-01T23:25:59.622+08:00") public class NotFoundException extends ApiException { private int code; public NotFoundException (int code, String msg) { diff --git a/samples/server/petstore/jaxrs/src/gen/java/io/swagger/api/PetApi.java b/samples/server/petstore/jaxrs/src/gen/java/io/swagger/api/PetApi.java index 37f781ba983..7058e7da819 100644 --- a/samples/server/petstore/jaxrs/src/gen/java/io/swagger/api/PetApi.java +++ b/samples/server/petstore/jaxrs/src/gen/java/io/swagger/api/PetApi.java @@ -28,7 +28,7 @@ import javax.ws.rs.*; @io.swagger.annotations.Api(description = "the pet API") -@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JaxRSServerCodegen", date = "2015-12-01T23:19:25.707+08:00") +@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JaxRSServerCodegen", date = "2015-12-01T23:25:59.622+08:00") public class PetApi { private final PetApiService delegate = PetApiServiceFactory.getPetApi(); diff --git a/samples/server/petstore/jaxrs/src/gen/java/io/swagger/api/PetApiService.java b/samples/server/petstore/jaxrs/src/gen/java/io/swagger/api/PetApiService.java index fa43b1f51fb..7ac9e1693af 100644 --- a/samples/server/petstore/jaxrs/src/gen/java/io/swagger/api/PetApiService.java +++ b/samples/server/petstore/jaxrs/src/gen/java/io/swagger/api/PetApiService.java @@ -19,7 +19,7 @@ import com.sun.jersey.multipart.FormDataParam; import javax.ws.rs.core.Response; import javax.ws.rs.core.SecurityContext; -@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JaxRSServerCodegen", date = "2015-12-01T23:19:25.707+08:00") +@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JaxRSServerCodegen", date = "2015-12-01T23:25:59.622+08:00") public abstract class PetApiService { public abstract Response updatePet(Pet body,SecurityContext securityContext) diff --git a/samples/server/petstore/jaxrs/src/gen/java/io/swagger/api/StoreApi.java b/samples/server/petstore/jaxrs/src/gen/java/io/swagger/api/StoreApi.java index 868b1f2c2a8..0143cc89976 100644 --- a/samples/server/petstore/jaxrs/src/gen/java/io/swagger/api/StoreApi.java +++ b/samples/server/petstore/jaxrs/src/gen/java/io/swagger/api/StoreApi.java @@ -28,7 +28,7 @@ import javax.ws.rs.*; @io.swagger.annotations.Api(description = "the store API") -@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JaxRSServerCodegen", date = "2015-12-01T23:19:25.707+08:00") +@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JaxRSServerCodegen", date = "2015-12-01T23:25:59.622+08:00") public class StoreApi { private final StoreApiService delegate = StoreApiServiceFactory.getStoreApi(); diff --git a/samples/server/petstore/jaxrs/src/gen/java/io/swagger/api/StoreApiService.java b/samples/server/petstore/jaxrs/src/gen/java/io/swagger/api/StoreApiService.java index f90a96d8399..f1f0714dd38 100644 --- a/samples/server/petstore/jaxrs/src/gen/java/io/swagger/api/StoreApiService.java +++ b/samples/server/petstore/jaxrs/src/gen/java/io/swagger/api/StoreApiService.java @@ -19,7 +19,7 @@ import com.sun.jersey.multipart.FormDataParam; import javax.ws.rs.core.Response; import javax.ws.rs.core.SecurityContext; -@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JaxRSServerCodegen", date = "2015-12-01T23:19:25.707+08:00") +@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JaxRSServerCodegen", date = "2015-12-01T23:25:59.622+08:00") public abstract class StoreApiService { public abstract Response getInventory(SecurityContext securityContext) diff --git a/samples/server/petstore/jaxrs/src/gen/java/io/swagger/api/UserApi.java b/samples/server/petstore/jaxrs/src/gen/java/io/swagger/api/UserApi.java index 4c48e6e3ec6..f4018f7e94d 100644 --- a/samples/server/petstore/jaxrs/src/gen/java/io/swagger/api/UserApi.java +++ b/samples/server/petstore/jaxrs/src/gen/java/io/swagger/api/UserApi.java @@ -28,7 +28,7 @@ import javax.ws.rs.*; @io.swagger.annotations.Api(description = "the user API") -@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JaxRSServerCodegen", date = "2015-12-01T23:19:25.707+08:00") +@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JaxRSServerCodegen", date = "2015-12-01T23:25:59.622+08:00") public class UserApi { private final UserApiService delegate = UserApiServiceFactory.getUserApi(); diff --git a/samples/server/petstore/jaxrs/src/gen/java/io/swagger/api/UserApiService.java b/samples/server/petstore/jaxrs/src/gen/java/io/swagger/api/UserApiService.java index c9f1fef2fb8..66437bebdc4 100644 --- a/samples/server/petstore/jaxrs/src/gen/java/io/swagger/api/UserApiService.java +++ b/samples/server/petstore/jaxrs/src/gen/java/io/swagger/api/UserApiService.java @@ -19,7 +19,7 @@ import com.sun.jersey.multipart.FormDataParam; import javax.ws.rs.core.Response; import javax.ws.rs.core.SecurityContext; -@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JaxRSServerCodegen", date = "2015-12-01T23:19:25.707+08:00") +@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JaxRSServerCodegen", date = "2015-12-01T23:25:59.622+08:00") public abstract class UserApiService { public abstract Response createUser(User body,SecurityContext securityContext) diff --git a/samples/server/petstore/jaxrs/src/gen/java/io/swagger/model/Category.java b/samples/server/petstore/jaxrs/src/gen/java/io/swagger/model/Category.java index 8c97caf5663..023da1a9013 100644 --- a/samples/server/petstore/jaxrs/src/gen/java/io/swagger/model/Category.java +++ b/samples/server/petstore/jaxrs/src/gen/java/io/swagger/model/Category.java @@ -8,7 +8,7 @@ import java.util.Objects; @ApiModel(description = "") -@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JaxRSServerCodegen", date = "2015-12-01T23:19:25.707+08:00") +@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JaxRSServerCodegen", date = "2015-12-01T23:25:59.622+08:00") public class Category { private Long id = null; diff --git a/samples/server/petstore/jaxrs/src/gen/java/io/swagger/model/Order.java b/samples/server/petstore/jaxrs/src/gen/java/io/swagger/model/Order.java index fd7e7a4e7fd..cea0908230b 100644 --- a/samples/server/petstore/jaxrs/src/gen/java/io/swagger/model/Order.java +++ b/samples/server/petstore/jaxrs/src/gen/java/io/swagger/model/Order.java @@ -9,7 +9,7 @@ import java.util.Objects; @ApiModel(description = "") -@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JaxRSServerCodegen", date = "2015-12-01T23:19:25.707+08:00") +@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JaxRSServerCodegen", date = "2015-12-01T23:25:59.622+08:00") public class Order { private Long id = null; diff --git a/samples/server/petstore/jaxrs/src/gen/java/io/swagger/model/Pet.java b/samples/server/petstore/jaxrs/src/gen/java/io/swagger/model/Pet.java index 7c9c21f4a0f..6ce50aa3302 100644 --- a/samples/server/petstore/jaxrs/src/gen/java/io/swagger/model/Pet.java +++ b/samples/server/petstore/jaxrs/src/gen/java/io/swagger/model/Pet.java @@ -11,7 +11,7 @@ import java.util.Objects; @ApiModel(description = "") -@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JaxRSServerCodegen", date = "2015-12-01T23:19:25.707+08:00") +@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JaxRSServerCodegen", date = "2015-12-01T23:25:59.622+08:00") public class Pet { private Long id = null; diff --git a/samples/server/petstore/jaxrs/src/gen/java/io/swagger/model/Tag.java b/samples/server/petstore/jaxrs/src/gen/java/io/swagger/model/Tag.java index 010842ed2a9..e9d97e9fe05 100644 --- a/samples/server/petstore/jaxrs/src/gen/java/io/swagger/model/Tag.java +++ b/samples/server/petstore/jaxrs/src/gen/java/io/swagger/model/Tag.java @@ -8,7 +8,7 @@ import java.util.Objects; @ApiModel(description = "") -@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JaxRSServerCodegen", date = "2015-12-01T23:19:25.707+08:00") +@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JaxRSServerCodegen", date = "2015-12-01T23:25:59.622+08:00") public class Tag { private Long id = null; diff --git a/samples/server/petstore/jaxrs/src/gen/java/io/swagger/model/User.java b/samples/server/petstore/jaxrs/src/gen/java/io/swagger/model/User.java index dd8c720b7c6..6e17298795a 100644 --- a/samples/server/petstore/jaxrs/src/gen/java/io/swagger/model/User.java +++ b/samples/server/petstore/jaxrs/src/gen/java/io/swagger/model/User.java @@ -8,7 +8,7 @@ import java.util.Objects; @ApiModel(description = "") -@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JaxRSServerCodegen", date = "2015-12-01T23:19:25.707+08:00") +@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JaxRSServerCodegen", date = "2015-12-01T23:25:59.622+08:00") public class User { private Long id = null; From d49b0e3afd8656bd541e196012ea40e480581858 Mon Sep 17 00:00:00 2001 From: evigeant Date: Tue, 1 Dec 2015 12:05:26 -0500 Subject: [PATCH 097/211] Fixed xml validation in web.xml --- modules/swagger-generator/src/main/webapp/WEB-INF/web.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/swagger-generator/src/main/webapp/WEB-INF/web.xml b/modules/swagger-generator/src/main/webapp/WEB-INF/web.xml index 74e3828a8f4..adbd8b0184a 100644 --- a/modules/swagger-generator/src/main/webapp/WEB-INF/web.xml +++ b/modules/swagger-generator/src/main/webapp/WEB-INF/web.xml @@ -41,7 +41,6 @@ Bootstrap io.swagger.generator.Bootstrap - 2 generator.host localhost:8001 @@ -50,6 +49,7 @@ generator.protocol http + 2 ApiOriginFilter From 2b9fe5c9bf9d79d5bb91e1d889e6759c37ac9b0d Mon Sep 17 00:00:00 2001 From: xhh Date: Wed, 2 Dec 2015 10:24:01 +0800 Subject: [PATCH 098/211] Escape characters for text in Clojure client Closes #1648 --- .../swagger/codegen/languages/ClojureClientCodegen.java | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/ClojureClientCodegen.java b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/ClojureClientCodegen.java index a358cc05b51..a850785a7db 100644 --- a/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/ClojureClientCodegen.java +++ b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/ClojureClientCodegen.java @@ -177,6 +177,14 @@ public class ClojureClientCodegen extends DefaultCodegen implements CodegenConfi return name; } + @Override + public String escapeText(String input) { + if (input == null) { + return null; + } + return input.trim().replace("\\", "\\\\").replace("\"", "\\\""); + } + @Override public Map postProcessOperations(Map operations) { Map objs = (Map) operations.get("operations"); From cea8ad40cddf1a018aae3507130d0fc062acb4c7 Mon Sep 17 00:00:00 2001 From: wing328 Date: Wed, 2 Dec 2015 16:01:29 +0800 Subject: [PATCH 099/211] make apiclient less mutable --- .../main/resources/csharp/ApiClient.mustache | 51 ++--------------- .../resources/csharp/Configuration.mustache | 23 +++++++- .../src/main/resources/csharp/api.mustache | 38 ++++++++----- .../src/main/csharp/IO/Swagger/Api/PetApi.cs | 52 +++++++++++------- .../main/csharp/IO/Swagger/Api/StoreApi.cs | 44 +++++++++------ .../src/main/csharp/IO/Swagger/Api/UserApi.cs | 52 +++++++++++------- .../csharp/IO/Swagger/Client/ApiClient.cs | 51 ++--------------- .../csharp/IO/Swagger/Client/Configuration.cs | 29 +++++++++- .../SwaggerClientTest.userprefs | 10 ++-- .../SwaggerClientTest/TestConfiguration.cs | 31 ++++++++++- .../bin/Debug/SwaggerClientTest.dll | Bin 80384 -> 80896 bytes .../bin/Debug/SwaggerClientTest.dll.mdb | Bin 25989 -> 26270 bytes ...ClientTest.csproj.FilesWrittenAbsolute.txt | 12 +--- .../obj/Debug/SwaggerClientTest.dll | Bin 80384 -> 80896 bytes .../obj/Debug/SwaggerClientTest.dll.mdb | Bin 25989 -> 26270 bytes 15 files changed, 205 insertions(+), 188 deletions(-) diff --git a/modules/swagger-codegen/src/main/resources/csharp/ApiClient.mustache b/modules/swagger-codegen/src/main/resources/csharp/ApiClient.mustache index acc99626c58..5dda78a41a4 100644 --- a/modules/swagger-codegen/src/main/resources/csharp/ApiClient.mustache +++ b/modules/swagger-codegen/src/main/resources/csharp/ApiClient.mustache @@ -18,16 +18,16 @@ namespace {{packageName}}.Client /// public class ApiClient { - private readonly Dictionary _defaultHeaderMap = new Dictionary(); - /// /// Initializes a new instance of the class. /// /// The base path. public ApiClient(String basePath="{{basePath}}") { - BasePath = basePath; - RestClient = new RestClient(BasePath); + if (String.IsNullOrEmpty(basePath)) + throw new ArgumentException("basePath cannot be empty"); + + RestClient = new RestClient(basePath); } /// @@ -36,36 +36,12 @@ namespace {{packageName}}.Client /// The default API client. public static ApiClient Default = new ApiClient(); - /// - /// Gets or sets the base path. - /// - /// The base path - public string BasePath { get; set; } - /// /// Gets or sets the RestClient. /// /// An instance of the RestClient public RestClient RestClient { get; set; } - /// - /// Gets the default header. - /// - public Dictionary DefaultHeader - { - 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( String path, RestSharp.Method method, Dictionary queryParams, String postBody, @@ -74,10 +50,6 @@ namespace {{packageName}}.Client { var request = new RestRequest(path, method); - // add default header, if any - foreach(var defaultHeader in _defaultHeaderMap) - request.AddHeader(defaultHeader.Key, defaultHeader.Value); - // add path parameter, if any foreach(var param in pathParams) request.AddParameter(param.Key, param.Value, ParameterType.UrlSegment); @@ -124,8 +96,6 @@ namespace {{packageName}}.Client var request = PrepareRequest( path, method, queryParams, postBody, headerParams, formParams, fileParams, pathParams); var response = RestClient.Execute(request); - StatusCode = (int) response.StatusCode; - ResponseHeaders = response.Headers.ToDictionary(x => x.Name, x => x.Value.ToString()); return (Object) response; } @@ -149,22 +119,9 @@ namespace {{packageName}}.Client var request = PrepareRequest( path, method, queryParams, postBody, headerParams, formParams, fileParams, pathParams); var response = await RestClient.ExecuteTaskAsync(request); - StatusCode = (int)response.StatusCode; - ResponseHeaders = response.Headers.ToDictionary(x => x.Name, x => x.Value.ToString()); return (Object)response; } - /// - /// Add default header. - /// - /// Header field name. - /// Header field value. - /// - public void AddDefaultHeader(string key, string value) - { - _defaultHeaderMap.Add(key, value); - } - /// /// Escape string (url-encoded). /// diff --git a/modules/swagger-codegen/src/main/resources/csharp/Configuration.mustache b/modules/swagger-codegen/src/main/resources/csharp/Configuration.mustache index a28b395b0db..46dde35d8d3 100644 --- a/modules/swagger-codegen/src/main/resources/csharp/Configuration.mustache +++ b/modules/swagger-codegen/src/main/resources/csharp/Configuration.mustache @@ -41,7 +41,28 @@ namespace {{packageName}}.Client /// /// The API client. public ApiClient ApiClient; - + + private readonly Dictionary _defaultHeaderMap = new Dictionary(); + + /// + /// Gets the default header. + /// + public Dictionary DefaultHeader + { + get { return _defaultHeaderMap; } + } + + /// + /// Add default header. + /// + /// Header field name. + /// Header field value. + /// + public void AddDefaultHeader(string key, string value) + { + _defaultHeaderMap.Add(key, value); + } + /// /// Gets or sets the username (HTTP basic authentication). /// diff --git a/modules/swagger-codegen/src/main/resources/csharp/api.mustache b/modules/swagger-codegen/src/main/resources/csharp/api.mustache index 3689729ce41..7a9fe4d8b09 100644 --- a/modules/swagger-codegen/src/main/resources/csharp/api.mustache +++ b/modules/swagger-codegen/src/main/resources/csharp/api.mustache @@ -49,8 +49,7 @@ namespace {{packageName}}.Api /// public {{classname}}(String basePath) { - this.Configuration = Configuration.Default; - this.SetBasePath(basePath); + this.Configuration = new Configuration(new ApiClient(basePath)); } /// @@ -67,23 +66,13 @@ namespace {{packageName}}.Api this.Configuration = configuration; } - /// - /// Sets the base path of the API client. - /// - /// The base path - /// The base path - public void SetBasePath(String basePath) - { - this.Configuration.ApiClient.BasePath = basePath; - } - /// /// Gets the base path of the API client. /// /// The base path public String GetBasePath() { - return this.Configuration.ApiClient.BasePath; + return this.Configuration.BasePath; } /// @@ -101,6 +90,27 @@ namespace {{packageName}}.Api /// Gets the response headers of the previous request /// public Dictionary ResponseHeaders { get; private set; } + + private readonly Dictionary _defaultHeaderMap = new Dictionary(); + + /// + /// Gets the default header. + /// + public Dictionary DefaultHeader + { + get { return _defaultHeaderMap; } + } + + /// + /// Add default header. + /// + /// Header field name. + /// Header field value. + /// + public void AddDefaultHeader(string key, string value) + { + _defaultHeaderMap.Add(key, value); + } {{#operation}} /// @@ -119,7 +129,7 @@ namespace {{packageName}}.Api var pathParams = new Dictionary(); var queryParams = new Dictionary(); - var headerParams = new Dictionary(); + var headerParams = new Dictionary(Configuration.DefaultHeader); var formParams = new Dictionary(); var fileParams = new Dictionary(); String postBody = null; diff --git a/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Api/PetApi.cs b/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Api/PetApi.cs index 989ee05d0d9..e3b4aad14cd 100644 --- a/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Api/PetApi.cs +++ b/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Api/PetApi.cs @@ -198,8 +198,7 @@ namespace IO.Swagger.Api /// public PetApi(String basePath) { - this.Configuration = Configuration.Default; - this.SetBasePath(basePath); + this.Configuration = new Configuration(new ApiClient(basePath)); } /// @@ -216,23 +215,13 @@ namespace IO.Swagger.Api this.Configuration = configuration; } - /// - /// Sets the base path of the API client. - /// - /// The base path - /// The base path - public void SetBasePath(String basePath) - { - this.Configuration.ApiClient.BasePath = basePath; - } - /// /// Gets the base path of the API client. /// /// The base path public String GetBasePath() { - return this.Configuration.ApiClient.BasePath; + return this.Configuration.BasePath; } /// @@ -250,6 +239,27 @@ namespace IO.Swagger.Api /// Gets the response headers of the previous request /// public Dictionary ResponseHeaders { get; private set; } + + private readonly Dictionary _defaultHeaderMap = new Dictionary(); + + /// + /// Gets the default header. + /// + public Dictionary DefaultHeader + { + get { return _defaultHeaderMap; } + } + + /// + /// Add default header. + /// + /// Header field name. + /// Header field value. + /// + public void AddDefaultHeader(string key, string value) + { + _defaultHeaderMap.Add(key, value); + } /// @@ -265,7 +275,7 @@ namespace IO.Swagger.Api var pathParams = new Dictionary(); var queryParams = new Dictionary(); - var headerParams = new Dictionary(); + var headerParams = new Dictionary(Configuration.DefaultHeader); var formParams = new Dictionary(); var fileParams = new Dictionary(); String postBody = null; @@ -384,7 +394,7 @@ namespace IO.Swagger.Api var pathParams = new Dictionary(); var queryParams = new Dictionary(); - var headerParams = new Dictionary(); + var headerParams = new Dictionary(Configuration.DefaultHeader); var formParams = new Dictionary(); var fileParams = new Dictionary(); String postBody = null; @@ -503,7 +513,7 @@ namespace IO.Swagger.Api var pathParams = new Dictionary(); var queryParams = new Dictionary(); - var headerParams = new Dictionary(); + var headerParams = new Dictionary(Configuration.DefaultHeader); var formParams = new Dictionary(); var fileParams = new Dictionary(); String postBody = null; @@ -621,7 +631,7 @@ namespace IO.Swagger.Api var pathParams = new Dictionary(); var queryParams = new Dictionary(); - var headerParams = new Dictionary(); + var headerParams = new Dictionary(Configuration.DefaultHeader); var formParams = new Dictionary(); var fileParams = new Dictionary(); String postBody = null; @@ -742,7 +752,7 @@ namespace IO.Swagger.Api var pathParams = new Dictionary(); var queryParams = new Dictionary(); - var headerParams = new Dictionary(); + var headerParams = new Dictionary(Configuration.DefaultHeader); var formParams = new Dictionary(); var fileParams = new Dictionary(); String postBody = null; @@ -867,7 +877,7 @@ namespace IO.Swagger.Api var pathParams = new Dictionary(); var queryParams = new Dictionary(); - var headerParams = new Dictionary(); + var headerParams = new Dictionary(Configuration.DefaultHeader); var formParams = new Dictionary(); var fileParams = new Dictionary(); String postBody = null; @@ -998,7 +1008,7 @@ namespace IO.Swagger.Api var pathParams = new Dictionary(); var queryParams = new Dictionary(); - var headerParams = new Dictionary(); + var headerParams = new Dictionary(Configuration.DefaultHeader); var formParams = new Dictionary(); var fileParams = new Dictionary(); String postBody = null; @@ -1127,7 +1137,7 @@ namespace IO.Swagger.Api var pathParams = new Dictionary(); var queryParams = new Dictionary(); - var headerParams = new Dictionary(); + var headerParams = new Dictionary(Configuration.DefaultHeader); var formParams = new Dictionary(); var fileParams = new Dictionary(); String postBody = null; diff --git a/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Api/StoreApi.cs b/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Api/StoreApi.cs index 2eae0cebc46..5fdd6805a2a 100644 --- a/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Api/StoreApi.cs +++ b/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Api/StoreApi.cs @@ -106,8 +106,7 @@ namespace IO.Swagger.Api /// public StoreApi(String basePath) { - this.Configuration = Configuration.Default; - this.SetBasePath(basePath); + this.Configuration = new Configuration(new ApiClient(basePath)); } /// @@ -124,23 +123,13 @@ namespace IO.Swagger.Api this.Configuration = configuration; } - /// - /// Sets the base path of the API client. - /// - /// The base path - /// The base path - public void SetBasePath(String basePath) - { - this.Configuration.ApiClient.BasePath = basePath; - } - /// /// Gets the base path of the API client. /// /// The base path public String GetBasePath() { - return this.Configuration.ApiClient.BasePath; + return this.Configuration.BasePath; } /// @@ -158,6 +147,27 @@ namespace IO.Swagger.Api /// Gets the response headers of the previous request /// public Dictionary ResponseHeaders { get; private set; } + + private readonly Dictionary _defaultHeaderMap = new Dictionary(); + + /// + /// Gets the default header. + /// + public Dictionary DefaultHeader + { + get { return _defaultHeaderMap; } + } + + /// + /// Add default header. + /// + /// Header field name. + /// Header field value. + /// + public void AddDefaultHeader(string key, string value) + { + _defaultHeaderMap.Add(key, value); + } /// @@ -172,7 +182,7 @@ namespace IO.Swagger.Api var pathParams = new Dictionary(); var queryParams = new Dictionary(); - var headerParams = new Dictionary(); + var headerParams = new Dictionary(Configuration.DefaultHeader); var formParams = new Dictionary(); var fileParams = new Dictionary(); String postBody = null; @@ -287,7 +297,7 @@ namespace IO.Swagger.Api var pathParams = new Dictionary(); var queryParams = new Dictionary(); - var headerParams = new Dictionary(); + var headerParams = new Dictionary(Configuration.DefaultHeader); var formParams = new Dictionary(); var fileParams = new Dictionary(); String postBody = null; @@ -392,7 +402,7 @@ namespace IO.Swagger.Api var pathParams = new Dictionary(); var queryParams = new Dictionary(); - var headerParams = new Dictionary(); + var headerParams = new Dictionary(Configuration.DefaultHeader); var formParams = new Dictionary(); var fileParams = new Dictionary(); String postBody = null; @@ -499,7 +509,7 @@ namespace IO.Swagger.Api var pathParams = new Dictionary(); var queryParams = new Dictionary(); - var headerParams = new Dictionary(); + var headerParams = new Dictionary(Configuration.DefaultHeader); var formParams = new Dictionary(); var fileParams = new Dictionary(); String postBody = null; diff --git a/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Api/UserApi.cs b/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Api/UserApi.cs index e3e67eaa9fb..cb70245d911 100644 --- a/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Api/UserApi.cs +++ b/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Api/UserApi.cs @@ -190,8 +190,7 @@ namespace IO.Swagger.Api /// public UserApi(String basePath) { - this.Configuration = Configuration.Default; - this.SetBasePath(basePath); + this.Configuration = new Configuration(new ApiClient(basePath)); } /// @@ -208,23 +207,13 @@ namespace IO.Swagger.Api this.Configuration = configuration; } - /// - /// Sets the base path of the API client. - /// - /// The base path - /// The base path - public void SetBasePath(String basePath) - { - this.Configuration.ApiClient.BasePath = basePath; - } - /// /// Gets the base path of the API client. /// /// The base path public String GetBasePath() { - return this.Configuration.ApiClient.BasePath; + return this.Configuration.BasePath; } /// @@ -242,6 +231,27 @@ namespace IO.Swagger.Api /// Gets the response headers of the previous request /// public Dictionary ResponseHeaders { get; private set; } + + private readonly Dictionary _defaultHeaderMap = new Dictionary(); + + /// + /// Gets the default header. + /// + public Dictionary DefaultHeader + { + get { return _defaultHeaderMap; } + } + + /// + /// Add default header. + /// + /// Header field name. + /// Header field value. + /// + public void AddDefaultHeader(string key, string value) + { + _defaultHeaderMap.Add(key, value); + } /// @@ -257,7 +267,7 @@ namespace IO.Swagger.Api var pathParams = new Dictionary(); var queryParams = new Dictionary(); - var headerParams = new Dictionary(); + var headerParams = new Dictionary(Configuration.DefaultHeader); var formParams = new Dictionary(); var fileParams = new Dictionary(); String postBody = null; @@ -360,7 +370,7 @@ namespace IO.Swagger.Api var pathParams = new Dictionary(); var queryParams = new Dictionary(); - var headerParams = new Dictionary(); + var headerParams = new Dictionary(Configuration.DefaultHeader); var formParams = new Dictionary(); var fileParams = new Dictionary(); String postBody = null; @@ -463,7 +473,7 @@ namespace IO.Swagger.Api var pathParams = new Dictionary(); var queryParams = new Dictionary(); - var headerParams = new Dictionary(); + var headerParams = new Dictionary(Configuration.DefaultHeader); var formParams = new Dictionary(); var fileParams = new Dictionary(); String postBody = null; @@ -567,7 +577,7 @@ namespace IO.Swagger.Api var pathParams = new Dictionary(); var queryParams = new Dictionary(); - var headerParams = new Dictionary(); + var headerParams = new Dictionary(Configuration.DefaultHeader); var formParams = new Dictionary(); var fileParams = new Dictionary(); String postBody = null; @@ -671,7 +681,7 @@ namespace IO.Swagger.Api var pathParams = new Dictionary(); var queryParams = new Dictionary(); - var headerParams = new Dictionary(); + var headerParams = new Dictionary(Configuration.DefaultHeader); var formParams = new Dictionary(); var fileParams = new Dictionary(); String postBody = null; @@ -774,7 +784,7 @@ namespace IO.Swagger.Api var pathParams = new Dictionary(); var queryParams = new Dictionary(); - var headerParams = new Dictionary(); + var headerParams = new Dictionary(Configuration.DefaultHeader); var formParams = new Dictionary(); var fileParams = new Dictionary(); String postBody = null; @@ -882,7 +892,7 @@ namespace IO.Swagger.Api var pathParams = new Dictionary(); var queryParams = new Dictionary(); - var headerParams = new Dictionary(); + var headerParams = new Dictionary(Configuration.DefaultHeader); var formParams = new Dictionary(); var fileParams = new Dictionary(); String postBody = null; @@ -993,7 +1003,7 @@ namespace IO.Swagger.Api var pathParams = new Dictionary(); var queryParams = new Dictionary(); - var headerParams = new Dictionary(); + var headerParams = new Dictionary(Configuration.DefaultHeader); var formParams = new Dictionary(); var fileParams = new Dictionary(); String postBody = null; diff --git a/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Client/ApiClient.cs b/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Client/ApiClient.cs index 1d511e7624b..07b31cbf817 100644 --- a/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Client/ApiClient.cs +++ b/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Client/ApiClient.cs @@ -18,16 +18,16 @@ namespace IO.Swagger.Client /// public class ApiClient { - private readonly Dictionary _defaultHeaderMap = new Dictionary(); - /// /// Initializes a new instance of the class. /// /// The base path. public ApiClient(String basePath="http://petstore.swagger.io/v2") { - BasePath = basePath; - RestClient = new RestClient(BasePath); + if (String.IsNullOrEmpty(basePath)) + throw new ArgumentException("basePath cannot be empty"); + + RestClient = new RestClient(basePath); } /// @@ -36,36 +36,12 @@ namespace IO.Swagger.Client /// The default API client. public static ApiClient Default = new ApiClient(); - /// - /// Gets or sets the base path. - /// - /// The base path - public string BasePath { get; set; } - /// /// Gets or sets the RestClient. /// /// An instance of the RestClient public RestClient RestClient { get; set; } - /// - /// Gets the default header. - /// - public Dictionary DefaultHeader - { - 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( String path, RestSharp.Method method, Dictionary queryParams, String postBody, @@ -74,10 +50,6 @@ namespace IO.Swagger.Client { var request = new RestRequest(path, method); - // add default header, if any - foreach(var defaultHeader in _defaultHeaderMap) - request.AddHeader(defaultHeader.Key, defaultHeader.Value); - // add path parameter, if any foreach(var param in pathParams) request.AddParameter(param.Key, param.Value, ParameterType.UrlSegment); @@ -124,8 +96,6 @@ namespace IO.Swagger.Client var request = PrepareRequest( path, method, queryParams, postBody, headerParams, formParams, fileParams, pathParams); var response = RestClient.Execute(request); - StatusCode = (int) response.StatusCode; - ResponseHeaders = response.Headers.ToDictionary(x => x.Name, x => x.Value.ToString()); return (Object) response; } @@ -149,22 +119,9 @@ namespace IO.Swagger.Client var request = PrepareRequest( path, method, queryParams, postBody, headerParams, formParams, fileParams, pathParams); var response = await RestClient.ExecuteTaskAsync(request); - StatusCode = (int)response.StatusCode; - ResponseHeaders = response.Headers.ToDictionary(x => x.Name, x => x.Value.ToString()); return (Object)response; } - /// - /// Add default header. - /// - /// Header field name. - /// Header field value. - /// - public void AddDefaultHeader(string key, string value) - { - _defaultHeaderMap.Add(key, value); - } - /// /// Escape string (url-encoded). /// diff --git a/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Client/Configuration.cs b/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Client/Configuration.cs index a25a2d28fbf..79bc86118b8 100644 --- a/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Client/Configuration.cs +++ b/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Client/Configuration.cs @@ -41,7 +41,34 @@ namespace IO.Swagger.Client /// /// The API client. public ApiClient ApiClient; - + + /// + /// Gets or sets the base path. + /// + /// The base path + public string BasePath { get; set; } + + private readonly Dictionary _defaultHeaderMap = new Dictionary(); + + /// + /// Gets the default header. + /// + public Dictionary DefaultHeader + { + get { return _defaultHeaderMap; } + } + + /// + /// Add default header. + /// + /// Header field name. + /// Header field value. + /// + public void AddDefaultHeader(string key, string value) + { + _defaultHeaderMap.Add(key, value); + } + /// /// Gets or sets the username (HTTP basic authentication). /// diff --git a/samples/client/petstore/csharp/SwaggerClientTest/SwaggerClientTest.userprefs b/samples/client/petstore/csharp/SwaggerClientTest/SwaggerClientTest.userprefs index 2774e9b7536..2b3d5191461 100644 --- a/samples/client/petstore/csharp/SwaggerClientTest/SwaggerClientTest.userprefs +++ b/samples/client/petstore/csharp/SwaggerClientTest/SwaggerClientTest.userprefs @@ -2,8 +2,7 @@ - - + @@ -11,10 +10,9 @@ - - - - + + + diff --git a/samples/client/petstore/csharp/SwaggerClientTest/TestConfiguration.cs b/samples/client/petstore/csharp/SwaggerClientTest/TestConfiguration.cs index 177fd5bf53f..c508917e7d5 100644 --- a/samples/client/petstore/csharp/SwaggerClientTest/TestConfiguration.cs +++ b/samples/client/petstore/csharp/SwaggerClientTest/TestConfiguration.cs @@ -26,9 +26,10 @@ namespace SwaggerClient.TestConfiguration public void TestBasePath () { PetApi p = new PetApi ("http://new-basepath.com"); - Assert.AreEqual (p.Configuration.ApiClient.BasePath, "http://new-basepath.com"); - Assert.AreSame (p.Configuration, Configuration.Default); - + Assert.AreEqual (p.Configuration.ApiClient.RestClient.BaseUrl, "http://new-basepath.com"); + // Given that PetApi is initailized with a base path, a new configuration (with a new ApiClient) + // is created by default + Assert.AreNotSame (p.Configuration, Configuration.Default); } [Test ()] @@ -50,5 +51,29 @@ namespace SwaggerClient.TestConfiguration Assert.AreNotSame (p3.Configuration, p1.Configuration); } + + [Test ()] + public void TestUsage () + { + // basic use case using default base URL + PetApi p1 = new PetApi (); + Assert.AreSame (p1.Configuration, Configuration.Default, "PetApi should use default configuration"); + + // using a different base URL + PetApi p2 = new PetApi ("http://new-base-url.com/"); + Assert.AreEqual (p2.Configuration.ApiClient.RestClient.BaseUrl.ToString(), "http://new-base-url.com/"); + + // using a different configuration + Configuration c1 = new Configuration (); + PetApi p3 = new PetApi (c1); + Assert.AreSame (p3.Configuration, c1); + + // using a different base URL via a new ApiClient + ApiClient a1 = new ApiClient ("http://new-api-client.com"); + Configuration c2 = new Configuration (a1); + PetApi p4 = new PetApi (c2); + Assert.AreSame (p4.Configuration.ApiClient, a1); + } + } } \ No newline at end of file diff --git a/samples/client/petstore/csharp/SwaggerClientTest/bin/Debug/SwaggerClientTest.dll b/samples/client/petstore/csharp/SwaggerClientTest/bin/Debug/SwaggerClientTest.dll index 70db74529f5b75d232cb69f96f6ea3b99b3157fd..af6c40173eb69c3ea004d294c53b220768ee9b15 100755 GIT binary patch literal 80896 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 ZYXtsH{aM8O9#Qu?R(}8g=QmFR{{zwY=2idz diff --git a/samples/client/petstore/csharp/SwaggerClientTest/bin/Debug/SwaggerClientTest.dll.mdb b/samples/client/petstore/csharp/SwaggerClientTest/bin/Debug/SwaggerClientTest.dll.mdb index dbafd969d6c8fe219bc7d1fbb371866938468952..52a34556bcf0ae726f861c4cfc48b42ea3251ce5 100644 GIT binary patch literal 26270 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 literal 25989 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 diff --git a/samples/client/petstore/csharp/SwaggerClientTest/obj/Debug/SwaggerClientTest.csproj.FilesWrittenAbsolute.txt b/samples/client/petstore/csharp/SwaggerClientTest/obj/Debug/SwaggerClientTest.csproj.FilesWrittenAbsolute.txt index 67be9ad1f14..b46eed9f9d6 100644 --- a/samples/client/petstore/csharp/SwaggerClientTest/obj/Debug/SwaggerClientTest.csproj.FilesWrittenAbsolute.txt +++ b/samples/client/petstore/csharp/SwaggerClientTest/obj/Debug/SwaggerClientTest.csproj.FilesWrittenAbsolute.txt @@ -1,16 +1,8 @@ -/Users/williamcheng/Code/csharp/swagger-codegen/samples/client/petstore/csharp/SwaggerClientTest/obj/Debug/.NETFramework,Version=v4.5.AssemblyAttribute.cs -/Users/williamcheng/Code/csharp/swagger-codegen/samples/client/petstore/csharp/SwaggerClientTest/bin/Debug/SwaggerClientTest.dll.mdb -/Users/williamcheng/Code/csharp/swagger-codegen/samples/client/petstore/csharp/SwaggerClientTest/bin/Debug/SwaggerClientTest.dll -/Users/williamcheng/Code/csharp/swagger-codegen/samples/client/petstore/csharp/SwaggerClientTest/obj/Debug/SwaggerClientTest.dll -/Users/williamcheng/Code/csharp/swagger-codegen/samples/client/petstore/csharp/SwaggerClientTest/obj/Debug/SwaggerClientTest.dll.mdb -/Users/williamcheng/Code/csharp/swagger-codegen/samples/client/petstore/csharp/SwaggerClientTest/bin/Debug/Newtonsoft.Json.dll -/Users/williamcheng/Code/csharp/swagger-codegen/samples/client/petstore/csharp/SwaggerClientTest/bin/Debug/nunit.framework.dll -/Users/williamcheng/Code/csharp/swagger-codegen/samples/client/petstore/csharp/SwaggerClientTest/bin/Debug/RestSharp.dll /Users/williamcheng/Code/wing328/swagger-codegen/samples/client/petstore/csharp/SwaggerClientTest/obj/Debug/.NETFramework,Version=v4.5.AssemblyAttribute.cs +/Users/williamcheng/Code/wing328/swagger-codegen/samples/client/petstore/csharp/SwaggerClientTest/bin/Debug/SwaggerClientTest.dll.mdb +/Users/williamcheng/Code/wing328/swagger-codegen/samples/client/petstore/csharp/SwaggerClientTest/bin/Debug/SwaggerClientTest.dll /Users/williamcheng/Code/wing328/swagger-codegen/samples/client/petstore/csharp/SwaggerClientTest/obj/Debug/SwaggerClientTest.dll /Users/williamcheng/Code/wing328/swagger-codegen/samples/client/petstore/csharp/SwaggerClientTest/obj/Debug/SwaggerClientTest.dll.mdb /Users/williamcheng/Code/wing328/swagger-codegen/samples/client/petstore/csharp/SwaggerClientTest/bin/Debug/Newtonsoft.Json.dll /Users/williamcheng/Code/wing328/swagger-codegen/samples/client/petstore/csharp/SwaggerClientTest/bin/Debug/nunit.framework.dll /Users/williamcheng/Code/wing328/swagger-codegen/samples/client/petstore/csharp/SwaggerClientTest/bin/Debug/RestSharp.dll -/Users/williamcheng/Code/wing328/swagger-codegen/samples/client/petstore/csharp/SwaggerClientTest/bin/Debug/SwaggerClientTest.dll.mdb -/Users/williamcheng/Code/wing328/swagger-codegen/samples/client/petstore/csharp/SwaggerClientTest/bin/Debug/SwaggerClientTest.dll diff --git a/samples/client/petstore/csharp/SwaggerClientTest/obj/Debug/SwaggerClientTest.dll b/samples/client/petstore/csharp/SwaggerClientTest/obj/Debug/SwaggerClientTest.dll index 70db74529f5b75d232cb69f96f6ea3b99b3157fd..af6c40173eb69c3ea004d294c53b220768ee9b15 100755 GIT binary patch literal 80896 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 ZYXtsH{aM8O9#Qu?R(}8g=QmFR{{zwY=2idz diff --git a/samples/client/petstore/csharp/SwaggerClientTest/obj/Debug/SwaggerClientTest.dll.mdb b/samples/client/petstore/csharp/SwaggerClientTest/obj/Debug/SwaggerClientTest.dll.mdb index dbafd969d6c8fe219bc7d1fbb371866938468952..52a34556bcf0ae726f861c4cfc48b42ea3251ce5 100644 GIT binary patch literal 26270 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 literal 25989 zcmdUX2VfLM`~J-BCb`RT%3T^9EhN-*?gE6nL?i*F3M43!fRJ*KgfuS&!~%pSfzYIv z&^sz3T|fj;nt=4C^rCbH{G|S#*~T3tz*qnI6P|mXeP?!e-kEpG?(LrEg8mQv>s)SO zBI3VgYp=dHv{{W-OV=N`YQE^bdWemX93&0wM93>(FKL_U`6*&rdrHVHq_2EcJO=w@ z`>}tI@lOrb2wQ|qr=f4>+U&WZebO>A(h@V1Q*BwjLSwR1Y_MeYGMgeobNeLr>SePB zC&SpwmKBL}fTKgaC%o7eyDFMWG{J!NxYvM-rY9vxs2QF{5$KP;Ga zc+H}tp4r)+L){Y2kvZk9{9@d(FcMWMQFO9a=kv6-fM4g zTzd4y4P;h%bEF-{zKqbA#5`NCZ2JeLv_(~qJy(M|^czuiY`eFQ?OFU&`RmxC3+?SG zHhU@MzuRuiqc8VX8GWSos#>1>?aO3Z`D_AA4W*Rc?LhBEql2c;9(1Z`;hXPePA{*e z@08f9l+r)Ex1_de*ZPpm&m*P`I@aA>{w8HHcG$E~O7UlY{HSXD#x{GlMa(%pWm5VA zlJVbPQm}PJ>7mdpu-X~^#QK9YcHaCeTee*w_Ww<3o;TqH*set0?{|9MvWk|VFFStX zK??piWqQ%LTg(sJx4&ZT6-(b6Ieh${{I>}fjw(VpLU=-42yrFEjSwssv08K|L`z5o zLUiK76WM;C)aqd|8_k5$iW;3kXVB0^USzS?5-)Zb!tG}ntd_2F4!yVDTSIqvk)2+< zq%5Z?^)Mu{Bj5l58hX`>T=TjvCH}?|C9^ow>{1&B12&N0X$wKc% zPDT^`#+z*L-Y6OG3OQ@iect3}@BL235PHFzT=c#q8Se`@qv$uqO(&zAZ{M1d3ibA#T~mRCbOA8m#7WTT8Tz&x8>$!XXV;Z2W(CM>I!;* z5^k`HdPQ2T)|i;uKN-?vVxrScjglH0k~lY&8#S0r2_EUDc(b=*MTVcr?5Aq#ZVERH zGNh-Qti}XJkzz|!ui;z0x=yF7-%O_uYF=GeNmnUMSGQqhoj$5fHJz@}Te|u>UA-`! zPOq=uHOt3P8{dVWJl$lmCJRV-T&X$S(n~Iops4!b#}Be zxoEs)RO;+O74opkqblXJ&c35(5odpJrNmjdB|6E(xvN}WD$)$=KNC9kv$0mw8W&tv zv?b>YHJ9AaN9P-%p(Cr3snzCJQ|fMQb+WGd`s(Gn?k@BH#k#A}xP4$*b(fec)Lmj< zvF^54Cx>gCsiD-}ZC`T7_pUDnvT`uKX%lnO+SopLCov=6M%JD>y|ClX16>aozbMB zgKLsmeoOt7+T7w#w)%hXUrr-&hH4Y)?}RJ$vXoYTtRpwFv`#Xa*$1b7$u2EU9?z-B zMsEe^YFc80%8JmG0-;V*K4jzKet&Yh)|FaHjgGHFCe)c&r<~SkvFZyJk#5h4$cDoB zsQC|7X3eO#L&~a0=Q+6!Sy6XmU8NpR)+4{v`?X#BdEty>gUv>9GU3j|Eb6f zj!loy)nMUS#wy35w_}l7kKC(2BtWUrF9OMzfy)DhZEm@W8Zfa%H>aBd$+v-<9n2=! z+js0t4+WCLfk&i-g`AxKdLX$Gc+mMqf8lYH59A@=fCnjmu>%UHLa^NnG2# zWF5ViBlNKM^0AIn?QBerMjVS!YUpGW@=KFnn+V$oY1||d=MUA@CgfU^>rM&M2(KDq zAww<0Eb=~^eB&^_FjxBxRme9kh@`mcvd7@;=ur@4lR7d$2Ilg0pA6$C$2}-* zp27XG=Zv4vxg%EA=&9j$N0H;Nop?>CF|-4>uPOPt>HenWvQEzZ^K;6})=9=E!Z?sI zh+-h%PB$gjU%&CXQYjajk&DePH7l2uva_@sT>qIs>HV=#DZLAYO1aaF42l^Xqg2Yh z7;-=60k+Fw?^#jioh$Q`OWPODv(GL>{F`Qqj3;;=^3a4X*+Ti)FIrcxuTTaq;`*S0K|HS!2G z^6#$D{OgypLi2y^oe<|0S`WL>!Fu%Z(N!^PxF1@QgRKs=QfldBYw}C$Ut5>UTKfHY zcjR7X_$j-Jp0nE5a93NCdu{HwQR-+wJ2J3cVY_l!N5^oF?O%-~v5%EqNoDu7G3`jn zTQlEMYG_V-GPnJ__QEz67PI6PDYv3M`MUi|rvz!G$n9!RcDMgYNg5{K`Qa|MCzsk^ zc1n=jvr9cL&>^W{57-0F^GO~bX++j&Mb=hO312H~I#XIDLe!n-VkO&iFcr7v(i@bz ztf2d(?HhExin=|d(^O*mdeu;lYIdkDN!vrY+Z@$S;0|$w=ebtY!x&|-BpI!K(WX{g zUNacenY2hUMzR{xjj}`rCuxcn{;+dYOl)KuREtJeMHdj@6`*g>ymCN*&d<-wPao8{ zvY($Q>xV0{L8KxbGSm%j(zIP%avDq1S4L#~(1{Fx`~2HPrE;jxC*MWkih}3*QICF+ z28-2bG8@_V>E;-zBvtFmUy^J1iJi%^&YyP{8WG9-sm|nd=QH9qj)8i`cT~cDH8lK< z&g5q2TT0^R>_Sg`2EtRrk9?ODzdPz(IULp^G1-`8GNl-$=Opyztaf$u<~kaF@w;Tn zyGxOkQ|WqUBM~Imz3bq0%GJ5{b;*;lWxuGe{2(dldI z^kEHk`bs)|Ej&RH>Z9RLb|FjSZ^jc99+|MIq~cMdSaf4BE94{<_4J4y@8MyQPN+9Y zJ3me!gS$@XDu=`p74>M-++s>dv4~Nl*R`mu*HzK*8@iH>T{kHi(Oq#cA-bpj}!!gP|FqC<7Q4Y zRaNq1MgAE_NVa;KJp#;9yijT>FmQhhv133Os$AJ{rqR_w+;~;e>+9&N)YR~^yOA~B zw&PqpRpllTl}lPyimflMl3ClUv>YP*SSVXv|tji)^i}=;l(?gN*1gvWIvk7p|_5Dx`PmrLD+v zEb2iP_gJFj(6SO%ciGv4?CP=G+3N3dx(7MaYQUXn#CP#=CNYwXW;WP0+9WE4;uZYoq_1+`%`!5GrWkYI>1Mh{B)8p((#y_c8X*Qa+x8-Ep^Tc9&gkr2;YBj3^O(xTb-WgJ1!gM}9KGv8vh)Ip> ztz>dP`2jnxP%*VA*GMI_vri@0&r`@3DPN|@X@%&I@i@OYupz0B#U}3R?^x~Piu3}e(Hp|@kKTabIBId zG87uYsWa9w8Uv~s>luy4pc)#ttv$*2J-1;;d=r(Ln45|*SQyOc+pOeC)XSr`VVbF5 zb3=m3)V#TP4874SIE;Om^cuGZJ;~r+#l3`5Az8h#7unS7TXCCLOBJjBsTbMPYp=7_ zSADJ*Ip6DoVihY^{dX^Nuh)HNtG{}5DjAbHHdXXq&DCa&;H#dWN*1Ipbhg%3f0If! zq;6EKK|(iC|C~zpryg*&2B413`#}Cm$vj9PyZ|m0!FXMFO9uHhuY9al3AIv6{`@B)itX!$?D8C&Q^cTu1vB! z^C!hB#AAKUnM`sv^PICaMDtfB`A6p8iq$N{n5H<3jLI6FC6__4*3rz(BJ;B5D^?*M zeKqT{$oi~roUOGrd$Y*Cte;_3;!)!qk3s-G^HIuRC4{0dVujYTNMn}}l!!;og)DL< z>#A~c$9UB2&L%%)@5z>(aEwRI_U}rXQ#@MO_$9}mwBcZSDi*~k6vsDXu+bP% ziw$<>8b&cBHJZUWWJu1?oM(e^8=_O=6pTXjmGbfQKq$naiG^Te_93Wny+(5*hy0Z@ z@O{B!#IO7D_sNO(Pm0^TyA+J>zrRneynof%>gzthP6pZw?P6`YOS6vqL_3*epX_Y) zcVA{FpWDBHRcT!Je`3~g-(n}*?K_l%I?g)o19M4X?x0+`7>=`!`;1&tk~>pLd+Axn zeO)eDpZg7Ve0n^mJjtE1Dpq@-~f(ol2DJ+S!bNi6R zeU{+VY%!(fdO6H++LFFxX5U$T<+S%5W;pHozT}&}8R*y~TY5$%&^20%t&trkgEhOSm-_)Gt!lijVQb zOEJcVxPcIk({L4dSN2zl*Ws_)E4&(iUZRcngzpvp>PHrTxa31tH%^BSrk)1tICk~N zi5VY#NIv~&_(#H3xKs{`a^+&Kce*WAfs0_bG}3WP!xC=6Q@nW1Bi@{jmA4toZ(#$> zY^|9I7U>+`d?jAX2W$C2;j?x?h?X}swrcq>aHN(G((-;tYWzA%z3?Nl^`q}m7?o0L z`cx_6#8UioWiY;U308hgc6_|^W2fqPQUaAmen*DAOpn&eWTmkehNoLCX1H#Mm#Rjn z7gR(;dy*Mx!VO|p;kC3pD+_!^g@kJP`dVJ75LN?7tHL)xEv){89QowvCr-5>yx)Tx z6u46*o_QF%!xU+WoZ4urT+>x?WbD4aKl!=;{{Fbv@uU*nbMq4O@^jm!;r6Y{EdzvC z-4KRoamtA|S8EkeYU)f?mUozAQ-m8>{UVK418$gF@lF<;;2sDU=N#Sgy41MU`5JsB zyvoD7RB)+V0g|imcYiW#0R3tJCQWyu%4tBTM(zU*U{X3k1H!TRZ$Nk#)(sjE7gdgl zxGI@V#O+CD6H&9wCZZ8COSQk0KDV>P*v--A=HQ#fKJqR?}AC zjgr9!t#c0*b7&wvJP`HsRNuTR)H!+>3nY{-K3?gkd{qQafR?Wsh(k;rM9I8CbUsL$ zsdc|V|2l}CVkVAoxEFyp$(-6eD?d|ceT1!!(^A~RT5pXuH7vx3e3t4w&QOW>)pEL< zIMArUbo5~56t8TC{%$bc!b}+Il35tO!s%ECKyZW?nTyPpcrg^cg^@_dd+_l1l>^x0 z=wNzG+L8U#1a>r{2=G+sGeR)E%KM;0cw>i=Lns+LgpLCthJ_Gfp`pS#IaQ8X+~1#_ z7=OZ;6K=2?G4|l5c{no&$E(O!0!QRC<$yz}NxE$p4Q^%&&5Rr6?tbdxz3l9HixF-U4yx_THTYlhLaAZFsO z%3li79Wd=2Mt3=;NcRHiIT+6mqZfoUXAjqK|8G3R`)Tm-F-kPxQ##_)Cmv27PRW$v zbSg;j@SOa0BwY&Avf=b|#}wJaZ7}{Yoc<`JNgi%hU1x3h1)cybs|~}G(3HYM6VGkM zNXv2ci08HAQ}2^Gv?Sgp6J8@bgOZ&cPOnLY$H8df2ucQxpo2kzr^n?lQRxJjCXS$! z98+XZzl3r52>O+f=IrS_m;b(}Prd!+;3?ky5qNzKh^4`y{F{hKZ|<} zo$?vF=4W(1h&jtzecyQaKc4Of3I6X_UaC0<)A{lAf@6x}Ka7vY)5k)Z>)mB^ZRO1k2k-FYz3{@ulnL-}0-X<%{8KHTNXb_d=?V}tVNw|> z&%LUxFn&LgZgWnPd{mu+`Se73MoCq3d!E0p=uyf_;>l=LhCg`v%E1%XPVD7@hdAq_ ziS)5_ak=ONFT*S0?Fa|ISPL<~enc6zPo_JhqA5IE^j>Nj`0t zR|%?hFs`3Qzj02JeL4j5;c4`UoXV;3-eB4N39H%CqE2?DjMjNJ<}}=&IOFYU^p135 zc)?wrj`@E&y$%w*;JAZw#Bq;d9590poZ*xvdBIJCdHM`GLrKN=7|&m^{@Y&QiE=zi zz7A(xKZAZFotSyCqJ)yKOXy0F*|?aVO%H>l@)yf1 zP3{tmmuJ)8oYQ3A2F;;l@Eke>B<`u^c0Xq|UDk;9g6`trg)onDvvIyTbLd>@w9JRe zb8-DMmreyqKHN}zSPJ8^x%6}AG}(tAVctHM?od+I+$v$6{QQ+;S-w1(aPTl|Sq;RV zjCSw}&qWIlL|;G|F3zQwq@pmtZqB3R);#(LNb(E64PZb@baQUdeANDYIt1j9Ci^uL z=2`RUY$a9A&3%a#@e4+@7dTbg$hHwB*fgJhD;0!!^}_;6eq2DegQSx0lvlglF&K|8 zpeLNuWUubPe0Kr;OG#C8V}y0?zt&oETo5nYM^d z2T4Ayme;b}=P-V;h<@puCi}Dl=ADb^E;$w7I)BF2a31RYT~+V6C&)KP%aTvivF^zXry&i|IP&G^r%~0hkXi zriWOn9zQenEq+{TDPVv;3*HTQKtBfG06d|qvR|J9yr3I^>jU1TF~3U+ko28?r<&x&enl8Li+%9p=06b zCg^(5NzmPa`q1;3(?9@dCHN~K5E?(CMZN=qpwEMk0>RMt!MA`AXirp<8VH3B1lI(@ zpqqmufCkVB;En+9)Vk(@QvowHerk&h1j3=`fhPkEq4DclN^g-};pfU6n@EITi znn#2D1G))x6=*$Rfer`P17e`x0XGAhL-zwG11+GZfQJEZK(7Ta0N#Y&3*H8_guVzq z3ABQK2>ugj4eg1>cL&-)2ZCz?ZK0#V5kNa=JA&di^jpw{(EWk-&_xK4sz3+mso+UK zN9g4UmT({zdNX(<5C^>7dFJoG2v93TOD5_kmA6?z4D9*_xr2>dOO1$_^E7RZLKjDU3ma-bu?b%6Jw+k;yG zcIckqu0SsI$BcnI=<(npARl@ucs5V~y#!*;BWTt+9zuT%ZA9moitSIJ1EA{y{h@=gpa;-{p@%{b0){|OMrZN`hC(j_&j*GKnZk33@UEGOz1k`YQQY$NU#~04LuTr%?0Q=(D>~Vg5NtK zbD=MQ&jRzHRTzZ+fSwOs1Nv290d#9{5U>z>KX@##2pYffLEZ-zLz^&Ac>_zJ6TnS@ zrO^GrslYPmN#J3?=g=GmvmMZ1K$k$b2EK$|30?{;hu#hT4)_ZCA{f88K~_Ms!S7G# zuc50$>wuNeuY&`DRnYH%+X1VgGr-Bf8t6js2f$kB$>7nzI_T}-`M`SUU%`ifZ=i33 zuK*jM-5X%~1~x+bf_;EZ(2c;sz_-wC!7;#Q=&|4e;5+E0;1Xa9^d<0SU@Nr034IFs zd+4UnVZb)%cyL?b2k3M#zKSD1LJt7<0k%U=1Q!E4pqGK?0z09%fY$-LpsAUVgV4L7 zt3kg4`~=+u902Trwu9dQ_CkLR9tG@!-U{9f{0x1J*?|4fH^3Kx1JEwv=)cehp{qa} zfJ4v?!1aK`&~JiY1CBs<19t+BLg#|hfn(6a!2^Kf&@;gkffLZHz{`M>(7V7}fM1|Z z4Z+aALcayw6gUN)4o(10LmvhA0nR|jG$P~<^jYXQ=nlX+=rnK-;5>AHZ~<@udIESP za1nYbcn)w0`aAGi;4<_P@E+hd=xgBf!0*spV?yphUxBU+T@knn9SW`kT!U@_js&hl zCxByt8_-+8nZQlxU%`8UThRBwSAajDZ4v12z@O0jz=gnV=+od|fIHB4!PkJh&=s2C zi!9(TXg_de;2+Qt;85Ui=sw`qz&+^Cz=MJN&|iXQ0S}-rgEs&Vq3c_4iw<}M-2~hS zcnsYh{02bqU8@b;6`;@`g6)6`dMx-;fP-ELE&+Jxjo_7l3-kf-PQVrVH}Gk|4f-+o zE}(|?vSK|6XrKeZeto^)*CpTnd){sIVuJ_z0p1VQJwK)gc-Lw^cA1PFni1D*_oLT>`E0K%ZVzkzWA zx&gEuIvX%Sj|3M2c;3u)5qLTf4&Clej1SNap?g4g0~$g11LpvZp(lcifC!eqCFU9E zCM-X6H^9R3gL42Y%MUIBBB5hiAwP5!^gGaTz-!Ps;GRHJ=#k(7!0Rl3YqSw`GnOAZ z4v1#?!99T(mLEI-Xb$b)2Kk{|KsSOm18+dbG6vp+&H*O@EupW02LP?0*#h|?bZh9U z&=r9;&=znI&=z_dxHZrY`Y8Ai@D}uK@MWMqw4ojPBG3VP3fK?m2)zuv7>I@54&DI7 zL0<$P1v)`@e+zvR`fX@CbT;q~^eAv4&>4CexCD3?x^{aU2f7P%1aw0n9=a2_C6EAZ z2d4mCp|5}ofo{-`!1saopp6~SkAd#c5#Ruz2lS8NmOvu(aqtl!3HmPhcOV(svm?eB zAO(5^xE5f8E&=1+Ske=EJ@^Zt7xYo^P9POJITrN>od#V1oeQKxj{^?{dP6S<&jB)^ zo5W#0h0cU-3*8FHf=&f@1+t-sg8KqF(7H~T2ch4G_Jytn*r6lAVL&c)Jh&~82R#X# z4&*~G0WSm!pz#hQSr7DqJ`X+&Pz=#IfC@mrV?P*8Zi0F6au{8}`7pYIqhNFcyTYgj z?*MDS!;$C?eiMmWunQ6^fWHUpz_G~m3iu+Jo$nK5X6G9SX6G9WX6G9QX6Gvcv-1^$ m+4;tR+4(*Lv-3>^<3E{#4|cxkV0ONlV0OMaV0OOw;Qs^tY1*Lx From d11a19d171bf882253d12e8223b965e1ef69f63f Mon Sep 17 00:00:00 2001 From: xhh Date: Wed, 2 Dec 2015 18:31:02 +0800 Subject: [PATCH 100/211] Fix file uploading issue with Java jersey2 client codegen Closes #1650 --- .../main/resources/Java/ApiClient.mustache | 1 - .../Java/libraries/jersey2/ApiClient.mustache | 21 ++++++---------- .../java/io/swagger/client/ApiClient.java | 5 ++-- .../java/io/swagger/client/ApiClient.java | 25 ++++++++----------- 4 files changed, 20 insertions(+), 32 deletions(-) diff --git a/modules/swagger-codegen/src/main/resources/Java/ApiClient.mustache b/modules/swagger-codegen/src/main/resources/Java/ApiClient.mustache index 91d1eb93daf..2e73cd702e9 100644 --- a/modules/swagger-codegen/src/main/resources/Java/ApiClient.mustache +++ b/modules/swagger-codegen/src/main/resources/Java/ApiClient.mustache @@ -467,7 +467,6 @@ public class ApiClient { for (Entry param: formParams.entrySet()) { if (param.getValue() instanceof File) { File file = (File) param.getValue(); - mp.field(param.getKey(), file.getName()); mp.bodyPart(new FileDataBodyPart(param.getKey(), file, MediaType.MULTIPART_FORM_DATA_TYPE)); } else { mp.field(param.getKey(), parameterToString(param.getValue()), MediaType.MULTIPART_FORM_DATA_TYPE); 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 bd64a6fe659..d29beeea34c 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 @@ -13,10 +13,9 @@ import javax.ws.rs.core.Response.Status; import org.glassfish.jersey.client.ClientConfig; import org.glassfish.jersey.filter.LoggingFilter; import org.glassfish.jersey.media.multipart.FormDataBodyPart; -import org.glassfish.jersey.media.multipart.FormDataMultiPart; +import org.glassfish.jersey.media.multipart.FormDataContentDisposition; import org.glassfish.jersey.media.multipart.MultiPart; import org.glassfish.jersey.media.multipart.MultiPartFeature; -import org.glassfish.jersey.media.multipart.file.FileDataBodyPart; import java.util.Collection; import java.util.Collections; @@ -478,23 +477,19 @@ public class ApiClient { Entity formEntity = null; if (contentType.startsWith("multipart/form-data")) { - MultiPart multipart = new MultiPart(); + MultiPart multiPart = new MultiPart(); for (Entry param: formParams.entrySet()) { if (param.getValue() instanceof File) { File file = (File) param.getValue(); - - FormDataMultiPart mp = new FormDataMultiPart(); - mp.bodyPart(new FormDataBodyPart(param.getKey(), file.getName())); - multipart.bodyPart(mp, MediaType.MULTIPART_FORM_DATA_TYPE); - - multipart.bodyPart(new FileDataBodyPart(param.getKey(), file, MediaType.APPLICATION_OCTET_STREAM_TYPE)); + FormDataContentDisposition contentDisp = FormDataContentDisposition.name(param.getKey()) + .fileName(file.getName()).size(file.length()).build(); + multiPart.bodyPart(new FormDataBodyPart(contentDisp, file, MediaType.APPLICATION_OCTET_STREAM_TYPE)); } else { - FormDataMultiPart mp = new FormDataMultiPart(); - mp.bodyPart(new FormDataBodyPart(param.getKey(), parameterToString(param.getValue()))); - multipart.bodyPart(mp, MediaType.MULTIPART_FORM_DATA_TYPE); + FormDataContentDisposition contentDisp = FormDataContentDisposition.name(param.getKey()).build(); + multiPart.bodyPart(new FormDataBodyPart(contentDisp, parameterToString(param.getValue()))); } } - formEntity = Entity.entity(multipart, MediaType.MULTIPART_FORM_DATA_TYPE); + formEntity = Entity.entity(multiPart, MediaType.MULTIPART_FORM_DATA_TYPE); } else if (contentType.startsWith("application/x-www-form-urlencoded")) { Form form = new Form(); for (Entry param: formParams.entrySet()) { diff --git a/samples/client/petstore/java/default/src/main/java/io/swagger/client/ApiClient.java b/samples/client/petstore/java/default/src/main/java/io/swagger/client/ApiClient.java index f49054f111c..1966b0a34c6 100644 --- a/samples/client/petstore/java/default/src/main/java/io/swagger/client/ApiClient.java +++ b/samples/client/petstore/java/default/src/main/java/io/swagger/client/ApiClient.java @@ -39,7 +39,7 @@ import io.swagger.client.auth.HttpBasicAuth; import io.swagger.client.auth.ApiKeyAuth; import io.swagger.client.auth.OAuth; -@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-11-29T00:18:25.953+08:00") +@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-12-02T18:29:05.463+08:00") public class ApiClient { private Map hostMap = new HashMap(); private Map defaultHeaderMap = new HashMap(); @@ -69,8 +69,8 @@ public class ApiClient { // Setup authentications (key: authentication name, value: authentication). authentications = new HashMap(); - authentications.put("api_key", new ApiKeyAuth("header", "api_key")); authentications.put("petstore_auth", new OAuth()); + authentications.put("api_key", new ApiKeyAuth("header", "api_key")); // Prevent the authentications from being modified. authentications = Collections.unmodifiableMap(authentications); } @@ -466,7 +466,6 @@ public class ApiClient { for (Entry param: formParams.entrySet()) { if (param.getValue() instanceof File) { File file = (File) param.getValue(); - mp.field(param.getKey(), file.getName()); mp.bodyPart(new FileDataBodyPart(param.getKey(), file, MediaType.MULTIPART_FORM_DATA_TYPE)); } else { mp.field(param.getKey(), parameterToString(param.getValue()), MediaType.MULTIPART_FORM_DATA_TYPE); diff --git a/samples/client/petstore/java/jersey2/src/main/java/io/swagger/client/ApiClient.java b/samples/client/petstore/java/jersey2/src/main/java/io/swagger/client/ApiClient.java index decd81267c5..e9c55bfb710 100644 --- a/samples/client/petstore/java/jersey2/src/main/java/io/swagger/client/ApiClient.java +++ b/samples/client/petstore/java/jersey2/src/main/java/io/swagger/client/ApiClient.java @@ -13,10 +13,9 @@ import javax.ws.rs.core.Response.Status; import org.glassfish.jersey.client.ClientConfig; import org.glassfish.jersey.filter.LoggingFilter; import org.glassfish.jersey.media.multipart.FormDataBodyPart; -import org.glassfish.jersey.media.multipart.FormDataMultiPart; +import org.glassfish.jersey.media.multipart.FormDataContentDisposition; import org.glassfish.jersey.media.multipart.MultiPart; import org.glassfish.jersey.media.multipart.MultiPartFeature; -import org.glassfish.jersey.media.multipart.file.FileDataBodyPart; import java.util.Collection; import java.util.Collections; @@ -43,7 +42,7 @@ import io.swagger.client.auth.HttpBasicAuth; import io.swagger.client.auth.ApiKeyAuth; import io.swagger.client.auth.OAuth; -@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-11-29T00:18:01.946+08:00") +@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-12-02T18:29:08.393+08:00") public class ApiClient { private Client client; private Map hostMap = new HashMap(); @@ -76,8 +75,8 @@ public class ApiClient { // Setup authentications (key: authentication name, value: authentication). authentications = new HashMap(); - authentications.put("api_key", new ApiKeyAuth("header", "api_key")); authentications.put("petstore_auth", new OAuth()); + authentications.put("api_key", new ApiKeyAuth("header", "api_key")); // Prevent the authentications from being modified. authentications = Collections.unmodifiableMap(authentications); } @@ -477,23 +476,19 @@ public class ApiClient { Entity formEntity = null; if (contentType.startsWith("multipart/form-data")) { - MultiPart multipart = new MultiPart(); + MultiPart multiPart = new MultiPart(); for (Entry param: formParams.entrySet()) { if (param.getValue() instanceof File) { File file = (File) param.getValue(); - - FormDataMultiPart mp = new FormDataMultiPart(); - mp.bodyPart(new FormDataBodyPart(param.getKey(), file.getName())); - multipart.bodyPart(mp, MediaType.MULTIPART_FORM_DATA_TYPE); - - multipart.bodyPart(new FileDataBodyPart(param.getKey(), file, MediaType.APPLICATION_OCTET_STREAM_TYPE)); + FormDataContentDisposition contentDisp = FormDataContentDisposition.name(param.getKey()) + .fileName(file.getName()).size(file.length()).build(); + multiPart.bodyPart(new FormDataBodyPart(contentDisp, file, MediaType.APPLICATION_OCTET_STREAM_TYPE)); } else { - FormDataMultiPart mp = new FormDataMultiPart(); - mp.bodyPart(new FormDataBodyPart(param.getKey(), parameterToString(param.getValue()))); - multipart.bodyPart(mp, MediaType.MULTIPART_FORM_DATA_TYPE); + FormDataContentDisposition contentDisp = FormDataContentDisposition.name(param.getKey()).build(); + multiPart.bodyPart(new FormDataBodyPart(contentDisp, parameterToString(param.getValue()))); } } - formEntity = Entity.entity(multipart, MediaType.MULTIPART_FORM_DATA_TYPE); + formEntity = Entity.entity(multiPart, MediaType.MULTIPART_FORM_DATA_TYPE); } else if (contentType.startsWith("application/x-www-form-urlencoded")) { Form form = new Form(); for (Entry param: formParams.entrySet()) { From a5a4f8c7e07b30e357fc6c8189a7e828a4a35156 Mon Sep 17 00:00:00 2001 From: wing328 Date: Thu, 3 Dec 2015 11:10:34 +0800 Subject: [PATCH 101/211] add api response to C# --- .../languages/CSharpClientCodegen.java | 2 + .../resources/csharp/ApiException.mustache | 91 +++++++++--------- .../src/main/resources/csharp/api.mustache | 2 +- .../src/main/csharp/IO/Swagger/Api/PetApi.cs | 2 +- .../main/csharp/IO/Swagger/Api/StoreApi.cs | 2 +- .../src/main/csharp/IO/Swagger/Api/UserApi.cs | 2 +- .../csharp/IO/Swagger/Client/ApiException.cs | 91 +++++++++--------- .../csharp/IO/Swagger/Client/ApiResponse.cs | 44 +++++++++ .../csharp/IO/Swagger/Client/Configuration.cs | 6 -- .../SwaggerClientTest.csproj | 1 + .../bin/Debug/SwaggerClientTest.dll | Bin 80896 -> 81408 bytes .../bin/Debug/SwaggerClientTest.dll.mdb | Bin 26270 -> 26497 bytes .../obj/Debug/SwaggerClientTest.dll | Bin 80896 -> 81408 bytes .../obj/Debug/SwaggerClientTest.dll.mdb | Bin 26270 -> 26497 bytes 14 files changed, 145 insertions(+), 98 deletions(-) create mode 100644 samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Client/ApiResponse.cs diff --git a/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/CSharpClientCodegen.java b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/CSharpClientCodegen.java index e95f9c71c4c..be8b4b74781 100644 --- a/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/CSharpClientCodegen.java +++ b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/CSharpClientCodegen.java @@ -128,6 +128,8 @@ public class CSharpClientCodegen extends DefaultCodegen implements CodegenConfig sourceFolder + File.separator + clientPackage.replace(".", java.io.File.separator), "ApiClient.cs")); supportingFiles.add(new SupportingFile("ApiException.mustache", sourceFolder + File.separator + clientPackage.replace(".", java.io.File.separator), "ApiException.cs")); + supportingFiles.add(new SupportingFile("ApiResponse.mustache", + sourceFolder + File.separator + clientPackage.replace(".", java.io.File.separator), "ApiResponse.cs")); supportingFiles.add(new SupportingFile("Newtonsoft.Json.dll", "bin", "Newtonsoft.Json.dll")); supportingFiles.add(new SupportingFile("RestSharp.dll", "bin", "RestSharp.dll")); supportingFiles.add(new SupportingFile("compile.mustache", "", "compile.bat")); diff --git a/modules/swagger-codegen/src/main/resources/csharp/ApiException.mustache b/modules/swagger-codegen/src/main/resources/csharp/ApiException.mustache index 68e3a032765..09dbd0dce50 100644 --- a/modules/swagger-codegen/src/main/resources/csharp/ApiException.mustache +++ b/modules/swagger-codegen/src/main/resources/csharp/ApiException.mustache @@ -1,47 +1,50 @@ using System; -namespace {{packageName}}.Client { - /// - /// API Exception - /// - public class ApiException : Exception { - /// - /// Gets or sets the error code (HTTP status code) - /// - /// The error code (HTTP status code). - public int ErrorCode { get; set; } - - /// - /// Gets or sets the error content (body json object) - /// - /// The error content (Http response body). - public dynamic ErrorContent { get; private set; } - - /// - /// Initializes a new instance of the class. - /// - public ApiException() {} - - /// - /// Initializes a new instance of the class. - /// - /// HTTP status code. - /// Error message. - public ApiException(int errorCode, string message) : base(message) { - this.ErrorCode = errorCode; - } - - /// - /// Initializes a new instance of the class. - /// - /// HTTP status code. - /// Error message. - /// Error content. - public ApiException(int errorCode, string message, dynamic errorContent = null) : base(message) { - this.ErrorCode = errorCode; - this.ErrorContent = errorContent; - } - - } - +namespace {{packageName}}.Client +{ + /// + /// API Exception + /// + public class ApiException : Exception + { + /// + /// Gets or sets the error code (HTTP status code) + /// + /// The error code (HTTP status code). + public int ErrorCode { get; set; } + + /// + /// Gets or sets the error content (body json object) + /// + /// The error content (Http response body). + public dynamic ErrorContent { get; private set; } + + /// + /// Initializes a new instance of the class. + /// + public ApiException() {} + + /// + /// Initializes a new instance of the class. + /// + /// HTTP status code. + /// Error message. + public ApiException(int errorCode, string message) : base(message) + { + this.ErrorCode = errorCode; + } + + /// + /// Initializes a new instance of the class. + /// + /// HTTP status code. + /// Error message. + /// Error content. + public ApiException(int errorCode, string message, dynamic errorContent = null) : base(message) + { + this.ErrorCode = errorCode; + this.ErrorContent = errorContent; + } + } + } diff --git a/modules/swagger-codegen/src/main/resources/csharp/api.mustache b/modules/swagger-codegen/src/main/resources/csharp/api.mustache index 7a9fe4d8b09..8196bcd7ec0 100644 --- a/modules/swagger-codegen/src/main/resources/csharp/api.mustache +++ b/modules/swagger-codegen/src/main/resources/csharp/api.mustache @@ -72,7 +72,7 @@ namespace {{packageName}}.Api /// The base path public String GetBasePath() { - return this.Configuration.BasePath; + return this.Configuration.ApiClient.RestClient.BaseUrl.ToString(); } /// diff --git a/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Api/PetApi.cs b/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Api/PetApi.cs index e3b4aad14cd..64398c599bd 100644 --- a/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Api/PetApi.cs +++ b/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Api/PetApi.cs @@ -221,7 +221,7 @@ namespace IO.Swagger.Api /// The base path public String GetBasePath() { - return this.Configuration.BasePath; + return this.Configuration.ApiClient.RestClient.BaseUrl.ToString(); } /// diff --git a/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Api/StoreApi.cs b/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Api/StoreApi.cs index 5fdd6805a2a..93ef67dae91 100644 --- a/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Api/StoreApi.cs +++ b/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Api/StoreApi.cs @@ -129,7 +129,7 @@ namespace IO.Swagger.Api /// The base path public String GetBasePath() { - return this.Configuration.BasePath; + return this.Configuration.ApiClient.RestClient.BaseUrl.ToString(); } /// diff --git a/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Api/UserApi.cs b/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Api/UserApi.cs index cb70245d911..21905d02d1d 100644 --- a/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Api/UserApi.cs +++ b/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Api/UserApi.cs @@ -213,7 +213,7 @@ namespace IO.Swagger.Api /// The base path public String GetBasePath() { - return this.Configuration.BasePath; + return this.Configuration.ApiClient.RestClient.BaseUrl.ToString(); } /// diff --git a/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Client/ApiException.cs b/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Client/ApiException.cs index addfc839716..2410626602c 100644 --- a/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Client/ApiException.cs +++ b/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Client/ApiException.cs @@ -1,47 +1,50 @@ using System; -namespace IO.Swagger.Client { - /// - /// API Exception - /// - public class ApiException : Exception { - /// - /// Gets or sets the error code (HTTP status code) - /// - /// The error code (HTTP status code). - public int ErrorCode { get; set; } - - /// - /// Gets or sets the error content (body json object) - /// - /// The error content (Http response body). - public dynamic ErrorContent { get; private set; } - - /// - /// Initializes a new instance of the class. - /// - public ApiException() {} - - /// - /// Initializes a new instance of the class. - /// - /// HTTP status code. - /// Error message. - public ApiException(int errorCode, string message) : base(message) { - this.ErrorCode = errorCode; - } - - /// - /// Initializes a new instance of the class. - /// - /// HTTP status code. - /// Error message. - /// Error content. - public ApiException(int errorCode, string message, dynamic errorContent = null) : base(message) { - this.ErrorCode = errorCode; - this.ErrorContent = errorContent; - } - - } - +namespace IO.Swagger.Client +{ + /// + /// API Exception + /// + public class ApiException : Exception + { + /// + /// Gets or sets the error code (HTTP status code) + /// + /// The error code (HTTP status code). + public int ErrorCode { get; set; } + + /// + /// Gets or sets the error content (body json object) + /// + /// The error content (Http response body). + public dynamic ErrorContent { get; private set; } + + /// + /// Initializes a new instance of the class. + /// + public ApiException() {} + + /// + /// Initializes a new instance of the class. + /// + /// HTTP status code. + /// Error message. + public ApiException(int errorCode, string message) : base(message) + { + this.ErrorCode = errorCode; + } + + /// + /// Initializes a new instance of the class. + /// + /// HTTP status code. + /// Error message. + /// Error content. + public ApiException(int errorCode, string message, dynamic errorContent = null) : base(message) + { + this.ErrorCode = errorCode; + this.ErrorContent = errorContent; + } + } + } diff --git a/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Client/ApiResponse.cs b/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Client/ApiResponse.cs new file mode 100644 index 00000000000..0e42375271e --- /dev/null +++ b/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Client/ApiResponse.cs @@ -0,0 +1,44 @@ +using System; +using System.Collections.Generic; + +namespace IO.Swagger.Client +{ + /// + /// API Response + /// + public class ApiResponse + { + /// + /// Gets or sets the status code (HTTP status code) + /// + /// The status code. + public int StatusCode { get; set; } + + /// + /// Gets or sets the HTTP headers + /// + /// HTTP headers + public IDictionary Headers { get; set; } + + /// + /// Gets or sets the data (parsed HTTP body) + /// + /// The data. + public T Data { get; set; } + + /// + /// Initializes a new instance of the class. + /// + /// HTTP status code. + /// Error message. + /// Data (parsed HTTP body) + public ApiResponse(int statusCode, IDictionary headers, T data) + { + this.StatusCode= statusCode; + this.Headers = headers; + this.Data = data; + } + + } + +} diff --git a/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Client/Configuration.cs b/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Client/Configuration.cs index 79bc86118b8..151e4e42248 100644 --- a/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Client/Configuration.cs +++ b/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Client/Configuration.cs @@ -42,12 +42,6 @@ namespace IO.Swagger.Client /// The API client. public ApiClient ApiClient; - /// - /// Gets or sets the base path. - /// - /// The base path - public string BasePath { get; set; } - private readonly Dictionary _defaultHeaderMap = new Dictionary(); /// diff --git a/samples/client/petstore/csharp/SwaggerClientTest/SwaggerClientTest.csproj b/samples/client/petstore/csharp/SwaggerClientTest/SwaggerClientTest.csproj index 3452fb823b6..c1dc6a31e19 100644 --- a/samples/client/petstore/csharp/SwaggerClientTest/SwaggerClientTest.csproj +++ b/samples/client/petstore/csharp/SwaggerClientTest/SwaggerClientTest.csproj @@ -57,6 +57,7 @@ + diff --git a/samples/client/petstore/csharp/SwaggerClientTest/bin/Debug/SwaggerClientTest.dll b/samples/client/petstore/csharp/SwaggerClientTest/bin/Debug/SwaggerClientTest.dll index af6c40173eb69c3ea004d294c53b220768ee9b15..1f473e2ad876bd1fd1a6b5647378d35b38585366 100755 GIT binary patch literal 81408 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 x_9wYxY-D{EG&hj83mLjI52jpQmn=-X6l(E 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 literal 26270 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 diff --git a/samples/client/petstore/csharp/SwaggerClientTest/obj/Debug/SwaggerClientTest.dll b/samples/client/petstore/csharp/SwaggerClientTest/obj/Debug/SwaggerClientTest.dll index af6c40173eb69c3ea004d294c53b220768ee9b15..1f473e2ad876bd1fd1a6b5647378d35b38585366 100755 GIT binary patch literal 81408 zcmeFa31C#!^*?^!nMg7C}%6qOuE$ih>J@LWBU3kiki!;>%2-F0ETD zb*-WeE>)|od#hC|xKM4a(rRt3qQTv^ersD>msdgU^2fHTfK+s^ov~YDlf3w$8KE zp~O*dq_7)WW38pijP6cdYL&tW+*(w+_~hYmCgbVzHRO0-2CWjh>tzOe%h9SEl3$T8|h)njNrMBNOK)iE(xslYNl zvh>{;LkkQLD;IVm*aBaQB|^zWxX(qUu)?sK3@)p$8`eAXC0-LHKAXf#(l?@lL?j-m z8;E{IGlxN^tAcc?By$3UnMMGieQJU94Xh??I(0vYR22P~xEm@(tt~7FUolmuMIi=- zH2Q{l_hu>FClU`w=no&lZP9<`2kQ%$9|Cm);I@&>Fm%lq;eqsZm;he}(b?c%Ocymf z;T~v0d%zgi1IWq=K$L4CV$}E!Svi6oy2m&Sac9zn(eK_pe71^5w_=Ux&#V_qUyqKp zl1%6|BOY^e3PvD4bP+mBA400dHPweXEh{zMSIuP}>*Rhc5e~_z>1B z?IwG>ZbDX009Gh19Onwj$`S0)hrYd&K4kQFnGeCy#fPx;i4Sd*tM(y8EO_m_(1)Z-Tvb}B{_w4uPpvwvol4f#%r=ayo((QY)} zbtAHJ0x=)U;3HAdg_u~?e8*7uny9@~n}*}gnQ zGEpi!pLnU8rw|C@V>hF-%v1NsHHCE|mc3W-c3$XXu=}XgAP7dnuH5_V1s{Xs#g)DR z(603`2K2>sExiJEbt=!Fg0k(72Q$+H1%4OwR6==`qIERnspy&bx7N{}*=E7jwF~a+ zx*%CO0SJ37+|Lz~l_S`pe;y7i?94i9^gaKK`utOGyWu+lH3dEdj}+fS*uwXM*~jG? z%5IUXoqa;Cdf)Y=;O)H77qLYv+;r91-aVU z7v-vb?j^z7d7;l?TVLpNv;L{iO+@dF&)os^3wBhnlRn3z2;{_9F_7+^E>yQ0RYI9a zs6a*NP#Rm8aC$J-j$PoKJChi353ijQXH&*G$;t`9L6jEm?+VGv5$w=8t1-@fkBO-_kb|(0<9u@!Tp(um%JLeX0XFw$>W7%XZI6<& z<-{_(7-DmTTkoMKd*~7mT`DN@UM$-{G?`t-OZUf^+2xek&PrUo(?i=KTh27IE2!WQ z){SC^95$uTH+wFnk0l)TwfMBNYg>)bl7mm(QLk3tPHay!oo~CvJq0aR#l2VlD70%c zv|%6H5u-U`5*do^h`}7OmGn4`Teom}cN(x6W$bps)KJh9v5{7GZ<#Gyju*Ai=Hce3 zZE;MS(H;(MIdd(wOR{O!VmrKKPa&SvEa|@Okmb95@pG}+ise>AF2}PYtb95oOZd4{ z^TLs?kSyW*(xJALcSbu_%qg=@rX19op1?8nVXcqWcPiUZNNvM$uPQSxtBnvz?SV4e zusu)({8S3;k>F0@2^Rh_uiXl_z8@b}gSExlSJx3pL6OSLasO)mD~zo#!w!rsUjIpK zWgs@O1<%T(tsdIup{EHdv2{ApWcCbRdWfwxl-UkXBK@&NwvMecso)US>DXdZCboJk zWnznc?HXIfr5tGK*piNVed!uo(zY+Q+^V!{4AW!o$GZ-RHtcOXVl+p$Bvy08V2;?z zVUK;WwHBn^PFN6IoGn|9YPHZ#m3pxy+6A$-j_S6!Dxu(60$9v2`BN zWcGYsdWfwHD6^e!;Np)hvUO}-NCk(`#1@+}vDITK6I<+Sacnskc~x-$`aHf%2dL#c zQSjtl15P^R3plq|-2|K~lV`BDL&MhCj#$zWJ2_%XN37_G0UZv*7jWMMX}1#=1RST( zmUC?_v{PjaxC1bkM!O*3E}^>Z@RI#H@nlw5GE&*_mH=AD_p;vn7w>1Kt`T(bm;)K{ITga)ipMyLoMD$vq-gIF?3}nHfdPIrdZMuJ2_%XN37_G z0UZv*7n?VLwA%>_Vv|#7w_oQ9?G%D2ADg0G5Suqr(RO&rb`Vcyg(a4-9kTqf$&MSY z#O8NEOKk4rh96lu0XOA^ct^VjOq;&gl%Dxxv)HCo_#Cn6 z*{d)%J^ts7P1<~y#pc|AQq{6<{s7f7HhJ}8^KTaN%V;PeVNGW?4G;N1aKUwO7s!_M}m5-OS%-zx!cbxV` z6pKL}F_#pz9WkaOc9f3#qWFhwvYoIXiaFV~Jdx2tJ5}LDv1k`W@qJXc9bU3`6HjJ^ zCAP2~viwoZjvKB-@%^ABitF4!B`YW3M|t5yS4dWlz#qk8jp8VFnHfINGHo(y<=q}1 zZ60iOnLKuVD>_;HgsW(U_3RZ*!6Dog*5gM~W4UVj*VkSMpWX54i&-A5?8^^=y&iQR`h^v53hu!n9E zRAP5C(PZ`!UV4b#M=7(NCvfq{F4;PEAESapXkwR5nb_^Il!;yTwK#TVtfnfF>#!}Z ziWc!Ny^nhx-~jb=yDr_PmcP`NqEhlGuS+Rv`AfNd>AK9z;C;({k!lRC<0c4KW|nzQ zBJO!*)*P7=N2bk@8FOT^9Gb+JAbtkYZYL~A5cDKl9+PRIovQTic}2S*K|Dou+uLw8{UIV6aQPGXX5`C9{NiUebz&t6EuQKv%eym%s$Uc5ApwN%53LF zT>SA*wvPYbP{AQILCdC0{P$SO#6SC59RJ>!&Dt$WItdilNAnb~-OdX|UC~Q(aZzgd zW7?H>jcFN>FQ$uB3u4-pnV9Cp^tBzC2}kVg$W%Bo3yw^H!x8#o`el%IJ7Gag(@Si5 z45@{73SN{yBNpv~n0|%ow!=&Ix5SfKVaZh54q5(~X2%UzV!9Kw#Pk$5Y{|+A*q#?o zb%kW*2>dZE)+ml?mzm*{TGJ+ml3(Td#q^bK zO#cbhGNyU;V)_)u^l3V#U!{@ycZq55L9w0Tlj7`a&@(apx`)2up>KNVTY^eVzfClm zeTSDGV)}QK+0Gwv@y9gTI;MY51&7eYG@CLp-D4>e)9h=Pn0Ci(Vp^1ROc&Qj)h;pp z2d^s}s(u39WdPLj$Mm}_HHL}Qp;h!l>7r7GNmbwDX-}zZIuKj<(t$ewty+){T$xD+ zoKr0EGKr2%kt4I{$OK9+ZHLD3rGr0%wA%>_(g7XJmM6YiXs6;{IuPyQ@GrYj^XN8nEfVvXW-;4(9O zHg4MVr32|%PwBujLSZ`a_&Oc<_w^?s44d%rt?%!lqq`y(0P8ly32QGIIMhQ{O%0tg741oOh1A8RAv??yy%4(j_hCi?u=`bp1wO%tRVTS>vw0U z=H2w~;5|~e&hQT2BRvGQ@}*Jrend?Uxy$oC!k+mc$_OFD@UM%X%6d3%?9*; zJ%)7V6uyq~`Q9V->mzfRuhSI1N9qm_?~x*}`QLXZS@<652>59d^UC)}@vH{#tfa=F z-mEQnJ1=}Ur5af(wGRX%#jm64F8BjH68><*7u6pm*1Ydhxn>FP;3XtI>*h;QSn~C( zFK{Q8tek)WdExP{kgOcR4rl$xob}K5r6`$oqwmeS|LsgW;&ObtbRBD26{(qgHfB*Z#?_)^jwYg0A3zsGG z?+Kwo#pNsRu# z?<9F2!D=Bs($Dw^&RUow#7Bl}AK`^Qf;3X-Bg_#Y<_N!!{0<}fZ}E{GylPwEBZKp9 zaH8u5WaR|Z=7lG@Lb7rMJM@udB|GOMM!$O>L5wSfB%hyuYy@Qf_cZgrpPql@gIIQg zo_}6A|5y(G?|pxf?;O30`$g;q_{3kA_j3}xQ1`A4XtU2x+SqPp$ylEr(rG`FzCqP9bpzVVV6_j6^h7=~PK zyk@)iR%GP_l;nknxI(gW1ioO`lgFiBZy3kYZ#<^#8ck1pH(t^+@5akFE#_vH3f*lB ziypps_KKz^!s+s_H+cL=YJamI@ZYE11^3>h;~@Y1g?q?AYLZs|ci(Sd`1F$)>xF6= zW4wAXb}D1+79C^UnPwvpn;46FXv{-PJ+w?viLr8`$!rBLJ;YcgWwygzlRw7D)-hH^ z1&7eY7@ION)?+CXW9)0!7%MKtotu8IPdeJQGaNmRE@Zfl=r}T7M~3RiC>^%ti=Y~i zb~|A~1kuiRJ2!+{C{OS55hU6L5!9QCw!=%dns_oREU}mEkmZjcj?8c+g8G1#2s+FS z60&jv`sRg)yF#*Z1pWvTa}`IB%gk^`ZQArjko3$SLB&R=LU&v2q6qTr6-^!Jiy)65 zNgX6X;g6q-;kwrr#t%&%NKM`~@$+{#e)d4Mj2~XT_}R$#c|qdG;hxX;{L305qzfg>Yy#0ZXz-;tp^Y`_<9@K}TtVL`lc zUhH;muC>tSmxuH5CfWt@HiC+_!%KE3@nlw5G6vfr%O7tvlHp3cjRY<6cBC6pWaR{m z$_tNjg=FOj{P8B1FOD~tnc>ZeY10>P(ldX&70(|PK1aNH_9~1wkKbLqajkl~Fy3hL zT^4W8pl%Efd%`+Y%Xs6pDBixO%xIy_U$n_TsT1vjc-xbb-dtve zH+rT`U%W}rym;G&ZKd~Z4$laMNAn)vJgM`qS(m|muP=-tnsHa2%@4&Uzq_;f7Hp5* zvw5FV!Pz{O@@Ml>03$9so6kUHC(h=FpgZ~Fa-PkT_Rih)+5B!rI;1@veKx;)kq+rD zXY(9ZzA>K7lP)-$zX)r#oU>%E#f%r7&2wb`+S$Bolb+7zixni^yPnOvYTj9_%i7Ud zY#Vy-{y^0*3|wO7d~o#%JXtvb2u>}$z!j2}BhWE(I_pZc0{TzjNoT(M`HxWi`v3e0 z#XUpmZ_ZE-Mo{pab+%mfcR&vjyqy=Gq2SiWe})oO-rRQnSI_Mp`RTjRoj$U10#bS5 zMXr#n9KjCfwk-0wkH=(gjsEAH+W}^77nr#{!8f-H_1yBpxrH0_G`EY<$N%2A9g&~D zue;MnR!#uU8g<-$!xfU1BiP~Gp1+fGYxF$&BHa|<^poZHus zlLw)^%DnW&o7?xI(gW1UsDbWji_NM!)+xpTMm!@($+{xk=T^eA?Oddj1lezi;aKHM5PQaMF@G@6O zR*qnY^F9S;+?iN6`rXgFZ+M9H%EE`|B#UBwEPMmId3i2&rTBxLy-F-mL2^NZNU-&`|2&h<*sLtl@qXcUU-Eo zBr8X-L$~>8C*8*A$1!>NAFd^?-*L^S3&|JE|G0Y-pZKoKe=vKGTEB`xIq^`c*xBE6TbO>QqMmxoPR78{`vpcfAiwsd9L>V%I1$(^tligdWA5= zZzmzk@50|!;yVK0w)5w~hr$JT9?YwE9(*bq-j;$PVvyG zg36)qG@{AubY6Nm^qoPO?eH|hOVqYQwm$ToNd`74%_mb@6G{fw-Xke@6yh;9JFYmox<$q&v!)| zM@8PN*N0Kvc6iCoBA(0&OYCJkWa;x=$yk1FIjYGW4!N9F;b6d=Rgoq9+!1-<@ve|8 z;rmjTo|;yqH~$*|VtF#<)XMav3T>LNUrNtNclS*U&j^L*yB@!r^W6rxV+%ew56?f- z=XuqxINw!;F>xZQWlZqeeN6BaEISus6B9>z=usXz&qL=6Dlvhhc1|M>)q9MIV=1#8 zp5pjpf@~cV$5Fu{G%>-ZOic7x%EScw+BGJMOYtO0$AomWYiBrm#Domj5gkXy>&Q?Y z8KuLvd@*qnNV}b|ASP&MyPXGAT4<-Rhsno;Xcxr9A}ZPrFIl)QjVUa#m+g?{j|q;< za3v-dgO->;vnD3U$_c2?3(>3*l9eOy$Ap-xI3`?XhNpL?O$pl9^~HXeZ6<$scW_sViOZ>9(tOGp6;P%2r4nLhG;T-CNDk2 zghQF_ti{D26J+a{Xs3chXkvm*nV9IYl!*!UwKyi6tXCBWkdf1xE*+qj?}53KD=H=D zxm`+8%U7!FxM)bc)*_a3#4e7Q&Jn9QVlao@_J!A3AnkU-g7D&$*>e7=g?0*4nt!cD zvfN^TMmEO{vh`!E(`SWS+gEsae?7 zo`;_Ap%(}$v3McTWcDIndWglZQ)WBsaq-6@**X@#K?R4<#3GwAvDjlN6N~I?aV&Oi zi-SXa$Y>ntt0Tj4WF(FZ!eLdu__!3L-A-5#A2cI=aLpCkDa1p5`4R1c__&OUw!=&I zV&ciHu*4j;LzX{2I9$V(__!Rj#0OS$69Q!A1YD69Vre%*vT_9e_z)Ww$A`5C8PnHL|0uc3HGC|rI#zFB?>e11CI?WjVZryY0M`oni8VSM=fji{DB&#UM28|m}r z-N`E<@x9CCJpr&Yd<2mF7UU)zuJX{UJ#>SIUL&Z4!?i?{*>CgGLpXF$W;@s8;tvP1 zbvU4#@Bu;-4s6PVLyx6QIIyq9;oxwrrYe!^rKz|oY85Op#R@bDf=F!O$Os)Vf+OR1 zWathX@CDI#K-%qu1wq7l!SATKLYqHLn_px^yC8^eqN45alD&?2GAk@GqV1674E_)@nmmv?eAlco?;+kWIKj@48pavg8QRZ*)T-ij6Op~4L~NYcaWIt1DbKb0*; za>N9VSjiCsIbs`!J@5tO{UGgj!h(S0#Nk)ZT%pbUonO^NyC5KcL`B=-C3`RNWL8*W zW!oXkACMfG;YvV009pd_R5#|x$_aQdFU+_?vT_9efE05T2c*l)@X?TI(-)A^GcO~YHQduF)!V~lJaV_T@;5SqYXQzpiG zEM;PheeDus9IL5Hfb3qt5AD&p6{aLN9JIDQ?B7cnA!lMA>%gxGPzl@R(lXbGV< zH%iFL33xg$Jk1r7l_N+YDUV9YyOw&sibF_DL}rE$)l8ed5R#tt6hfX63PZ@_cXKY$ z&HKqTaGI=mR9GTZsI_6RJ2XW}pL&c!vg0i%`oO7!zR>_xDq;Vabc zYrTAjnDj`Thldp0S|L5+9g<+nktiQi6_NB&K*}cIeG^q}r{;ku4Od&K`9N?v8kaul zV*rOkdMvIJpa1N$&$d;F`lmH`iJ^b`IIv$*6(OlA5uAW`k5qL~>M9Rc2XtKlsVlue zstW3=e(hEjEU3!V6xO{8OHGMTxH_b(3hAnjm#V_Wy$TmpRT0*`is-r`x~`INb&0O4 zMAvnK)Dog2p8Gf9)h24~X$=`?$sDmNHnBpqf zhKnVCfhZ76-3+~8D>>;#RFpb}U?o6oLT{8X8kt0yT5Z_iGPwFYRkd42Ll!h5& ziJ*$agYxIDqp36)Wt6N2GV!-`4t6jeYQrp9!xG`T5|UvZb&*K=ROt0ykj~&zI-v}* zK&nM>psHk~g^Xw8FQSie6zjowg6eb_4}HOS(#V&wSU~>NU}->pkESfR6)otu5>t2v z8LPu$ikiwNOhvKaR=jQO7v4x=r0(myq#lIHbi#^}gbiX7LU}HEe4J>%rfZ4yVrqnYkMU#E5B!^?U2Sx`nF_oEuZi$ zRuXQ>f#BcFE}!r<(82VVS;YgWBE1$^T_0+dBx^ya)H-l3dH!db-_P%U6$(GPbF9vV{;k`u~`-P zdgDa8OENZLEG_{_CaH5!aSEX@N-ry=NHDPpXjqA(22x*z+!s@}>=C8D6bu=&)90~* z^Zii7o$VuEcQgBs+mSv!!v7~Fhk>Dx!5QOM(}R!vswqFGRlwXBCy zshWV1VutXhVfve3C_7ve{(58j65zwiY7Tf6u~w446jb@Paw^t^33Z@h)=(4Xjrn%W zRQ{Pl{XXaAxWcx`pA#8;DzhKP+j1FdIn$Qdto;;zcYx^IDQKg&OQENQeU5Lr0<6-S zvI+aKwB|+@NTJk~?28?Vrs2@Y5+(7VRFJ+3zG zJ17udyAM2=`7EX^OeS7y!(QP5uI&FWU}NyzMZ-+YZw^e#BBB z6T9s&tJ@A!y6rHZ%j%K+HECUetRuEV4u7O9md4H{mVJo|?Sw4g{`n(z#+Kx-g*N{V z!l-SB(>_N1+bsSY>N$j^+t^w6PX~DwL{c5l%pYxg{F2m0@bh!ZzZ|sXIn|f(gTEKV zWhaojjtaZksq1l7Bd6NI)D6V!K5wkgIjBg7G<5>%5cF#t`z7fpv($Dt*g&-<%(`k6Dam{p4j$IarVKaiZc}8u%+c(h%1!mPtz&lyWb)6} zi84YzfqVZFT>WDdKJ*kooEQ;1357Vd@cRx9;g$fY`t zF{G}ASdZ~6bUGF;?ROEfGm>EmvS8*(@U9!yCv__dT{o<6=0(z}+d##_nO8uhz6U)0 zeSjQtsJ@HZ1fOexL&nyUC4ByMkWu`zAEVNDu>kXdRF=9M80zX3 zeFMuyfevZv*b18zwJ+zew#hKI#s`i~-)U>r8j3bhZ}y;DE(jg>M^IqiYO&<0PiQ%|D${7@mI&cnDO^06L^ zFV(~*V8)=z{+8k{>jBgmNRukVT^6Zv)nNAr0-Bdktx;CZM4DKaD#vXV`E`q2Rw7s( z)Rl+{KCQv()j$0pl`xYi$8iVJgfd|hhq&Cjgo|p0^g}3y7DrjV0o~DXEXP6>{fOg@ ztr56C$PYm}(+{%n;JV{A8)Gq@_%Uib4$5r14ke9}OoWzU`vkU%y6ywJ>HMSp2br+I zH%NQ_qje50(jo2X)S=IKr>#hbw5J0*L1%W64rxzE=Q?DEg8q>9boQ5e4lU9lO&wd6 zp^^fB{>XDazdt_(OZDK-y(^7x+o`8})*9t$ZKYOUxM&%XBs3 zFrU_l+ejuEFG}>1M0s_2YO^#bWJPs_kdyboV2o%YQjqFBp+<8aVJ|9}F=DAl0hrNr zN2G$v>Po4g4&B0_gjZEv6-W~kpZv5&JX1P?MG{JM#6X(RpVCOzonNFNDXp$mxOC4% zygJT=1cM1#U0p3C3>Hs4&aPI=#cwcCOjIXCASVlUN_ffYq^?Gs{?i(9efG2a9GZj` zv4hIz(7b!fyn8v+_-RoNrI)x~i4rE4l1O6Jf!zs<&<`c9Soi50U z^{ERVZfIs8uP%o6@;S+LUM6;-Q__~cs)P@3G)6M%-#gaoe*ZA1D3_A<^6i0=Zx1Wd zA?@kF8L-yxnaR zyCT<@GtS>d^+mbmTHqClF^G(@!SD@C%@UOd%l z5-#T~kR~)Gh}OYT(MwOpKY%pKY!Eq#fi$7NYoyHv(NpMtgGk^02^#S24{1A2M^SDg zyX*e2lTCT~gru8K#6q5oq$?9!cruc%Oh)a=NV+l^nkOS^WINiA9#s_Eq>JN!UXc!I z9sgW~3gZ7y`A{p2|M$?L9^&5@-hXDdyM*_yh`kE>$_J>vDE6?iD2lz?!Ld{9uNQly zK2PjX&yBrBZbdrwTod?XZ=xu1+<`Qq-(5)?cl8vycUQ^9MfWrLAr$$m8B5XXDs6fG zL-KR_&-^0aAYJS~M;GakF4j4wNQZQ>4n|mTuR^+5=eQyr(#1LpigZX9>l|OCL)z29 zZVzkl2}L@jsbi~ykW&ldqO{7pgMT)Ek7TDlhM{|ii#_rs?9?Zmj;o57y(yl;r`;-? z=qcc)zndCP_Y~}I6)x};g54_I=qZG|Rk+_%h(Mu-`?j7!Tx?l|7=bx)F7eOLEGike zGmCNHXxn=+&YAc;F-|=<#$Q9fbVWMG-RbnlI9_mo66Y|GCiKTR z>AGu*6!dEORpD}G18G8kG17I*iWGFQxx(dq2hxQ8Vx;T#DpJtJ`U;m`5J(gHi;=G5 zP7eoSu7WOx#S2{eMj%b-FGjjcKSPN`FpS4fZ$S_)NpI&Rl70i1 zObZI&Ltl%B!s$W4nA-#Vey5twu_Rln!7La|=1w+~a&<%Sl^H$griVeTw1mehv9d_! zQIzB#>l`Jfi0F;=R>(56M?~*tNk?QWoOz4-dqZE3^+Fib(xRI5FQAs@N-t{*k5yt~ zfC4!ec@afqH=gNRjS9!H1GJ}R*6_?CX0$p{AagXe#zSlHgbPoUCdrl~UteRKqexmL zkL8;g3A@pLaBMyg>ehbgq0lZZDKbV$kugd zvRa=peV$ZcoI+1B6W{Gv!}zLfQU5oijb!(IFUwHqb9FqU2+A}6Sw5R&UV)N+A)?ej zd@~xjRe@E?O3EY2Xqs$3BgQ)-@Hd=%yEb;y2IESnjZ(yZEehZPboyC1JYM}maPrl! z=RlRKsLvr;D(X2Pm2f{CoA`|T_7kQLIl{dCq~B|>@s`T|EAVg@|2W3KVcrj6pZ<@@ zhtg4|LVs#y>W+uJ+zq@idGmFcg7h5^|I_@PD3JutcU}DLFonk>U2}LmVv=|?9>S|B z%;G@8lE;CRNG2}AiPd=X6jW(-rl_XtXSZZWDkl40{{!IR%zC2t5p^ab zX=J_!I`b@}$@@&r3tqYUZLoADEMX4_$JB0G66pBbG zjr(-aWRA9o$_M=#U<%rp`NLs)Zde|CQl$+W669MvogaZY*xf6@KNH zhla^%_^qj&Qhb--eI(=E=e1@Uo0qpxqjiZ=1A2jX^gMO(8S?!Zwfn(G&xY@)4$x)2 zA)DHiKAFn+2mh@)cJOu4CD!` zsYT*_4_v`k5qwaM;Nx*s>gB=YV@lNJ*7a6Qy>ESHh1Ik6%XV1J3=sYxa6LGu1_@sX zzHC>hj{(D~B(z&7rsjsIe^TgWJEqP8UZFZdw}--NONg~SEz-9jtycdCMZ#eq^co39D-azpsQf?-n6EIznl4gwiLX&qUFBl%?JmI5I|QdyJab#K`}p zaF&;`Cr^}phSr}0467H*uD43m?=WRCHME@kv4CMUtDI%e68J$m>$fWidshss2&*vy zCkZ^hf}_5y;_8YD^&^3s1pX2*tX`E;e--$tz|zW^%CM@dWc{-%kE^Uvt18!k^RRH< zt)vA?tCCgKYD(2^p=z}bFsv@DqLnTI-cN0)y1lBOdRpL{fYs__;YZ`QSB2GHan^jW zz~*=ooOZ$AjkEt1)r1FBQ)jBcg#w$Z*{kaWPR0BVQa`EQRy|043|ONo5^E}VQ%5D1 zCw5b(3p`igl>+Ys46COTtaBS+Z?R`s{jP?bNdpL%4{i*9)pFqVVRioC-9q##?OTkR zjiCBs2FT-oRcZ*RfxzM-ONp!(o<38yx5#=Sud>|!A{(L>iEO&ahA190R3X#PK`r~J ztAttsDvOiVTZL*9S)IB|s7uvZ(44L|3w4c9Gu6+8x?ZR`YMW3u33ZhEqfoaBHD7%s z)E0FIYFVf%@d{v-`ki_j)QPIEP<^Zqh3YTVNQ*r?QPo-jy!O~0Rw`>PR(lBbVhO2? z8YR?tgk{z`TkR#(B|=@U#tF4esGHS(LhTc!<^yVfq1uFc1{r`Yd{3xX)ij~rg{iaF z-_*fE;oVJ85$jN)h6&ZrIzp(aLhWhI6Kb_k2U^Dpb%9WGtrLX0SE!S%MMAwSRI9Z_ zs1Jqusw@{IftSLQb2&vjsjZ@M(d)qm&L8c&xx> z0>2^fTEJb^?yjmQu6C~fHEJvDXsO>=Nx-O0>kYO0sAJYnwfiIYZ-rHnui?Aeo|ZZU zd`m4Am;(%}tL+Hjb%1eoJ2Nv&2KEFzBEZ^~2gUB%ftNvH-;mCcM5z&;Bx|B55EWg`=Vo)d<49I3H2`v{sVAaiDd=Ul#&qO!6i|^ zR7#IpE->#Q+LF`5{~6COY-Pv3 zp?mnR<>$h-e!9aE{X1=47W`Md@!x5&aCAGiA^{T%?XoURHrq z1o^imv<$LYe}xG9i-TSD(8U&P&Wo+|0}S_PhQ$-gb3c&~RW5-wHS z>%$5hlNi~kUct&fYHlsbbNf6S9FFzA&86a%1Juo$Qv3JH;NIaknu;9UtAFJ{^=CsZ z=oJU`iJ{hqhD8Udnjs4R)-PGjWS?8M;Ex)^3YbaWNsG7^8eaL9}Vd`Q-(elI9r97a4jF#U+ zJ!dFdKBay$Ld$6R5vmVPaj8kmk5rTP)D$g0O0^q`mfus|H(JYR`Mp$xM?ok@%kQnm zkJS_{KVG#Pik9D3Z5^j&w0xbam1Cmy>Ic0(sGOuG8EOlt1Jpu8JrC+Yb%vo{19gzP z(opY#nyl_IR7uSTl~dGnh8hHFs(Q~*<3LSQRr|2@^=cNV>1t0yEdVt`%`wy|pk}HS zhWZMqgVomzbrq;t>IOr77u0O^n4x|I>JZgwsGos4l#SuvmeBh(1FPm}0+iKzq>oDU z-rq+J>OHjzXQuLROK5cO!>SHg_Dmh;?#gpf&(T1WY&sP%+MNd9j9VL|ZBcmrDqfRq2dh#)9 zt&!1_k5yM|N<8^kb(>IcTC~Ihb@nlA{Y{IOSfCy>6fLnpwI8Qtw8Zi1K||3JC#a6& zwTzZns5%WrOPr`W@QjXi(h?`BPNCMTQ+j_;xk!Cts4S?(Y5-3B=>->qs#g;XwGq_G z>NrE)1!{?EHPqvvma0n)^&3zP>JCHw4%9MMh<{r`pY;B7)pAXMD(UlK)e4vD-RHBa zMwc4fCmKJ+rRGAm(xn<9YjUZt_Bk}V%B9x#NygJI)zPO>o$6Az_8Dw>)B}A6#XaiD zK11UfSM#MlqvI_u^;VyK;%zSVL7(A~(_PB$dt%iYY7gn0_N+B(j!VTW&s1wQC7$J| zJ2WMp<*1(;ik{`D=L|*9YFGawl=iH4^`Vi`v$CpMhOcvERt*s9+z34@r}op7cveo$ z66#HhmS3x07egTv!Sd_W&}I(fO^cTQirOS*d()!j&%(E=wTzZOTWt_Sy=l?%=ctzq zMa!S7o)Sa7Y0>guQ^{6cj+Q@PZ4k4)Y0>iMtLF?w%b&0A6C=K9(ef9l4-G}jU#Om1 zqidn%zpj#JYKoS>SUu-xik4rmlI^6{tLnZVRDM&9G1Ts$E>Uw0H6GNZs>x9EL0zUU zG*m07%hk<>x&+h}>Ip;L1?o!mx}hEc^(}lgRk!y`P*!Z)^3#s&<2>e$nss>P_mNYc#bDvPbX-nKkuRzp})mYOYY1tB?DIqK~OF z3{}#4a#YEJ)^fvxJtLamFO*#F4HFVquSh8B)V z{8A0LPTG^mc~_I@eH_LH4}5*ihF& z_G|TBL)``0uhl)8QjhdcM1P~ou4n6)N1pFLIr@U)ceP2q)Bohe3+hTusZSvLt(tlR zW!g%=RSPwxVgr^Zeyi3BrET`2`kJO9g9c<0FRJSdHEh6FK;34j@>oW_q_!Ap&jG_D zFR86UZBd^FGdPK#dn4OBSM4)^RFhC!)YwELzN>z*P{d{2A17hFXtazos&V+JN!BrrHg4(|}JBudB-qb@2b~@;@Hc3{f}zD z!yEe_)e(1kWB;Q%PE#`WKdOwOIQBoPc0+M|@2SfT#qqtTI)u`F`ID-}+XHzY{F9m_ zl&su%H-yqY_!o7hrlc=_QFj@Neff)e&`^x<_to=;VuZi1 zIt>*am{EUK9~-Loz~PaQYH!H?rc#DF2(k~;pB&P|O-1 zs%3^^*7#7ZHq<W`9?; zLTQ`*T}>B?HXG6F6Lsl*p3VND?!I5jiSPbHJ)tRe&cH_X4|VB}be-o5waHN56zVy= zmBBgsj!>NsYU*C0-hW6_KND*Dk2UpMp?+hi{}Jk?OtnZ`*L4_ zY?F}<7ulYV=vwN8YBkhMq24ysBB3sPG~dFPYW|^a(^Q1JE@f>o6z@!xwbf8R3QerB ztlt@GLh_sn%X;5Xje|M@wpH<%)ESwc+yaVU1mMo3Rw${Cd-Abrb%A8u+=V~h*X(*P9SoaxCmWx`E$zHjr)ki2@E@q84 z6w8%b^Nl9Um034T^U9T3_XwrSm0Md4#c~zadq$JxDyivoYN2$wgms~zST1SZW;9u@mo;8)^WL;*&tBGap>(+#Yq6nNuD7+; zXtG=%Yw|p=y*}1lp>(;vR+FJvuAjB_M6Jnk{jIkbd*%9D9}1<*4X~2+l&x1RH_#d{ zl%DrN7Jnj*Uci11vgC(zpvie3Y|R&$E>~-{8cnu0#JY01S8j-PvrxL+Zq{RlVtcz= zuNzI48*05IH%z*{q1GRS(&dI(k(I1dw>R8+U-p=~pL8o+(@faC|z!p^@*WaZcl5#*fLExpJqH_mDmN|zgNU2G_p+sC@Y zXtLbC)^ito<@U8+7fP4g&q5dRPxo_zRV$S4XPq_SQmujUR z_9j{Fvb)#wH_5tCC|&LV>t;i-+<{hYhi-x84zeb1^x8Yfs;aW^JhgjxmGCv(DEP)8 z-wHXZ09IAm>N}7I)K!MxJ?B=R)Q{gKWgquR{hXglyPYDP8e;2yI13ybobLOt$Mr=R zMQMyZ|Ia}G*xAY((pFcv^OpQ)we8GU{5||<_(`SooaKO)%H!Boy)`@v`!xP zbasBE{~Nv98H;f&JEPD3|I`;FYswfGIY2(Wz{{(6dcijzuL2CKn*dAHU4Rihy@&FNC+dO7J^lrRwW=3;3J(sm06j6_Bg&%XQbP zq&f$`xOEQR1Um;mXL=5_&cS<`=cs=8^v7oaJ_GR?gwJ4nYVjF@&u;kaj?YkhhT$_D zpFQwN;Zvq~R#qnvZ{`J80p}UcY~hrtIUz@M&O+FI*o(*nR=c#1)C*bTA&H(NY_$?{BQLQW~w>GLwNj2aZC4;Ry!5?bfuc{)~SbIYH z03fA%Li(gNUfmU$XHOFTB;ijIeo}h19c32=)+n9?tWh`Fq+7rtf0FPg34fCCCkcO{^kkv* zWTEtAsc@DGXQ^-&O4)@{cA=DAC}o!lf2r`73V*5ao1}&&si8?~XcbPYa9V}aBxReV zY?G92lCrJBZxw#4@LPo+#~ASonXu3BNMGQiB4z5YW#c04Do}oKa(-C$p9Vfjk%mkI1$-V#Yl*$buYrBdohvH6kejPi>jN2&|UGx*)n zZvpnTZYjSaa-q}~S9g}*6xkqS*&t)tAY)lzalY!Ul8R9DNJwMRA@H|EbdB}bvOdvM ztw8z80KIDvaQ13}npH6@xr4I{Ks&W}xA6L0D`hs;{ z<>}Fn)YX+4^@4R%<>=^k>*>l|^gQ)?<=JT6s@f3!lT}-FJ>ZC{ThNoet8R~egxX*+ zdu7Q_qa*BhtDcMAfDu`-8&v=J0(G0(Ej}>D78}(IYJ7ZT>;*M3zBf1r#m7Zw+nk*# z>clwg0DNL>fxRw%P;7xZCq5%~r2UQfp|QBSJbrxa9`Wi2#j7{Sj6Wz|y+P)EgUtH| znfH$*$_R&J#<#~Wh}GL4#II2G_NVbnQS*T6t7G-n@ahiWEurgUYwW|TZxQ_V*m-ta z^}T@SS3eMY3^g!{Z?FDU>^yaE^`B$w?FXtq70qDjdYd!20QN5{-H4tys#^qd6pe~K zKfaVUtS=p}1}8cKb#m^z0B~8fPR@Cs68=*X-Om|F%^|3BcG*iJeM$J|sp*L)%kGz& zHwzq(zHJG-4ro>ULEw|Z|AoN!)ptGm`1Wd< z#kW_>EWW*(w0P>1w0ORgw0M#e4LlpXzosuB&MT1HPXvq#EEgCT*h^qvfqd({8d;lg ztiXK)9v~3@0{(1)M+#gZ@I-+P0viRMD)2mk7YST1@G^nl5_pZkjRJ2Jc(1_w1#TAj zxWJza{FT6M0=ENJsMpn6{0R6v!g*KVSc^T}N8n)s8w55Ayhh+gfj0`gMd0@Y-YM{2 zf%gl1NZ@9HzYzF>z;^^%Hrombj0!9l7#G+}U|)d)1r8B7OyE8O4*;xC=h?q6saACX zu`S>b{D%5zfC1~|z-YW>xT$8e+P~zjmE^_-29I1zMKWAaIJndVx!< zyF;g`b%LKI_(s967ksnej|#qB@Ye)?$2uW+nzC%x8L;;cqi=#w5m+y9t-y5x&l1=n zaHD}7%k_faVm}b7F5M*fW&Xz-Z`!(B9>>AsI{P zZuPc3MEJW490BPGQo4SZesV$oa-&EbK1;WvW+-SV}9uM>D4I9tm*1m7rdlfcaa zI|XhRsKV@tC9qcD5P_2gP7%0RV7&ePQkYuNRBFzR!YSG4NiWo z;FAR|7P!$sN;eC>xrF$3!M6)uA7O3l45W0U;2R@SO7P8scM87UKuT3qdSW0swSo^Z zketbaPce|3#e&xxNX}Zp*BMC8M!`2miEkEsv*6nW-!8a{ah6r=ZZ$S&#iS=O>JJfo zh~Se&XEJoo3QiIJ6yetkUN87s(OC~QAo-gF-)tZ`+XdfVN_;ZjnmbJ` z7PwYmhrmq&I|VMrTO81-yjwMgIt1?kes`!-@J`^Lg=(uLf~xLT$A%XRz8Lr=;SRw& zfWH#%6ucAo;F8+7=*RC?3ri-)r4Itv3hWTLNnocyRZX2*fs+L;7PwYmhrmq&I|ZtQ z=nGsdaIL`31l#RQ+^wF9Z0bdwPJyaM^aXYZ+$6A5pz1ABfs+NQKIBXmxLDv?fgJ*G z=)+ihOyJtS)a($rN#J9BDeV+o^`kV{kDOY;hYCJf@Wlex3hWTLNnoeO`?GAPKsA7P zt-#3w7Yke~utVS`ft>=?K+zYd1_>^3vcSa}A58vYfolbJ2;3yFQ=qDqvH~XyTr6;{ zzz%_%1a=BkLquPo+HD$E;o9An08ZX*CE#L#YXx=)+$6A5pxT`}lLf97*dcI}z)pd+ zLs|c1fr|yM71$wglR!1>Q0p|cR-hU#xInds-~v@jaDi%s-~!c1!3C;Of(ul83NBE6 zNpOK`wBQ2OUc`G>)>aOy+`ID7%2s?QHdpz*%DXCmSovDz+m-KD{<-oWm7%Ic)sm_! zsy0;pr0S`vUsOF`^>)<(@oDkd@gw4E;$M!R6Tc(=gZP8-N8&$=|2AG({k7_cs()7f ztLi^ghZB7hLlb)?4oECaG$+nXT#&djaYy2r#5;*#vVZcc$)6`XlOHGd>UBb|_FmuY zbw#fmdfnRVo?egj+SbdiiPsFMnN~BWCV@HB=OyK8 zAUM0@BxRUN;I}oDYEwtn;BQt8ItDO1=y<@31nw;VeQOEIUM=<9IB11i&s~F>fIlGc zF@akLtp?|nL9KwV3PT_8}#3tU%qL{RBT?Fk93Xm^JuT;ByDxQ)A<-ht})`Xyder-=XUb$lt#&0p1tT z#;H>j@L<^2QnLVU+?SLCKLn6}bEgvc96%etQh*;~QyEy@QZ0b|P5WNJ+W>9&d~e{V z1KRi-Dt!U3#%Y$NHUQe{`gRwqz7;$c_%ndE z+N#C@{{^6}eu-}?Tk2UrTRn&GDO-4}Yd_%6iartdZ3(!`!H4k_I&{jd~Xy7408}9}j3%mr- z#_tK?d;?GY7XTk(odA3{KwIsOdn|na6wp?~EPj7`IN-_Z8?f%>)*aSi_9FYVz&U|W z0|SGn2M-PZGJH^EUc`x<9oZClH(C)}7F!j2Dz@8 zluYy*(yO&saIHR(_u$d^4mutRxc}a+xfvX#aB}DJ5FJ7k>b;Di7ni+L%9i*_{;6gS zo+lLQeO&X9=oQwtt(tnU75Y;#fq0#*#LEzTcEe|Pe1_sP44>in?14`T`Dz3{{5M=pum-~mMyP()2(`!>ryj$n!rosk zvqz|n_`HVCkienpa(wOz9IGD0=c&LV^*rcKe13<|`+-KaXE3dD_&g9CfnR-SQ4?@h zI~AWfp+nU%p%H2YKHtOVqtH3($nXetQTPJ&0%ll8(Miam)Y}L)0qY`Tx9mqEe#oR@>gFC)0!F^ znp+j59ya5QB@L@v8}YZrrlp&gH7;+<)C=V+hQ2g3scH4C4a?J+HR_1W(uNFspyt;v zmu8gdqONuH{DziR5u0mQsn-MQdQ?}cnYHAR6%jkm}nj12WOVpyJ4a@4=np$-|ht;oE(=|g)LKCgpN?mIAM2hIV74@0b zYSN5MCY|ZNyGGR9iaG64+c6jbCv_6tpt*ikH^ZG<-_mk=IrH8jQHPxTo#97j&Q2S_25;EsEu4>57dKU#a%c|8)4c!!-l=t?o zW#+C(x2BKIG7{E_i^Pv=#Sj(UO4VzBs9(CYQG%oCu!h$9r6{kK zH8wSQBduDEN-`2y zn9QY9TJal0C%3gWdWJSXmHM6aG2~tS`cdVMx+_tJA!&u3Wa!zCOsj!MS zM{2gG1dn5*=sy#I;F1{*LkQO|Z$R!jxsB_`yw--*^H*fjZOd15G2`^c`sK~(me$54 zEyx(FF?|hOVOrKSFF9}tdQ4=DnzS0hz39M2iwr8`Y5@(OKeeqPv&Lm$Oe-Xbx}0%p z(z0}Bl}nEYou3p|u@7oT2d2WuK<$h2F!3T?$)bAXqt&fc+pjwT_!HEmjF~G?b!uqq zipCZ-^yIciCM6{!nP1zN!51l(rP0KW3wD5`gj5Z$Cu(AP|X@$`+7Azs7 z$!*bT}#<8(UY*gtrw|4;S-y zWLhCPT}_(az_p;uX$Vf z(d@BN0!a>=6*aV_6+5Ld%G(gmYiKPXjAFi{vl^E!ZD{refbwogD3q1{n-Ed6#WV#h zY&{w>T$Ip<+0CaRd0}^1Xh9^JxlQ#;8f42^D1yJDoCvyl5~5B|W;X@LsW!7EQmf4l z2)jnf08 zok*STDsC2NUAfDa418Gnw1&eQ&S+KG)?fjbKvNoR;C?_a(8P{(mo3>Du+d{Pj4U-p zHuYw4Wo)}4XjWQj2~|*rplMjbZ3*^`O-RXqrPzPh1v07@K*CzK8xO-gP+Lpn()v%fYEkjje>M2c4x?K*Hx0>*jRmcR! z5Fk!QnrL2@&NqEj!!mQrrB`hUO9c;TX;8D7_Ul{cX40oMa^atjl*C(rd97=jFf?Pj zgYnCg7~h%tPWOtR(rU>rrFqLWg4bov&)%it#5?MX6LP)F94@IB;DAoTIs?wnwO-x`N;R3 zhL;+Tob|e^o*Ag?Ec>iF;$o;s} z)bs2%Q&3bBy3qXk4D6|NA=Su4tY`x5Oz^MzrPwMNj zY%G_pjmsKglKGi6m^!_fPjAfNo`@$aGtR)0(PFlw9^1vl*z~4pI2>p}Ml%KHHNes8 zQ3d%*z>Mb88Z+r;W_Rs>^YSMGN36!pMJt>{2LrZ+EeNqDiFKXEAoDX3Zw*MpOK|(8 zRT~jWc?HRe$F6_^LK-)?(pbJJ+L&&hsbA9SxuOZe{HM&d=Zub#}|l`X*mCkYz5@aCo|P9(u((*GL0&lA&NJ^%wbgGg(&R+H4wk=tdrn2)n7t-phXCfR1jn9iV z%+4V?5;Ud*<6IyGWTysfip0rJ1vR#1$oT1wF_WSJtwRnwoOaCtZ#?c)P~)InT0$AI z*g(*~)T$;0lubz*QKtE6(V<~8X@pC(&AAWR1UGa3r8ODnZABS}gQz9V2%JC{f#2r@ zs#}vV@cFtW!`XAmls94F=5;1w(gtZHtw1PD#j**Qj9DIy=n06qRo8S(vTREb4s)nX z9Fr*5Gz7q8DVu=l64T)X@iwKTAB!sm&g?9JDq|zMUEMrDxu9)wI}aeHjij|m5)(a= zu+F4FY)J`c?MY}kS0rK3df5cDV7gqwXph~p!X&humX@S4#d_y9<#b~G>8_`On%TAq zhMS6{AiGUc+OzGaa;rKKZTE~v9o zlPd}i`s0MbgwE-glMeIIWDcQCM$AVGw&hzPF&nMfD;q6qB}8zvYbK7K=;TBI^u%m} zUKVkZBM^FFMw(2s%Nzt{0=l3RBNOaGhJipIbkZcmi!v6$z$IG|GE}6ZSkoe( zWJSya9lJTKZE=Qzh2jKa;+`xkufRAb+aVbFY2;ljm8adZRJL0(rLf>KYh)WCuGuCL zvNpn;)HaD^rsFTkJ{?ALn$={Rgg6V?of7iWmV|X)uGnItv;mJ|HWOv*)wL(FBt>HR zge1fZTiB2(i%chWlC2i004$sa!%%<_)68y)VA}|D%x;S0*ofqapP|!rkf~-VNz!dZ zaxnLj4MTEh_EV&EyM-c1E=DYIC`2suESO?9P6XP;m}hoQB+EvaBReOOtV2vgN$a|W zb%<$fYdz))a4I?v=TKc}EHAEOE=$kvB|DgEo0Lrxkd9F^Nww|@agveRtkVjJ^HQBV zH@9w9Du~tDshB#q3y&DH3hZ5QyN^lM{b58rl$}P_=V8Wm*&Lt*#7T6eVhWY@e6miC z>sU!h_aWP5Y!6BIhBg(45{kxZeYEOlwJm86t4&Tr5_dD%NmI7PbsOteO*Nr$=yVnJ zKDwTgQ3T0qY`0}t%r&?av2E7bWoo{&dUutpB5sDTwta77tFd}l*)7|9xO>A&0b7$x=BohciVx>Vf30s&A&sQg~Y-Hur$FjBib;lb3Mc z63Cix)e!#H)e3U2qnstdURGD74rhsTq8H8_FqYELPn-Hrs{5$%I&yy*PpVx5hva(~ zbyxk{>DXK^`Y$FlG(T8vXrm<@KH0s@1(dkL@=7dQLg#+gvJ4F=XZK}rgE^V-M2S(Z zzll1nN@xiwn<$CT|E-DqmJzPuw2Rh=dC1~f#2=!qmLZwW7I;apbX{3fVyMHec5kI9 z;bjyD99@OC4sL>v+v*L__=ZxadeyXBIa0&sZ~eTh*r{Y+1KU*J7ZdeXrS(LB>O!wd zJf4zNY5V70ql*xDLmJL>o8H~56aKSNF3PI`881Sq*saL3n%YabCZX02eqPMZ3NfA` z{*ttrHfW2W^s>~SIqc+%=yL4*QbJEf?8cKw2lj<#z zm9860fXO(REptCo>?~7i{nlqu>vUgne5ljC+P*uE@O*$;y}ggNzJM0yz`29#^#nsG zj5!LE&;IHul3@xTM65$lL~cs6I|~oDSz~F|@P*gZ|y&_xG*p;xnMv(}CB|F287^U=G0>4Deq z(z{8zVSJVxr%l5CIPQia98cX9)#gx7^Y9??;?~hkHxRGktoSmn%V=+U?Jxsl%(*Sz zFbBljfYjP>8xZuxzm9ISgdF&KIlSx_N7u)3^!oyGINa$$?*x7aj2(Lusq{b1Y~rk% zP|sP~hVnV}Iy}v%@NDvVoU?u%zn;X{O<>+qV>o5)a*w0Tr|^9iKfinp+|qQA_X+6i zE;=2Dyt}wAt2=56c(22gPeWZ4DJCKp)p7rdR}8G9cJ3AkUzD7`pn)U6eZ^xB(jP&F&ZX0L&UiTNODT6<=|N-_BrY* zby(-5xzgn)97!4NH5QyBnpe)J>1|+5&B9*Kud>qUEijWTV4ssvTwmwm`2jq@h#J;0v7?S37FE2k!Y! z+;+`PW47n1BW&e|;NGktIr*uBw69#Hp#@$+Ki(S_?ez@pEVW<~tPWQG~hugAVi76jRysn#pZ&&v95=BTisRNgbQQ$Z`^&X*>n@Jjy$*X5@1QPrudiQT^&`KTvbio>kzG`>^#_T`F|SMxAMuLgC`^9GKpeA%m9CCAqb zU@*Ql?WxJsqg>d(o4~3&ZewnTUv@K6=lq4p!W4eyau3YZi4ltia|$LQ&gr5;xs}BO zkoz(!!lbeb;;}tOAZBoSLnO3{*b8`v^B$$SgAICLAj>XH3n|?^9Q>| z2bQ0QCtHly$a+VoS79A#$dQ;gAsq6fMT&nCk-|(u1p?KA+vdIt|q}-5LuKPX} zZ{Vm`D*KWo3W$6v;G-h1&EK|p3pR9v0E5cLZ`#lu8(OlV2R76w53w__)k4(u3kMTL zGik`7-kB&xvDrmC%oCGinIj-salk^OgnFVEb*&e5QrtQ1sV}!RuA}Hqhh*uYlMwmM z$FXCNjbzaiU4MJVQz!QR*1ZF$x~l>Jdw7O8CjZ;p3r*tqNmR9la@WjktGF5QmL1{2wKc5 zEBaoS4r427&vRr6(S8v3{a!+HM?JF0FcgVu&1%)svihKldRRVSbQtdb7=Y&G!(P0& z!y;K;U^t{AAN4|Z=SZ^1FdJpl`I}7_e8&afb;0*s@O>Bjzy&{a!H>>nJqG%mcuEgn zJrC_Qr_aN_L>#Z9O7r&)&}=oopN!WGMUhVXu1)(c(lB-odgWR!ZvJ6Ztu+4#_zaSc zB!xl+LoowDh(}8t<(q%%#cKy^dBP+y;&|~CQu0MGkT1r~?`WliC56)I-t}=?XHK4> zM(5I@vArHCfS=;QGf=sBG#V~|Z^Q~1_?tg2svJC!2$nl!YDmB;>NQ-zdno+)R(va` zR0P8uH~$hSbXSTBQbN8K*5A@H4;O&!<7W+Xl}Z#h|FP2iXFye>_*Oxolz$%_@N$XQ zLcgW?pKxDtWsjtyXc%q~fc_hVz*_+f3>Urt|DZ*usZ}V%tx|leihsNlBX0FqT9xRK zLh9j4YZ&sIhX)bgl6$LvunStBA{`DNzyU&5oVsTrJ9CZWB6nrmv;H?{=IC^lU zWjY`cpBE8jnNcOrA_lFcsIz5xOZ@vsT&YptLeD`%|-npfo^~qa*)@0SFL+4CDk%3tUdj1 z1mT2Y>Q+KGrg<1lCLJ@nuTB>sPp=wLiqq&AUbPyQ0mxY%OwphU105BJaa!(5i@t0i z_jnqn(({Q(^WdRlqd&lqz}E$h5QY^LBb0R+X_^Pl8Ue~#11!n)c)Fh!gp(d&w4&`v zDg|iB;{;V8VPSNv2up?T3_}%P$GrqoEKpGyBhPgm#ET=7#CWZbfI2x|6Anglfd~7e z;*osd#f*hAzk(+mg#ox?Ky%Fy=b%wE5|m*-8Qlb5$E zNrepWwo>)@ku>nER&`j@&iHpP_7?^QrE~Q473C>9tEjqYhiUi1&0Cr#P7sY)v+3eaZHZ)gCqj@ zn5{7yVWy4>k7AgOs!`%P6Tj2 zsTt^?@Vct-r_krCa72a+@me{^ z5UXIVmKTpFM8kwAtd%AzW((kz3eA=TMCB!vAo&TBZ;*Upq5eiN)RhHSd^RL}wOuL| zU1{w9RQzmUy4-W;!wmNAD!}IJ=fc3|CoJJ>#XT0@_QAK(=PFLnu3l z_r)V|-#`$UU|eGY21*aTlLIvz0FDO?iXa&P=U9v!!Kj(Ti^akbJ$OV+DIukbZPRQtui$&*j;B8H8Pk8C_*mM)$%1P*v+^4Dx4w!H z&r)1Ld>+>q5$4}d^8fZfJhsyQcRoqTeat?`1Yp9ArBip# x_9wYxY-D{EG&hj83mLjI52jpQmn=-X6l(E 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 literal 26270 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 From afb7e31e217c276c08c145c266dd4393460c2a90 Mon Sep 17 00:00:00 2001 From: xhh Date: Thu, 3 Dec 2015 13:25:59 +0800 Subject: [PATCH 102/211] Add authentications support to Clojure client Closes #1654 --- .../src/main/resources/clojure/api.mustache | 3 +- .../src/main/resources/clojure/core.mustache | 101 ++++++++++++------ .../clojure/src/swagger_petstore/api/pet.clj | 24 +++-- .../src/swagger_petstore/api/store.clj | 12 ++- .../clojure/src/swagger_petstore/api/user.clj | 24 +++-- .../clojure/src/swagger_petstore/core.clj | 97 ++++++++++++----- .../test/swagger_petstore/api/pet_test.clj | 7 ++ .../test/swagger_petstore/api/store_test.clj | 7 ++ .../test/swagger_petstore/api/user_test.clj | 7 ++ .../test/swagger_petstore/core_test.clj | 48 +++++++-- 10 files changed, 241 insertions(+), 89 deletions(-) diff --git a/modules/swagger-codegen/src/main/resources/clojure/api.mustache b/modules/swagger-codegen/src/main/resources/clojure/api.mustache index 94e95dffaf7..2993f118b57 100644 --- a/modules/swagger-codegen/src/main/resources/clojure/api.mustache +++ b/modules/swagger-codegen/src/main/resources/clojure/api.mustache @@ -15,5 +15,6 @@ <#hasOptionalParams> :form-params {<#formParams>"" }<#bodyParam> <#hasOptionalParams> :body-param <#hasOptionalParams> :content-types [<#consumes>""<#hasMore> ] - <#hasOptionalParams> :accepts [<#produces>""<#hasMore> ]}))<#hasOptionalParams>) + <#hasOptionalParams> :accepts [<#produces>""<#hasMore> ] + <#hasOptionalParams> :auth-names [<#authMethods>"<&name>"<#hasMore> ]})<#hasOptionalParams>)) \ No newline at end of file diff --git a/modules/swagger-codegen/src/main/resources/clojure/core.mustache b/modules/swagger-codegen/src/main/resources/clojure/core.mustache index 32aa8a6bc0d..7ed6195a671 100644 --- a/modules/swagger-codegen/src/main/resources/clojure/core.mustache +++ b/modules/swagger-codegen/src/main/resources/clojure/core.mustache @@ -1,4 +1,4 @@ -(ns {{{baseNamespace}}}.core +{{=< >=}}(ns <&baseNamespace>.core (:require [cheshire.core :refer [generate-string parse-string]] [clojure.string :as str] [clj-http.client :as client]) @@ -7,12 +7,18 @@ (java.util Date TimeZone) (java.text SimpleDateFormat))) +(def auth-definitions + {<#authMethods>"<&name>" <#isBasic>{:type :basic}<#isApiKey>{:type :api-key<#isKeyInHeader> :in :header<#isKeyInQuery> :in :query :param-name "<&keyParamName>"}<#isOAuth>{:type :oauth2}<#hasMore> + }) + (def default-api-context "Default API context." - {:base-url "http://petstore.swagger.io/v2" + {:base-url "<&basePath>" :date-format "yyyy-MM-dd" :datetime-format "yyyy-MM-dd'T'HH:mm:ss.SSSXXX" - :debug false}) + :debug false + :auths {<#authMethods>"<&name>" nil<#hasMore> + }}) (def ^:dynamic *api-context* "Dynamic API context to be applied in API calls." @@ -20,12 +26,16 @@ (defmacro with-api-context "A helper macro to wrap *api-context* with default values." - [context & body] - `(binding [*api-context* (merge *api-context* ~context)] - ~@body)) + [api-context & body] + `(let [api-context# ~api-context + api-context# (-> *api-context* + (merge api-context#) + (assoc :auths (merge (:auths *api-context*) (:auths api-context#))))] + (binding [*api-context* api-context#] + ~@body))) (defmacro check-required-params - "Throw exception if the given parameter value is nil." + "Throw exception if any of the given parameters is nil." [& params] (->> params (map (fn [p] @@ -33,9 +43,9 @@ (throw (IllegalArgumentException. ~(str "The parameter \"" p "\" is required")))))) (list* 'do))) -(defn- make-date-format - ([format-str] (make-date-format format-str nil)) - ([format-str time-zone] +(defn- ^SimpleDateFormat make-date-format + ([^String format-str] (make-date-format format-str nil)) + ([^String format-str ^String time-zone] (let [date-format (SimpleDateFormat. format-str)] (when time-zone (.setTimeZone date-format (TimeZone/getTimeZone time-zone))) @@ -75,18 +85,45 @@ (-> (make-date-format datetime-format time-zone) (.parse s))))) -(defn param-to-str [param] +(defn param->str "Format the given parameter value to string." + [param] (cond (instance? Date param) (format-datetime param) (sequential? param) (str/join "," param) :else (str param))) +(defn auth->opts + "Process the given auth to an option map that might conatin request options and parameters." + [{:keys [type in param-name]} value] + (case type + :basic {:req-opts {:basic-auth value}} + :oauth2 {:req-opts {:oauth-token value}} + :api-key (case in + :header {:header-params {param-name value}} + :query {:query-params {param-name value}} + (throw (IllegalArgumentException. (str "Invalid `in` for api-key auth: " in)))) + (throw (IllegalArgumentException. (str "Invalid auth `type`: " type))))) + +(defn process-auth + "Process the given auth name into options, which is merged into the given opts." + [opts auth-name] + (if-let [value (get-in *api-context* [:auths auth-name])] + (merge-with merge + opts + (auth->opts (get auth-definitions auth-name) value)) + opts)) + +(defn auths->opts + "Process the given auth names to an option map that might conatin request options and parameters." + [auth-names] + (reduce process-auth {} auth-names)) + (defn make-url "Make full URL by adding base URL and filling path parameters." [path path-params] (let [path (reduce (fn [p [k v]] - (str/replace p (re-pattern (str "\\{" k "\\}")) (param-to-str v))) + (str/replace p (re-pattern (str "\\{" k "\\}")) (param->str v))) path path-params)] (str (:base-url *api-context*) path))) @@ -95,15 +132,15 @@ "Normalize parameter value, handling three cases: for sequential value, normalize each elements of it; for File value, do nothing with it; - otherwise, call `param-to-string`." + otherwise, call `param->str`." [param] (cond (sequential? param) (map normalize-param param) (instance? File param) param - :else (param-to-str param))) + :else (param->str param))) (defn normalize-params - "Normalize parameters values: remove nils, format to string with `param-to-str`." + "Normalize parameters values: remove nils, format to string with `param->str`." [params] (->> params (remove (comp nil? second)) @@ -144,7 +181,7 @@ ;; for non-JSON response, return the body string directly :else body)) -(defn form-params-to-multipart +(defn form-params->multipart "Convert the given form parameters map into a vector as clj-http's :multipart option." [form-params] (->> form-params @@ -153,25 +190,27 @@ (defn call-api "Call an API by making HTTP request and return its response." - [path method {:keys [path-params query-params header-params form-params body-param content-types accepts]}] + [path method {:keys [path-params body-param content-types accepts auth-names] :as opts}] (let [{:keys [debug]} *api-context* + {:keys [req-opts query-params header-params form-params]} (auths->opts auth-names) + query-params (merge query-params (:query-params opts)) + header-params (merge header-params (:header-params opts)) + form-params (merge form-params (:form-params opts)) url (make-url path path-params) - content-type (or (json-preferred-mime content-types) - (and body-param :json)) + content-type (or (json-preferred-mime content-types) (and body-param :json)) accept (or (json-preferred-mime accepts) :json) multipart? (= "multipart/form-data" content-type) - opts (cond-> {:url url :method method} - accept (assoc :accept accept) - (seq query-params) (assoc :query-params (normalize-params query-params)) - (seq header-params) (assoc :header-params (normalize-params header-params)) - (and content-type (not multipart?)) (assoc :content-type content-type) - multipart? (assoc :multipart (-> form-params - normalize-params - form-params-to-multipart)) - (and (not multipart?) (seq form-params)) (assoc :form-params (normalize-params form-params)) - body-param (assoc :body (serialize body-param content-type)) - debug (assoc :debug true :debug-body true)) - resp (client/request opts)] + req-opts (cond-> req-opts + true (assoc :url url :method method) + accept (assoc :accept accept) + (seq query-params) (assoc :query-params (normalize-params query-params)) + (seq header-params) (assoc :headers (normalize-params header-params)) + (and content-type (not multipart?)) (assoc :content-type content-type) + multipart? (assoc :multipart (-> form-params normalize-params form-params->multipart)) + (and (not multipart?) (seq form-params)) (assoc :form-params (normalize-params form-params)) + body-param (assoc :body (serialize body-param content-type)) + debug (assoc :debug true :debug-body true)) + resp (client/request req-opts)] (when debug (println "Response:") (println resp)) diff --git a/samples/client/petstore/clojure/src/swagger_petstore/api/pet.clj b/samples/client/petstore/clojure/src/swagger_petstore/api/pet.clj index c331444c886..ac4b921ba1e 100644 --- a/samples/client/petstore/clojure/src/swagger_petstore/api/pet.clj +++ b/samples/client/petstore/clojure/src/swagger_petstore/api/pet.clj @@ -14,7 +14,8 @@ :form-params {} :body-param body :content-types ["application/json" "application/xml"] - :accepts ["application/json" "application/xml"]}))) + :accepts ["application/json" "application/xml"] + :auth-names ["petstore_auth"]}))) (defn add-pet "Add a new pet to the store @@ -28,7 +29,8 @@ :form-params {} :body-param body :content-types ["application/json" "application/xml"] - :accepts ["application/json" "application/xml"]}))) + :accepts ["application/json" "application/xml"] + :auth-names ["petstore_auth"]}))) (defn find-pets-by-status "Finds Pets by status @@ -41,7 +43,8 @@ :query-params {"status" status } :form-params {} :content-types [] - :accepts ["application/json" "application/xml"]}))) + :accepts ["application/json" "application/xml"] + :auth-names ["petstore_auth"]}))) (defn find-pets-by-tags "Finds Pets by tags @@ -54,7 +57,8 @@ :query-params {"tags" tags } :form-params {} :content-types [] - :accepts ["application/json" "application/xml"]}))) + :accepts ["application/json" "application/xml"] + :auth-names ["petstore_auth"]}))) (defn get-pet-by-id "Find pet by ID @@ -66,7 +70,8 @@ :query-params {} :form-params {} :content-types [] - :accepts ["application/json" "application/xml"]})) + :accepts ["application/json" "application/xml"] + :auth-names ["api_key"]})) (defn update-pet-with-form "Updates a pet in the store with form data @@ -79,7 +84,8 @@ :query-params {} :form-params {"name" name "status" status } :content-types ["application/x-www-form-urlencoded"] - :accepts ["application/json" "application/xml"]}))) + :accepts ["application/json" "application/xml"] + :auth-names ["petstore_auth"]}))) (defn delete-pet "Deletes a pet @@ -92,7 +98,8 @@ :query-params {} :form-params {} :content-types [] - :accepts ["application/json" "application/xml"]}))) + :accepts ["application/json" "application/xml"] + :auth-names ["petstore_auth"]}))) (defn upload-file "uploads an image @@ -105,4 +112,5 @@ :query-params {} :form-params {"additionalMetadata" additional-metadata "file" file } :content-types ["multipart/form-data"] - :accepts ["application/json" "application/xml"]}))) + :accepts ["application/json" "application/xml"] + :auth-names ["petstore_auth"]}))) diff --git a/samples/client/petstore/clojure/src/swagger_petstore/api/store.clj b/samples/client/petstore/clojure/src/swagger_petstore/api/store.clj index f2a18cea2e8..054b3671fa6 100644 --- a/samples/client/petstore/clojure/src/swagger_petstore/api/store.clj +++ b/samples/client/petstore/clojure/src/swagger_petstore/api/store.clj @@ -12,7 +12,8 @@ :query-params {} :form-params {} :content-types [] - :accepts ["application/json" "application/xml"]})) + :accepts ["application/json" "application/xml"] + :auth-names ["api_key"]})) (defn place-order "Place an order for a pet @@ -26,7 +27,8 @@ :form-params {} :body-param body :content-types [] - :accepts ["application/json" "application/xml"]}))) + :accepts ["application/json" "application/xml"] + :auth-names []}))) (defn get-order-by-id "Find purchase order by ID @@ -38,7 +40,8 @@ :query-params {} :form-params {} :content-types [] - :accepts ["application/json" "application/xml"]})) + :accepts ["application/json" "application/xml"] + :auth-names []})) (defn delete-order "Delete purchase order by ID @@ -50,4 +53,5 @@ :query-params {} :form-params {} :content-types [] - :accepts ["application/json" "application/xml"]})) + :accepts ["application/json" "application/xml"] + :auth-names []})) diff --git a/samples/client/petstore/clojure/src/swagger_petstore/api/user.clj b/samples/client/petstore/clojure/src/swagger_petstore/api/user.clj index 15d41515ebb..2e5c5782e04 100644 --- a/samples/client/petstore/clojure/src/swagger_petstore/api/user.clj +++ b/samples/client/petstore/clojure/src/swagger_petstore/api/user.clj @@ -14,7 +14,8 @@ :form-params {} :body-param body :content-types [] - :accepts ["application/json" "application/xml"]}))) + :accepts ["application/json" "application/xml"] + :auth-names []}))) (defn create-users-with-array-input "Creates list of users with given input array @@ -28,7 +29,8 @@ :form-params {} :body-param body :content-types [] - :accepts ["application/json" "application/xml"]}))) + :accepts ["application/json" "application/xml"] + :auth-names []}))) (defn create-users-with-list-input "Creates list of users with given input array @@ -42,7 +44,8 @@ :form-params {} :body-param body :content-types [] - :accepts ["application/json" "application/xml"]}))) + :accepts ["application/json" "application/xml"] + :auth-names []}))) (defn login-user "Logs user into the system @@ -55,7 +58,8 @@ :query-params {"username" username "password" password } :form-params {} :content-types [] - :accepts ["application/json" "application/xml"]}))) + :accepts ["application/json" "application/xml"] + :auth-names []}))) (defn logout-user "Logs out current logged in user session @@ -67,7 +71,8 @@ :query-params {} :form-params {} :content-types [] - :accepts ["application/json" "application/xml"]})) + :accepts ["application/json" "application/xml"] + :auth-names []})) (defn get-user-by-name "Get user by user name @@ -79,7 +84,8 @@ :query-params {} :form-params {} :content-types [] - :accepts ["application/json" "application/xml"]})) + :accepts ["application/json" "application/xml"] + :auth-names []})) (defn update-user "Updated user @@ -93,7 +99,8 @@ :form-params {} :body-param body :content-types [] - :accepts ["application/json" "application/xml"]}))) + :accepts ["application/json" "application/xml"] + :auth-names []}))) (defn delete-user "Delete user @@ -105,4 +112,5 @@ :query-params {} :form-params {} :content-types [] - :accepts ["application/json" "application/xml"]})) + :accepts ["application/json" "application/xml"] + :auth-names []})) diff --git a/samples/client/petstore/clojure/src/swagger_petstore/core.clj b/samples/client/petstore/clojure/src/swagger_petstore/core.clj index e7c55258e79..50312c3d150 100644 --- a/samples/client/petstore/clojure/src/swagger_petstore/core.clj +++ b/samples/client/petstore/clojure/src/swagger_petstore/core.clj @@ -7,12 +7,18 @@ (java.util Date TimeZone) (java.text SimpleDateFormat))) +(def auth-definitions + {"petstore_auth" {:type :oauth2} + "api_key" {:type :api-key :in :header :param-name "api_key"}}) + (def default-api-context "Default API context." {:base-url "http://petstore.swagger.io/v2" :date-format "yyyy-MM-dd" :datetime-format "yyyy-MM-dd'T'HH:mm:ss.SSSXXX" - :debug false}) + :debug false + :auths {"petstore_auth" nil + "api_key" nil}}) (def ^:dynamic *api-context* "Dynamic API context to be applied in API calls." @@ -20,12 +26,16 @@ (defmacro with-api-context "A helper macro to wrap *api-context* with default values." - [context & body] - `(binding [*api-context* (merge *api-context* ~context)] - ~@body)) + [api-context & body] + `(let [api-context# ~api-context + api-context# (-> *api-context* + (merge api-context#) + (assoc :auths (merge (:auths *api-context*) (:auths api-context#))))] + (binding [*api-context* api-context#] + ~@body))) (defmacro check-required-params - "Throw exception if the given parameter value is nil." + "Throw exception if any of the given parameters is nil." [& params] (->> params (map (fn [p] @@ -33,9 +43,9 @@ (throw (IllegalArgumentException. ~(str "The parameter \"" p "\" is required")))))) (list* 'do))) -(defn- make-date-format - ([format-str] (make-date-format format-str nil)) - ([format-str time-zone] +(defn- ^SimpleDateFormat make-date-format + ([^String format-str] (make-date-format format-str nil)) + ([^String format-str ^String time-zone] (let [date-format (SimpleDateFormat. format-str)] (when time-zone (.setTimeZone date-format (TimeZone/getTimeZone time-zone))) @@ -75,18 +85,45 @@ (-> (make-date-format datetime-format time-zone) (.parse s))))) -(defn param-to-str [param] +(defn param->str "Format the given parameter value to string." + [param] (cond (instance? Date param) (format-datetime param) (sequential? param) (str/join "," param) :else (str param))) +(defn auth->opts + "Process the given auth to an option map that might conatin request options and parameters." + [{:keys [type in param-name]} value] + (case type + :basic {:req-opts {:basic-auth value}} + :oauth2 {:req-opts {:oauth-token value}} + :api-key (case in + :header {:header-params {param-name value}} + :query {:query-params {param-name value}} + (throw (IllegalArgumentException. (str "Invalid `in` for api-key auth: " in)))) + (throw (IllegalArgumentException. (str "Invalid auth `type`: " type))))) + +(defn process-auth + "Process the given auth name into options, which is merged into the given opts." + [opts auth-name] + (if-let [value (get-in *api-context* [:auths auth-name])] + (merge-with merge + opts + (auth->opts (get auth-definitions auth-name) value)) + opts)) + +(defn auths->opts + "Process the given auth names to an option map that might conatin request options and parameters." + [auth-names] + (reduce process-auth {} auth-names)) + (defn make-url "Make full URL by adding base URL and filling path parameters." [path path-params] (let [path (reduce (fn [p [k v]] - (str/replace p (re-pattern (str "\\{" k "\\}")) (param-to-str v))) + (str/replace p (re-pattern (str "\\{" k "\\}")) (param->str v))) path path-params)] (str (:base-url *api-context*) path))) @@ -95,15 +132,15 @@ "Normalize parameter value, handling three cases: for sequential value, normalize each elements of it; for File value, do nothing with it; - otherwise, call `param-to-string`." + otherwise, call `param->str`." [param] (cond (sequential? param) (map normalize-param param) (instance? File param) param - :else (param-to-str param))) + :else (param->str param))) (defn normalize-params - "Normalize parameters values: remove nils, format to string with `param-to-str`." + "Normalize parameters values: remove nils, format to string with `param->str`." [params] (->> params (remove (comp nil? second)) @@ -144,7 +181,7 @@ ;; for non-JSON response, return the body string directly :else body)) -(defn form-params-to-multipart +(defn form-params->multipart "Convert the given form parameters map into a vector as clj-http's :multipart option." [form-params] (->> form-params @@ -153,25 +190,27 @@ (defn call-api "Call an API by making HTTP request and return its response." - [path method {:keys [path-params query-params header-params form-params body-param content-types accepts]}] + [path method {:keys [path-params body-param content-types accepts auth-names] :as opts}] (let [{:keys [debug]} *api-context* + {:keys [req-opts query-params header-params form-params]} (auths->opts auth-names) + query-params (merge query-params (:query-params opts)) + header-params (merge header-params (:header-params opts)) + form-params (merge form-params (:form-params opts)) url (make-url path path-params) - content-type (or (json-preferred-mime content-types) - (and body-param :json)) + content-type (or (json-preferred-mime content-types) (and body-param :json)) accept (or (json-preferred-mime accepts) :json) multipart? (= "multipart/form-data" content-type) - opts (cond-> {:url url :method method} - accept (assoc :accept accept) - (seq query-params) (assoc :query-params (normalize-params query-params)) - (seq header-params) (assoc :header-params (normalize-params header-params)) - (and content-type (not multipart?)) (assoc :content-type content-type) - multipart? (assoc :multipart (-> form-params - normalize-params - form-params-to-multipart)) - (and (not multipart?) (seq form-params)) (assoc :form-params (normalize-params form-params)) - body-param (assoc :body (serialize body-param content-type)) - debug (assoc :debug true :debug-body true)) - resp (client/request opts)] + req-opts (cond-> req-opts + true (assoc :url url :method method) + accept (assoc :accept accept) + (seq query-params) (assoc :query-params (normalize-params query-params)) + (seq header-params) (assoc :headers (normalize-params header-params)) + (and content-type (not multipart?)) (assoc :content-type content-type) + multipart? (assoc :multipart (-> form-params normalize-params form-params->multipart)) + (and (not multipart?) (seq form-params)) (assoc :form-params (normalize-params form-params)) + body-param (assoc :body (serialize body-param content-type)) + debug (assoc :debug true :debug-body true)) + resp (client/request req-opts)] (when debug (println "Response:") (println resp)) diff --git a/samples/client/petstore/clojure/test/swagger_petstore/api/pet_test.clj b/samples/client/petstore/clojure/test/swagger_petstore/api/pet_test.clj index 7327b44c45d..281179150a7 100644 --- a/samples/client/petstore/clojure/test/swagger_petstore/api/pet_test.clj +++ b/samples/client/petstore/clojure/test/swagger_petstore/api/pet_test.clj @@ -1,8 +1,15 @@ (ns swagger-petstore.api.pet-test (:require [clojure.test :refer :all] [clojure.java.io :as io] + [swagger-petstore.core :refer [with-api-context]] [swagger-petstore.api.pet :refer :all])) +(defn credentials-fixture [f] + (with-api-context {:auths {"api_key" "special-key"}} + (f))) + +(use-fixtures :once credentials-fixture) + (defn- make-random-pet ([] (make-random-pet nil)) ([{:keys [id] :as attrs :or {id (System/currentTimeMillis)}}] diff --git a/samples/client/petstore/clojure/test/swagger_petstore/api/store_test.clj b/samples/client/petstore/clojure/test/swagger_petstore/api/store_test.clj index 5a453e3693e..cf58b488ed4 100644 --- a/samples/client/petstore/clojure/test/swagger_petstore/api/store_test.clj +++ b/samples/client/petstore/clojure/test/swagger_petstore/api/store_test.clj @@ -1,8 +1,15 @@ (ns swagger-petstore.api.store-test (:require [clojure.test :refer :all] + [swagger-petstore.core :refer [with-api-context]] [swagger-petstore.api.store :refer :all]) (:import (java.util Date))) +(defn credentials-fixture [f] + (with-api-context {:auths {"api_key" "special-key"}} + (f))) + +(use-fixtures :once credentials-fixture) + (defn- make-random-order [] {:id (+ 90000 (rand-int 10000)) :petId 200 diff --git a/samples/client/petstore/clojure/test/swagger_petstore/api/user_test.clj b/samples/client/petstore/clojure/test/swagger_petstore/api/user_test.clj index aa05b23f19a..c24be99c284 100644 --- a/samples/client/petstore/clojure/test/swagger_petstore/api/user_test.clj +++ b/samples/client/petstore/clojure/test/swagger_petstore/api/user_test.clj @@ -1,7 +1,14 @@ (ns swagger-petstore.api.user-test (:require [clojure.test :refer :all] + [swagger-petstore.core :refer [with-api-context]] [swagger-petstore.api.user :refer :all])) +(defn credentials-fixture [f] + (with-api-context {:auths {"api_key" "special-key"}} + (f))) + +(use-fixtures :once credentials-fixture) + (defn- make-random-user ([] (make-random-user nil)) ([{:keys [id] :as attrs :or {id (System/currentTimeMillis)}}] diff --git a/samples/client/petstore/clojure/test/swagger_petstore/core_test.clj b/samples/client/petstore/clojure/test/swagger_petstore/core_test.clj index 394824aa4a9..b68358a860e 100644 --- a/samples/client/petstore/clojure/test/swagger_petstore/core_test.clj +++ b/samples/client/petstore/clojure/test/swagger_petstore/core_test.clj @@ -9,30 +9,43 @@ (is (= {:base-url "http://petstore.swagger.io/v2" :date-format "yyyy-MM-dd" :datetime-format "yyyy-MM-dd'T'HH:mm:ss.SSSXXX" - :debug false} + :debug false + :auths {"api_key" nil + "petstore_auth" nil}} default-api-context *api-context* (with-api-context {} *api-context*)))) (testing "customize via with-api-context" - (with-api-context {:base-url "http://localhost" :debug true} + (with-api-context {:base-url "http://localhost" + :debug true + :auths {"api_key" "key1" + "petstore_auth" "token1"}} (is (= {:base-url "http://localhost" :date-format "yyyy-MM-dd" :datetime-format "yyyy-MM-dd'T'HH:mm:ss.SSSXXX" - :debug true} + :debug true + :auths {"api_key" "key1" + "petstore_auth" "token1"}} *api-context*)) ;; nested with-api-context inherits values from the outer api context - (with-api-context {:datetime-format "yyyy-MM-dd HH:mm:ss"} + (with-api-context {:datetime-format "yyyy-MM-dd HH:mm:ss" + :auths {"api_key" "key2"}} (is (= {:base-url "http://localhost" :date-format "yyyy-MM-dd" :datetime-format "yyyy-MM-dd HH:mm:ss" - :debug true} + :debug true + :auths {"api_key" "key2" + "petstore_auth" "token1"}} *api-context*)))) ;; back to default api context (is (= {:base-url "http://petstore.swagger.io/v2" :date-format "yyyy-MM-dd" :datetime-format "yyyy-MM-dd'T'HH:mm:ss.SSSXXX" - :debug false} + :debug false + :auths {"api_key" nil + "petstore_auth" nil}} + default-api-context *api-context*)))) (deftest test-check-required-params @@ -69,10 +82,10 @@ "2015-11-07T00:49:09-03:00") (is (thrown? ParseException (parse-datetime "2015-11-07T03:49:09.123Z")))))) -(deftest test-param-to-str +(deftest test-param->str (let [date (parse-datetime "2015-11-07T03:49:09.123Z")] (are [param expected] - (is (= expected (param-to-str param))) + (is (= expected (param->str param))) nil "" "abc" "abc" 123 "123" @@ -80,6 +93,25 @@ [12 "34"] "12,34" date (format-datetime date)))) +(deftest test-auths->opts + (testing "auth values not set by default" + (is (= {} (auths->opts ["api_key" "petstore_auth"]))) + (is (= {} (auths->opts [])))) + (testing "set api_key" + (with-api-context {:auths {"api_key" "my key"}} + (is (= {:header-params {"api_key" "my key"}} (auths->opts ["api_key" "petstore_auth"]))) + (is (= {:header-params {"api_key" "my key"}} (auths->opts ["api_key"]))) + (is (= {} (auths->opts ["petstore_auth"]))) + (is (= {} (auths->opts []))))) + (testing "set both api_key and petstore_auth" + (with-api-context {:auths {"api_key" "my key" "petstore_auth" "my token"}} + (is (= {:req-opts {:oauth-token "my token"} + :header-params {"api_key" "my key"}} + (auths->opts ["api_key" "petstore_auth"]))) + (is (= {:req-opts {:oauth-token "my token"}} (auths->opts ["petstore_auth"]))) + (is (= {:header-params {"api_key" "my key"}} (auths->opts ["api_key"]))) + (is (= {} (auths->opts [])))))) + (deftest test-make-url (are [path path-params url] (is (= url (make-url path path-params))) From 506b8d2b77dde7673882ee7d33a9d1dc7b649bff Mon Sep 17 00:00:00 2001 From: wing328 Date: Thu, 3 Dec 2015 16:34:51 +0800 Subject: [PATCH 103/211] add WithHttpInfo method --- .../src/main/resources/csharp/api.mustache | 60 ++- .../src/main/csharp/IO/Swagger/Api/PetApi.cs | 399 +++++++++++++----- .../main/csharp/IO/Swagger/Api/StoreApi.cs | 199 ++++++--- .../src/main/csharp/IO/Swagger/Api/UserApi.cs | 390 ++++++++++++----- .../csharp/IO/Swagger/Client/ApiResponse.cs | 6 +- .../csharp/SwaggerClientTest/TestPet.cs | 8 +- .../bin/Debug/SwaggerClientTest.dll | Bin 81408 -> 79872 bytes .../bin/Debug/SwaggerClientTest.dll.mdb | Bin 26497 -> 25605 bytes .../obj/Debug/SwaggerClientTest.dll | Bin 81408 -> 79872 bytes .../obj/Debug/SwaggerClientTest.dll.mdb | Bin 26497 -> 25605 bytes 10 files changed, 763 insertions(+), 299 deletions(-) diff --git a/modules/swagger-codegen/src/main/resources/csharp/api.mustache b/modules/swagger-codegen/src/main/resources/csharp/api.mustache index 8196bcd7ec0..12e754ca6da 100644 --- a/modules/swagger-codegen/src/main/resources/csharp/api.mustache +++ b/modules/swagger-codegen/src/main/resources/csharp/api.mustache @@ -26,6 +26,16 @@ namespace {{packageName}}.Api {{/allParams}}/// {{#returnType}}{{^returnContainer}}{{{returnType}}}{{/returnContainer}}{{/returnType}} {{#returnType}}{{{returnType}}}{{/returnType}}{{^returnType}}void{{/returnType}} {{operationId}} ({{#allParams}}{{{dataType}}} {{paramName}}{{^required}}{{#optionalMethodArgument}} = null{{/optionalMethodArgument}}{{/required}}{{#hasMore}}, {{/hasMore}}{{/allParams}}); + /// + /// {{summary}} + /// + /// + /// {{notes}} + /// + {{#allParams}}/// {{description}} + {{/allParams}}/// ApiResponse{{#returnType}}< {{{returnType}}} >{{/returnType}}{{^returnType}}{{/returnType}} + ApiResponse<{{#returnType}}{{{returnType}}}{{/returnType}}{{^returnType}}Object{{/returnType}}> {{operationId}}WithHttpInfo ({{#allParams}}{{{dataType}}} {{paramName}}{{^required}}{{#optionalMethodArgument}} = null{{/optionalMethodArgument}}{{/required}}{{#hasMore}}, {{/hasMore}}{{/allParams}}); + /// /// {{summary}} /// @@ -81,16 +91,6 @@ namespace {{packageName}}.Api /// An instance of the Configuration public Configuration Configuration {get; set;} - /// - /// 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; } - private readonly Dictionary _defaultHeaderMap = new Dictionary(); /// @@ -117,8 +117,19 @@ namespace {{packageName}}.Api /// {{summary}} {{notes}} /// {{#allParams}}/// {{description}} - {{/allParams}}/// {{#returnType}}{{^returnContainer}}{{{returnType}}}{{/returnContainer}}{{/returnType}} + {{/allParams}}/// {{#returnType}}{{^returnContainer}}{{{returnType}}}{{/returnContainer}}{{/returnType}} public {{#returnType}}{{{returnType}}}{{/returnType}}{{^returnType}}void{{/returnType}} {{operationId}} ({{#allParams}}{{{dataType}}} {{paramName}}{{^required}}{{#optionalMethodArgument}} = null{{/optionalMethodArgument}}{{/required}}{{#hasMore}}, {{/hasMore}}{{/allParams}}) + { + {{#returnType}}ApiResponse<{{{returnType}}}> response = {{operationId}}WithHttpInfo({{#allParams}}{{paramName}}{{#hasMore}}, {{/hasMore}}{{/allParams}}); + return response.Data;{{/returnType}}{{^returnType}}{{operationId}}WithHttpInfo({{#allParams}}{{paramName}}{{#hasMore}}, {{/hasMore}}{{/allParams}});{{/returnType}} + } + + /// + /// {{summary}} {{notes}} + /// + {{#allParams}}/// {{description}} + {{/allParams}}/// {{#returnType}}{{^returnContainer}}{{{returnType}}}{{/returnContainer}}{{/returnType}} + public ApiResponse<{{#returnType}} {{{returnType}}} {{/returnType}}{{^returnType}}Object{{/returnType}}> {{operationId}}WithHttpInfo ({{#allParams}}{{{dataType}}} {{paramName}}{{^required}}{{#optionalMethodArgument}} = null{{/optionalMethodArgument}}{{/required}}{{#hasMore}}, {{/hasMore}}{{/allParams}}) { {{#allParams}}{{#required}} // verify the required parameter '{{paramName}}' is set @@ -184,15 +195,19 @@ namespace {{packageName}}.Api // make the HTTP request IRestResponse response = (IRestResponse) Configuration.ApiClient.CallApi(path_, Method.{{httpMethod}}, queryParams, postBody, headerParams, formParams, fileParams, pathParams); - StatusCode = (int) response.StatusCode; - ResponseHeaders = response.Headers.ToDictionary(x => x.Name, x => x.Value.ToString()); + int statusCode = (int) response.StatusCode; - if (StatusCode >= 400) - throw new ApiException (StatusCode, "Error calling {{operationId}}: " + response.Content, response.Content); - else if (((int)response.StatusCode) == 0) - throw new ApiException (StatusCode, "Error calling {{operationId}}: " + response.ErrorMessage, response.ErrorMessage); + if (statusCode >= 400) + throw new ApiException (statusCode, "Error calling {{operationId}}: " + response.Content, response.Content); + else if (statusCode == 0) + throw new ApiException (statusCode, "Error calling {{operationId}}: " + response.ErrorMessage, response.ErrorMessage); - {{#returnType}}return ({{{returnType}}}) Configuration.ApiClient.Deserialize(response, typeof({{{returnType}}}));{{/returnType}}{{^returnType}}return;{{/returnType}} + {{#returnType}}return new ApiResponse<{{{returnType}}}>(statusCode, + response.Headers.ToDictionary(x => x.Name, x => x.Value.ToString()), + ({{{returnType}}}) Configuration.ApiClient.Deserialize(response, typeof({{{returnType}}})));{{/returnType}} + {{^returnType}}return new ApiResponse(statusCode, + response.Headers.ToDictionary(x => x.Name, x => x.Value.ToString()), + null);{{/returnType}} } /// @@ -265,11 +280,12 @@ namespace {{packageName}}.Api // make the HTTP request IRestResponse response = (IRestResponse) await Configuration.ApiClient.CallApiAsync(path_, Method.{{httpMethod}}, queryParams, postBody, headerParams, formParams, fileParams, pathParams); - StatusCode = (int) response.StatusCode; - ResponseHeaders = response.Headers.ToDictionary(x => x.Name, x => x.Value.ToString()); + int statusCode = (int) response.StatusCode; - if (StatusCode >= 400) - throw new ApiException (StatusCode, "Error calling {{operationId}}: " + response.Content, response.Content); + if (statusCode >= 400) + throw new ApiException (statusCode, "Error calling {{operationId}}: " + response.Content, response.Content); + else if (statusCode == 0) + throw new ApiException (statusCode, "Error calling {{operationId}}: " + response.ErrorMessage, response.ErrorMessage); {{#returnType}}return ({{{returnType}}}) Configuration.ApiClient.Deserialize(response, typeof({{{returnType}}}));{{/returnType}}{{^returnType}} return;{{/returnType}} diff --git a/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Api/PetApi.cs b/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Api/PetApi.cs index 64398c599bd..1fb73aea079 100644 --- a/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Api/PetApi.cs +++ b/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Api/PetApi.cs @@ -25,6 +25,16 @@ namespace IO.Swagger.Api /// void UpdatePet (Pet body = null); + /// + /// Update an existing pet + /// + /// + /// + /// + /// Pet object that needs to be added to the store + /// ApiResponse + ApiResponse UpdatePetWithHttpInfo (Pet body = null); + /// /// Update an existing pet /// @@ -45,6 +55,16 @@ namespace IO.Swagger.Api /// void AddPet (Pet body = null); + /// + /// Add a new pet to the store + /// + /// + /// + /// + /// Pet object that needs to be added to the store + /// ApiResponse + ApiResponse AddPetWithHttpInfo (Pet body = null); + /// /// Add a new pet to the store /// @@ -65,6 +85,16 @@ namespace IO.Swagger.Api /// List FindPetsByStatus (List status = null); + /// + /// Finds Pets by status + /// + /// + /// Multiple status values can be provided with comma seperated strings + /// + /// Status values that need to be considered for filter + /// ApiResponse< List > + ApiResponse> FindPetsByStatusWithHttpInfo (List status = null); + /// /// Finds Pets by status /// @@ -85,6 +115,16 @@ namespace IO.Swagger.Api /// List FindPetsByTags (List tags = null); + /// + /// Finds Pets by tags + /// + /// + /// Muliple tags can be provided with comma seperated strings. Use tag1, tag2, tag3 for testing. + /// + /// Tags to filter by + /// ApiResponse< List > + ApiResponse> FindPetsByTagsWithHttpInfo (List tags = null); + /// /// Finds Pets by tags /// @@ -105,6 +145,16 @@ namespace IO.Swagger.Api /// Pet Pet GetPetById (long? petId); + /// + /// Find pet by ID + /// + /// + /// Returns a pet when ID < 10. ID > 10 or nonintegers will simulate API error conditions + /// + /// ID of pet that needs to be fetched + /// ApiResponse< Pet > + ApiResponse GetPetByIdWithHttpInfo (long? petId); + /// /// Find pet by ID /// @@ -127,6 +177,18 @@ namespace IO.Swagger.Api /// void UpdatePetWithForm (string petId, string name = null, string status = null); + /// + /// Updates a pet in the store with form data + /// + /// + /// + /// + /// ID of pet that needs to be updated + /// Updated name of the pet + /// Updated status of the pet + /// ApiResponse + ApiResponse UpdatePetWithFormWithHttpInfo (string petId, string name = null, string status = null); + /// /// Updates a pet in the store with form data /// @@ -150,6 +212,17 @@ namespace IO.Swagger.Api /// void DeletePet (long? petId, string apiKey = null); + /// + /// Deletes a pet + /// + /// + /// + /// + /// Pet id to delete + /// + /// ApiResponse + ApiResponse DeletePetWithHttpInfo (long? petId, string apiKey = null); + /// /// Deletes a pet /// @@ -173,6 +246,18 @@ namespace IO.Swagger.Api /// void UploadFile (long? petId, string additionalMetadata = null, Stream file = null); + /// + /// uploads an image + /// + /// + /// + /// + /// ID of pet to update + /// Additional data to pass to server + /// file to upload + /// ApiResponse + ApiResponse UploadFileWithHttpInfo (long? petId, string additionalMetadata = null, Stream file = null); + /// /// uploads an image /// @@ -230,16 +315,6 @@ namespace IO.Swagger.Api /// An instance of the Configuration public Configuration Configuration {get; set;} - /// - /// 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; } - private readonly Dictionary _defaultHeaderMap = new Dictionary(); /// @@ -266,8 +341,18 @@ namespace IO.Swagger.Api /// Update an existing pet /// /// Pet object that needs to be added to the store - /// + /// public void UpdatePet (Pet body = null) + { + UpdatePetWithHttpInfo(body); + } + + /// + /// Update an existing pet + /// + /// Pet object that needs to be added to the store + /// + public ApiResponse UpdatePetWithHttpInfo (Pet body = null) { @@ -311,15 +396,17 @@ namespace IO.Swagger.Api // make the HTTP request IRestResponse response = (IRestResponse) Configuration.ApiClient.CallApi(path_, Method.PUT, queryParams, postBody, headerParams, formParams, fileParams, pathParams); - StatusCode = (int) response.StatusCode; - ResponseHeaders = response.Headers.ToDictionary(x => x.Name, x => x.Value.ToString()); + int statusCode = (int) response.StatusCode; - if (StatusCode >= 400) - throw new ApiException (StatusCode, "Error calling UpdatePet: " + response.Content, response.Content); - else if (((int)response.StatusCode) == 0) - throw new ApiException (StatusCode, "Error calling UpdatePet: " + response.ErrorMessage, response.ErrorMessage); + if (statusCode >= 400) + throw new ApiException (statusCode, "Error calling UpdatePet: " + response.Content, response.Content); + else if (statusCode == 0) + throw new ApiException (statusCode, "Error calling UpdatePet: " + response.ErrorMessage, response.ErrorMessage); - return; + + return new ApiResponse(statusCode, + response.Headers.ToDictionary(x => x.Name, x => x.Value.ToString()), + null); } /// @@ -371,11 +458,12 @@ namespace IO.Swagger.Api // make the HTTP request IRestResponse response = (IRestResponse) await Configuration.ApiClient.CallApiAsync(path_, Method.PUT, queryParams, postBody, headerParams, formParams, fileParams, pathParams); - StatusCode = (int) response.StatusCode; - ResponseHeaders = response.Headers.ToDictionary(x => x.Name, x => x.Value.ToString()); + int statusCode = (int) response.StatusCode; - if (StatusCode >= 400) - throw new ApiException (StatusCode, "Error calling UpdatePet: " + response.Content, response.Content); + if (statusCode >= 400) + throw new ApiException (statusCode, "Error calling UpdatePet: " + response.Content, response.Content); + else if (statusCode == 0) + throw new ApiException (statusCode, "Error calling UpdatePet: " + response.ErrorMessage, response.ErrorMessage); return; @@ -385,8 +473,18 @@ namespace IO.Swagger.Api /// Add a new pet to the store /// /// Pet object that needs to be added to the store - /// + /// public void AddPet (Pet body = null) + { + AddPetWithHttpInfo(body); + } + + /// + /// Add a new pet to the store + /// + /// Pet object that needs to be added to the store + /// + public ApiResponse AddPetWithHttpInfo (Pet body = null) { @@ -430,15 +528,17 @@ namespace IO.Swagger.Api // make the HTTP request IRestResponse response = (IRestResponse) Configuration.ApiClient.CallApi(path_, Method.POST, queryParams, postBody, headerParams, formParams, fileParams, pathParams); - StatusCode = (int) response.StatusCode; - ResponseHeaders = response.Headers.ToDictionary(x => x.Name, x => x.Value.ToString()); + int statusCode = (int) response.StatusCode; - if (StatusCode >= 400) - throw new ApiException (StatusCode, "Error calling AddPet: " + response.Content, response.Content); - else if (((int)response.StatusCode) == 0) - throw new ApiException (StatusCode, "Error calling AddPet: " + response.ErrorMessage, response.ErrorMessage); + if (statusCode >= 400) + throw new ApiException (statusCode, "Error calling AddPet: " + response.Content, response.Content); + else if (statusCode == 0) + throw new ApiException (statusCode, "Error calling AddPet: " + response.ErrorMessage, response.ErrorMessage); - return; + + return new ApiResponse(statusCode, + response.Headers.ToDictionary(x => x.Name, x => x.Value.ToString()), + null); } /// @@ -490,11 +590,12 @@ namespace IO.Swagger.Api // make the HTTP request IRestResponse response = (IRestResponse) await Configuration.ApiClient.CallApiAsync(path_, Method.POST, queryParams, postBody, headerParams, formParams, fileParams, pathParams); - StatusCode = (int) response.StatusCode; - ResponseHeaders = response.Headers.ToDictionary(x => x.Name, x => x.Value.ToString()); + int statusCode = (int) response.StatusCode; - if (StatusCode >= 400) - throw new ApiException (StatusCode, "Error calling AddPet: " + response.Content, response.Content); + if (statusCode >= 400) + throw new ApiException (statusCode, "Error calling AddPet: " + response.Content, response.Content); + else if (statusCode == 0) + throw new ApiException (statusCode, "Error calling AddPet: " + response.ErrorMessage, response.ErrorMessage); return; @@ -504,8 +605,19 @@ namespace IO.Swagger.Api /// Finds Pets by status Multiple status values can be provided with comma seperated strings /// /// Status values that need to be considered for filter - /// + /// public List FindPetsByStatus (List status = null) + { + ApiResponse> response = FindPetsByStatusWithHttpInfo(status); + return response.Data; + } + + /// + /// Finds Pets by status Multiple status values can be provided with comma seperated strings + /// + /// Status values that need to be considered for filter + /// + public ApiResponse< List > FindPetsByStatusWithHttpInfo (List status = null) { @@ -549,15 +661,17 @@ namespace IO.Swagger.Api // make the HTTP request IRestResponse response = (IRestResponse) Configuration.ApiClient.CallApi(path_, Method.GET, queryParams, postBody, headerParams, formParams, fileParams, pathParams); - StatusCode = (int) response.StatusCode; - ResponseHeaders = response.Headers.ToDictionary(x => x.Name, x => x.Value.ToString()); + int statusCode = (int) response.StatusCode; - if (StatusCode >= 400) - throw new ApiException (StatusCode, "Error calling FindPetsByStatus: " + response.Content, response.Content); - else if (((int)response.StatusCode) == 0) - throw new ApiException (StatusCode, "Error calling FindPetsByStatus: " + response.ErrorMessage, response.ErrorMessage); + if (statusCode >= 400) + throw new ApiException (statusCode, "Error calling FindPetsByStatus: " + response.Content, response.Content); + else if (statusCode == 0) + throw new ApiException (statusCode, "Error calling FindPetsByStatus: " + response.ErrorMessage, response.ErrorMessage); - return (List) Configuration.ApiClient.Deserialize(response, typeof(List)); + return new ApiResponse>(statusCode, + response.Headers.ToDictionary(x => x.Name, x => x.Value.ToString()), + (List) Configuration.ApiClient.Deserialize(response, typeof(List))); + } /// @@ -609,11 +723,12 @@ namespace IO.Swagger.Api // make the HTTP request IRestResponse response = (IRestResponse) await Configuration.ApiClient.CallApiAsync(path_, Method.GET, queryParams, postBody, headerParams, formParams, fileParams, pathParams); - StatusCode = (int) response.StatusCode; - ResponseHeaders = response.Headers.ToDictionary(x => x.Name, x => x.Value.ToString()); + int statusCode = (int) response.StatusCode; - if (StatusCode >= 400) - throw new ApiException (StatusCode, "Error calling FindPetsByStatus: " + response.Content, response.Content); + if (statusCode >= 400) + throw new ApiException (statusCode, "Error calling FindPetsByStatus: " + response.Content, response.Content); + else if (statusCode == 0) + throw new ApiException (statusCode, "Error calling FindPetsByStatus: " + response.ErrorMessage, response.ErrorMessage); return (List) Configuration.ApiClient.Deserialize(response, typeof(List)); } @@ -622,8 +737,19 @@ namespace IO.Swagger.Api /// Finds Pets by tags Muliple tags can be provided with comma seperated strings. Use tag1, tag2, tag3 for testing. /// /// Tags to filter by - /// + /// public List FindPetsByTags (List tags = null) + { + ApiResponse> response = FindPetsByTagsWithHttpInfo(tags); + return response.Data; + } + + /// + /// Finds Pets by tags Muliple tags can be provided with comma seperated strings. Use tag1, tag2, tag3 for testing. + /// + /// Tags to filter by + /// + public ApiResponse< List > FindPetsByTagsWithHttpInfo (List tags = null) { @@ -667,15 +793,17 @@ namespace IO.Swagger.Api // make the HTTP request IRestResponse response = (IRestResponse) Configuration.ApiClient.CallApi(path_, Method.GET, queryParams, postBody, headerParams, formParams, fileParams, pathParams); - StatusCode = (int) response.StatusCode; - ResponseHeaders = response.Headers.ToDictionary(x => x.Name, x => x.Value.ToString()); + int statusCode = (int) response.StatusCode; - if (StatusCode >= 400) - throw new ApiException (StatusCode, "Error calling FindPetsByTags: " + response.Content, response.Content); - else if (((int)response.StatusCode) == 0) - throw new ApiException (StatusCode, "Error calling FindPetsByTags: " + response.ErrorMessage, response.ErrorMessage); + if (statusCode >= 400) + throw new ApiException (statusCode, "Error calling FindPetsByTags: " + response.Content, response.Content); + else if (statusCode == 0) + throw new ApiException (statusCode, "Error calling FindPetsByTags: " + response.ErrorMessage, response.ErrorMessage); - return (List) Configuration.ApiClient.Deserialize(response, typeof(List)); + return new ApiResponse>(statusCode, + response.Headers.ToDictionary(x => x.Name, x => x.Value.ToString()), + (List) Configuration.ApiClient.Deserialize(response, typeof(List))); + } /// @@ -727,11 +855,12 @@ namespace IO.Swagger.Api // make the HTTP request IRestResponse response = (IRestResponse) await Configuration.ApiClient.CallApiAsync(path_, Method.GET, queryParams, postBody, headerParams, formParams, fileParams, pathParams); - StatusCode = (int) response.StatusCode; - ResponseHeaders = response.Headers.ToDictionary(x => x.Name, x => x.Value.ToString()); + int statusCode = (int) response.StatusCode; - if (StatusCode >= 400) - throw new ApiException (StatusCode, "Error calling FindPetsByTags: " + response.Content, response.Content); + if (statusCode >= 400) + throw new ApiException (statusCode, "Error calling FindPetsByTags: " + response.Content, response.Content); + else if (statusCode == 0) + throw new ApiException (statusCode, "Error calling FindPetsByTags: " + response.ErrorMessage, response.ErrorMessage); return (List) Configuration.ApiClient.Deserialize(response, typeof(List)); } @@ -740,8 +869,19 @@ namespace IO.Swagger.Api /// Find pet by ID Returns a pet when ID < 10. ID > 10 or nonintegers will simulate API error conditions /// /// ID of pet that needs to be fetched - /// Pet + /// Pet public Pet GetPetById (long? petId) + { + ApiResponse response = GetPetByIdWithHttpInfo(petId); + return response.Data; + } + + /// + /// Find pet by ID Returns a pet when ID < 10. ID > 10 or nonintegers will simulate API error conditions + /// + /// ID of pet that needs to be fetched + /// Pet + public ApiResponse< Pet > GetPetByIdWithHttpInfo (long? petId) { // verify the required parameter 'petId' is set @@ -788,15 +928,17 @@ namespace IO.Swagger.Api // make the HTTP request IRestResponse response = (IRestResponse) Configuration.ApiClient.CallApi(path_, Method.GET, queryParams, postBody, headerParams, formParams, fileParams, pathParams); - StatusCode = (int) response.StatusCode; - ResponseHeaders = response.Headers.ToDictionary(x => x.Name, x => x.Value.ToString()); + int statusCode = (int) response.StatusCode; - if (StatusCode >= 400) - throw new ApiException (StatusCode, "Error calling GetPetById: " + response.Content, response.Content); - else if (((int)response.StatusCode) == 0) - throw new ApiException (StatusCode, "Error calling GetPetById: " + response.ErrorMessage, response.ErrorMessage); + if (statusCode >= 400) + throw new ApiException (statusCode, "Error calling GetPetById: " + response.Content, response.Content); + else if (statusCode == 0) + throw new ApiException (statusCode, "Error calling GetPetById: " + response.ErrorMessage, response.ErrorMessage); - return (Pet) Configuration.ApiClient.Deserialize(response, typeof(Pet)); + return new ApiResponse(statusCode, + response.Headers.ToDictionary(x => x.Name, x => x.Value.ToString()), + (Pet) Configuration.ApiClient.Deserialize(response, typeof(Pet))); + } /// @@ -850,11 +992,12 @@ namespace IO.Swagger.Api // make the HTTP request IRestResponse response = (IRestResponse) await Configuration.ApiClient.CallApiAsync(path_, Method.GET, queryParams, postBody, headerParams, formParams, fileParams, pathParams); - StatusCode = (int) response.StatusCode; - ResponseHeaders = response.Headers.ToDictionary(x => x.Name, x => x.Value.ToString()); + int statusCode = (int) response.StatusCode; - if (StatusCode >= 400) - throw new ApiException (StatusCode, "Error calling GetPetById: " + response.Content, response.Content); + if (statusCode >= 400) + throw new ApiException (statusCode, "Error calling GetPetById: " + response.Content, response.Content); + else if (statusCode == 0) + throw new ApiException (statusCode, "Error calling GetPetById: " + response.ErrorMessage, response.ErrorMessage); return (Pet) Configuration.ApiClient.Deserialize(response, typeof(Pet)); } @@ -865,8 +1008,20 @@ namespace IO.Swagger.Api /// ID of pet that needs to be updated /// Updated name of the pet /// Updated status of the pet - /// + /// public void UpdatePetWithForm (string petId, string name = null, string status = null) + { + UpdatePetWithFormWithHttpInfo(petId, name, status); + } + + /// + /// Updates a pet in the store with form data + /// + /// ID of pet that needs to be updated + /// Updated name of the pet + /// Updated status of the pet + /// + public ApiResponse UpdatePetWithFormWithHttpInfo (string petId, string name = null, string status = null) { // verify the required parameter 'petId' is set @@ -915,15 +1070,17 @@ namespace IO.Swagger.Api // make the HTTP request IRestResponse response = (IRestResponse) Configuration.ApiClient.CallApi(path_, Method.POST, queryParams, postBody, headerParams, formParams, fileParams, pathParams); - StatusCode = (int) response.StatusCode; - ResponseHeaders = response.Headers.ToDictionary(x => x.Name, x => x.Value.ToString()); + int statusCode = (int) response.StatusCode; - if (StatusCode >= 400) - throw new ApiException (StatusCode, "Error calling UpdatePetWithForm: " + response.Content, response.Content); - else if (((int)response.StatusCode) == 0) - throw new ApiException (StatusCode, "Error calling UpdatePetWithForm: " + response.ErrorMessage, response.ErrorMessage); + if (statusCode >= 400) + throw new ApiException (statusCode, "Error calling UpdatePetWithForm: " + response.Content, response.Content); + else if (statusCode == 0) + throw new ApiException (statusCode, "Error calling UpdatePetWithForm: " + response.ErrorMessage, response.ErrorMessage); - return; + + return new ApiResponse(statusCode, + response.Headers.ToDictionary(x => x.Name, x => x.Value.ToString()), + null); } /// @@ -981,11 +1138,12 @@ namespace IO.Swagger.Api // make the HTTP request IRestResponse response = (IRestResponse) await Configuration.ApiClient.CallApiAsync(path_, Method.POST, queryParams, postBody, headerParams, formParams, fileParams, pathParams); - StatusCode = (int) response.StatusCode; - ResponseHeaders = response.Headers.ToDictionary(x => x.Name, x => x.Value.ToString()); + int statusCode = (int) response.StatusCode; - if (StatusCode >= 400) - throw new ApiException (StatusCode, "Error calling UpdatePetWithForm: " + response.Content, response.Content); + if (statusCode >= 400) + throw new ApiException (statusCode, "Error calling UpdatePetWithForm: " + response.Content, response.Content); + else if (statusCode == 0) + throw new ApiException (statusCode, "Error calling UpdatePetWithForm: " + response.ErrorMessage, response.ErrorMessage); return; @@ -996,8 +1154,19 @@ namespace IO.Swagger.Api /// /// Pet id to delete /// - /// + /// public void DeletePet (long? petId, string apiKey = null) + { + DeletePetWithHttpInfo(petId, apiKey); + } + + /// + /// Deletes a pet + /// + /// Pet id to delete + /// + /// + public ApiResponse DeletePetWithHttpInfo (long? petId, string apiKey = null) { // verify the required parameter 'petId' is set @@ -1045,15 +1214,17 @@ namespace IO.Swagger.Api // make the HTTP request IRestResponse response = (IRestResponse) Configuration.ApiClient.CallApi(path_, Method.DELETE, queryParams, postBody, headerParams, formParams, fileParams, pathParams); - StatusCode = (int) response.StatusCode; - ResponseHeaders = response.Headers.ToDictionary(x => x.Name, x => x.Value.ToString()); + int statusCode = (int) response.StatusCode; - if (StatusCode >= 400) - throw new ApiException (StatusCode, "Error calling DeletePet: " + response.Content, response.Content); - else if (((int)response.StatusCode) == 0) - throw new ApiException (StatusCode, "Error calling DeletePet: " + response.ErrorMessage, response.ErrorMessage); + if (statusCode >= 400) + throw new ApiException (statusCode, "Error calling DeletePet: " + response.Content, response.Content); + else if (statusCode == 0) + throw new ApiException (statusCode, "Error calling DeletePet: " + response.ErrorMessage, response.ErrorMessage); - return; + + return new ApiResponse(statusCode, + response.Headers.ToDictionary(x => x.Name, x => x.Value.ToString()), + null); } /// @@ -1109,11 +1280,12 @@ namespace IO.Swagger.Api // make the HTTP request IRestResponse response = (IRestResponse) await Configuration.ApiClient.CallApiAsync(path_, Method.DELETE, queryParams, postBody, headerParams, formParams, fileParams, pathParams); - StatusCode = (int) response.StatusCode; - ResponseHeaders = response.Headers.ToDictionary(x => x.Name, x => x.Value.ToString()); + int statusCode = (int) response.StatusCode; - if (StatusCode >= 400) - throw new ApiException (StatusCode, "Error calling DeletePet: " + response.Content, response.Content); + if (statusCode >= 400) + throw new ApiException (statusCode, "Error calling DeletePet: " + response.Content, response.Content); + else if (statusCode == 0) + throw new ApiException (statusCode, "Error calling DeletePet: " + response.ErrorMessage, response.ErrorMessage); return; @@ -1125,8 +1297,20 @@ namespace IO.Swagger.Api /// ID of pet to update /// Additional data to pass to server /// file to upload - /// + /// public void UploadFile (long? petId, string additionalMetadata = null, Stream file = null) + { + UploadFileWithHttpInfo(petId, additionalMetadata, file); + } + + /// + /// uploads an image + /// + /// ID of pet to update + /// Additional data to pass to server + /// file to upload + /// + public ApiResponse UploadFileWithHttpInfo (long? petId, string additionalMetadata = null, Stream file = null) { // verify the required parameter 'petId' is set @@ -1175,15 +1359,17 @@ namespace IO.Swagger.Api // make the HTTP request IRestResponse response = (IRestResponse) Configuration.ApiClient.CallApi(path_, Method.POST, queryParams, postBody, headerParams, formParams, fileParams, pathParams); - StatusCode = (int) response.StatusCode; - ResponseHeaders = response.Headers.ToDictionary(x => x.Name, x => x.Value.ToString()); + int statusCode = (int) response.StatusCode; - if (StatusCode >= 400) - throw new ApiException (StatusCode, "Error calling UploadFile: " + response.Content, response.Content); - else if (((int)response.StatusCode) == 0) - throw new ApiException (StatusCode, "Error calling UploadFile: " + response.ErrorMessage, response.ErrorMessage); + if (statusCode >= 400) + throw new ApiException (statusCode, "Error calling UploadFile: " + response.Content, response.Content); + else if (statusCode == 0) + throw new ApiException (statusCode, "Error calling UploadFile: " + response.ErrorMessage, response.ErrorMessage); - return; + + return new ApiResponse(statusCode, + response.Headers.ToDictionary(x => x.Name, x => x.Value.ToString()), + null); } /// @@ -1241,11 +1427,12 @@ namespace IO.Swagger.Api // make the HTTP request IRestResponse response = (IRestResponse) await Configuration.ApiClient.CallApiAsync(path_, Method.POST, queryParams, postBody, headerParams, formParams, fileParams, pathParams); - StatusCode = (int) response.StatusCode; - ResponseHeaders = response.Headers.ToDictionary(x => x.Name, x => x.Value.ToString()); + int statusCode = (int) response.StatusCode; - if (StatusCode >= 400) - throw new ApiException (StatusCode, "Error calling UploadFile: " + response.Content, response.Content); + if (statusCode >= 400) + throw new ApiException (statusCode, "Error calling UploadFile: " + response.Content, response.Content); + else if (statusCode == 0) + throw new ApiException (statusCode, "Error calling UploadFile: " + response.ErrorMessage, response.ErrorMessage); return; diff --git a/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Api/StoreApi.cs b/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Api/StoreApi.cs index 93ef67dae91..ab979c24565 100644 --- a/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Api/StoreApi.cs +++ b/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Api/StoreApi.cs @@ -24,6 +24,15 @@ namespace IO.Swagger.Api /// Dictionary GetInventory (); + /// + /// Returns pet inventories by status + /// + /// + /// Returns a map of status codes to quantities + /// + /// ApiResponse< Dictionary > + ApiResponse> GetInventoryWithHttpInfo (); + /// /// Returns pet inventories by status /// @@ -43,6 +52,16 @@ namespace IO.Swagger.Api /// Order Order PlaceOrder (Order body = null); + /// + /// Place an order for a pet + /// + /// + /// + /// + /// order placed for purchasing the pet + /// ApiResponse< Order > + ApiResponse PlaceOrderWithHttpInfo (Order body = null); + /// /// Place an order for a pet /// @@ -63,6 +82,16 @@ namespace IO.Swagger.Api /// Order Order GetOrderById (string orderId); + /// + /// Find purchase order by ID + /// + /// + /// For valid response try integer IDs with value <= 5 or > 10. Other values will generated exceptions + /// + /// ID of pet that needs to be fetched + /// ApiResponse< Order > + ApiResponse GetOrderByIdWithHttpInfo (string orderId); + /// /// Find purchase order by ID /// @@ -83,6 +112,16 @@ namespace IO.Swagger.Api /// void DeleteOrder (string orderId); + /// + /// Delete purchase order by ID + /// + /// + /// For valid response try integer IDs with value < 1000. Anything above 1000 or nonintegers will generate API errors + /// + /// ID of the order that needs to be deleted + /// ApiResponse + ApiResponse DeleteOrderWithHttpInfo (string orderId); + /// /// Delete purchase order by ID /// @@ -138,16 +177,6 @@ namespace IO.Swagger.Api /// An instance of the Configuration public Configuration Configuration {get; set;} - /// - /// 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; } - private readonly Dictionary _defaultHeaderMap = new Dictionary(); /// @@ -173,8 +202,18 @@ namespace IO.Swagger.Api /// /// Returns pet inventories by status Returns a map of status codes to quantities /// - /// + /// public Dictionary GetInventory () + { + ApiResponse> response = GetInventoryWithHttpInfo(); + return response.Data; + } + + /// + /// Returns pet inventories by status Returns a map of status codes to quantities + /// + /// + public ApiResponse< Dictionary > GetInventoryWithHttpInfo () { @@ -217,15 +256,17 @@ namespace IO.Swagger.Api // make the HTTP request IRestResponse response = (IRestResponse) Configuration.ApiClient.CallApi(path_, Method.GET, queryParams, postBody, headerParams, formParams, fileParams, pathParams); - StatusCode = (int) response.StatusCode; - ResponseHeaders = response.Headers.ToDictionary(x => x.Name, x => x.Value.ToString()); + int statusCode = (int) response.StatusCode; - if (StatusCode >= 400) - throw new ApiException (StatusCode, "Error calling GetInventory: " + response.Content, response.Content); - else if (((int)response.StatusCode) == 0) - throw new ApiException (StatusCode, "Error calling GetInventory: " + response.ErrorMessage, response.ErrorMessage); + if (statusCode >= 400) + throw new ApiException (statusCode, "Error calling GetInventory: " + response.Content, response.Content); + else if (statusCode == 0) + throw new ApiException (statusCode, "Error calling GetInventory: " + response.ErrorMessage, response.ErrorMessage); - return (Dictionary) Configuration.ApiClient.Deserialize(response, typeof(Dictionary)); + return new ApiResponse>(statusCode, + response.Headers.ToDictionary(x => x.Name, x => x.Value.ToString()), + (Dictionary) Configuration.ApiClient.Deserialize(response, typeof(Dictionary))); + } /// @@ -275,11 +316,12 @@ namespace IO.Swagger.Api // make the HTTP request IRestResponse response = (IRestResponse) await Configuration.ApiClient.CallApiAsync(path_, Method.GET, queryParams, postBody, headerParams, formParams, fileParams, pathParams); - StatusCode = (int) response.StatusCode; - ResponseHeaders = response.Headers.ToDictionary(x => x.Name, x => x.Value.ToString()); + int statusCode = (int) response.StatusCode; - if (StatusCode >= 400) - throw new ApiException (StatusCode, "Error calling GetInventory: " + response.Content, response.Content); + if (statusCode >= 400) + throw new ApiException (statusCode, "Error calling GetInventory: " + response.Content, response.Content); + else if (statusCode == 0) + throw new ApiException (statusCode, "Error calling GetInventory: " + response.ErrorMessage, response.ErrorMessage); return (Dictionary) Configuration.ApiClient.Deserialize(response, typeof(Dictionary)); } @@ -288,8 +330,19 @@ namespace IO.Swagger.Api /// Place an order for a pet /// /// order placed for purchasing the pet - /// Order + /// Order public Order PlaceOrder (Order body = null) + { + ApiResponse response = PlaceOrderWithHttpInfo(body); + return response.Data; + } + + /// + /// Place an order for a pet + /// + /// order placed for purchasing the pet + /// Order + public ApiResponse< Order > PlaceOrderWithHttpInfo (Order body = null) { @@ -325,15 +378,17 @@ namespace IO.Swagger.Api // make the HTTP request IRestResponse response = (IRestResponse) Configuration.ApiClient.CallApi(path_, Method.POST, queryParams, postBody, headerParams, formParams, fileParams, pathParams); - StatusCode = (int) response.StatusCode; - ResponseHeaders = response.Headers.ToDictionary(x => x.Name, x => x.Value.ToString()); + int statusCode = (int) response.StatusCode; - if (StatusCode >= 400) - throw new ApiException (StatusCode, "Error calling PlaceOrder: " + response.Content, response.Content); - else if (((int)response.StatusCode) == 0) - throw new ApiException (StatusCode, "Error calling PlaceOrder: " + response.ErrorMessage, response.ErrorMessage); + if (statusCode >= 400) + throw new ApiException (statusCode, "Error calling PlaceOrder: " + response.Content, response.Content); + else if (statusCode == 0) + throw new ApiException (statusCode, "Error calling PlaceOrder: " + response.ErrorMessage, response.ErrorMessage); - return (Order) Configuration.ApiClient.Deserialize(response, typeof(Order)); + return new ApiResponse(statusCode, + response.Headers.ToDictionary(x => x.Name, x => x.Value.ToString()), + (Order) Configuration.ApiClient.Deserialize(response, typeof(Order))); + } /// @@ -377,11 +432,12 @@ namespace IO.Swagger.Api // make the HTTP request IRestResponse response = (IRestResponse) await Configuration.ApiClient.CallApiAsync(path_, Method.POST, queryParams, postBody, headerParams, formParams, fileParams, pathParams); - StatusCode = (int) response.StatusCode; - ResponseHeaders = response.Headers.ToDictionary(x => x.Name, x => x.Value.ToString()); + int statusCode = (int) response.StatusCode; - if (StatusCode >= 400) - throw new ApiException (StatusCode, "Error calling PlaceOrder: " + response.Content, response.Content); + if (statusCode >= 400) + throw new ApiException (statusCode, "Error calling PlaceOrder: " + response.Content, response.Content); + else if (statusCode == 0) + throw new ApiException (statusCode, "Error calling PlaceOrder: " + response.ErrorMessage, response.ErrorMessage); return (Order) Configuration.ApiClient.Deserialize(response, typeof(Order)); } @@ -390,8 +446,19 @@ namespace IO.Swagger.Api /// Find purchase order by ID For valid response try integer IDs with value <= 5 or > 10. Other values will generated exceptions /// /// ID of pet that needs to be fetched - /// Order + /// Order public Order GetOrderById (string orderId) + { + ApiResponse response = GetOrderByIdWithHttpInfo(orderId); + return response.Data; + } + + /// + /// Find purchase order by ID For valid response try integer IDs with value <= 5 or > 10. Other values will generated exceptions + /// + /// ID of pet that needs to be fetched + /// Order + public ApiResponse< Order > GetOrderByIdWithHttpInfo (string orderId) { // verify the required parameter 'orderId' is set @@ -430,15 +497,17 @@ namespace IO.Swagger.Api // make the HTTP request IRestResponse response = (IRestResponse) Configuration.ApiClient.CallApi(path_, Method.GET, queryParams, postBody, headerParams, formParams, fileParams, pathParams); - StatusCode = (int) response.StatusCode; - ResponseHeaders = response.Headers.ToDictionary(x => x.Name, x => x.Value.ToString()); + int statusCode = (int) response.StatusCode; - if (StatusCode >= 400) - throw new ApiException (StatusCode, "Error calling GetOrderById: " + response.Content, response.Content); - else if (((int)response.StatusCode) == 0) - throw new ApiException (StatusCode, "Error calling GetOrderById: " + response.ErrorMessage, response.ErrorMessage); + if (statusCode >= 400) + throw new ApiException (statusCode, "Error calling GetOrderById: " + response.Content, response.Content); + else if (statusCode == 0) + throw new ApiException (statusCode, "Error calling GetOrderById: " + response.ErrorMessage, response.ErrorMessage); - return (Order) Configuration.ApiClient.Deserialize(response, typeof(Order)); + return new ApiResponse(statusCode, + response.Headers.ToDictionary(x => x.Name, x => x.Value.ToString()), + (Order) Configuration.ApiClient.Deserialize(response, typeof(Order))); + } /// @@ -484,11 +553,12 @@ namespace IO.Swagger.Api // make the HTTP request IRestResponse response = (IRestResponse) await Configuration.ApiClient.CallApiAsync(path_, Method.GET, queryParams, postBody, headerParams, formParams, fileParams, pathParams); - StatusCode = (int) response.StatusCode; - ResponseHeaders = response.Headers.ToDictionary(x => x.Name, x => x.Value.ToString()); + int statusCode = (int) response.StatusCode; - if (StatusCode >= 400) - throw new ApiException (StatusCode, "Error calling GetOrderById: " + response.Content, response.Content); + if (statusCode >= 400) + throw new ApiException (statusCode, "Error calling GetOrderById: " + response.Content, response.Content); + else if (statusCode == 0) + throw new ApiException (statusCode, "Error calling GetOrderById: " + response.ErrorMessage, response.ErrorMessage); return (Order) Configuration.ApiClient.Deserialize(response, typeof(Order)); } @@ -497,8 +567,18 @@ namespace IO.Swagger.Api /// Delete purchase order by ID For valid response try integer IDs with value < 1000. Anything above 1000 or nonintegers will generate API errors /// /// ID of the order that needs to be deleted - /// + /// public void DeleteOrder (string orderId) + { + DeleteOrderWithHttpInfo(orderId); + } + + /// + /// Delete purchase order by ID For valid response try integer IDs with value < 1000. Anything above 1000 or nonintegers will generate API errors + /// + /// ID of the order that needs to be deleted + /// + public ApiResponse DeleteOrderWithHttpInfo (string orderId) { // verify the required parameter 'orderId' is set @@ -537,15 +617,17 @@ namespace IO.Swagger.Api // make the HTTP request IRestResponse response = (IRestResponse) Configuration.ApiClient.CallApi(path_, Method.DELETE, queryParams, postBody, headerParams, formParams, fileParams, pathParams); - StatusCode = (int) response.StatusCode; - ResponseHeaders = response.Headers.ToDictionary(x => x.Name, x => x.Value.ToString()); + int statusCode = (int) response.StatusCode; - if (StatusCode >= 400) - throw new ApiException (StatusCode, "Error calling DeleteOrder: " + response.Content, response.Content); - else if (((int)response.StatusCode) == 0) - throw new ApiException (StatusCode, "Error calling DeleteOrder: " + response.ErrorMessage, response.ErrorMessage); + if (statusCode >= 400) + throw new ApiException (statusCode, "Error calling DeleteOrder: " + response.Content, response.Content); + else if (statusCode == 0) + throw new ApiException (statusCode, "Error calling DeleteOrder: " + response.ErrorMessage, response.ErrorMessage); - return; + + return new ApiResponse(statusCode, + response.Headers.ToDictionary(x => x.Name, x => x.Value.ToString()), + null); } /// @@ -591,11 +673,12 @@ namespace IO.Swagger.Api // make the HTTP request IRestResponse response = (IRestResponse) await Configuration.ApiClient.CallApiAsync(path_, Method.DELETE, queryParams, postBody, headerParams, formParams, fileParams, pathParams); - StatusCode = (int) response.StatusCode; - ResponseHeaders = response.Headers.ToDictionary(x => x.Name, x => x.Value.ToString()); + int statusCode = (int) response.StatusCode; - if (StatusCode >= 400) - throw new ApiException (StatusCode, "Error calling DeleteOrder: " + response.Content, response.Content); + if (statusCode >= 400) + throw new ApiException (statusCode, "Error calling DeleteOrder: " + response.Content, response.Content); + else if (statusCode == 0) + throw new ApiException (statusCode, "Error calling DeleteOrder: " + response.ErrorMessage, response.ErrorMessage); return; diff --git a/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Api/UserApi.cs b/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Api/UserApi.cs index 21905d02d1d..06b0fe65be8 100644 --- a/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Api/UserApi.cs +++ b/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Api/UserApi.cs @@ -25,6 +25,16 @@ namespace IO.Swagger.Api /// void CreateUser (User body = null); + /// + /// Create user + /// + /// + /// This can only be done by the logged in user. + /// + /// Created user object + /// ApiResponse + ApiResponse CreateUserWithHttpInfo (User body = null); + /// /// Create user /// @@ -45,6 +55,16 @@ namespace IO.Swagger.Api /// void CreateUsersWithArrayInput (List body = null); + /// + /// Creates list of users with given input array + /// + /// + /// + /// + /// List of user object + /// ApiResponse + ApiResponse CreateUsersWithArrayInputWithHttpInfo (List body = null); + /// /// Creates list of users with given input array /// @@ -65,6 +85,16 @@ namespace IO.Swagger.Api /// void CreateUsersWithListInput (List body = null); + /// + /// Creates list of users with given input array + /// + /// + /// + /// + /// List of user object + /// ApiResponse + ApiResponse CreateUsersWithListInputWithHttpInfo (List body = null); + /// /// Creates list of users with given input array /// @@ -86,6 +116,17 @@ namespace IO.Swagger.Api /// string string LoginUser (string username = null, string password = null); + /// + /// Logs user into the system + /// + /// + /// + /// + /// The user name for login + /// The password for login in clear text + /// ApiResponse< string > + ApiResponse LoginUserWithHttpInfo (string username = null, string password = null); + /// /// Logs user into the system /// @@ -106,6 +147,15 @@ namespace IO.Swagger.Api /// void LogoutUser (); + /// + /// Logs out current logged in user session + /// + /// + /// + /// + /// ApiResponse + ApiResponse LogoutUserWithHttpInfo (); + /// /// Logs out current logged in user session /// @@ -125,6 +175,16 @@ namespace IO.Swagger.Api /// User User GetUserByName (string username); + /// + /// Get user by user name + /// + /// + /// + /// + /// The name that needs to be fetched. Use user1 for testing. + /// ApiResponse< User > + ApiResponse GetUserByNameWithHttpInfo (string username); + /// /// Get user by user name /// @@ -146,6 +206,17 @@ namespace IO.Swagger.Api /// void UpdateUser (string username, User body = null); + /// + /// Updated user + /// + /// + /// This can only be done by the logged in user. + /// + /// name that need to be deleted + /// Updated user object + /// ApiResponse + ApiResponse UpdateUserWithHttpInfo (string username, User body = null); + /// /// Updated user /// @@ -167,6 +238,16 @@ namespace IO.Swagger.Api /// void DeleteUser (string username); + /// + /// Delete user + /// + /// + /// This can only be done by the logged in user. + /// + /// The name that needs to be deleted + /// ApiResponse + ApiResponse DeleteUserWithHttpInfo (string username); + /// /// Delete user /// @@ -222,16 +303,6 @@ namespace IO.Swagger.Api /// An instance of the Configuration public Configuration Configuration {get; set;} - /// - /// 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; } - private readonly Dictionary _defaultHeaderMap = new Dictionary(); /// @@ -258,8 +329,18 @@ namespace IO.Swagger.Api /// Create user This can only be done by the logged in user. /// /// Created user object - /// + /// public void CreateUser (User body = null) + { + CreateUserWithHttpInfo(body); + } + + /// + /// Create user This can only be done by the logged in user. + /// + /// Created user object + /// + public ApiResponse CreateUserWithHttpInfo (User body = null) { @@ -295,15 +376,17 @@ namespace IO.Swagger.Api // make the HTTP request IRestResponse response = (IRestResponse) Configuration.ApiClient.CallApi(path_, Method.POST, queryParams, postBody, headerParams, formParams, fileParams, pathParams); - StatusCode = (int) response.StatusCode; - ResponseHeaders = response.Headers.ToDictionary(x => x.Name, x => x.Value.ToString()); + int statusCode = (int) response.StatusCode; - if (StatusCode >= 400) - throw new ApiException (StatusCode, "Error calling CreateUser: " + response.Content, response.Content); - else if (((int)response.StatusCode) == 0) - throw new ApiException (StatusCode, "Error calling CreateUser: " + response.ErrorMessage, response.ErrorMessage); + if (statusCode >= 400) + throw new ApiException (statusCode, "Error calling CreateUser: " + response.Content, response.Content); + else if (statusCode == 0) + throw new ApiException (statusCode, "Error calling CreateUser: " + response.ErrorMessage, response.ErrorMessage); - return; + + return new ApiResponse(statusCode, + response.Headers.ToDictionary(x => x.Name, x => x.Value.ToString()), + null); } /// @@ -347,11 +430,12 @@ namespace IO.Swagger.Api // make the HTTP request IRestResponse response = (IRestResponse) await Configuration.ApiClient.CallApiAsync(path_, Method.POST, queryParams, postBody, headerParams, formParams, fileParams, pathParams); - StatusCode = (int) response.StatusCode; - ResponseHeaders = response.Headers.ToDictionary(x => x.Name, x => x.Value.ToString()); + int statusCode = (int) response.StatusCode; - if (StatusCode >= 400) - throw new ApiException (StatusCode, "Error calling CreateUser: " + response.Content, response.Content); + if (statusCode >= 400) + throw new ApiException (statusCode, "Error calling CreateUser: " + response.Content, response.Content); + else if (statusCode == 0) + throw new ApiException (statusCode, "Error calling CreateUser: " + response.ErrorMessage, response.ErrorMessage); return; @@ -361,8 +445,18 @@ namespace IO.Swagger.Api /// Creates list of users with given input array /// /// List of user object - /// + /// public void CreateUsersWithArrayInput (List body = null) + { + CreateUsersWithArrayInputWithHttpInfo(body); + } + + /// + /// Creates list of users with given input array + /// + /// List of user object + /// + public ApiResponse CreateUsersWithArrayInputWithHttpInfo (List body = null) { @@ -398,15 +492,17 @@ namespace IO.Swagger.Api // make the HTTP request IRestResponse response = (IRestResponse) Configuration.ApiClient.CallApi(path_, Method.POST, queryParams, postBody, headerParams, formParams, fileParams, pathParams); - StatusCode = (int) response.StatusCode; - ResponseHeaders = response.Headers.ToDictionary(x => x.Name, x => x.Value.ToString()); + int statusCode = (int) response.StatusCode; - if (StatusCode >= 400) - throw new ApiException (StatusCode, "Error calling CreateUsersWithArrayInput: " + response.Content, response.Content); - else if (((int)response.StatusCode) == 0) - throw new ApiException (StatusCode, "Error calling CreateUsersWithArrayInput: " + response.ErrorMessage, response.ErrorMessage); + if (statusCode >= 400) + throw new ApiException (statusCode, "Error calling CreateUsersWithArrayInput: " + response.Content, response.Content); + else if (statusCode == 0) + throw new ApiException (statusCode, "Error calling CreateUsersWithArrayInput: " + response.ErrorMessage, response.ErrorMessage); - return; + + return new ApiResponse(statusCode, + response.Headers.ToDictionary(x => x.Name, x => x.Value.ToString()), + null); } /// @@ -450,11 +546,12 @@ namespace IO.Swagger.Api // make the HTTP request IRestResponse response = (IRestResponse) await Configuration.ApiClient.CallApiAsync(path_, Method.POST, queryParams, postBody, headerParams, formParams, fileParams, pathParams); - StatusCode = (int) response.StatusCode; - ResponseHeaders = response.Headers.ToDictionary(x => x.Name, x => x.Value.ToString()); + int statusCode = (int) response.StatusCode; - if (StatusCode >= 400) - throw new ApiException (StatusCode, "Error calling CreateUsersWithArrayInput: " + response.Content, response.Content); + if (statusCode >= 400) + throw new ApiException (statusCode, "Error calling CreateUsersWithArrayInput: " + response.Content, response.Content); + else if (statusCode == 0) + throw new ApiException (statusCode, "Error calling CreateUsersWithArrayInput: " + response.ErrorMessage, response.ErrorMessage); return; @@ -464,8 +561,18 @@ namespace IO.Swagger.Api /// Creates list of users with given input array /// /// List of user object - /// + /// public void CreateUsersWithListInput (List body = null) + { + CreateUsersWithListInputWithHttpInfo(body); + } + + /// + /// Creates list of users with given input array + /// + /// List of user object + /// + public ApiResponse CreateUsersWithListInputWithHttpInfo (List body = null) { @@ -501,15 +608,17 @@ namespace IO.Swagger.Api // make the HTTP request IRestResponse response = (IRestResponse) Configuration.ApiClient.CallApi(path_, Method.POST, queryParams, postBody, headerParams, formParams, fileParams, pathParams); - StatusCode = (int) response.StatusCode; - ResponseHeaders = response.Headers.ToDictionary(x => x.Name, x => x.Value.ToString()); + int statusCode = (int) response.StatusCode; - if (StatusCode >= 400) - throw new ApiException (StatusCode, "Error calling CreateUsersWithListInput: " + response.Content, response.Content); - else if (((int)response.StatusCode) == 0) - throw new ApiException (StatusCode, "Error calling CreateUsersWithListInput: " + response.ErrorMessage, response.ErrorMessage); + if (statusCode >= 400) + throw new ApiException (statusCode, "Error calling CreateUsersWithListInput: " + response.Content, response.Content); + else if (statusCode == 0) + throw new ApiException (statusCode, "Error calling CreateUsersWithListInput: " + response.ErrorMessage, response.ErrorMessage); - return; + + return new ApiResponse(statusCode, + response.Headers.ToDictionary(x => x.Name, x => x.Value.ToString()), + null); } /// @@ -553,11 +662,12 @@ namespace IO.Swagger.Api // make the HTTP request IRestResponse response = (IRestResponse) await Configuration.ApiClient.CallApiAsync(path_, Method.POST, queryParams, postBody, headerParams, formParams, fileParams, pathParams); - StatusCode = (int) response.StatusCode; - ResponseHeaders = response.Headers.ToDictionary(x => x.Name, x => x.Value.ToString()); + int statusCode = (int) response.StatusCode; - if (StatusCode >= 400) - throw new ApiException (StatusCode, "Error calling CreateUsersWithListInput: " + response.Content, response.Content); + if (statusCode >= 400) + throw new ApiException (statusCode, "Error calling CreateUsersWithListInput: " + response.Content, response.Content); + else if (statusCode == 0) + throw new ApiException (statusCode, "Error calling CreateUsersWithListInput: " + response.ErrorMessage, response.ErrorMessage); return; @@ -568,8 +678,20 @@ namespace IO.Swagger.Api /// /// The user name for login /// The password for login in clear text - /// string + /// string public string LoginUser (string username = null, string password = null) + { + ApiResponse response = LoginUserWithHttpInfo(username, password); + return response.Data; + } + + /// + /// Logs user into the system + /// + /// The user name for login + /// The password for login in clear text + /// string + public ApiResponse< string > LoginUserWithHttpInfo (string username = null, string password = null) { @@ -606,15 +728,17 @@ namespace IO.Swagger.Api // make the HTTP request IRestResponse response = (IRestResponse) Configuration.ApiClient.CallApi(path_, Method.GET, queryParams, postBody, headerParams, formParams, fileParams, pathParams); - StatusCode = (int) response.StatusCode; - ResponseHeaders = response.Headers.ToDictionary(x => x.Name, x => x.Value.ToString()); + int statusCode = (int) response.StatusCode; - if (StatusCode >= 400) - throw new ApiException (StatusCode, "Error calling LoginUser: " + response.Content, response.Content); - else if (((int)response.StatusCode) == 0) - throw new ApiException (StatusCode, "Error calling LoginUser: " + response.ErrorMessage, response.ErrorMessage); + if (statusCode >= 400) + throw new ApiException (statusCode, "Error calling LoginUser: " + response.Content, response.Content); + else if (statusCode == 0) + throw new ApiException (statusCode, "Error calling LoginUser: " + response.ErrorMessage, response.ErrorMessage); - return (string) Configuration.ApiClient.Deserialize(response, typeof(string)); + return new ApiResponse(statusCode, + response.Headers.ToDictionary(x => x.Name, x => x.Value.ToString()), + (string) Configuration.ApiClient.Deserialize(response, typeof(string))); + } /// @@ -660,11 +784,12 @@ namespace IO.Swagger.Api // make the HTTP request IRestResponse response = (IRestResponse) await Configuration.ApiClient.CallApiAsync(path_, Method.GET, queryParams, postBody, headerParams, formParams, fileParams, pathParams); - StatusCode = (int) response.StatusCode; - ResponseHeaders = response.Headers.ToDictionary(x => x.Name, x => x.Value.ToString()); + int statusCode = (int) response.StatusCode; - if (StatusCode >= 400) - throw new ApiException (StatusCode, "Error calling LoginUser: " + response.Content, response.Content); + if (statusCode >= 400) + throw new ApiException (statusCode, "Error calling LoginUser: " + response.Content, response.Content); + else if (statusCode == 0) + throw new ApiException (statusCode, "Error calling LoginUser: " + response.ErrorMessage, response.ErrorMessage); return (string) Configuration.ApiClient.Deserialize(response, typeof(string)); } @@ -672,8 +797,17 @@ namespace IO.Swagger.Api /// /// Logs out current logged in user session /// - /// + /// public void LogoutUser () + { + LogoutUserWithHttpInfo(); + } + + /// + /// Logs out current logged in user session + /// + /// + public ApiResponse LogoutUserWithHttpInfo () { @@ -708,15 +842,17 @@ namespace IO.Swagger.Api // make the HTTP request IRestResponse response = (IRestResponse) Configuration.ApiClient.CallApi(path_, Method.GET, queryParams, postBody, headerParams, formParams, fileParams, pathParams); - StatusCode = (int) response.StatusCode; - ResponseHeaders = response.Headers.ToDictionary(x => x.Name, x => x.Value.ToString()); + int statusCode = (int) response.StatusCode; - if (StatusCode >= 400) - throw new ApiException (StatusCode, "Error calling LogoutUser: " + response.Content, response.Content); - else if (((int)response.StatusCode) == 0) - throw new ApiException (StatusCode, "Error calling LogoutUser: " + response.ErrorMessage, response.ErrorMessage); + if (statusCode >= 400) + throw new ApiException (statusCode, "Error calling LogoutUser: " + response.Content, response.Content); + else if (statusCode == 0) + throw new ApiException (statusCode, "Error calling LogoutUser: " + response.ErrorMessage, response.ErrorMessage); - return; + + return new ApiResponse(statusCode, + response.Headers.ToDictionary(x => x.Name, x => x.Value.ToString()), + null); } /// @@ -758,11 +894,12 @@ namespace IO.Swagger.Api // make the HTTP request IRestResponse response = (IRestResponse) await Configuration.ApiClient.CallApiAsync(path_, Method.GET, queryParams, postBody, headerParams, formParams, fileParams, pathParams); - StatusCode = (int) response.StatusCode; - ResponseHeaders = response.Headers.ToDictionary(x => x.Name, x => x.Value.ToString()); + int statusCode = (int) response.StatusCode; - if (StatusCode >= 400) - throw new ApiException (StatusCode, "Error calling LogoutUser: " + response.Content, response.Content); + if (statusCode >= 400) + throw new ApiException (statusCode, "Error calling LogoutUser: " + response.Content, response.Content); + else if (statusCode == 0) + throw new ApiException (statusCode, "Error calling LogoutUser: " + response.ErrorMessage, response.ErrorMessage); return; @@ -772,8 +909,19 @@ namespace IO.Swagger.Api /// Get user by user name /// /// The name that needs to be fetched. Use user1 for testing. - /// User + /// User public User GetUserByName (string username) + { + ApiResponse response = GetUserByNameWithHttpInfo(username); + return response.Data; + } + + /// + /// Get user by user name + /// + /// The name that needs to be fetched. Use user1 for testing. + /// User + public ApiResponse< User > GetUserByNameWithHttpInfo (string username) { // verify the required parameter 'username' is set @@ -812,15 +960,17 @@ namespace IO.Swagger.Api // make the HTTP request IRestResponse response = (IRestResponse) Configuration.ApiClient.CallApi(path_, Method.GET, queryParams, postBody, headerParams, formParams, fileParams, pathParams); - StatusCode = (int) response.StatusCode; - ResponseHeaders = response.Headers.ToDictionary(x => x.Name, x => x.Value.ToString()); + int statusCode = (int) response.StatusCode; - if (StatusCode >= 400) - throw new ApiException (StatusCode, "Error calling GetUserByName: " + response.Content, response.Content); - else if (((int)response.StatusCode) == 0) - throw new ApiException (StatusCode, "Error calling GetUserByName: " + response.ErrorMessage, response.ErrorMessage); + if (statusCode >= 400) + throw new ApiException (statusCode, "Error calling GetUserByName: " + response.Content, response.Content); + else if (statusCode == 0) + throw new ApiException (statusCode, "Error calling GetUserByName: " + response.ErrorMessage, response.ErrorMessage); - return (User) Configuration.ApiClient.Deserialize(response, typeof(User)); + return new ApiResponse(statusCode, + response.Headers.ToDictionary(x => x.Name, x => x.Value.ToString()), + (User) Configuration.ApiClient.Deserialize(response, typeof(User))); + } /// @@ -866,11 +1016,12 @@ namespace IO.Swagger.Api // make the HTTP request IRestResponse response = (IRestResponse) await Configuration.ApiClient.CallApiAsync(path_, Method.GET, queryParams, postBody, headerParams, formParams, fileParams, pathParams); - StatusCode = (int) response.StatusCode; - ResponseHeaders = response.Headers.ToDictionary(x => x.Name, x => x.Value.ToString()); + int statusCode = (int) response.StatusCode; - if (StatusCode >= 400) - throw new ApiException (StatusCode, "Error calling GetUserByName: " + response.Content, response.Content); + if (statusCode >= 400) + throw new ApiException (statusCode, "Error calling GetUserByName: " + response.Content, response.Content); + else if (statusCode == 0) + throw new ApiException (statusCode, "Error calling GetUserByName: " + response.ErrorMessage, response.ErrorMessage); return (User) Configuration.ApiClient.Deserialize(response, typeof(User)); } @@ -880,8 +1031,19 @@ namespace IO.Swagger.Api /// /// name that need to be deleted /// Updated user object - /// + /// public void UpdateUser (string username, User body = null) + { + UpdateUserWithHttpInfo(username, body); + } + + /// + /// Updated user This can only be done by the logged in user. + /// + /// name that need to be deleted + /// Updated user object + /// + public ApiResponse UpdateUserWithHttpInfo (string username, User body = null) { // verify the required parameter 'username' is set @@ -921,15 +1083,17 @@ namespace IO.Swagger.Api // make the HTTP request IRestResponse response = (IRestResponse) Configuration.ApiClient.CallApi(path_, Method.PUT, queryParams, postBody, headerParams, formParams, fileParams, pathParams); - StatusCode = (int) response.StatusCode; - ResponseHeaders = response.Headers.ToDictionary(x => x.Name, x => x.Value.ToString()); + int statusCode = (int) response.StatusCode; - if (StatusCode >= 400) - throw new ApiException (StatusCode, "Error calling UpdateUser: " + response.Content, response.Content); - else if (((int)response.StatusCode) == 0) - throw new ApiException (StatusCode, "Error calling UpdateUser: " + response.ErrorMessage, response.ErrorMessage); + if (statusCode >= 400) + throw new ApiException (statusCode, "Error calling UpdateUser: " + response.Content, response.Content); + else if (statusCode == 0) + throw new ApiException (statusCode, "Error calling UpdateUser: " + response.ErrorMessage, response.ErrorMessage); - return; + + return new ApiResponse(statusCode, + response.Headers.ToDictionary(x => x.Name, x => x.Value.ToString()), + null); } /// @@ -977,11 +1141,12 @@ namespace IO.Swagger.Api // make the HTTP request IRestResponse response = (IRestResponse) await Configuration.ApiClient.CallApiAsync(path_, Method.PUT, queryParams, postBody, headerParams, formParams, fileParams, pathParams); - StatusCode = (int) response.StatusCode; - ResponseHeaders = response.Headers.ToDictionary(x => x.Name, x => x.Value.ToString()); + int statusCode = (int) response.StatusCode; - if (StatusCode >= 400) - throw new ApiException (StatusCode, "Error calling UpdateUser: " + response.Content, response.Content); + if (statusCode >= 400) + throw new ApiException (statusCode, "Error calling UpdateUser: " + response.Content, response.Content); + else if (statusCode == 0) + throw new ApiException (statusCode, "Error calling UpdateUser: " + response.ErrorMessage, response.ErrorMessage); return; @@ -991,8 +1156,18 @@ namespace IO.Swagger.Api /// Delete user This can only be done by the logged in user. /// /// The name that needs to be deleted - /// + /// public void DeleteUser (string username) + { + DeleteUserWithHttpInfo(username); + } + + /// + /// Delete user This can only be done by the logged in user. + /// + /// The name that needs to be deleted + /// + public ApiResponse DeleteUserWithHttpInfo (string username) { // verify the required parameter 'username' is set @@ -1031,15 +1206,17 @@ namespace IO.Swagger.Api // make the HTTP request IRestResponse response = (IRestResponse) Configuration.ApiClient.CallApi(path_, Method.DELETE, queryParams, postBody, headerParams, formParams, fileParams, pathParams); - StatusCode = (int) response.StatusCode; - ResponseHeaders = response.Headers.ToDictionary(x => x.Name, x => x.Value.ToString()); + int statusCode = (int) response.StatusCode; - if (StatusCode >= 400) - throw new ApiException (StatusCode, "Error calling DeleteUser: " + response.Content, response.Content); - else if (((int)response.StatusCode) == 0) - throw new ApiException (StatusCode, "Error calling DeleteUser: " + response.ErrorMessage, response.ErrorMessage); + if (statusCode >= 400) + throw new ApiException (statusCode, "Error calling DeleteUser: " + response.Content, response.Content); + else if (statusCode == 0) + throw new ApiException (statusCode, "Error calling DeleteUser: " + response.ErrorMessage, response.ErrorMessage); - return; + + return new ApiResponse(statusCode, + response.Headers.ToDictionary(x => x.Name, x => x.Value.ToString()), + null); } /// @@ -1085,11 +1262,12 @@ namespace IO.Swagger.Api // make the HTTP request IRestResponse response = (IRestResponse) await Configuration.ApiClient.CallApiAsync(path_, Method.DELETE, queryParams, postBody, headerParams, formParams, fileParams, pathParams); - StatusCode = (int) response.StatusCode; - ResponseHeaders = response.Headers.ToDictionary(x => x.Name, x => x.Value.ToString()); + int statusCode = (int) response.StatusCode; - if (StatusCode >= 400) - throw new ApiException (StatusCode, "Error calling DeleteUser: " + response.Content, response.Content); + if (statusCode >= 400) + throw new ApiException (statusCode, "Error calling DeleteUser: " + response.Content, response.Content); + else if (statusCode == 0) + throw new ApiException (statusCode, "Error calling DeleteUser: " + response.ErrorMessage, response.ErrorMessage); return; diff --git a/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Client/ApiResponse.cs b/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Client/ApiResponse.cs index 0e42375271e..15735711656 100644 --- a/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Client/ApiResponse.cs +++ b/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Client/ApiResponse.cs @@ -12,19 +12,19 @@ namespace IO.Swagger.Client /// Gets or sets the status code (HTTP status code) /// /// The status code. - public int StatusCode { get; set; } + public int StatusCode { get; private set; } /// /// Gets or sets the HTTP headers /// /// HTTP headers - public IDictionary Headers { get; set; } + public IDictionary Headers { get; private set; } /// /// Gets or sets the data (parsed HTTP body) /// /// The data. - public T Data { get; set; } + public T Data { get; private set; } /// /// Initializes a new instance of the class. diff --git a/samples/client/petstore/csharp/SwaggerClientTest/TestPet.cs b/samples/client/petstore/csharp/SwaggerClientTest/TestPet.cs index 2bd9b8ac733..98e9f9cefe9 100644 --- a/samples/client/petstore/csharp/SwaggerClientTest/TestPet.cs +++ b/samples/client/petstore/csharp/SwaggerClientTest/TestPet.cs @@ -236,10 +236,10 @@ namespace SwaggerClient.TestPet public void TestStatusCodeAndHeader () { PetApi petApi = new PetApi (); - petApi.GetPetById (petId); - Assert.AreEqual (petApi.StatusCode, 200); - Assert.IsTrue (petApi.ResponseHeaders.ContainsKey("Content-Type")); - Assert.AreEqual (petApi.ResponseHeaders["Content-Type"], "application/json"); + var response = petApi.GetPetByIdWithHttpInfo (petId); + Assert.AreEqual (response.StatusCode, 200); + Assert.IsTrue (response.Headers.ContainsKey("Content-Type")); + Assert.AreEqual (response.Headers["Content-Type"], "application/json"); } } diff --git a/samples/client/petstore/csharp/SwaggerClientTest/bin/Debug/SwaggerClientTest.dll b/samples/client/petstore/csharp/SwaggerClientTest/bin/Debug/SwaggerClientTest.dll index 1f473e2ad876bd1fd1a6b5647378d35b38585366..a58a6d610acd13e5bf97ddc3970a1e527197b816 100755 GIT binary patch literal 79872 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 l7YV)y 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 literal 81408 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 Uuip>M>#qam_4|W){XyXW0W`-tCIA2c literal 26497 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 diff --git a/samples/client/petstore/csharp/SwaggerClientTest/obj/Debug/SwaggerClientTest.dll b/samples/client/petstore/csharp/SwaggerClientTest/obj/Debug/SwaggerClientTest.dll index 1f473e2ad876bd1fd1a6b5647378d35b38585366..a58a6d610acd13e5bf97ddc3970a1e527197b816 100755 GIT binary patch literal 79872 zcmeFa31C#!**AXfoh37qb&^R4d%~gvD59bgL}gV|Hxy981tJ89hD@9Z3f@c_>QWb6 zsC%^*+!yM;FD+s;l9Q)`s-Tj)u05hMC9BX;_h3(mKApJT}TyJ$sf?M_cTH_qScy zjipvZsR@=+Va@;DaljjZFT$0*BW~+{1C##qs@6jeKK}x0>V-;G$^YKfkXl8pN4-Z8 zN4=5!ZfK2OOO+Yj-MTa=g%P-a5zt4vlv3lnT32;}{$L;U7cv>E>32>I>_y|#ne<{X zq;Ke>40JzSeScG7kn!o(_7oJQujsSb;J_li>AqruZlzuE$G+Jrq>g+>soB>km0wa+ zb_smR&Y);4OV`**z?iZFnaAPB%=ZD3LjlGVpq|i6`&a-s5J`xW{{7WV6VT5t6TF+3(bbBH1yWr>Az<*H+0mEhgHFcuJe zCKe=?Y&8H^Bs=DjKypts9Sf)G5h^<5N;ua<)h`i?m;*RxSf9B$BhZ97RYlUH(KTPz z2U1_hXneDZo+19pDWq<IdOmQQFtR4YyixwW@3d!mrkg)NY zBp%(0NEw_Q2>+(O0sStLnL!}EDJD0+z)%uX7osB0FBi)-IT*^>O9b!cg)xOWYaDNP zF+D%!#}s%wiK&&J-I%)evlCNa-L;r9YCDT5cvpwbp>Eia)gu6RJuN)U6_V9M@Gr#_ zDv+4E4izz`Zj`HzsV@uO%?o1+b7FB!;m$7e6jmLKsbL7Yym=~!J00%naaCz0heKHR ziPgl_ncUyg+hD=WcTn`a^c?#$H;tJtH#KrTPOm@*eVH3r3&#vDoYB&&p_Te6M#R;O zULA2+h}97#n1PCxLVeC-SOMv!P-(o>w-hQ(U&2~qzNL`H%^IgvFNIt+FXmz?;yE?c zAWI>1Mu*i@H>}9&5dgPo;WSrBRu4f@%*D21b!PkKF_M`Ev{_T8mr7+=-{^G`L=tni zpd!ZHeRAcJIF{WgcsDPMIn0LRk|QA)yC3d`!BBDn`jT5WH*l5B*wPDr9a7(bfj+w- zrSFWz!Q{nJP?qTNV0vaCFW!QlN+_pNaDNSXDmqaArTgpdEz6EYZ+GGTYSg^AjQZn} z3ww!6M2HT(>2Bze)gu6fwQz~oI$5-juC4anV^4p|rJpyps(!yD;kgOhpe&Y_?NQKf8cP~JZ zard%Z?d(>$>UjI1;N841-mq3Q@n+_|15Lnj?cekd<83l5V&d&Vpr5hhgx!oc9#>#4 z`~?Qmcff_3Mo=Y`j)d}5gbt;igV|EpUB~_nfw_AVVm11+3lpMI+gV`75f^f1akv|M zWc3KZfrJ(w;R?y>A?PzOVX@qth~Smj#958R<{NSiWw*=K&b}#E9izV#yqg!sDAqsz zeXGU!RnFAx)E=;S?)Xcex7E0^Jt6D+e9b~%{$E*3eHLvsctT7)iFpSBhcnRS2!WVg zo8>h;3v8Z!sVCsTZP$^qt^0Ah1Idy0pi>Y=B3=;?xD-iu`y5=~?m@zVG4X10Yg z+gXZ>cdBSRWXoA+_6#aGgiYhvA%{)rbI<-u>7xmUeJwl%EpBTuv{IXpak`^kt-e*) zUT8YkcE&v&EmXxGEO$g&+zf44Z#!Z%XAuZJ6x$JlIbtj6aSF?ra4Jaywo$E{FgXVF zaIQB!OiCO(zN zPwox&*l9eK!XM|U9)#&yd|1bDOj`%)3IfS}sEM6jUc9fy02%MR{)2cwi`I}6`fR(0 zuJF(f4^0Uw@!m-^kv*H2e&Rh%neFft(I4+*>v%_W!4ZTe-r1Ci_kK&6cxPXWEyq^cs z?k3EOcY4c~V^%G+lcip~i*{bTJ5;wFUa~8RC$fe`O2_*-_d zi9{#da6_lU0})L+79Ao#=eJ>n9y7~t+dcaQLL<|c@kGrabl zGdxw#UJkLznJYZ>N)NrtL)Qr!L2KDB5lv*T=B1yUxrQ>^xe*tC&XBEh=2|K^geGU$ zl*yTXOPQQuUyE|)I8$9$@ z54}xLNvqq5CbD<%(ob65Ntx~3hl@Y0$ku6f7Zn^rlU8iXq*cGAOj@z8g=yuDxoHAs z9@`NmdHhh+3!10!L4>cb-s6bu-O#ihLj6>t9#x}m>Fa8onQNJwU44+VrqrU9ApG|fX=4BV1ZOaM27TQU~Yc9J)J1@H)pt|kwlD&s`B5PQrbavfK zzC-BGF4FSA#CAm0mt8KMOB3pv>?$mV-sQ4OijmG0D>M@owxXTFCm{uQB+mrVHI zcSrL0k>r8kkIlOuy^VX(hxiPH=gj?RBiaij4-!?`v&=eet zgA#oIASCjtlo&1TJvlKs^$_GHrylmuM?CaV4}DBf$*ISQCbCcP(oar3Ntx|@9T$I2 zk*#y;DJnRGCa2hx$*F!znVe!@3v)`wYN`^sPN%}EXc7Od>S?b79H4$CQ`Bv0`Aa=h zP)Z)t6qTZuzm(gT;@hGO-gjFpP>sR;ZsNK!GvCvR*iVVq9Px=GZga$AjyTJqNqmXB z8Km7!n3uSWBwHSdXrY~~^!8JtotL=JQ{8rW$v#Uwku@w*I&q&P-y!rTF6lHM71@rc z`V!Zra~ViolemS&e2FW?yu{sx`1j5aym964r#yb~erga>h;Q!ra`7AJN#1@6kDW{| z{sFEbMhrBID{sV*p$i1eoL90WM2z&(i^k6&xw*w%)$l%QKhG z5 zP3W#Saq;IF**edDP6db1ErdpW;?1PISaY zj(E`#2TCt(hsN=x=vyG|Zo<42Wq{f8BuoqKBmyvZlrGwNDf(-w+YT?;9mEq^!y=_q z^cUnig#HvIo#sPA+Ywb?in??zMX762w6K^jMWtAODe8?YKSe#hPSLz|>AnHHs*TS; zINPjCe~GS`9L>GOp8%_`xA;%SV+;2!exFj_Tl`eYy~QsD3f|#A33BoBuD!!wgTCaR zPx2jp(nas^voAR%zQa#C_YOavpIWL8;{}u7AvhK7mnEBk--{jqpCoQFFsgphu zPAqsB&tCs?@AkXn?eE?GLIs&0ir?+0nzu>Z$vbOqo#EYkXYEWr3g7uVYevltRTS~U zG+vr}XARcWPrH|)@A~z9vU&u-C0e-L6_V9MVBT4CM-h*0Mg9JFZ%JmF;KTfP*2cik zr~uE&?d%7r2+zJJLn-?w!Ml0k^YCiS0Ldv3jD>#91pUtK0Ev%4av}PI06D}TAbgkO z7Q{!r#K-NQ)%cLS^1l1w+Aq9&FGPHuQLytbaTql(3i^IS40hFyZgU+?R*wJ}R142^ zg=F;*6h%RFYgzt&on+=vMuG239=UfHF~`aK61K%Su(Kh#CJ$pggaz;Bh4Fw%Wn6Mv zKk;xzKk@KFE*|{vG=2cnnOAz!;m_PGl6$9dJ-TKm-SEhJ+u!B(J$3Z^&7TKR=Pm?| zQQKM2z903NLCNQKNmE)m_ZE^Gcgl0b-tJxpksy?#td#JCT8SY zVy)IZS34dJt2G;pciHqHP?QdzxF2#jW+gV%;&bfYt>w2lrC?D!d;So1;UL3^JH4x!ngu_?1b>$jBIps}xo8#G^A-dZgC2Wf>c@4#N#(kC61x#xa`4bwh2 zuor_kGF(S2;)pREv4g|j_%=I#25EN_=52Q930syqT4?i|i@5`P(H@78cHbNN3)O9h zm+T*jC$fe`N^f@lhkS?7zu6(3<}%QBMAf(1ap~MDC!u4u=aC^z^i?~({Bxg}mzhlIZ9x8EPf~kOU z&#M>rXEW}*b=-4>nEePfn7IF|hyKk&KlaeS3o3E{3DHFMQ(pRsd%U|zzi~z5k9)Fp z+~b`OIE~Q6J)1Id-)|`s_v~wN+!vPOsw%Y!^Q`V@ac4MsY~f|Njts_;@j5b8M@H$e zEniee*zIn@yr`y~ZCR{op`9GyMYU+>MRkYAu7Ear=9DdvyrLOW8SuVrmPRC^|fCXet%wa1SnkJPd1e=lM&!tw0< zxaOKSkZkti`ulEN*F(g(=GBYq4UFrJ64wsbMZV`y-fGuQbGe%>h1`UEnTM8pXoZJX z3MwIwS6t|&I4}K#d^KgZ!v&c??)@Jx`O2OhuAJmB2EAwLgj#=JbZ6>=O6VqG%^BIW_F1$oe`^MLC_Umkd?dy@x4 zAUAn1)I*1P=x`5h5LEJ@k!T`2f|q{sU?gR>vnMY8JRn==!6+&?geG{|l*xmBOPM@i zUyJg9V>MNYT<1YyRn*GMgF*$G1W#SW29Au-5hFMkaSerZ=wqBVCVgj&$?RbeAI}&&iK%?o|rTbcf+i+t-=yWw?dAXSzP6 zyfa-Y<<4}aK*5>rrI7E&nJ!jQ?r|;8bV(PT>9Q~WGhNcTGhNwnUx`L@-!JXS?YYyp zz*_}px9r_NcXsQJtG~0`LIugA;xBZoAiY8(BR9M&*R} zxk9pf2zKIAq_X(*B;(TsKA)bVeaZ`ciX$KYxmSSCLKI?(zbO$+-hig@(ByO2R^*IM(-&h4Xw9{EzsP z_*pKo63n*A)y}rdHF-2jWmgE^%?slQH~VqPW4Zm@15aabLXU70XRMrsSP4q391YWa zcISrO^z+hP^RrRgnVPA~=*KbeBc=-Y(av^jza{9m zto9o(^c!yJ{`}X^Oc7r4n=-ecL8Sk2D3?or@#zcjDWWX@S;)<>hBZZFuDi+V5im9oYC8*;ak+?i*o_FXdIap16F%Y!$?75Kd+LA> z^*sQyi^Rj1#P`AM&2qJ~UzMv~^RE}Yn-|7KgFBbVn*VkQ3*G~6>nkSqDgBR$iSX_{ zJG~Dh--Y?YsO>BO_RjhEQP;<0^#~ZB6F%k&$?75KI{s3%5rp&=1?M(n$!h z!}0Mw-{tvJ-n;2utR4jsW0lvwW0faT*+U>Uv3jV79_FD_J#?C&606gRCbBbl=_gia zQf50mVe!W***aEdQNbZJvC5`QtoB>V#47t*9IJ(;c*>(=RXSSS8IB&YD#LX|$C2?m zGE_%K>98$dtR4;0?k3EORodC^=HZbR+WZ~CT&#+AUaTHNMcd&edj#=B*04zFSUr+_ zhtMCZq|-b`vmH_O#i~o^VwJikRtt;yVpWRu7pva5@?+KG?_#XdH2uWtsSq(%dF?w^ zdD50W7Ge{t$9d>%4?W&PPY_gMbq>))b}ldd#OgfCY-a&3{#Yej$Lfhxa0pGTvMCd* z{gyJZ%DxuIYGJ99prvC~I$GQrjvlcp!*xW*k?}e*R7XbXuq|J#o(9tHCd`Xf+S%^r zp_mrhN$j0-u`1emv3fcc@e4q>WKSlZ$Ql+Y9jo)ncL@ElN;=KsLE8~kU#z-xE>@{) zVzscCFIJ^kf3fO~D?e5}{w~HUO_LX^?_l1=5(jI54u}}5yn3Y=_M-1k$ z+rF?*fwa2`^TM7kv*ip=3+*J1esZrKh<0AscT(MUc*&kgJdrglQabFu z4?Xd7R#f$cy-Vl9p1LON3yb-}UW$2PUu-5S^mXW2@CuG+f@pFcRwua^%RGK0c_R2c z-|)YKb3a1++5EM~3bYvDSnmrq0lOt&l z&3I^+hprSLpgw$72&RB#AQj<6|{BmI^#Il{gc=16f{ z930|SM&n3d9T|=zBXML94y*FT?dL(--Gq5@OEcQtSyyN$aU7YOu0=a9ZhNU{JG^Ai zBc8|_7AYOK4*3qDKW<5mzNm;b>f_ohmZHJfaWyBL%!y=`FdoB46p+C4ur+F%EJEH0fZkNslH+4;L z7Z&pcw-ob&yV#Lb*xJXbbit(TnIM{+@0*l8ek8d-&$IqHxsUh3XvRSD6mL#`0ePV3 zWJJ8=0k2*jJkLDfOJ(@N;g=xs<$-sKZSvr1$W0zx1CG^HC32kyg;h~2FAoY8Zl=N} z9)`&9iibd(;pa5PNRH?@VkJim|^M4_%pl)_@ZM3G`%qU7HN zym95<1w6jF3;1In|1N>L9v|OX$a-`o?;ha23;8faya({=#XcHP+swO=w{slcJ-|Dy zH?e;Q~EwDKaPWoKlaJivHvwHID{r(*_4U> zeoL9yXJ3nApJO#uiCo8iVO7-1i~T|cngs7ciVYkYp(93cWc-c{-C+a1(0&A@-A$Mm z+VqRv{g5lPDa|c#L_06EAEl!0@RGfscp__9q;zOMK)yrh4{g$EK54KWQT2tkOXotH zx+b&>i}^xZiuD)T-njBZ+vDdJIR4n~<6TIa#>Do$<^{-rd`+jR6jOJ42Oln-idp|W z{DXC;;hKC>AIZy^JbI__2n=hX33v{YdmWMQERr6J-*F15Zy^`<=B*+S%$$x2VyYsN zS_q_U5}ui>YCE|IL}|F%O11#O8GD=V{6s+Cw2JF&frul z*srUKkW^I@oHUfepwv|!t`6wB0#a9MsZ{$_P!kPkKq%Xx!z*YnY zX(xnzPr31|1O2e^>#7qEmq#DKPgnb|%i(vciSP>Q0RICuF=-ims&(RZ8s~G&agdK^ zOz>YqsR&ktD#8^d6_MmqXd6Fp{{$}KR2m&EEz$qxN`&vg1QZ6P_CY!R+jNg1aQSZ# zJTBKz_6fOG1hY?SB$RzhBjN1R8Y#&>qmf7!hbr>o+73P2zHT^ItLXc&m~v| z5SxT==pZ3PBVALbIt|;@IT&NbQ%L?>d}wcFkahBY6u5(EtXicHW0}>cs&vxj6s$yw zSxsmKIXeTgvh*y#auw*JAax!zYeJLoGAaIrfs{iks3P&8{Cs^h*$qY+C0QVo|BJ!F z4#q<(FB*QxEB9T-N^ajjNeIA$6No9})lD&chRV8DsD*FE@HNla80uJ*) zP+_C0_LK3X)<88Dkh_0rK>nSSvfx&egWbp+~iPG`K0M67Tk(ACjG)YD2y~+ z!AtUIu(F=9VkFN;=}DoSpeC4Zh9NQ+fLjxahaxiK)P*F&7|=y*YZmLlzu_28eGz2( z5fl(3rY?*6ZfZ*6CE?^Hkj6^}W-i6GeA11qB%HYn1pj@?@<}L+TgF;e@eHa+ z!B4R!MG(I-lsU{x%#YVqQUH5k9^fLv1h(DNvd;h1}WH9jFdf=nW z>JIq@a;+q_0aW?6aw;~333Z~uYp6+bsaj2#uBagMAZ(!yWPA2xCZ9?lgz;u>MJ?yq zlA8^mATl)Qs|u_Mvcoj_`WCGntC zkh%-x9-K0m`zM#Fh%R>6b20)%v1^g(=^55wd!+F_uIK|rzCwSZ8^lm$x+wp6P0y(SO4ySbdxE`R~J+jY{))mNo1i#4# zPU>#-FLe(<_IWCF6DIEko%<&R*cn?Ue=W561N`H*9ZUNd^^Gk4b?P~UrQ6t9_qY4K z3L?p`K{I#$>G4aF_k*AFDSy3x%d2W2^9R4#&)ZHQ`2ZD0*vSWRRb!{y!Q?~4@Xu#{ z57r!edI7@@C0`~#_a4F|u`jYNZ!Jbze}9B?2Xn=CFcatLkfx5U4(F)wXZ9orv)uM% zvWFf_l>hc?%>0al-9t}jkpw~WO&Gy3*xbD{Ao1$3zFg|?w}?pRzPBQ}>?89YkJ5dr zTvL+v#-VjEVz)Z#kS^3|D$pTKoq+lr+5(05uX)dm;WZ410@W(@Fh;hAFiUNRgAG($ z!fdKWk&^W15#V8c+mzvk-DOJN7*x*`U)wr&7o!6Cv-M3&64>sg;w1LRPU0Q2n9QJd z5{rP?9=6Uj+;1NP+4DHSRL&}*8xOC9vyw#4b zE8)Mf{33X_j;`mb9<$=W^na6PCdFdm^cx_OPXp&ZE7o%ex+vdRB+HekF(7$)BSGYolC3Z(-kPz?{|&Pis50gq^4GKRJax!m=*Oy&TN;dAnwe zk=nl+?BPH_^YV!`&Z?VC6YEmt*jAC>w9sYM1gnF(5;4Iibz+DYsf7Na+;-F-ND+#| zCO5j=rWzO33aRg+7+M@>4FGgU!?BzMRd_FsUmqBQ{XuRB(wRY!g@-pS&}@vwbOIA* z>|`i!hqwtPjS|U}mSOn>wu-vp1H0+>xpe$YEr<=$Ui@gCX$3l@J)OhQXWN-xphMcz zL9Nii`Xnz_Nqahs1KXKdphMczLCes=@+Yqz($uk487j$(=a0PL^T+esFi=17JfPCV zww?S<|61cbt@o(a&}VMU^0aWHqUD6w%m2PL|;CW@1Xm!v@n(Q ziHRi2g$Ze1^hBZ?6vfi&QV}%G_v$LEE(@e6m4NxAPQpfJl8K_kD5)v0E>C`68Wggk zx=;lBPfk;a}%@}ogw)Be0AX?42=hJ>SAbbJ|}7Bb7L0< zC2i?zS!{@CG)6Mhzjv(F_xb@V;k>z&v^U>k_QiaAM1c-zPX{K4&XEN=q&*$X(9mfv z&>`*Vpk?TMu0V&hr=#0Csz8S{b!_z)xGit~zcM#@(e{B9;lYhEwGeH3*G07~#Wi8mkA+KT z1X6_lDT{Oyb{H6dr=X{-TZBs&1yY2jA)-xRD3I|7tj9IA3zt3%qzFw3qD`|4Wc;_U z$C(8poft?F`nyKjED$|~z88p$?Qf%jLy;q9eVB7c!Q5v2QZQSI@x1wjq&uI8g*+Ka zS0=XbWF%dgjM|ftbY(I$Pe#(ncD5cpx*)en7v}#l1v;d4{uk|M{*X(x{QSo{vA_KH zrFR9p{l6vmDj1J7sJsz1$o}>B9Iqu0V%$p$^hH@4iU7 zQ0Mpp9nyt5Clu(AF4UP*phLP)XKsNGX;0@cxp&Sh&>>A7TOEcubqeQ>+&;gw%G<&F z_W5-%bU*jSJ#!`Si&Jz*QC>{*6bALFaGIwuq)&x&J%wR?DqQ9%H1w%(ho>;2PlcyE zg;7vg+pt?(DY0c0as=kw>6t|(b9@XMDai2|*vlNj^6r_%{<6EF?Y$f)wJSMJJvYbS zlv^iRI>(6>dfqk zm7R0<_*Br}6AhsUnQfp;ONLK6 zQ)|8fvLqddL%aj%fXhqe%sIUeIJahgipt6|rR;gsUw=6`(e&{wRS9&!fKBps2ZaQfHO zM@!@MSl6BkTWC=o4`5>{cfld0!~l76-sDY%iUS^4jSBZ?2WZcTEYa&yuzAdAaTS}M zN3Ds_8a`?5Y0{)DZqcHi`E+CSQABnVsqK&mb1dve`(eSWu*&SyeyP30CI!YQDKJKf zXN;2mjiE*T8zWEd8lyzUU0@8&^ckZ>##Uqu&6e|Txea*6FcQBpm=_Vm$1!=f=w@Pk zQb%vf>3#ZI7(D$DKnh!;a9-vV8mq8Zg~pM({KjOpK4bbKDbG0hkz^d-=UBsbQU5oi zjYQvlFH2MC3w1ne3Cc5ntRmg`NWTFk{X#^kfB0rJ2NYPPtfV}Wh^ENqyJC1p1o4Iy zr(2&pZ7{F&v{8!O-vb5k0GjcNNnz4xl)|fDm}g?;D(VYJmWp}-NG03_W0Qa2zWoIE zp)&LKlYXzk#@lKKFUP}K{BevQ!tYq&{{Lt`l!=>Dp?_-S)Ey6bb2sq($(ygk zH^k@Cc$_G2QpDVsd?gp~=ynF`HaU?#1~?Mq>$DwjJoT4z!XI5X;Fi$?hL64_^DcO0 z>9eR6@wD6rU!3btN1Iq|GxxraYVgQ*B|HBk;NkQ-qOTH_N95_Rflj|dCWa6T%Oi5l z{FBQRI)z(3;wX_Dr?%%5v?cfD^!|{@tsCwb0@Z?_$rQPaNQ--LI}7sJLk#net(K!6 z>S`V=-qWMx^L{D|#H3sR_n|;u&VPD9Q_LZsmASheI2C zj(INw?~MErG~O8bA6`Pq4=APm^)pT^1aYSPdoXjGFg_zE?d_ehONP$-1v;cX9oz(= z^M?W*(qq;1IiH(uAz}GfhR-<@$4?l)|AhVbAf;VrD>UNYo6CZiRyk?xetF@rNSr6It_S6|v#vkIh>ZIYfMx&g) z|7z{ef9!~@FTrOFK6tN7wc|4bpP``tjL$NBR)EGhq>t1)79ZTgrECOOR3kW|4}W)z zggXAh_)WG|R!lu%J#U58b@m23tfB$J)qz#u%nlMh8Qfr3sMi3)>aCy^im81<)ITJ& z!H%gjfLEx`hpq^P)$<|N_Fa*_32C+ZC=?8b)zC2O85ceh_+cd$G&@UHmW0(>!S5xtu6r! zt81!grJH~cQnyz14^IBPym;5qRj;9Ma1pWub1B+r2)ah8+4@HzeF4S^RS-fxj zZJ}0*Y=8BAp{`NqL-SCzO{lL3HC6pusM~}(Tzw?eT|ynLO0g}gQuhgUtg01ii+T{X zoT$bL^&8YZ6z_E$AXL5e7oiRkYOKYcousB%0lfTpN?56^wE#Iw>boVR&Qi04+6&2< zwYt?2LR}`*<*Hez9}9JhI!dTRqSSm)9V1j$s29|6LOmwbkJa%){RyVdT5qd4LRI7b zmbE@o^Mu-4sF-zMfxbS}j6x(#cw9 zTZ@GnEYupSRj4MRzGN*EYOYYXTWvyZE@!#Nth221VV9*idK-%QZ3Qei8J|WqAAuBC zuZA83{EfhkCB&Z*_#1&A30x5&zgyrF0=Ebp9wmRgz=Z-k1YR%jPQZVqt$(F#T(td&IeL4O6$gCDss;SDRj*F$4cUV+yI&29g|PxEH+HjBIrx^^Q{Xf}NbL|{D?&vjDILju1iQ1|c`f`1ekjULtpk3~I$gB;^Q!Q%l>56)KswK6;yus0k6yh`8( zfsY7$Asny*>J`!15iSG%SHZi2RluuD5`YaQwJ1BGq#pQzB|`vD1jkaz*o^^8b;qdl zS#D)@@G$hhud#gl-#C`u-E5^cI1Ih|=j`@=gg&*Rw0vdM@0~SvU*4$=QvaW8>q05J zT3}x`>^mO*mC;@L|6yC}q^;Y7M+EwgkiJLv&snlBuN@L(PE7;+_vO@`s4d@9x|MtT zY~{DHe?B(;&$aUJ^h;Oprcj~9z6#F2d#>C5AJfXxQpQY5V15i}yImOm_r-Hx_4n<4 z-K&2tH~VU(x}>jB{41^OZlwJyZS^&xzU{WAjNZJc?9Y*ay1b0*gd2r(tKbg^e7cP5 zgl`G{TKUJ&e5;&yp9v-St|2nTih8#Ca;#3BU-fsauKBkmG%xXMoZaicEun>p-&SD1 zE`M7>D-(aN2)NV*&au>zFEup_d6U%V<+Y+j;9af3OwW0Q^oluFzwV@8Gom|P|1paLa9b0>3 zWu+!SonCulB^KWDw{8#Vy||L6 z5&YW{dbRfIN^Q~zxVeOUWImo@}63g z9y>tYU?_U*K=rJl=&^&;#xYux9-E}zGZa16q^fYb#lFyElU2iBnxe-JR;L+?9-E@t z4MmR~rfwLoHR-YG>Q{!M$7ZPy3`LI}p{n-Pn)Fz+nrA3_>?pOwQ1sZbYUBP|lO8)> zeJs>EHNWops=2COj*-@>m7wOSNrqYn>O?iyQ1^m5Np%_O1yCoes|@uPsQKzaLq!KX zU$sEJWT>&APEqd}>L^gBst6viD78*42X&fC8tOt&r>mKUx(C!kwZu>_gIc6|4fPJF z7Pa0`q59{m&QQ-9Y6PgotR8<`Le2GWSMjWke_KK)*8j;zrRu|RPqwChfR9>RKP=v= zi=o_Y^<&~V_>;dap-1W`#+SL&ruxb8#JTDiL(vke)X9dTC047*e62}KoTrWyYMp8r_IqQ2>SIIw1k@T;&xa<6x(`5ofhhjAgsKM(sXkv5poR__QGJ0+ zO&qjW^@T1qbI|_P7rE5wgAS?wqDx&c=&0(8UFtSyUgA>ELi19W+5yeWTn zRCMr()mOOG@WG3!uX3sJgWJ@XT&ijCnbjUOd+>giM=cth_Q^U1ud2Sg!$Vxxu$o-{?{=5AKNEkda>H$-Zk-R~DL#Vebdh9m!lA-9a z+ttaEf^S*$*d6LxL(yY*s`ZAV$L>;lNkZcO06*NV+6+aH-J`k;MUUN!gLw||EsGwz zPfaxxJ+@ITF%&&^zna>iHR-Vj)rE$l#~xN!8HyfzSVcOuCO!7BnrbL|>|wRUQ1sX% zYGPVz(qoURvkgU$J*IjMMUOq9W_D>!dh986iJ|DRXVf)@qQ{<9GtbeQ^w@Li0-@Ha zPX|9=^>wx0P(y}1U-b>O$xuz8HmTPQ)e35}`q)tGKs~SO&t;wK)U%*oP?HSxYf#@* za}5<3`h3;5RF|QKgW965GSn1M-&PMAYCfp%sFw`28q|yGJwx3H>bnZlh_v@OsPCzy zpPnWoC{jM`)S4ftLk%@#*iukO3bjU!8`fU4Rh_y{ zG}Yu`zpnY2y2en`ht(&xt13yei_~$$PKmy)_A=C|!#TW|lI_$>8AJksgu`k!D zO~Y61O@=xSvViqphFS<&!1|@8 zRBHGs(V#Wu%N*@>k@JUN91U3~8|u2@zfFX!?`TTh16kNg%e1Af6t>oCNAsX&f6{p;{WQ2enlwJ@&Zu_E)8!GWNI?Tu*9? z;@IO>QYemneQmY1^;Rw8*lVo!ZzHA0USs`5Q!@4%3zIu#GWHs4h@mAnoLt`drUxwCGV zbt-OixxNgyz9E$E%W&&Env%W@w|-$L_GP&Bo}rlG4OaL*X)nSIZ?LKi^*C(SXpJ@0 zH(|3zYoeik1lb7dSVO%5*$C@oL%j#tNGolq4B0mjcsa-_05NLod*f^zM&2iD)@+&%@L~VQB9p8)TqZa zwMwWiLw!-G$m3delTc+(YU&Q5(wZ`T={B3YMIH}rtk~NcB-EP7)WkMW zql|1v$)nbI>rf**I`M8`y!HA4EccdmM0uOq$9i^>roJ278ra8r$xxI{ur?m-$tGCO z8j7-gt?h?;vVE=h4Mo|0R${s*+s_(hD9ZM?I%j#Z{jFX@Q8v-~_()GS(JE`!6lDik zOOEzr2UuN(qU=B`GTW0KXiZw+l{?64IL(tCWKA#>%T2QWve1)FvLcJTa!r@X{Gkyq|8tKLwQO|_~n@nlo2218Lc%_>{#$);ID3`N;= z>up)r>Gq~uvt<>e$1ua{yum9s!>X#X6rLCE6s{H>KkOAw4)RTh+F&uPs6 zM!KtXMkzrTW4P zOYM%8K8yX|9glGAyQ9zX-s8*eHD%21ivam_1h1ju=?LFpycIC49sn#+PXk8qbcAjF z@7DjIoUL4l9^$+Gf)B1B=S)CbWdzrpZ&Z?BQN_8Mf0kMR+*U1smfAP&!3Tib>M7ym zaL%`zg~M4+|Ka^2ndQDO{M@|9dh|@_hd*=6=Irm6>K-=M^j+4ksquf8{_fV}?}@+c zzyvKe3NWDd0_@8I&&hoCe*y*&jUl{=SAt*ADpmL6RkMfjj??4#a>LX3J=3qNgt`#F zC3PX*fVvPr)OjJaF2q}f7pg({48~^&K11;thR<+(8t`evX9PYY@fn5BXngj-XHR^R z_@E7(i8Kj}tCxc-fOD_jESxemF64;L`DmS*^VQ7I^?)aYZU%ooq%Ep5bSvPEp)}wf z0v`|Eh2A_I+^jB9RpD==Wv+>Dlo~du1tksE2GvqB8gN<3e%3?aA7t&NxZ-_EMIxJk zQ-2CHe{M|?%_-1)&zdPZN2_}yS$n4F%oUxvqBB=?64K`#kX{s6t+*dtt%k*}4V@nc!*rVvf6|wIIHmI9oZ8(qN7&j=c9H)rR6p>DW^j&bspDX;i z!k;Vrxx#OkzO_rQx}{g$(yMOi)deEGK%{F$x>lrXMcOTOc1xYzQfIf+xmNgVg}+w# zYlVM})OL;3cC*xWv($F8)ONc_Zx`uCk!}>}Mv>kub>1v>-Yj+AEOl-a{zl<%6#hox z$6=F>NF23wLjeu<&h=4llnO{3FVMfZeMw3kFFrb6^_KrQa=f~xJdN*eYycc+JyiZi9( z`^c*@mRDsgugX~FTl8;>RatRN^ms^5h&Cd6Pl>L!{$92ydbU+ser4MQvQ z)h{Zpj^1PazT(E{eCVu?J_UGpbhGqfzM4>ZKUzPy@{#Ck*1F1XL_bouRi@Qz)&rI2 zM0Z#}soWC1M7>w}5?YT|{WAIoD_Qj};J#IVKu;!D{W1trz7G4`LThTsRY z7nC#uj*QP&zf@!6tueOPre0H1;_29HYI^)UaE^#O(Po?8nWkFfumkWf#OB+V#J?Du zuP%>Y9y{K?K7Ms9u5O9n8hcN&-~-8mSHBY3OTnn=h!87w)*dYU#bq2evBG8 z4?IylwDc17T=nGAb@mI@hnKR{(ZK1!`LO@o(hcZ&o4Q9JN71I(^IJ=4!+T1PR(sYw zYBkA;*?hqJqfK%;7_`U_TAUNg3?v6LU&Xqzgh&&@zeF8f6EA;CYThjHX!Pyfzz|rq zxnh*S7lr>rfqPl^qn_97O*JhQuh}oxtboqzHQg0M1WrUGUs*8`G4`l6QKIWL``wxi z(EKAHYiq+h+}!=M?41=e6?gkntiRSg3;24?^A$6t#n`Juoc3w%xBHi0_?{z>3R0xgRc2nj3~7#BEDV57h>0{0bo zfIz(WjZ)JDHVZsP;5vcV3cOL^QvzQU__Dws3M{u-LtJ33z<~mX3TzZOTHqLgdkfrG z-~j@g1Rf%An!s5C=L>8R*d{P5@N$9c1YRrfMuA@uxIy3@0`C#{HGvNad`#d|0-qDO zS>U$>z9w*oz;^&ER8wI8NVR$=z%hOV*oa?*KZnp-8yK(dD`~19uO2B`1^7(Kn)()z z;&~BtHVE7-aECz4lClEFST6+6f!)bz5xCeI96m>_5&V3?Hwb>4;F|@1LGT@dzbW`T z*2wUJQp;vN0sA)85Vc2!v!#u~83TMl=`_Kcfj?f_A~+!W-v-X>rRNLh65t_xyN31L zCh#6`#+Pjt`~`t8f-|pdhv07tdY^k^(V^;NpA%<3LGhL zn!rV(xd@sE+AYFaBXEPjO(NX{>9zJ|;aFkT1_+BagxN|%_!+g;ZWKNs_|w7?hr*dA zoLd9Zx9?1_;$f}%1irqMv9Z4N8Pyt8WfF~L l7YV)y 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 literal 81408 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 Uuip>M>#qam_4|W){XyXW0W`-tCIA2c literal 26497 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 From 4482f71e05dcb338a25ebfd30851b50f48d5bf0a Mon Sep 17 00:00:00 2001 From: wing328 Date: Thu, 3 Dec 2015 16:47:14 +0800 Subject: [PATCH 104/211] add apiresponse.mustache --- .../resources/csharp/ApiResponse.mustache | 44 +++++++++++++++++++ 1 file changed, 44 insertions(+) create mode 100644 modules/swagger-codegen/src/main/resources/csharp/ApiResponse.mustache diff --git a/modules/swagger-codegen/src/main/resources/csharp/ApiResponse.mustache b/modules/swagger-codegen/src/main/resources/csharp/ApiResponse.mustache new file mode 100644 index 00000000000..32816110a1b --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/csharp/ApiResponse.mustache @@ -0,0 +1,44 @@ +using System; +using System.Collections.Generic; + +namespace {{packageName}}.Client +{ + /// + /// API Response + /// + public class ApiResponse + { + /// + /// Gets or sets the status code (HTTP status code) + /// + /// The status code. + public int StatusCode { get; private set; } + + /// + /// Gets or sets the HTTP headers + /// + /// HTTP headers + public IDictionary Headers { get; private set; } + + /// + /// Gets or sets the data (parsed HTTP body) + /// + /// The data. + public T Data { get; private set; } + + /// + /// Initializes a new instance of the class. + /// + /// HTTP status code. + /// Error message. + /// Data (parsed HTTP body) + public ApiResponse(int statusCode, IDictionary headers, T data) + { + this.StatusCode= statusCode; + this.Headers = headers; + this.Data = data; + } + + } + +} From 9d6b1bb2245fe5b33a72eb2254561f273bcf9d1c Mon Sep 17 00:00:00 2001 From: xhh Date: Thu, 3 Dec 2015 17:25:27 +0800 Subject: [PATCH 105/211] Support collectionFormat for array parameters in Clojure client Closes #1655 --- .../src/main/resources/clojure/api.mustache | 10 +++--- .../src/main/resources/clojure/core.mustache | 36 +++++++++++++++---- .../clojure/src/swagger_petstore/api/pet.clj | 6 ++-- .../src/swagger_petstore/api/store.clj | 2 +- .../clojure/src/swagger_petstore/api/user.clj | 2 +- .../clojure/src/swagger_petstore/core.clj | 36 +++++++++++++++---- .../test/swagger_petstore/core_test.clj | 21 ++++++++--- 7 files changed, 85 insertions(+), 28 deletions(-) diff --git a/modules/swagger-codegen/src/main/resources/clojure/api.mustache b/modules/swagger-codegen/src/main/resources/clojure/api.mustache index 2993f118b57..740027e224b 100644 --- a/modules/swagger-codegen/src/main/resources/clojure/api.mustache +++ b/modules/swagger-codegen/src/main/resources/clojure/api.mustache @@ -1,5 +1,5 @@ {{=< >=}}(ns . - (:require [.core :refer [call-api check-required-params]]) + (:require [.core :refer [call-api check-required-params with-collection-format]]) (:import (java.io File))) <#operations><#operation> (defn @@ -9,10 +9,10 @@ <#hasOptionalParams>([<#allParams><#required><#isFile>^File <#hasOptionalParams>{:keys [<#allParams><^required><#isFile>^File ]}]<#hasRequiredParams> <#hasOptionalParams> (check-required-params<#allParams><#required> ) <#hasOptionalParams> (call-api "" : - <#hasOptionalParams> {:path-params {<#pathParams>"" } - <#hasOptionalParams> :header-params {<#headerParams>"" } - <#hasOptionalParams> :query-params {<#queryParams>"" } - <#hasOptionalParams> :form-params {<#formParams>"" }<#bodyParam> + <#hasOptionalParams> {:path-params {<#pathParams>"" <#collectionFormat>(with-collection-format :)<^collectionFormat> } + <#hasOptionalParams> :header-params {<#headerParams>"" <#collectionFormat>(with-collection-format :)<^collectionFormat> } + <#hasOptionalParams> :query-params {<#queryParams>"" <#collectionFormat>(with-collection-format :)<^collectionFormat> } + <#hasOptionalParams> :form-params {<#formParams>"" <#collectionFormat>(with-collection-format :)<^collectionFormat> }<#bodyParam> <#hasOptionalParams> :body-param <#hasOptionalParams> :content-types [<#consumes>""<#hasMore> ] <#hasOptionalParams> :accepts [<#produces>""<#hasMore> ] diff --git a/modules/swagger-codegen/src/main/resources/clojure/core.mustache b/modules/swagger-codegen/src/main/resources/clojure/core.mustache index 7ed6195a671..b05df804a7f 100644 --- a/modules/swagger-codegen/src/main/resources/clojure/core.mustache +++ b/modules/swagger-codegen/src/main/resources/clojure/core.mustache @@ -29,8 +29,8 @@ [api-context & body] `(let [api-context# ~api-context api-context# (-> *api-context* - (merge api-context#) - (assoc :auths (merge (:auths *api-context*) (:auths api-context#))))] + (merge api-context#) + (assoc :auths (merge (:auths *api-context*) (:auths api-context#))))] (binding [*api-context* api-context#] ~@body))) @@ -43,6 +43,11 @@ (throw (IllegalArgumentException. ~(str "The parameter \"" p "\" is required")))))) (list* 'do))) +(defn with-collection-format + "Attach collection-format to meta data of the given parameter." + [param collection-format] + (and param (with-meta param {:collection-format collection-format}))) + (defn- ^SimpleDateFormat make-date-format ([^String format-str] (make-date-format format-str nil)) ([^String format-str ^String time-zone] @@ -119,23 +124,40 @@ [auth-names] (reduce process-auth {} auth-names)) +(declare normalize-param) + (defn make-url "Make full URL by adding base URL and filling path parameters." [path path-params] (let [path (reduce (fn [p [k v]] - (str/replace p (re-pattern (str "\\{" k "\\}")) (param->str v))) + (str/replace p (re-pattern (str "\\{" k "\\}")) (normalize-param v))) path path-params)] (str (:base-url *api-context*) path))) +(defn normalize-array-param + "Normalize array paramater according to :collection-format specified in the parameter's meta data. + When the parameter contains File, a seq is returned so as to keep File parameters. + For :multi collection format, a seq is returned which will be handled properly by clj-http. + For other cases, a string is returned." + [xs] + (if (some (partial instance? File) xs) + (map normalize-param xs) + (case (-> (meta xs) :collection-format (or :csv)) + :csv (str/join "," (map normalize-param xs)) + :ssv (str/join " " (map normalize-param xs)) + :tsv (str/join "\t" (map normalize-param xs)) + :pipes (str/join "|" (map normalize-param xs)) + :multi (map normalize-param xs)))) + (defn normalize-param "Normalize parameter value, handling three cases: - for sequential value, normalize each elements of it; - for File value, do nothing with it; - otherwise, call `param->str`." + for sequential value, apply `normalize-array-param` which handles collection format; + for File value, use current value; + otherwise, apply `param->str`." [param] (cond - (sequential? param) (map normalize-param param) + (sequential? param) (normalize-array-param param) (instance? File param) param :else (param->str param))) diff --git a/samples/client/petstore/clojure/src/swagger_petstore/api/pet.clj b/samples/client/petstore/clojure/src/swagger_petstore/api/pet.clj index ac4b921ba1e..8cf64f607b2 100644 --- a/samples/client/petstore/clojure/src/swagger_petstore/api/pet.clj +++ b/samples/client/petstore/clojure/src/swagger_petstore/api/pet.clj @@ -1,5 +1,5 @@ (ns swagger-petstore.api.pet - (:require [swagger-petstore.core :refer [call-api check-required-params]]) + (:require [swagger-petstore.core :refer [call-api check-required-params with-collection-format]]) (:import (java.io File))) (defn update-pet @@ -40,7 +40,7 @@ (call-api "/pet/findByStatus" :get {:path-params {} :header-params {} - :query-params {"status" status } + :query-params {"status" (with-collection-format status :multi) } :form-params {} :content-types [] :accepts ["application/json" "application/xml"] @@ -54,7 +54,7 @@ (call-api "/pet/findByTags" :get {:path-params {} :header-params {} - :query-params {"tags" tags } + :query-params {"tags" (with-collection-format tags :multi) } :form-params {} :content-types [] :accepts ["application/json" "application/xml"] diff --git a/samples/client/petstore/clojure/src/swagger_petstore/api/store.clj b/samples/client/petstore/clojure/src/swagger_petstore/api/store.clj index 054b3671fa6..d3b0d9f5abe 100644 --- a/samples/client/petstore/clojure/src/swagger_petstore/api/store.clj +++ b/samples/client/petstore/clojure/src/swagger_petstore/api/store.clj @@ -1,5 +1,5 @@ (ns swagger-petstore.api.store - (:require [swagger-petstore.core :refer [call-api check-required-params]]) + (:require [swagger-petstore.core :refer [call-api check-required-params with-collection-format]]) (:import (java.io File))) (defn get-inventory diff --git a/samples/client/petstore/clojure/src/swagger_petstore/api/user.clj b/samples/client/petstore/clojure/src/swagger_petstore/api/user.clj index 2e5c5782e04..64ad38627ed 100644 --- a/samples/client/petstore/clojure/src/swagger_petstore/api/user.clj +++ b/samples/client/petstore/clojure/src/swagger_petstore/api/user.clj @@ -1,5 +1,5 @@ (ns swagger-petstore.api.user - (:require [swagger-petstore.core :refer [call-api check-required-params]]) + (:require [swagger-petstore.core :refer [call-api check-required-params with-collection-format]]) (:import (java.io File))) (defn create-user diff --git a/samples/client/petstore/clojure/src/swagger_petstore/core.clj b/samples/client/petstore/clojure/src/swagger_petstore/core.clj index 50312c3d150..bcb9ed99ad2 100644 --- a/samples/client/petstore/clojure/src/swagger_petstore/core.clj +++ b/samples/client/petstore/clojure/src/swagger_petstore/core.clj @@ -29,8 +29,8 @@ [api-context & body] `(let [api-context# ~api-context api-context# (-> *api-context* - (merge api-context#) - (assoc :auths (merge (:auths *api-context*) (:auths api-context#))))] + (merge api-context#) + (assoc :auths (merge (:auths *api-context*) (:auths api-context#))))] (binding [*api-context* api-context#] ~@body))) @@ -43,6 +43,11 @@ (throw (IllegalArgumentException. ~(str "The parameter \"" p "\" is required")))))) (list* 'do))) +(defn with-collection-format + "Attach collection-format to meta data of the given parameter." + [param collection-format] + (and param (with-meta param {:collection-format collection-format}))) + (defn- ^SimpleDateFormat make-date-format ([^String format-str] (make-date-format format-str nil)) ([^String format-str ^String time-zone] @@ -119,23 +124,40 @@ [auth-names] (reduce process-auth {} auth-names)) +(declare normalize-param) + (defn make-url "Make full URL by adding base URL and filling path parameters." [path path-params] (let [path (reduce (fn [p [k v]] - (str/replace p (re-pattern (str "\\{" k "\\}")) (param->str v))) + (str/replace p (re-pattern (str "\\{" k "\\}")) (normalize-param v))) path path-params)] (str (:base-url *api-context*) path))) +(defn normalize-array-param + "Normalize array paramater according to :collection-format specified in the parameter's meta data. + When the parameter contains File, a seq is returned so as to keep File parameters. + For :multi collection format, a seq is returned which will be handled properly by clj-http. + For other cases, a string is returned." + [xs] + (if (some (partial instance? File) xs) + (map normalize-param xs) + (case (-> (meta xs) :collection-format (or :csv)) + :csv (str/join "," (map normalize-param xs)) + :ssv (str/join " " (map normalize-param xs)) + :tsv (str/join "\t" (map normalize-param xs)) + :pipes (str/join "|" (map normalize-param xs)) + :multi (map normalize-param xs)))) + (defn normalize-param "Normalize parameter value, handling three cases: - for sequential value, normalize each elements of it; - for File value, do nothing with it; - otherwise, call `param->str`." + for sequential value, apply `normalize-array-param` which handles collection format; + for File value, use current value; + otherwise, apply `param->str`." [param] (cond - (sequential? param) (map normalize-param param) + (sequential? param) (normalize-array-param param) (instance? File param) param :else (param->str param))) diff --git a/samples/client/petstore/clojure/test/swagger_petstore/core_test.clj b/samples/client/petstore/clojure/test/swagger_petstore/core_test.clj index b68358a860e..27a9e1db291 100644 --- a/samples/client/petstore/clojure/test/swagger_petstore/core_test.clj +++ b/samples/client/petstore/clojure/test/swagger_petstore/core_test.clj @@ -124,14 +124,27 @@ (let [file (-> "hello.txt" io/resource io/file)] (are [param expected] (is (= expected (normalize-param param))) - [12 "34"] ["12" "34"] file file "abc" "abc" - [[12 "34"] file "abc"] [["12" "34"] file "abc"]))) + [12 "34"] "12,34" + ^{:collection-format :csv} [12 "34"] "12,34" + ^{:collection-format :ssv} [12 "34"] "12 34" + ^{:collection-format :tsv} [12 "34"] "12\t34" + (with-collection-format [12 "34"] :pipes) "12|34" + (with-collection-format [12 "34"] :multi) ["12" "34"] + [[12 "34"] file "abc"] ["12,34" file "abc"]))) (deftest test-normalize-params - (is (= {:a "123" :b ["4" ["5" "6"]]} - (normalize-params {:a 123 :b [4 [5 "6"]] :c nil})))) + (is (= {:a "123" :b "4,5,6"} + (normalize-params {:a 123 :b [4 [5 "6"]] :c nil}))) + (is (= {:a "123" :b ["4" "5,6"]} + (normalize-params {:a 123 + :b ^{:collection-format :multi} [4 [5 "6"]] + :c nil}))) + (is (= {:a "123" :b "4 5|6"} + (normalize-params {:a 123 + :b (with-collection-format [4 (with-collection-format [5 "6"] :pipes)] :ssv) + :c nil})))) (deftest test-json-mime? (are [mime expected] From dd28075a0e18677eaa5efc627f9bab49c0747667 Mon Sep 17 00:00:00 2001 From: wing328 Date: Thu, 3 Dec 2015 17:33:25 +0800 Subject: [PATCH 106/211] add back deprecated method --- .../src/main/resources/csharp/api.mustache | 21 +++++++++++++----- .../src/main/csharp/IO/Swagger/Api/PetApi.cs | 21 +++++++++++++----- .../main/csharp/IO/Swagger/Api/StoreApi.cs | 21 +++++++++++++----- .../src/main/csharp/IO/Swagger/Api/UserApi.cs | 21 +++++++++++++----- .../csharp/SwaggerClientTest/TestApiClient.cs | 1 - .../csharp/SwaggerClientTest/TestPet.cs | 13 +++++++++++ .../bin/Debug/SwaggerClientTest.dll | Bin 79872 -> 80384 bytes .../bin/Debug/SwaggerClientTest.dll.mdb | Bin 25605 -> 25511 bytes .../obj/Debug/SwaggerClientTest.dll | Bin 79872 -> 80384 bytes .../obj/Debug/SwaggerClientTest.dll.mdb | Bin 25605 -> 25511 bytes 10 files changed, 77 insertions(+), 21 deletions(-) diff --git a/modules/swagger-codegen/src/main/resources/csharp/api.mustache b/modules/swagger-codegen/src/main/resources/csharp/api.mustache index 12e754ca6da..b13ffd3cc58 100644 --- a/modules/swagger-codegen/src/main/resources/csharp/api.mustache +++ b/modules/swagger-codegen/src/main/resources/csharp/api.mustache @@ -84,6 +84,16 @@ namespace {{packageName}}.Api { return this.Configuration.ApiClient.RestClient.BaseUrl.ToString(); } + + /// + /// Sets the base path of the API client. + /// + /// The base path + [Obsolete("SetBasePath is deprecated, please do 'Configuraiton.ApiClient = new ApiClient(\"http://new-path\")' instead.")] + public void SetBasePath(String basePath) + { + // do nothing + } /// /// Gets or sets the configuration object @@ -91,14 +101,14 @@ namespace {{packageName}}.Api /// An instance of the Configuration public Configuration Configuration {get; set;} - private readonly Dictionary _defaultHeaderMap = new Dictionary(); - /// /// Gets the default header. /// - public Dictionary DefaultHeader + /// Dictionary of HTTP header + [Obsolete("DefaultHeader is deprecated, please use Configuration.DefaultHeader instead.")] + public Dictionary DefaultHeader() { - get { return _defaultHeaderMap; } + return this.Configuration.DefaultHeader; } /// @@ -107,9 +117,10 @@ namespace {{packageName}}.Api /// Header field name. /// Header field value. /// + [Obsolete("AddDefaultHeader is deprecated, please use Configuration.AddDefaultHeader instead.")] public void AddDefaultHeader(string key, string value) { - _defaultHeaderMap.Add(key, value); + this.Configuration.AddDefaultHeader(key, value); } {{#operation}} diff --git a/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Api/PetApi.cs b/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Api/PetApi.cs index 1fb73aea079..3f9159a9e4e 100644 --- a/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Api/PetApi.cs +++ b/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Api/PetApi.cs @@ -308,6 +308,16 @@ namespace IO.Swagger.Api { return this.Configuration.ApiClient.RestClient.BaseUrl.ToString(); } + + /// + /// Sets the base path of the API client. + /// + /// The base path + [Obsolete("SetBasePath is deprecated, please do 'Configuraiton.ApiClient = new ApiClient(\"http://new-path\")' instead.")] + public void SetBasePath(String basePath) + { + // do nothing + } /// /// Gets or sets the configuration object @@ -315,14 +325,14 @@ namespace IO.Swagger.Api /// An instance of the Configuration public Configuration Configuration {get; set;} - private readonly Dictionary _defaultHeaderMap = new Dictionary(); - /// /// Gets the default header. /// - public Dictionary DefaultHeader + /// Dictionary of HTTP header + [Obsolete("DefaultHeader is deprecated, please use Configuration.DefaultHeader instead.")] + public Dictionary DefaultHeader() { - get { return _defaultHeaderMap; } + return this.Configuration.DefaultHeader; } /// @@ -331,9 +341,10 @@ namespace IO.Swagger.Api /// Header field name. /// Header field value. /// + [Obsolete("AddDefaultHeader is deprecated, please use Configuration.AddDefaultHeader instead.")] public void AddDefaultHeader(string key, string value) { - _defaultHeaderMap.Add(key, value); + this.Configuration.AddDefaultHeader(key, value); } diff --git a/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Api/StoreApi.cs b/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Api/StoreApi.cs index ab979c24565..a31b910c630 100644 --- a/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Api/StoreApi.cs +++ b/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Api/StoreApi.cs @@ -170,6 +170,16 @@ namespace IO.Swagger.Api { return this.Configuration.ApiClient.RestClient.BaseUrl.ToString(); } + + /// + /// Sets the base path of the API client. + /// + /// The base path + [Obsolete("SetBasePath is deprecated, please do 'Configuraiton.ApiClient = new ApiClient(\"http://new-path\")' instead.")] + public void SetBasePath(String basePath) + { + // do nothing + } /// /// Gets or sets the configuration object @@ -177,14 +187,14 @@ namespace IO.Swagger.Api /// An instance of the Configuration public Configuration Configuration {get; set;} - private readonly Dictionary _defaultHeaderMap = new Dictionary(); - /// /// Gets the default header. /// - public Dictionary DefaultHeader + /// Dictionary of HTTP header + [Obsolete("DefaultHeader is deprecated, please use Configuration.DefaultHeader instead.")] + public Dictionary DefaultHeader() { - get { return _defaultHeaderMap; } + return this.Configuration.DefaultHeader; } /// @@ -193,9 +203,10 @@ namespace IO.Swagger.Api /// Header field name. /// Header field value. /// + [Obsolete("AddDefaultHeader is deprecated, please use Configuration.AddDefaultHeader instead.")] public void AddDefaultHeader(string key, string value) { - _defaultHeaderMap.Add(key, value); + this.Configuration.AddDefaultHeader(key, value); } diff --git a/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Api/UserApi.cs b/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Api/UserApi.cs index 06b0fe65be8..818dd135dd4 100644 --- a/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Api/UserApi.cs +++ b/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Api/UserApi.cs @@ -296,6 +296,16 @@ namespace IO.Swagger.Api { return this.Configuration.ApiClient.RestClient.BaseUrl.ToString(); } + + /// + /// Sets the base path of the API client. + /// + /// The base path + [Obsolete("SetBasePath is deprecated, please do 'Configuraiton.ApiClient = new ApiClient(\"http://new-path\")' instead.")] + public void SetBasePath(String basePath) + { + // do nothing + } /// /// Gets or sets the configuration object @@ -303,14 +313,14 @@ namespace IO.Swagger.Api /// An instance of the Configuration public Configuration Configuration {get; set;} - private readonly Dictionary _defaultHeaderMap = new Dictionary(); - /// /// Gets the default header. /// - public Dictionary DefaultHeader + /// Dictionary of HTTP header + [Obsolete("DefaultHeader is deprecated, please use Configuration.DefaultHeader instead.")] + public Dictionary DefaultHeader() { - get { return _defaultHeaderMap; } + return this.Configuration.DefaultHeader; } /// @@ -319,9 +329,10 @@ namespace IO.Swagger.Api /// Header field name. /// Header field value. /// + [Obsolete("AddDefaultHeader is deprecated, please use Configuration.AddDefaultHeader instead.")] public void AddDefaultHeader(string key, string value) { - _defaultHeaderMap.Add(key, value); + this.Configuration.AddDefaultHeader(key, value); } diff --git a/samples/client/petstore/csharp/SwaggerClientTest/TestApiClient.cs b/samples/client/petstore/csharp/SwaggerClientTest/TestApiClient.cs index 42cea3120fe..ff81f6b7c76 100644 --- a/samples/client/petstore/csharp/SwaggerClientTest/TestApiClient.cs +++ b/samples/client/petstore/csharp/SwaggerClientTest/TestApiClient.cs @@ -20,7 +20,6 @@ namespace SwaggerClient.TestApiClient List numList = new List(new int[] {1, 37}); Assert.AreEqual("1,37", api.ParameterToString (numList)); } - } } diff --git a/samples/client/petstore/csharp/SwaggerClientTest/TestPet.cs b/samples/client/petstore/csharp/SwaggerClientTest/TestPet.cs index 98e9f9cefe9..6f7ef6b2812 100644 --- a/samples/client/petstore/csharp/SwaggerClientTest/TestPet.cs +++ b/samples/client/petstore/csharp/SwaggerClientTest/TestPet.cs @@ -242,6 +242,19 @@ namespace SwaggerClient.TestPet Assert.AreEqual (response.Headers["Content-Type"], "application/json"); } + /// + /// Test default header (should be deprecated + /// + [Test ()] + public void TestDefaultHeader () + { + PetApi petApi = new PetApi (); + // there should be a warning for using AddDefaultHeader (deprecated) below + petApi.AddDefaultHeader ("header_key", "header_value"); + // the following should be used instead as suggested in the doc + petApi.Configuration.AddDefaultHeader ("header_key", "header_value"); + + } } } diff --git a/samples/client/petstore/csharp/SwaggerClientTest/bin/Debug/SwaggerClientTest.dll b/samples/client/petstore/csharp/SwaggerClientTest/bin/Debug/SwaggerClientTest.dll index a58a6d610acd13e5bf97ddc3970a1e527197b816..86c933a16356ceb267b0ca9f8ad0194ef360760c 100755 GIT binary patch literal 80384 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 l7YV)y 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 diff --git a/samples/client/petstore/csharp/SwaggerClientTest/bin/Debug/SwaggerClientTest.dll.mdb b/samples/client/petstore/csharp/SwaggerClientTest/bin/Debug/SwaggerClientTest.dll.mdb index 536c4f0ba9eff45273a45d300b0a6ab631ee022e..a86d1c82dccab38bf1e2606143bb46942c495b3a 100644 GIT binary patch literal 25511 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 literal 25605 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 Uuip>M>#qam_4|W){XyXW0W`-tCIA2c diff --git a/samples/client/petstore/csharp/SwaggerClientTest/obj/Debug/SwaggerClientTest.dll b/samples/client/petstore/csharp/SwaggerClientTest/obj/Debug/SwaggerClientTest.dll index a58a6d610acd13e5bf97ddc3970a1e527197b816..86c933a16356ceb267b0ca9f8ad0194ef360760c 100755 GIT binary patch literal 80384 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 l7YV)y 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 diff --git a/samples/client/petstore/csharp/SwaggerClientTest/obj/Debug/SwaggerClientTest.dll.mdb b/samples/client/petstore/csharp/SwaggerClientTest/obj/Debug/SwaggerClientTest.dll.mdb index 536c4f0ba9eff45273a45d300b0a6ab631ee022e..a86d1c82dccab38bf1e2606143bb46942c495b3a 100644 GIT binary patch literal 25511 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 literal 25605 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 Uuip>M>#qam_4|W){XyXW0W`-tCIA2c From 0cd801b9527fb7a8d243daab479840dba4571693 Mon Sep 17 00:00:00 2001 From: wing328 Date: Thu, 3 Dec 2015 22:09:40 +0800 Subject: [PATCH 107/211] add async with http info method to C# client --- .../src/main/resources/csharp/api.mustache | 30 ++- .../src/main/csharp/IO/Swagger/Api/PetApi.cs | 216 +++++++++++++++++- .../main/csharp/IO/Swagger/Api/StoreApi.cs | 104 ++++++++- .../src/main/csharp/IO/Swagger/Api/UserApi.cs | 206 ++++++++++++++++- .../csharp/SwaggerClientTest/TestPet.cs | 34 ++- .../bin/Debug/SwaggerClientTest.dll | Bin 80384 -> 98816 bytes .../bin/Debug/SwaggerClientTest.dll.mdb | Bin 25511 -> 29704 bytes ...ClientTest.csproj.FilesWrittenAbsolute.txt | 6 +- .../obj/Debug/SwaggerClientTest.dll | Bin 80384 -> 98816 bytes .../obj/Debug/SwaggerClientTest.dll.mdb | Bin 25511 -> 29704 bytes 10 files changed, 570 insertions(+), 26 deletions(-) diff --git a/modules/swagger-codegen/src/main/resources/csharp/api.mustache b/modules/swagger-codegen/src/main/resources/csharp/api.mustache index b13ffd3cc58..2d6f58634db 100644 --- a/modules/swagger-codegen/src/main/resources/csharp/api.mustache +++ b/modules/swagger-codegen/src/main/resources/csharp/api.mustache @@ -45,6 +45,16 @@ namespace {{packageName}}.Api {{#allParams}}/// {{description}} {{/allParams}}/// {{#returnType}}{{^returnContainer}}{{{returnType}}}{{/returnContainer}}{{/returnType}} {{#returnType}}System.Threading.Tasks.Task<{{{returnType}}}>{{/returnType}}{{^returnType}}System.Threading.Tasks.Task{{/returnType}} {{operationId}}Async ({{#allParams}}{{{dataType}}} {{paramName}}{{^required}}{{#optionalMethodArgument}} = null{{/optionalMethodArgument}}{{/required}}{{#hasMore}}, {{/hasMore}}{{/allParams}}); + + ///

+ /// {{summary}} + /// + /// + /// {{notes}} + /// + {{#allParams}}/// {{description}} + {{/allParams}}/// {{#returnType}}{{^returnContainer}}{{{returnType}}}{{/returnContainer}}{{/returnType}} + System.Threading.Tasks.Task> {{operationId}}AsyncWithHttpInfo ({{#allParams}}{{{dataType}}} {{paramName}}{{^required}}{{#optionalMethodArgument}} = null{{/optionalMethodArgument}}{{/required}}{{#hasMore}}, {{/hasMore}}{{/allParams}}); {{/operation}} } @@ -227,6 +237,18 @@ namespace {{packageName}}.Api {{#allParams}}/// {{description}} {{/allParams}}/// {{#returnType}}{{^returnContainer}}{{{returnType}}}{{/returnContainer}}{{/returnType}} {{#returnType}}public async System.Threading.Tasks.Task<{{{returnType}}}>{{/returnType}}{{^returnType}}public async System.Threading.Tasks.Task{{/returnType}} {{operationId}}Async ({{#allParams}}{{{dataType}}} {{paramName}}{{^required}}{{#optionalMethodArgument}} = null{{/optionalMethodArgument}}{{/required}}{{#hasMore}}, {{/hasMore}}{{/allParams}}) + { + {{#returnType}}ApiResponse<{{{returnType}}}> response = await {{operationId}}AsyncWithHttpInfo({{#allParams}}{{paramName}}{{#hasMore}}, {{/hasMore}}{{/allParams}}); + return response.Data;{{/returnType}}{{^returnType}}await {{operationId}}AsyncWithHttpInfo({{#allParams}}{{paramName}}{{#hasMore}}, {{/hasMore}}{{/allParams}});{{/returnType}} + + } + + /// + /// {{summary}} {{notes}} + /// + {{#allParams}}/// {{description}} + {{/allParams}}/// {{#returnType}}{{^returnContainer}}{{{returnType}}}{{/returnContainer}}{{/returnType}} + public async System.Threading.Tasks.Task> {{operationId}}AsyncWithHttpInfo ({{#allParams}}{{{dataType}}} {{paramName}}{{^required}}{{#optionalMethodArgument}} = null{{/optionalMethodArgument}}{{/required}}{{#hasMore}}, {{/hasMore}}{{/allParams}}) { {{#allParams}}{{#required}}// verify the required parameter '{{paramName}}' is set if ({{paramName}} == null) throw new ApiException(400, "Missing required parameter '{{paramName}}' when calling {{operationId}}"); @@ -298,8 +320,12 @@ namespace {{packageName}}.Api else if (statusCode == 0) throw new ApiException (statusCode, "Error calling {{operationId}}: " + response.ErrorMessage, response.ErrorMessage); - {{#returnType}}return ({{{returnType}}}) Configuration.ApiClient.Deserialize(response, typeof({{{returnType}}}));{{/returnType}}{{^returnType}} - return;{{/returnType}} + {{#returnType}}return new ApiResponse<{{{returnType}}}>(statusCode, + response.Headers.ToDictionary(x => x.Name, x => x.Value.ToString()), + ({{{returnType}}}) Configuration.ApiClient.Deserialize(response, typeof({{{returnType}}})));{{/returnType}} + {{^returnType}}return new ApiResponse(statusCode, + response.Headers.ToDictionary(x => x.Name, x => x.Value.ToString()), + null);{{/returnType}} } {{/operation}} } diff --git a/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Api/PetApi.cs b/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Api/PetApi.cs index 3f9159a9e4e..12b9c90d878 100644 --- a/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Api/PetApi.cs +++ b/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Api/PetApi.cs @@ -44,6 +44,16 @@ namespace IO.Swagger.Api /// Pet object that needs to be added to the store /// System.Threading.Tasks.Task UpdatePetAsync (Pet body = null); + + /// + /// Update an existing pet + /// + /// + /// + /// + /// Pet object that needs to be added to the store + /// + System.Threading.Tasks.Task> UpdatePetAsyncWithHttpInfo (Pet body = null); /// /// Add a new pet to the store @@ -74,6 +84,16 @@ namespace IO.Swagger.Api /// Pet object that needs to be added to the store /// System.Threading.Tasks.Task AddPetAsync (Pet body = null); + + /// + /// Add a new pet to the store + /// + /// + /// + /// + /// Pet object that needs to be added to the store + /// + System.Threading.Tasks.Task> AddPetAsyncWithHttpInfo (Pet body = null); /// /// Finds Pets by status @@ -104,6 +124,16 @@ namespace IO.Swagger.Api /// Status values that need to be considered for filter /// System.Threading.Tasks.Task> FindPetsByStatusAsync (List status = null); + + /// + /// Finds Pets by status + /// + /// + /// Multiple status values can be provided with comma seperated strings + /// + /// Status values that need to be considered for filter + /// + System.Threading.Tasks.Task>> FindPetsByStatusAsyncWithHttpInfo (List status = null); /// /// Finds Pets by tags @@ -134,6 +164,16 @@ namespace IO.Swagger.Api /// Tags to filter by /// System.Threading.Tasks.Task> FindPetsByTagsAsync (List tags = null); + + /// + /// Finds Pets by tags + /// + /// + /// Muliple tags can be provided with comma seperated strings. Use tag1, tag2, tag3 for testing. + /// + /// Tags to filter by + /// + System.Threading.Tasks.Task>> FindPetsByTagsAsyncWithHttpInfo (List tags = null); /// /// Find pet by ID @@ -164,6 +204,16 @@ namespace IO.Swagger.Api /// ID of pet that needs to be fetched /// Pet System.Threading.Tasks.Task GetPetByIdAsync (long? petId); + + /// + /// Find pet by ID + /// + /// + /// Returns a pet when ID < 10. ID > 10 or nonintegers will simulate API error conditions + /// + /// ID of pet that needs to be fetched + /// Pet + System.Threading.Tasks.Task> GetPetByIdAsyncWithHttpInfo (long? petId); /// /// Updates a pet in the store with form data @@ -200,6 +250,18 @@ namespace IO.Swagger.Api /// Updated status of the pet /// System.Threading.Tasks.Task UpdatePetWithFormAsync (string petId, string name = null, string status = null); + + /// + /// Updates a pet in the store with form data + /// + /// + /// + /// + /// ID of pet that needs to be updated + /// Updated name of the pet + /// Updated status of the pet + /// + System.Threading.Tasks.Task> UpdatePetWithFormAsyncWithHttpInfo (string petId, string name = null, string status = null); /// /// Deletes a pet @@ -233,6 +295,17 @@ namespace IO.Swagger.Api /// /// System.Threading.Tasks.Task DeletePetAsync (long? petId, string apiKey = null); + + /// + /// Deletes a pet + /// + /// + /// + /// + /// Pet id to delete + /// + /// + System.Threading.Tasks.Task> DeletePetAsyncWithHttpInfo (long? petId, string apiKey = null); /// /// uploads an image @@ -269,6 +342,18 @@ namespace IO.Swagger.Api /// file to upload /// System.Threading.Tasks.Task UploadFileAsync (long? petId, string additionalMetadata = null, Stream file = null); + + /// + /// uploads an image + /// + /// + /// + /// + /// ID of pet to update + /// Additional data to pass to server + /// file to upload + /// + System.Threading.Tasks.Task> UploadFileAsyncWithHttpInfo (long? petId, string additionalMetadata = null, Stream file = null); } @@ -426,6 +511,17 @@ namespace IO.Swagger.Api /// Pet object that needs to be added to the store /// public async System.Threading.Tasks.Task UpdatePetAsync (Pet body = null) + { + await UpdatePetAsyncWithHttpInfo(body); + + } + + /// + /// Update an existing pet + /// + /// Pet object that needs to be added to the store + /// + public async System.Threading.Tasks.Task> UpdatePetAsyncWithHttpInfo (Pet body = null) { @@ -477,7 +573,9 @@ namespace IO.Swagger.Api throw new ApiException (statusCode, "Error calling UpdatePet: " + response.ErrorMessage, response.ErrorMessage); - return; + return new ApiResponse(statusCode, + response.Headers.ToDictionary(x => x.Name, x => x.Value.ToString()), + null); } /// @@ -558,6 +656,17 @@ namespace IO.Swagger.Api /// Pet object that needs to be added to the store /// public async System.Threading.Tasks.Task AddPetAsync (Pet body = null) + { + await AddPetAsyncWithHttpInfo(body); + + } + + /// + /// Add a new pet to the store + /// + /// Pet object that needs to be added to the store + /// + public async System.Threading.Tasks.Task> AddPetAsyncWithHttpInfo (Pet body = null) { @@ -609,7 +718,9 @@ namespace IO.Swagger.Api throw new ApiException (statusCode, "Error calling AddPet: " + response.ErrorMessage, response.ErrorMessage); - return; + return new ApiResponse(statusCode, + response.Headers.ToDictionary(x => x.Name, x => x.Value.ToString()), + null); } /// @@ -691,6 +802,18 @@ namespace IO.Swagger.Api /// Status values that need to be considered for filter /// public async System.Threading.Tasks.Task> FindPetsByStatusAsync (List status = null) + { + ApiResponse> response = await FindPetsByStatusAsyncWithHttpInfo(status); + return response.Data; + + } + + /// + /// Finds Pets by status Multiple status values can be provided with comma seperated strings + /// + /// Status values that need to be considered for filter + /// + public async System.Threading.Tasks.Task>> FindPetsByStatusAsyncWithHttpInfo (List status = null) { @@ -741,7 +864,10 @@ namespace IO.Swagger.Api else if (statusCode == 0) throw new ApiException (statusCode, "Error calling FindPetsByStatus: " + response.ErrorMessage, response.ErrorMessage); - return (List) Configuration.ApiClient.Deserialize(response, typeof(List)); + return new ApiResponse>(statusCode, + response.Headers.ToDictionary(x => x.Name, x => x.Value.ToString()), + (List) Configuration.ApiClient.Deserialize(response, typeof(List))); + } /// @@ -823,6 +949,18 @@ namespace IO.Swagger.Api /// Tags to filter by /// public async System.Threading.Tasks.Task> FindPetsByTagsAsync (List tags = null) + { + ApiResponse> response = await FindPetsByTagsAsyncWithHttpInfo(tags); + return response.Data; + + } + + /// + /// Finds Pets by tags Muliple tags can be provided with comma seperated strings. Use tag1, tag2, tag3 for testing. + /// + /// Tags to filter by + /// + public async System.Threading.Tasks.Task>> FindPetsByTagsAsyncWithHttpInfo (List tags = null) { @@ -873,7 +1011,10 @@ namespace IO.Swagger.Api else if (statusCode == 0) throw new ApiException (statusCode, "Error calling FindPetsByTags: " + response.ErrorMessage, response.ErrorMessage); - return (List) Configuration.ApiClient.Deserialize(response, typeof(List)); + return new ApiResponse>(statusCode, + response.Headers.ToDictionary(x => x.Name, x => x.Value.ToString()), + (List) Configuration.ApiClient.Deserialize(response, typeof(List))); + } /// @@ -958,6 +1099,18 @@ namespace IO.Swagger.Api /// ID of pet that needs to be fetched /// Pet public async System.Threading.Tasks.Task GetPetByIdAsync (long? petId) + { + ApiResponse response = await GetPetByIdAsyncWithHttpInfo(petId); + return response.Data; + + } + + /// + /// Find pet by ID Returns a pet when ID < 10. ID > 10 or nonintegers will simulate API error conditions + /// + /// ID of pet that needs to be fetched + /// Pet + public async System.Threading.Tasks.Task> GetPetByIdAsyncWithHttpInfo (long? petId) { // verify the required parameter 'petId' is set if (petId == null) throw new ApiException(400, "Missing required parameter 'petId' when calling GetPetById"); @@ -1010,7 +1163,10 @@ namespace IO.Swagger.Api else if (statusCode == 0) throw new ApiException (statusCode, "Error calling GetPetById: " + response.ErrorMessage, response.ErrorMessage); - return (Pet) Configuration.ApiClient.Deserialize(response, typeof(Pet)); + return new ApiResponse(statusCode, + response.Headers.ToDictionary(x => x.Name, x => x.Value.ToString()), + (Pet) Configuration.ApiClient.Deserialize(response, typeof(Pet))); + } /// @@ -1102,6 +1258,19 @@ namespace IO.Swagger.Api /// Updated status of the pet /// public async System.Threading.Tasks.Task UpdatePetWithFormAsync (string petId, string name = null, string status = null) + { + await UpdatePetWithFormAsyncWithHttpInfo(petId, name, status); + + } + + /// + /// Updates a pet in the store with form data + /// + /// ID of pet that needs to be updated + /// Updated name of the pet + /// Updated status of the pet + /// + public async System.Threading.Tasks.Task> UpdatePetWithFormAsyncWithHttpInfo (string petId, string name = null, string status = null) { // verify the required parameter 'petId' is set if (petId == null) throw new ApiException(400, "Missing required parameter 'petId' when calling UpdatePetWithForm"); @@ -1157,7 +1326,9 @@ namespace IO.Swagger.Api throw new ApiException (statusCode, "Error calling UpdatePetWithForm: " + response.ErrorMessage, response.ErrorMessage); - return; + return new ApiResponse(statusCode, + response.Headers.ToDictionary(x => x.Name, x => x.Value.ToString()), + null); } /// @@ -1245,6 +1416,18 @@ namespace IO.Swagger.Api /// /// public async System.Threading.Tasks.Task DeletePetAsync (long? petId, string apiKey = null) + { + await DeletePetAsyncWithHttpInfo(petId, apiKey); + + } + + /// + /// Deletes a pet + /// + /// Pet id to delete + /// + /// + public async System.Threading.Tasks.Task> DeletePetAsyncWithHttpInfo (long? petId, string apiKey = null) { // verify the required parameter 'petId' is set if (petId == null) throw new ApiException(400, "Missing required parameter 'petId' when calling DeletePet"); @@ -1299,7 +1482,9 @@ namespace IO.Swagger.Api throw new ApiException (statusCode, "Error calling DeletePet: " + response.ErrorMessage, response.ErrorMessage); - return; + return new ApiResponse(statusCode, + response.Headers.ToDictionary(x => x.Name, x => x.Value.ToString()), + null); } /// @@ -1391,6 +1576,19 @@ namespace IO.Swagger.Api /// file to upload /// public async System.Threading.Tasks.Task UploadFileAsync (long? petId, string additionalMetadata = null, Stream file = null) + { + await UploadFileAsyncWithHttpInfo(petId, additionalMetadata, file); + + } + + /// + /// uploads an image + /// + /// ID of pet to update + /// Additional data to pass to server + /// file to upload + /// + public async System.Threading.Tasks.Task> UploadFileAsyncWithHttpInfo (long? petId, string additionalMetadata = null, Stream file = null) { // verify the required parameter 'petId' is set if (petId == null) throw new ApiException(400, "Missing required parameter 'petId' when calling UploadFile"); @@ -1446,7 +1644,9 @@ namespace IO.Swagger.Api throw new ApiException (statusCode, "Error calling UploadFile: " + response.ErrorMessage, response.ErrorMessage); - return; + return new ApiResponse(statusCode, + response.Headers.ToDictionary(x => x.Name, x => x.Value.ToString()), + null); } } diff --git a/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Api/StoreApi.cs b/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Api/StoreApi.cs index a31b910c630..5b0ccf3f966 100644 --- a/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Api/StoreApi.cs +++ b/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Api/StoreApi.cs @@ -41,6 +41,15 @@ namespace IO.Swagger.Api /// /// System.Threading.Tasks.Task> GetInventoryAsync (); + + /// + /// Returns pet inventories by status + /// + /// + /// Returns a map of status codes to quantities + /// + /// + System.Threading.Tasks.Task>> GetInventoryAsyncWithHttpInfo (); /// /// Place an order for a pet @@ -71,6 +80,16 @@ namespace IO.Swagger.Api /// order placed for purchasing the pet /// Order System.Threading.Tasks.Task PlaceOrderAsync (Order body = null); + + /// + /// Place an order for a pet + /// + /// + /// + /// + /// order placed for purchasing the pet + /// Order + System.Threading.Tasks.Task> PlaceOrderAsyncWithHttpInfo (Order body = null); /// /// Find purchase order by ID @@ -101,6 +120,16 @@ namespace IO.Swagger.Api /// ID of pet that needs to be fetched /// Order System.Threading.Tasks.Task GetOrderByIdAsync (string orderId); + + /// + /// Find purchase order by ID + /// + /// + /// For valid response try integer IDs with value <= 5 or > 10. Other values will generated exceptions + /// + /// ID of pet that needs to be fetched + /// Order + System.Threading.Tasks.Task> GetOrderByIdAsyncWithHttpInfo (string orderId); /// /// Delete purchase order by ID @@ -131,6 +160,16 @@ namespace IO.Swagger.Api /// ID of the order that needs to be deleted /// System.Threading.Tasks.Task DeleteOrderAsync (string orderId); + + /// + /// Delete purchase order by ID + /// + /// + /// For valid response try integer IDs with value < 1000. Anything above 1000 or nonintegers will generate API errors + /// + /// ID of the order that needs to be deleted + /// + System.Threading.Tasks.Task> DeleteOrderAsyncWithHttpInfo (string orderId); } @@ -285,6 +324,17 @@ namespace IO.Swagger.Api /// /// public async System.Threading.Tasks.Task> GetInventoryAsync () + { + ApiResponse> response = await GetInventoryAsyncWithHttpInfo(); + return response.Data; + + } + + /// + /// Returns pet inventories by status Returns a map of status codes to quantities + /// + /// + public async System.Threading.Tasks.Task>> GetInventoryAsyncWithHttpInfo () { @@ -334,7 +384,10 @@ namespace IO.Swagger.Api else if (statusCode == 0) throw new ApiException (statusCode, "Error calling GetInventory: " + response.ErrorMessage, response.ErrorMessage); - return (Dictionary) Configuration.ApiClient.Deserialize(response, typeof(Dictionary)); + return new ApiResponse>(statusCode, + response.Headers.ToDictionary(x => x.Name, x => x.Value.ToString()), + (Dictionary) Configuration.ApiClient.Deserialize(response, typeof(Dictionary))); + } /// @@ -408,6 +461,18 @@ namespace IO.Swagger.Api /// order placed for purchasing the pet /// Order public async System.Threading.Tasks.Task PlaceOrderAsync (Order body = null) + { + ApiResponse response = await PlaceOrderAsyncWithHttpInfo(body); + return response.Data; + + } + + /// + /// Place an order for a pet + /// + /// order placed for purchasing the pet + /// Order + public async System.Threading.Tasks.Task> PlaceOrderAsyncWithHttpInfo (Order body = null) { @@ -450,7 +515,10 @@ namespace IO.Swagger.Api else if (statusCode == 0) throw new ApiException (statusCode, "Error calling PlaceOrder: " + response.ErrorMessage, response.ErrorMessage); - return (Order) Configuration.ApiClient.Deserialize(response, typeof(Order)); + return new ApiResponse(statusCode, + response.Headers.ToDictionary(x => x.Name, x => x.Value.ToString()), + (Order) Configuration.ApiClient.Deserialize(response, typeof(Order))); + } /// @@ -527,6 +595,18 @@ namespace IO.Swagger.Api /// ID of pet that needs to be fetched /// Order public async System.Threading.Tasks.Task GetOrderByIdAsync (string orderId) + { + ApiResponse response = await GetOrderByIdAsyncWithHttpInfo(orderId); + return response.Data; + + } + + /// + /// Find purchase order by ID For valid response try integer IDs with value <= 5 or > 10. Other values will generated exceptions + /// + /// ID of pet that needs to be fetched + /// Order + public async System.Threading.Tasks.Task> GetOrderByIdAsyncWithHttpInfo (string orderId) { // verify the required parameter 'orderId' is set if (orderId == null) throw new ApiException(400, "Missing required parameter 'orderId' when calling GetOrderById"); @@ -571,7 +651,10 @@ namespace IO.Swagger.Api else if (statusCode == 0) throw new ApiException (statusCode, "Error calling GetOrderById: " + response.ErrorMessage, response.ErrorMessage); - return (Order) Configuration.ApiClient.Deserialize(response, typeof(Order)); + return new ApiResponse(statusCode, + response.Headers.ToDictionary(x => x.Name, x => x.Value.ToString()), + (Order) Configuration.ApiClient.Deserialize(response, typeof(Order))); + } /// @@ -647,6 +730,17 @@ namespace IO.Swagger.Api /// ID of the order that needs to be deleted /// public async System.Threading.Tasks.Task DeleteOrderAsync (string orderId) + { + await DeleteOrderAsyncWithHttpInfo(orderId); + + } + + /// + /// Delete purchase order by ID For valid response try integer IDs with value < 1000. Anything above 1000 or nonintegers will generate API errors + /// + /// ID of the order that needs to be deleted + /// + public async System.Threading.Tasks.Task> DeleteOrderAsyncWithHttpInfo (string orderId) { // verify the required parameter 'orderId' is set if (orderId == null) throw new ApiException(400, "Missing required parameter 'orderId' when calling DeleteOrder"); @@ -692,7 +786,9 @@ namespace IO.Swagger.Api throw new ApiException (statusCode, "Error calling DeleteOrder: " + response.ErrorMessage, response.ErrorMessage); - return; + return new ApiResponse(statusCode, + response.Headers.ToDictionary(x => x.Name, x => x.Value.ToString()), + null); } } diff --git a/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Api/UserApi.cs b/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Api/UserApi.cs index 818dd135dd4..5c19fdb7e37 100644 --- a/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Api/UserApi.cs +++ b/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Api/UserApi.cs @@ -44,6 +44,16 @@ namespace IO.Swagger.Api /// Created user object /// System.Threading.Tasks.Task CreateUserAsync (User body = null); + + /// + /// Create user + /// + /// + /// This can only be done by the logged in user. + /// + /// Created user object + /// + System.Threading.Tasks.Task> CreateUserAsyncWithHttpInfo (User body = null); /// /// Creates list of users with given input array @@ -74,6 +84,16 @@ namespace IO.Swagger.Api /// List of user object /// System.Threading.Tasks.Task CreateUsersWithArrayInputAsync (List body = null); + + /// + /// Creates list of users with given input array + /// + /// + /// + /// + /// List of user object + /// + System.Threading.Tasks.Task> CreateUsersWithArrayInputAsyncWithHttpInfo (List body = null); /// /// Creates list of users with given input array @@ -104,6 +124,16 @@ namespace IO.Swagger.Api /// List of user object /// System.Threading.Tasks.Task CreateUsersWithListInputAsync (List body = null); + + /// + /// Creates list of users with given input array + /// + /// + /// + /// + /// List of user object + /// + System.Threading.Tasks.Task> CreateUsersWithListInputAsyncWithHttpInfo (List body = null); /// /// Logs user into the system @@ -137,6 +167,17 @@ namespace IO.Swagger.Api /// The password for login in clear text /// string System.Threading.Tasks.Task LoginUserAsync (string username = null, string password = null); + + /// + /// Logs user into the system + /// + /// + /// + /// + /// The user name for login + /// The password for login in clear text + /// string + System.Threading.Tasks.Task> LoginUserAsyncWithHttpInfo (string username = null, string password = null); /// /// Logs out current logged in user session @@ -164,6 +205,15 @@ namespace IO.Swagger.Api /// /// System.Threading.Tasks.Task LogoutUserAsync (); + + /// + /// Logs out current logged in user session + /// + /// + /// + /// + /// + System.Threading.Tasks.Task> LogoutUserAsyncWithHttpInfo (); /// /// Get user by user name @@ -194,6 +244,16 @@ namespace IO.Swagger.Api /// The name that needs to be fetched. Use user1 for testing. /// User System.Threading.Tasks.Task GetUserByNameAsync (string username); + + /// + /// Get user by user name + /// + /// + /// + /// + /// The name that needs to be fetched. Use user1 for testing. + /// User + System.Threading.Tasks.Task> GetUserByNameAsyncWithHttpInfo (string username); /// /// Updated user @@ -227,6 +287,17 @@ namespace IO.Swagger.Api /// Updated user object /// System.Threading.Tasks.Task UpdateUserAsync (string username, User body = null); + + /// + /// Updated user + /// + /// + /// This can only be done by the logged in user. + /// + /// name that need to be deleted + /// Updated user object + /// + System.Threading.Tasks.Task> UpdateUserAsyncWithHttpInfo (string username, User body = null); /// /// Delete user @@ -257,6 +328,16 @@ namespace IO.Swagger.Api /// The name that needs to be deleted /// System.Threading.Tasks.Task DeleteUserAsync (string username); + + /// + /// Delete user + /// + /// + /// This can only be done by the logged in user. + /// + /// The name that needs to be deleted + /// + System.Threading.Tasks.Task> DeleteUserAsyncWithHttpInfo (string username); } @@ -406,6 +487,17 @@ namespace IO.Swagger.Api /// Created user object /// public async System.Threading.Tasks.Task CreateUserAsync (User body = null) + { + await CreateUserAsyncWithHttpInfo(body); + + } + + /// + /// Create user This can only be done by the logged in user. + /// + /// Created user object + /// + public async System.Threading.Tasks.Task> CreateUserAsyncWithHttpInfo (User body = null) { @@ -449,7 +541,9 @@ namespace IO.Swagger.Api throw new ApiException (statusCode, "Error calling CreateUser: " + response.ErrorMessage, response.ErrorMessage); - return; + return new ApiResponse(statusCode, + response.Headers.ToDictionary(x => x.Name, x => x.Value.ToString()), + null); } /// @@ -522,6 +616,17 @@ namespace IO.Swagger.Api /// List of user object /// public async System.Threading.Tasks.Task CreateUsersWithArrayInputAsync (List body = null) + { + await CreateUsersWithArrayInputAsyncWithHttpInfo(body); + + } + + /// + /// Creates list of users with given input array + /// + /// List of user object + /// + public async System.Threading.Tasks.Task> CreateUsersWithArrayInputAsyncWithHttpInfo (List body = null) { @@ -565,7 +670,9 @@ namespace IO.Swagger.Api throw new ApiException (statusCode, "Error calling CreateUsersWithArrayInput: " + response.ErrorMessage, response.ErrorMessage); - return; + return new ApiResponse(statusCode, + response.Headers.ToDictionary(x => x.Name, x => x.Value.ToString()), + null); } /// @@ -638,6 +745,17 @@ namespace IO.Swagger.Api /// List of user object /// public async System.Threading.Tasks.Task CreateUsersWithListInputAsync (List body = null) + { + await CreateUsersWithListInputAsyncWithHttpInfo(body); + + } + + /// + /// Creates list of users with given input array + /// + /// List of user object + /// + public async System.Threading.Tasks.Task> CreateUsersWithListInputAsyncWithHttpInfo (List body = null) { @@ -681,7 +799,9 @@ namespace IO.Swagger.Api throw new ApiException (statusCode, "Error calling CreateUsersWithListInput: " + response.ErrorMessage, response.ErrorMessage); - return; + return new ApiResponse(statusCode, + response.Headers.ToDictionary(x => x.Name, x => x.Value.ToString()), + null); } /// @@ -759,6 +879,19 @@ namespace IO.Swagger.Api /// The password for login in clear text /// string public async System.Threading.Tasks.Task LoginUserAsync (string username = null, string password = null) + { + ApiResponse response = await LoginUserAsyncWithHttpInfo(username, password); + return response.Data; + + } + + /// + /// Logs user into the system + /// + /// The user name for login + /// The password for login in clear text + /// string + public async System.Threading.Tasks.Task> LoginUserAsyncWithHttpInfo (string username = null, string password = null) { @@ -802,7 +935,10 @@ namespace IO.Swagger.Api else if (statusCode == 0) throw new ApiException (statusCode, "Error calling LoginUser: " + response.ErrorMessage, response.ErrorMessage); - return (string) Configuration.ApiClient.Deserialize(response, typeof(string)); + return new ApiResponse(statusCode, + response.Headers.ToDictionary(x => x.Name, x => x.Value.ToString()), + (string) Configuration.ApiClient.Deserialize(response, typeof(string))); + } /// @@ -871,6 +1007,16 @@ namespace IO.Swagger.Api /// /// public async System.Threading.Tasks.Task LogoutUserAsync () + { + await LogoutUserAsyncWithHttpInfo(); + + } + + /// + /// Logs out current logged in user session + /// + /// + public async System.Threading.Tasks.Task> LogoutUserAsyncWithHttpInfo () { @@ -913,7 +1059,9 @@ namespace IO.Swagger.Api throw new ApiException (statusCode, "Error calling LogoutUser: " + response.ErrorMessage, response.ErrorMessage); - return; + return new ApiResponse(statusCode, + response.Headers.ToDictionary(x => x.Name, x => x.Value.ToString()), + null); } /// @@ -990,6 +1138,18 @@ namespace IO.Swagger.Api /// The name that needs to be fetched. Use user1 for testing. /// User public async System.Threading.Tasks.Task GetUserByNameAsync (string username) + { + ApiResponse response = await GetUserByNameAsyncWithHttpInfo(username); + return response.Data; + + } + + /// + /// Get user by user name + /// + /// The name that needs to be fetched. Use user1 for testing. + /// User + public async System.Threading.Tasks.Task> GetUserByNameAsyncWithHttpInfo (string username) { // verify the required parameter 'username' is set if (username == null) throw new ApiException(400, "Missing required parameter 'username' when calling GetUserByName"); @@ -1034,7 +1194,10 @@ namespace IO.Swagger.Api else if (statusCode == 0) throw new ApiException (statusCode, "Error calling GetUserByName: " + response.ErrorMessage, response.ErrorMessage); - return (User) Configuration.ApiClient.Deserialize(response, typeof(User)); + return new ApiResponse(statusCode, + response.Headers.ToDictionary(x => x.Name, x => x.Value.ToString()), + (User) Configuration.ApiClient.Deserialize(response, typeof(User))); + } /// @@ -1114,6 +1277,18 @@ namespace IO.Swagger.Api /// Updated user object /// public async System.Threading.Tasks.Task UpdateUserAsync (string username, User body = null) + { + await UpdateUserAsyncWithHttpInfo(username, body); + + } + + /// + /// Updated user This can only be done by the logged in user. + /// + /// name that need to be deleted + /// Updated user object + /// + public async System.Threading.Tasks.Task> UpdateUserAsyncWithHttpInfo (string username, User body = null) { // verify the required parameter 'username' is set if (username == null) throw new ApiException(400, "Missing required parameter 'username' when calling UpdateUser"); @@ -1160,7 +1335,9 @@ namespace IO.Swagger.Api throw new ApiException (statusCode, "Error calling UpdateUser: " + response.ErrorMessage, response.ErrorMessage); - return; + return new ApiResponse(statusCode, + response.Headers.ToDictionary(x => x.Name, x => x.Value.ToString()), + null); } /// @@ -1236,6 +1413,17 @@ namespace IO.Swagger.Api /// The name that needs to be deleted /// public async System.Threading.Tasks.Task DeleteUserAsync (string username) + { + await DeleteUserAsyncWithHttpInfo(username); + + } + + /// + /// Delete user This can only be done by the logged in user. + /// + /// The name that needs to be deleted + /// + public async System.Threading.Tasks.Task> DeleteUserAsyncWithHttpInfo (string username) { // verify the required parameter 'username' is set if (username == null) throw new ApiException(400, "Missing required parameter 'username' when calling DeleteUser"); @@ -1281,7 +1469,9 @@ namespace IO.Swagger.Api throw new ApiException (statusCode, "Error calling DeleteUser: " + response.ErrorMessage, response.ErrorMessage); - return; + return new ApiResponse(statusCode, + response.Headers.ToDictionary(x => x.Name, x => x.Value.ToString()), + null); } } diff --git a/samples/client/petstore/csharp/SwaggerClientTest/TestPet.cs b/samples/client/petstore/csharp/SwaggerClientTest/TestPet.cs index 6f7ef6b2812..55d081f9bb1 100644 --- a/samples/client/petstore/csharp/SwaggerClientTest/TestPet.cs +++ b/samples/client/petstore/csharp/SwaggerClientTest/TestPet.cs @@ -76,6 +76,38 @@ namespace SwaggerClient.TestPet } + /// + /// Test GetPetByIdAsyncWithHttpInfo + /// + [Test ()] + public void TestGetPetByIdAsyncWithHttpInfo () + { + PetApi petApi = new PetApi (); + var task = petApi.GetPetByIdAsyncWithHttpInfo (petId); + + Assert.AreEqual (200, task.Result.StatusCode); + Assert.IsTrue (task.Result.Headers.ContainsKey("Content-Type")); + Assert.AreEqual (task.Result.Headers["Content-Type"], "application/json"); + + Pet response = task.Result.Data; + Assert.IsInstanceOf (response, "Response is a Pet"); + + Assert.AreEqual ("Csharp test", response.Name); + Assert.AreEqual ("available", response.Status); + + Assert.IsInstanceOf> (response.Tags, "Response.Tags is a Array"); + Assert.AreEqual (petId, response.Tags [0].Id); + Assert.AreEqual ("sample tag name1", response.Tags [0].Name); + + Assert.IsInstanceOf> (response.PhotoUrls, "Response.PhotoUrls is a Array"); + Assert.AreEqual ("sample photoUrls", response.PhotoUrls [0]); + + Assert.IsInstanceOf (response.Category, "Response.Category is a Category"); + Assert.AreEqual (56, response.Category.Id); + Assert.AreEqual ("sample category name2", response.Category.Name); + + } + /// /// Test GetPetById /// @@ -252,7 +284,7 @@ namespace SwaggerClient.TestPet // there should be a warning for using AddDefaultHeader (deprecated) below petApi.AddDefaultHeader ("header_key", "header_value"); // the following should be used instead as suggested in the doc - petApi.Configuration.AddDefaultHeader ("header_key", "header_value"); + petApi.Configuration.AddDefaultHeader ("header_key2", "header_value2"); } } diff --git a/samples/client/petstore/csharp/SwaggerClientTest/bin/Debug/SwaggerClientTest.dll b/samples/client/petstore/csharp/SwaggerClientTest/bin/Debug/SwaggerClientTest.dll index 86c933a16356ceb267b0ca9f8ad0194ef360760c..eb5aee17989464d74610896186219a19d741f7c1 100755 GIT binary patch literal 98816 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 literal 80384 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 literal 25511 zcmdU22Urx>+WyYW0z0g$?gE0VB4S4n*u}&pG-@nZDJ#7MuzQVSG_m*Cu*Mpr ziM=FhtWgttH)>*yCMMBXQq})GGrI$esLB2R|2|wd@4WAxb7syr-+ZUcVP@mG?Cr-@ zYusvXCgoqb(f5X2`r~f1ojL5UA)>L}@_3>wWS#9uR0bT3?*qYHZ;n%R7$a)Y3FS&7 z(f*I`$NxRWKP_02zY*oL;5Tz@**U=jlGDc;2vS(XubG$F6ern^z6Mr1FaZG4la z99xyDogGpAX6oG0muY@UG`}NvNAV}n@6#1GUtKX=xLxjY#@jBdV`*MVJOLgN#oHg0 z+k4N$pNE~Ocq{ye#fMrPqQxc6ekJaB7%8flDB6E<$KEzQZoJ`faLUT_!4Egn(vo`; z%?HNYvT~C%Gm1Hn7EAAb(fpw2)sQ>G{D;NA-G`Qy(DR7S%;=k(*e^TwIVaM<)^bVe zknnY;$Un4MpIul)3rpIGv_;>S791U$YfH?`9#qV=sOWLzPGI}N<0?*R`{wy0D-V~v zhOL}JyX*v8b}{xpYCHMK$44tnI$M2XHBZfhTQs+1UIGja#aQolGIhnI!2CrczZtu{ zMX&Vyl4^aY*u-M2fBeUX)rBv&)lFaBaQ4Xay)7kgP*!4x4-3VZzu;d_D#mPYePmz5 z#ox}JnX-)1{{N>Gd|pv}C zoh(LYls-oN|1&ndtlv#ePi|c5@#P0QcMC4x{4sDQEh%Y@zF;)(V9UwM%*e476M&b8 z4@g{7u}SGcKlP3YZ9}gU=Dz}wNTeZhA#x>hBf_i~lU{cs9Z@MFJrSnIeARsL^FwP@}|w+TkHk43(S+}N$jjQo%23#Pu?dmqz18{yy<7}yH1H_HqwXQ z@fqc#)Nq*B;5dFwiOuq%**2nHMI&#U1%}we}%$;-l*zDN!93;Qh&z3#N{!J{EWQ)a^VgIUe@0*#OZvW!q-ZweT zX8+=<&C1Nljmk_IL~b5Qxw%=rl^uJ>#`7sm4rz_grjn%1wqICschAX<&Fz=NZ$4lu zzf&o*on2-m{vg-Hd~{ks~9`uY0m_4?XP^@hM^zIq?MPl&!|z4CfPig$8YcvPHObQfHn8@v%bc&*#SC%hd9?kwZ^VO+)9G3c2< zj_(JT#}DQ%uT&4Ayuz3ER6bH!b^0|wy6$(w?-{4xbt&rf`+oG)Z+Mme9;g55@*i+| z~Asu!w0|+iR|p5;>2X@-75*Gg^G>FIc&j+Gg>OXd3%Z-aW95ro zUH|m}eUhqJe=~V60wH2RFk(h_S>ho*0>3Z!O z$SV0hpCxRC&-0}hM|VBBcbEPz++C&dn{}V@wDTn8No|^4XGtB^)7t}SN8rvt#nTJj z3rF|iKspk56j>$T)4PPL@bpLSFZQ$}y3wQjpG0?1hm?l;$~?r2P7Dk6Dd?pq_gtmrkvuCVvb(B9ILMK8_7D{%M zzZF8aL%z3XY{ZmWIsS-H$_pJCs#MF99pz_*((KSV_Kdw+NBOm(v@Udgp=3w-1EF*< z^pHK{l;kLXC6um)UMrOBDF0h1{T}*!PEqx=*zO*Kz5EB5eYNBI?IT50}J$X(OWvoh>GFJ4aP8egMv6gWb*#=a#p4o5fgpVw= z+OkH?_>{>vcEUaj?YDeUB-t!nw9qBXWi@#Zuc_eXPPlKO2bPCw_EDZ)aC;|A4Wnsc z)5D5RBw){ZUeYmXZi1*PL&vi=Ukp>sZ`gD>v1J`p)v9aOt@Qbid()hN??{ZbWw*-D^~g zOApKU*o9sCv=NO9A0J-wU3w1p*DsowDbee+U{Snp{c9CJ^YxGD6l8aBp_r8&yegdb zTfeZX4n7t^$0JTeIQp#p@{KiunXd;4-$u}th^xpf=|Or7H`D*nqlKrnf5VTxve5Q> z^;4#>!s7^<^~&s5R4=~Ygl0CG)x_b&8G?OS5|%ZgnJ z-0PI#*yrm=x)^!Mo+XNto?QhMA4Sryk-w=$<`lOMD$Z_7bDGX=s+c8;%lT5I^Gc|= zqbcod`ng(Utz#`zywa4eHoc~1Y*ki6#Xp+TpH2TNl57^IMA6i!X;F@vcJZ1D22F8A z6s?Ty0rRuoht!PB6yjIUl2t;usmM8rk)7v1-vBb%(D8JP_lr8Cg-1VYm zNlU?!!QYq?6x*7sHt7ZRlp3@7g$`^CPT58Xapg z;=?xdsLij)Ea_g|h?U0TmKlqgUcIzkKQmi}*QU0m)vvF4UG>`Bc9h?4Ub|vKGan0y z>Ypp>@X%bCuTIKuLMZK0(?aeN1w&|zYSlJC()FIkp-ap(C$Hx_qW1wXFr zKzlpx>!|v1ZztNVc&Zbf?sNv3B|S3dVX5_hG3S4wBa3V9_d3z| z&J#MTUL4zn#&sFr#o@(?j`_Pdrwh&PlJAsZpI3|PyU>O%8`Z2l$6Q=I(uIz8Ip&n% z*yp=0bgRp4HS3YOPhM9V+4Y^S4g+|GW1qQQDZlGHHS0&mvY@!BD{bz&#VNzF&(W@Q ztm|<#>s!atp!j`P`l0I`rwqqFBfHT%-9~kDm~h&$JSfiZMhm(vbjon-v$-2>>9$qP zI__8^6i;-clif}^WjOZvp&Q-l_M@8hm1CJu934aN#=IBfFo0(`_E``^3u6}9voxX) z7WItX%@HR1vmB+o4d`g}l4e^BeH!zbS}uUE&DGLejiGBX*PT;?G{42r?=gQM)s@_` zZFm|YCzlu=mB8Z>OjKBOQP{;zVK+%($z6~iT#!03=3P(GofcpY9Y35Y-xjd%8FN|9 zzO;Y;o^2AC+wW|qpyY27mWWK+CyWwFqY*>VXd4?%aVD#ORCvqXuNX}!T$;HwrkJAb z5~)to93_8HtZ{UQh}Qg0UtdA*@9*Vr2y9T^-(Qin!&Dg>p~^x9Y6dlG(zauKGS4%V zhZiSyr(NC0_aH$iDP06+LN3&z(KxD~NQ>m7a99 z=QZU!_Q~UmmdcYeo|5KXPx__jeKm6eGUH8gW^;lmMk!;kWVEeeu+)G-y=YRe$-PJr z1%2PN*xX!OM#tQ2Jh{$9DaXby86L)F8s*{$8s({ykY!9@ji+KQuYC#=yCrk0u^j9X zKR7<#1J9X+!e3IxUXT2Vq zZqsO8b8@q7vFU=uY+9{iaUF}oul)$4+g(IF&1Bfhp_V7$u3T1og%fslLipCMz7-w{ z{QNd3%feQpHLklybHM6h?%qAx9PMxBe}oOl%S-jQ_$PQ6quUx|x_d-Th>HW65>eckB>{UJ@s#AI2@_q(`uR&j~g5FR?ZwRTU zH~8oc)%1Epu(zby)te^wIo$^nC&p}o-8^PeOg9B_Bky1>-6Lwchex=*LW9}9^YvJ| z9s5VD(gSG3r#PF|&BD#y6TJN^psyfl7RAxxxDVnS1+k`qgUMxDw5cj-4#m-z zabKy~c<{?Z=%K&D8pasB%CwPh0%(sP)g!SzTGM8(un?HDsgF~P^5 zn~W#JJmRgM7LNdnJzf|K?{5@;mt)6>Fce&QUnA*jAa1;T42Bwp3RNV{=y=MHUmZ_~ zNg)SSx+G^L*anj5nuZrJ5Fi>Ur(c{B%A&nuHxI>tsv!zDAHogThUEZU%f`l$9!8rn z%39IlVN9|5H}f}J{iE$>FlK@s_;ZQkEIs-}Z@ryW z%gVm=Vc%8GsbMZV`_kuqciB^2#Xx2h>u@LZF^U`ItK-i90yI7vhcLA)8&)Y)cPV;l+?JnFcPPo@dU6O&*PRy!5Wil4*JJC)k&fYql*bGdou?1AnRWux?vrwP@>@&E|2bX?ANu^xody z*67v|Ij8!${gpzGQ=X`)zPzlj+tgH=mO4FEsmx83 zQ>(hINTrpjA0m|zZ_BXJO{|I23b%%b$HZV`j)@4juUVASm(`c8RV7egHlS(pX^GEVw40=-ylPRE*sg}uP3al)-ZA_z0X`8Vl{<@YFo0EhNSsp*wo80m^ z=H*e{IM+P5875NZX3dmi7))M4A$(&tNNzu+(WA7dO3ldDewtKFGS zpQrC~PW98CPNy^JXVp~2vDzQf=}!8O&Z$+kBQhv2V`PToxYhYZ@YBxBpjjESol~o8 zS7*?gjE~jSKwh@Gc25TF&DiIh8lXL&K^HQQ8FV+}o^xt-?Wjx|o%wF2 z!v-raTSYrJlkzj?Ij7dpuFa%%nd_0N27*>>RyYvkXeij2d2qxO7aVn}ne}Ds)@*3s z1Xd5TD+G-8i%dG4c|@(eOQC?#uF0a0vp&gkm>XLtV6=y_=*z6H)V#F90h6bVUxm1F zkkC}ezbav5Pc0HnwN0iVKU1K|6jIf`4M2R=t)hI9v^TTpyR2KNt!R`@!GuJM2~0tp z%{AvWGk&0Mc-YBb+rZbnPjr71ZyHD_9m`bx`lXhqIS z=hUjw_8i)gvr|o#iE?TU zX+|!+pF2}cmE+M*T9r#5<*s&4tuF1#rQNxEkgCR`kJ8y(x|Dlat-NqNN;~?|&VHZwbDTusc$6;mqp$m2RP&tTF`V~bj`*{GDU?(s z7L_Pe`ZrUM$<(kK@9Zpd5yl;hCML$Cqg z$STYrNmu&Q?f&=s%V&&WbpL7q9UgFGfZ_pndoa3R96*-_Ty{?NbN^)k-5>BkO;tKa z_xA?Un1N#lI*y=>I_~oa(t?2tk*Z!?_kS?zxNjIp+XjBB9<=bN<9>f2Js9{<%_}_W zxKA2HlLt*1zF2GK`@R%6GamjI)VyZG`^$Nl;sx-;mZQZpQ@TRNDQ4PHK2 zu|#KgtZw6A+BA5xbE=>2%fa;3;KORF>_UItmBDm%@HOYunz~;H({F=+S5xIyUR5_? z2u&O^X^5jXIklGVgCVqJ$Wk>`Zsq>EtwU(rkWZacYwC^;p<_ditEqB(uB^K;gl-P` z&N;Q3?$06g*O13*YB=u^{B=`?($t~ThB|DJQ)}v$52Y1DSE{K^dD+Uk?L%qD(4Eey z)pRF^(y5`R)zp^Cac>W$?}z^2oLW=&bSMq~*NA@=3NW46q3~$-OvfQlbsU>w$2GYh zk-HFC6%2E-3aK3-Pl~D}V2tM1z@R1Ikiz&1kALIBpjDhw+u+X=0kq&qN-4h}m6TZ+c} zWQ>10ac!aTubAFOo_i@9J~|d13FXd5?ssHWFfhuhp+VA}dYdl3ee-R_O{K&#{7So* zIys!tsp0H22&-Exiqozmd-`Mk&z< zr>0oKE#YC-4xqsi^0%01e~Zats)q%IFw`WL(zx=Ek4BGArP3NLK3+JChp zKY}e70ZVXCP`HL5=4rG}<#$%1QuYxF4bNjE@=zA{=Jv7-*5zPo?6m$=N^FSR5o-z- zI>N)k@!+#L%ot-y!4%wrdAR%q%+p%&B&67@DW~z#=rln(O&xh#J)o{mV{Ty8X+ppe zI!&NX@ub>;R~+Qwod_B*(i| z{MRIK<goA!4L+9YH3Rd7oKwYTLWFmd&nsH~M%>(7|E3lqXS^V6HnYp@QEFj@K1sMRAJ zm)9cxCEx0cY~hQ_tUQ2{2oXQHWW8bG;~wzd0;Az+BIsAUjpBapRxzn$r0AmeEM~lvC1P zkfo`l)0Ed~%7yx2qr;w+bfq*VdxAHvP~N+YF1^bxg9=~cf>4vg3#)fZ%j2O1Lt|nb zP1vOI)oCgsWPGdh)-#6D<}qvwsA$XoT@I4CFk_x0Mi3$8#Zq@s_Kz{_PreJn30G48 z!B|F1#fDY~6Pbca( z;XtRxveW!{N)@F?k7M-iIQAY0hBE#WDw@)wo}VRRD{QP~tR*}~F|?fAwdpk;8u+X9 zZ0s?A99v-Dk^f)|b~M2RD?AfZ4~Jp38`^Lnjz4NVquJxx9FX8v z==efBVwzW=5n_2b$0MADtT3g%hP)#-=G8NEv$@@J<>=#0{F9=bgj`2ijZcU*8Wk&5 z!VR(zOW#0+VKpW7OF0@l(f|>yK>^ zH5PBCy0dWpX6iN!H06XPtW;EwamcmuB8|2D?6KmmCo}qFGFuBOYUL+*xc5J1rTUtu#CF4$J(JlH*(Alv(^D9onZnM3R4exg zKXG4fba}p&VR7)6{4~dNy%`aHK|Ah6{w(r_B=@NLexzSRyv_leZckwkWYZLDM^3|) zpT$y0laq*#Q89Q~I;@+s3?%~}%ralv^1>VJrVb2Lz=eO{<#RboNn+aJ z7GIme==uzH1EgAfNPNgGKBnas$353#9uW2U#v+FXfAQzJq2Xv~FEhQEx7zqwsPD8% z>=7*ebq33OpBt>4!}6JoR?K88LFzdy6OZ$A_(poU*XzmV^Vh`wx8@glON?8tz9S~F zZLsgtnQXsoregV(S&XjEV%I>bZ(TXXki;Iq(ucFy z@Yx04Upj};vN>!yNIi%7!baR(30iT1fU|f`?<{vFFOT-;gu42=2)9su@IJVOBy52t zTj#L7vO%(+g@bb$9h%F&1j&OJESvMk)ojWJ;xqA4&>ykieZv)5%pb~%P!li zMb{{t%*XsDpPdFdESbW`hL^N6*;mgs36Io2$13^d1Sb!1yKbWP@ABC#yAj;3ALcQ- zGmrfUa@aM7j|TsSU5>W?H>^@0^p}JusQKwUHhjKf0JrHW^za32!~(lbq8450^WzDl zebKAtFy%SkDSFNDm?7$#wt!8yR|zY`Q41N3UdY}B$)14~<6k_Q|9e&xJj5)CvryUW zg=~(!PHx8dMT{maViQ3QGlsulxc;}DQSeBxBrZT@3m36P_By#4(-t$DzL?DbIn4O| z1!l;z24#HU9qe->_&FD-;8|K8!)jkzsh%V*g9XbMvlVtjxNRSQfce)4Y%R!P+wB+3 z5sGV5F9{f@7A}dqQPZ9e*j{^u+=lf_7;RX>Hi8^Bd@GOqFCIsWv!$TR!Q*q!a}a-^ zlUt=e&RM}CiThFe7faXyyAj;3FPAdWn;M|8s9SuG~w^DslxMpyr3m*dx0E+@^=i89iFgeg(-k;g4kf z(CK(+PxKHvyLZ>7q7Z+Kt0JDKdT#}8t5&eFAYK+Znhnq!SFlYysXTu5XbgVn2#>aq z3Hl@O`#=Tg!{DtzMd<6`3qU34-@*3)U+B{Kg(O#?GN=x?0^kSz8n_`)1v(!5Cg2Y} z5kIHo2~>ri51tEDgWd{W1yqN=j^A5K0ct=$0N(>@Li^%Jm`VY)pu3eNItpDIIvKhz z5CA<5JOZc#eZ)Z23)`T_VR5C&~2N3_(7s2+4QbROegb{~L_mA{;PLNKHw4I^&@G^Sp*?}upc{be0B=IafSUoGq2C54 z0$rdNgU171p+5zG40MA&0X_i4K;H&`19XShA^;yj_kgYm?FICN?g(xI^n#v>z%&BA zp%;S}0DYj3fVTm$&^HjU{eU>=hu~iTEXlZ5LGbE<1n5^0ya%9d(4C<>0)3%#!0|vL z^mqid2}pv@2hRqQp*Mn80x8hPz`KD|=-c2+KpM0Ljo=Yvy1CRmT5F7wxLcalS z4rD>6fqMaCpeKO`0b`*zfb)TI&}YHBfbr0G!PkKa&~9jCkD(_*`$BsHlb{=e>j0CX zdw^R3Q=kWdlYyzw@1Rlo0n?zTgQoz~q1S>J0W+Ytqp@}c-iJO6J_O8!{vM2Txz#`~h&;jHEi=hQ{08gPmfUXQ(23P_ej?Q2|^it?n&@F&v(23wKz;fu}=p;%5 zE1)NXCjcvz;ctwE>wfagI6LmPly z(3`>if!)v-LeTDkJ<#6hEdPYw3mpkv4cG_W8{8Jy4?Pr|27Cd13%mw606h|&YcOyS zdNz16a0q%mcp2~|^l|X#z*o@s!Iy!<&=NXh-XR}>t_&^*9EGk24g`)tw+7<{PdW}g z65JIy0X+{q88`{O75pJ^3i>E`KX4lQ1{goWKxd%;1pfk@g*Kq$*8=CDYl3}&^U#gK zVZa4wEKgG+@HKQkcoJ|C`WzTPw?LPmz3SnbLSKdsh4u%&fo=nS1^5=a2e=z>1v(p? z3|xhN5BxT84SGI!25=pE19%m11NuIAKX4PeOnvwY_zt=bxFT>1Isx1exDCA&JRJBQ zdLwup@B{Rh;N8F-=quoJz>m)T3*87D0^Eac2Ywa!1=( ze*-=PXrLd0?*J~)x^R>QT%oIgeE>J;2H?7Y7P>9C86ZJ#0QUymp^t%g0XpbA;7dR$ z=q^^AD>R;gb=?h}3zUXF0X_t1pE*%Kzl~ucz_W)09*y|fKCQS0G`mJ z!2JO)=tbbEKso3O;5C3ZbcM#aCeS|6b)ahj<)NE`8v-WiF5uUJ3ef4`1fU}HNbq2w z67+2FWB|`vxPA;?22_UL2mTE3gZ>(P0;mFg4}1&ohjx1f*A2QVbR}p{pc=FV8~{{@ zZV8SAYC!h}cLr)g_XDQ^wV=m=^MKmWu1(PYLkB?nLwf*qpkDz81A)+oz^#EG=$4U) zE9kn=y`eh;!O*wC3xN=5ucn9rAQXBjI1(^J2SlOIgSJ4gg^mHjpznjv0`;K#MPnQR z>O;?HhHDDl0QwsAR-hqtx#oy#=tj`Bp=$u)(1XC80W0))@E9NhdLJ0?VpC)2-@xaA zSD?GTifaWlfj$Nv2Sh^u4*nKs3Twx`%Xy|5OE6@zOC%6;P9J)U^9e5Rb z5_mMw0^0vIjJMFQLDz#e11+HsfZGABpuYy616o7(Z;2R&ZUa3AdNj}$x>_rY|In{P zH-HWU+CiTIzX7y|z74*~zeCSyjrIz3fL;y$5aCm^p1Aq+ZKf%8N znb0*mp`QV=pu@op07lCHmO=odjqu;zrMqAa_!A_$fcqiQ72Ft!ZeUj=YQYD=5_k+U z-N7x8sRO$pvlMtQSP$-iLZ!hs!DYb1P?*=-9EEwkuYq~Jt--wB*TKBrH^98!PGDYd m7cj3k2F&a23Fh_o0pmZ4$A;J27tHHT2J?E;z`Wi}@c#f4GwJ34 diff --git a/samples/client/petstore/csharp/SwaggerClientTest/obj/Debug/SwaggerClientTest.csproj.FilesWrittenAbsolute.txt b/samples/client/petstore/csharp/SwaggerClientTest/obj/Debug/SwaggerClientTest.csproj.FilesWrittenAbsolute.txt index b46eed9f9d6..3e55ab90965 100644 --- a/samples/client/petstore/csharp/SwaggerClientTest/obj/Debug/SwaggerClientTest.csproj.FilesWrittenAbsolute.txt +++ b/samples/client/petstore/csharp/SwaggerClientTest/obj/Debug/SwaggerClientTest.csproj.FilesWrittenAbsolute.txt @@ -1,8 +1,8 @@ /Users/williamcheng/Code/wing328/swagger-codegen/samples/client/petstore/csharp/SwaggerClientTest/obj/Debug/.NETFramework,Version=v4.5.AssemblyAttribute.cs +/Users/williamcheng/Code/wing328/swagger-codegen/samples/client/petstore/csharp/SwaggerClientTest/bin/Debug/Newtonsoft.Json.dll +/Users/williamcheng/Code/wing328/swagger-codegen/samples/client/petstore/csharp/SwaggerClientTest/bin/Debug/nunit.framework.dll +/Users/williamcheng/Code/wing328/swagger-codegen/samples/client/petstore/csharp/SwaggerClientTest/bin/Debug/RestSharp.dll /Users/williamcheng/Code/wing328/swagger-codegen/samples/client/petstore/csharp/SwaggerClientTest/bin/Debug/SwaggerClientTest.dll.mdb /Users/williamcheng/Code/wing328/swagger-codegen/samples/client/petstore/csharp/SwaggerClientTest/bin/Debug/SwaggerClientTest.dll /Users/williamcheng/Code/wing328/swagger-codegen/samples/client/petstore/csharp/SwaggerClientTest/obj/Debug/SwaggerClientTest.dll /Users/williamcheng/Code/wing328/swagger-codegen/samples/client/petstore/csharp/SwaggerClientTest/obj/Debug/SwaggerClientTest.dll.mdb -/Users/williamcheng/Code/wing328/swagger-codegen/samples/client/petstore/csharp/SwaggerClientTest/bin/Debug/Newtonsoft.Json.dll -/Users/williamcheng/Code/wing328/swagger-codegen/samples/client/petstore/csharp/SwaggerClientTest/bin/Debug/nunit.framework.dll -/Users/williamcheng/Code/wing328/swagger-codegen/samples/client/petstore/csharp/SwaggerClientTest/bin/Debug/RestSharp.dll diff --git a/samples/client/petstore/csharp/SwaggerClientTest/obj/Debug/SwaggerClientTest.dll b/samples/client/petstore/csharp/SwaggerClientTest/obj/Debug/SwaggerClientTest.dll index 86c933a16356ceb267b0ca9f8ad0194ef360760c..eb5aee17989464d74610896186219a19d741f7c1 100755 GIT binary patch literal 98816 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 literal 80384 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 literal 25511 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 From ab520e41be003024a79103a94fd3ab1ff081faad Mon Sep 17 00:00:00 2001 From: wing328 Date: Fri, 4 Dec 2015 17:07:20 +0800 Subject: [PATCH 108/211] update return tag in documentation (C#) --- .../src/main/resources/csharp/api.mustache | 16 +-- .../src/main/csharp/IO/Swagger/Api/PetApi.cs | 104 +++++++++--------- .../main/csharp/IO/Swagger/Api/StoreApi.cs | 52 ++++----- .../src/main/csharp/IO/Swagger/Api/UserApi.cs | 96 ++++++++-------- .../SwaggerClientTest.userprefs | 14 ++- .../bin/Debug/SwaggerClientTest.dll.mdb | Bin 29704 -> 29704 bytes .../obj/Debug/SwaggerClientTest.dll.mdb | Bin 29704 -> 29704 bytes 7 files changed, 143 insertions(+), 139 deletions(-) diff --git a/modules/swagger-codegen/src/main/resources/csharp/api.mustache b/modules/swagger-codegen/src/main/resources/csharp/api.mustache index 2d6f58634db..51f8b3f9394 100644 --- a/modules/swagger-codegen/src/main/resources/csharp/api.mustache +++ b/modules/swagger-codegen/src/main/resources/csharp/api.mustache @@ -23,7 +23,7 @@ namespace {{packageName}}.Api /// {{notes}} /// {{#allParams}}/// {{description}} - {{/allParams}}/// {{#returnType}}{{^returnContainer}}{{{returnType}}}{{/returnContainer}}{{/returnType}} + {{/allParams}}/// {{#returnType}}{{returnType}}{{/returnType}} {{#returnType}}{{{returnType}}}{{/returnType}}{{^returnType}}void{{/returnType}} {{operationId}} ({{#allParams}}{{{dataType}}} {{paramName}}{{^required}}{{#optionalMethodArgument}} = null{{/optionalMethodArgument}}{{/required}}{{#hasMore}}, {{/hasMore}}{{/allParams}}); ///

@@ -33,7 +33,7 @@ namespace {{packageName}}.Api /// {{notes}} /// {{#allParams}}/// {{description}} - {{/allParams}}/// ApiResponse{{#returnType}}< {{{returnType}}} >{{/returnType}}{{^returnType}}{{/returnType}} + {{/allParams}}/// ApiResponse of {{#returnType}}{{returnType}}{{/returnType}}{{^returnType}}Object(void){{/returnType}} ApiResponse<{{#returnType}}{{{returnType}}}{{/returnType}}{{^returnType}}Object{{/returnType}}> {{operationId}}WithHttpInfo ({{#allParams}}{{{dataType}}} {{paramName}}{{^required}}{{#optionalMethodArgument}} = null{{/optionalMethodArgument}}{{/required}}{{#hasMore}}, {{/hasMore}}{{/allParams}}); /// @@ -43,7 +43,7 @@ namespace {{packageName}}.Api /// {{notes}} /// {{#allParams}}/// {{description}} - {{/allParams}}/// {{#returnType}}{{^returnContainer}}{{{returnType}}}{{/returnContainer}}{{/returnType}} + {{/allParams}}/// Task of {{#returnType}}{{returnType}}{{/returnType}}{{^returnType}}void{{/returnType}} {{#returnType}}System.Threading.Tasks.Task<{{{returnType}}}>{{/returnType}}{{^returnType}}System.Threading.Tasks.Task{{/returnType}} {{operationId}}Async ({{#allParams}}{{{dataType}}} {{paramName}}{{^required}}{{#optionalMethodArgument}} = null{{/optionalMethodArgument}}{{/required}}{{#hasMore}}, {{/hasMore}}{{/allParams}}); /// @@ -53,7 +53,7 @@ namespace {{packageName}}.Api /// {{notes}} /// {{#allParams}}/// {{description}} - {{/allParams}}/// {{#returnType}}{{^returnContainer}}{{{returnType}}}{{/returnContainer}}{{/returnType}} + {{/allParams}}/// Task of ApiResponse{{#returnType}} ({{returnType}}){{/returnType}} System.Threading.Tasks.Task> {{operationId}}AsyncWithHttpInfo ({{#allParams}}{{{dataType}}} {{paramName}}{{^required}}{{#optionalMethodArgument}} = null{{/optionalMethodArgument}}{{/required}}{{#hasMore}}, {{/hasMore}}{{/allParams}}); {{/operation}} } @@ -138,7 +138,7 @@ namespace {{packageName}}.Api /// {{summary}} {{notes}} /// {{#allParams}}/// {{description}} - {{/allParams}}/// {{#returnType}}{{^returnContainer}}{{{returnType}}}{{/returnContainer}}{{/returnType}} + {{/allParams}}/// {{#returnType}}{{returnType}}{{/returnType}} public {{#returnType}}{{{returnType}}}{{/returnType}}{{^returnType}}void{{/returnType}} {{operationId}} ({{#allParams}}{{{dataType}}} {{paramName}}{{^required}}{{#optionalMethodArgument}} = null{{/optionalMethodArgument}}{{/required}}{{#hasMore}}, {{/hasMore}}{{/allParams}}) { {{#returnType}}ApiResponse<{{{returnType}}}> response = {{operationId}}WithHttpInfo({{#allParams}}{{paramName}}{{#hasMore}}, {{/hasMore}}{{/allParams}}); @@ -149,7 +149,7 @@ namespace {{packageName}}.Api /// {{summary}} {{notes}} /// {{#allParams}}/// {{description}} - {{/allParams}}/// {{#returnType}}{{^returnContainer}}{{{returnType}}}{{/returnContainer}}{{/returnType}} + {{/allParams}}/// ApiResponse of {{#returnType}}{{returnType}}{{/returnType}}{{^returnType}}Object(void){{/returnType}} public ApiResponse<{{#returnType}} {{{returnType}}} {{/returnType}}{{^returnType}}Object{{/returnType}}> {{operationId}}WithHttpInfo ({{#allParams}}{{{dataType}}} {{paramName}}{{^required}}{{#optionalMethodArgument}} = null{{/optionalMethodArgument}}{{/required}}{{#hasMore}}, {{/hasMore}}{{/allParams}}) { {{#allParams}}{{#required}} @@ -235,7 +235,7 @@ namespace {{packageName}}.Api /// {{summary}} {{notes}} /// {{#allParams}}/// {{description}} - {{/allParams}}/// {{#returnType}}{{^returnContainer}}{{{returnType}}}{{/returnContainer}}{{/returnType}} + {{/allParams}}/// Task of {{#returnType}}{{returnType}}{{/returnType}}{{^returnType}}void{{/returnType}} {{#returnType}}public async System.Threading.Tasks.Task<{{{returnType}}}>{{/returnType}}{{^returnType}}public async System.Threading.Tasks.Task{{/returnType}} {{operationId}}Async ({{#allParams}}{{{dataType}}} {{paramName}}{{^required}}{{#optionalMethodArgument}} = null{{/optionalMethodArgument}}{{/required}}{{#hasMore}}, {{/hasMore}}{{/allParams}}) { {{#returnType}}ApiResponse<{{{returnType}}}> response = await {{operationId}}AsyncWithHttpInfo({{#allParams}}{{paramName}}{{#hasMore}}, {{/hasMore}}{{/allParams}}); @@ -247,7 +247,7 @@ namespace {{packageName}}.Api /// {{summary}} {{notes}} /// {{#allParams}}/// {{description}} - {{/allParams}}/// {{#returnType}}{{^returnContainer}}{{{returnType}}}{{/returnContainer}}{{/returnType}} + {{/allParams}}/// Task of ApiResponse{{#returnType}} ({{returnType}}){{/returnType}} public async System.Threading.Tasks.Task> {{operationId}}AsyncWithHttpInfo ({{#allParams}}{{{dataType}}} {{paramName}}{{^required}}{{#optionalMethodArgument}} = null{{/optionalMethodArgument}}{{/required}}{{#hasMore}}, {{/hasMore}}{{/allParams}}) { {{#allParams}}{{#required}}// verify the required parameter '{{paramName}}' is set diff --git a/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Api/PetApi.cs b/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Api/PetApi.cs index 12b9c90d878..ba58eeac9e0 100644 --- a/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Api/PetApi.cs +++ b/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Api/PetApi.cs @@ -32,7 +32,7 @@ namespace IO.Swagger.Api /// /// /// Pet object that needs to be added to the store - /// ApiResponse + /// ApiResponse of Object(void) ApiResponse UpdatePetWithHttpInfo (Pet body = null); /// @@ -42,7 +42,7 @@ namespace IO.Swagger.Api /// /// /// Pet object that needs to be added to the store - /// + /// Task of void System.Threading.Tasks.Task UpdatePetAsync (Pet body = null); /// @@ -52,7 +52,7 @@ namespace IO.Swagger.Api /// /// /// Pet object that needs to be added to the store - /// + /// Task of ApiResponse System.Threading.Tasks.Task> UpdatePetAsyncWithHttpInfo (Pet body = null); /// @@ -72,7 +72,7 @@ namespace IO.Swagger.Api /// /// /// Pet object that needs to be added to the store - /// ApiResponse + /// ApiResponse of Object(void) ApiResponse AddPetWithHttpInfo (Pet body = null); /// @@ -82,7 +82,7 @@ namespace IO.Swagger.Api /// /// /// Pet object that needs to be added to the store - /// + /// Task of void System.Threading.Tasks.Task AddPetAsync (Pet body = null); /// @@ -92,7 +92,7 @@ namespace IO.Swagger.Api /// /// /// Pet object that needs to be added to the store - /// + /// Task of ApiResponse System.Threading.Tasks.Task> AddPetAsyncWithHttpInfo (Pet body = null); /// @@ -102,7 +102,7 @@ namespace IO.Swagger.Api /// Multiple status values can be provided with comma seperated strings /// /// Status values that need to be considered for filter - /// + /// List<Pet> List FindPetsByStatus (List status = null); /// @@ -112,7 +112,7 @@ namespace IO.Swagger.Api /// Multiple status values can be provided with comma seperated strings /// /// Status values that need to be considered for filter - /// ApiResponse< List > + /// ApiResponse of List<Pet> ApiResponse> FindPetsByStatusWithHttpInfo (List status = null); /// @@ -122,7 +122,7 @@ namespace IO.Swagger.Api /// Multiple status values can be provided with comma seperated strings /// /// Status values that need to be considered for filter - /// + /// Task of List<Pet> System.Threading.Tasks.Task> FindPetsByStatusAsync (List status = null); /// @@ -132,7 +132,7 @@ namespace IO.Swagger.Api /// Multiple status values can be provided with comma seperated strings /// /// Status values that need to be considered for filter - /// + /// Task of ApiResponse (List<Pet>) System.Threading.Tasks.Task>> FindPetsByStatusAsyncWithHttpInfo (List status = null); /// @@ -142,7 +142,7 @@ namespace IO.Swagger.Api /// Muliple tags can be provided with comma seperated strings. Use tag1, tag2, tag3 for testing. /// /// Tags to filter by - /// + /// List<Pet> List FindPetsByTags (List tags = null); /// @@ -152,7 +152,7 @@ namespace IO.Swagger.Api /// Muliple tags can be provided with comma seperated strings. Use tag1, tag2, tag3 for testing. /// /// Tags to filter by - /// ApiResponse< List > + /// ApiResponse of List<Pet> ApiResponse> FindPetsByTagsWithHttpInfo (List tags = null); /// @@ -162,7 +162,7 @@ namespace IO.Swagger.Api /// Muliple tags can be provided with comma seperated strings. Use tag1, tag2, tag3 for testing. /// /// Tags to filter by - /// + /// Task of List<Pet> System.Threading.Tasks.Task> FindPetsByTagsAsync (List tags = null); /// @@ -172,7 +172,7 @@ namespace IO.Swagger.Api /// Muliple tags can be provided with comma seperated strings. Use tag1, tag2, tag3 for testing. /// /// Tags to filter by - /// + /// Task of ApiResponse (List<Pet>) System.Threading.Tasks.Task>> FindPetsByTagsAsyncWithHttpInfo (List tags = null); /// @@ -192,7 +192,7 @@ namespace IO.Swagger.Api /// Returns a pet when ID < 10. ID > 10 or nonintegers will simulate API error conditions /// /// ID of pet that needs to be fetched - /// ApiResponse< Pet > + /// ApiResponse of Pet ApiResponse GetPetByIdWithHttpInfo (long? petId); /// @@ -202,7 +202,7 @@ namespace IO.Swagger.Api /// Returns a pet when ID < 10. ID > 10 or nonintegers will simulate API error conditions /// /// ID of pet that needs to be fetched - /// Pet + /// Task of Pet System.Threading.Tasks.Task GetPetByIdAsync (long? petId); /// @@ -212,7 +212,7 @@ namespace IO.Swagger.Api /// Returns a pet when ID < 10. ID > 10 or nonintegers will simulate API error conditions /// /// ID of pet that needs to be fetched - /// Pet + /// Task of ApiResponse (Pet) System.Threading.Tasks.Task> GetPetByIdAsyncWithHttpInfo (long? petId); /// @@ -236,7 +236,7 @@ namespace IO.Swagger.Api /// ID of pet that needs to be updated /// Updated name of the pet /// Updated status of the pet - /// ApiResponse + /// ApiResponse of Object(void) ApiResponse UpdatePetWithFormWithHttpInfo (string petId, string name = null, string status = null); /// @@ -248,7 +248,7 @@ namespace IO.Swagger.Api /// ID of pet that needs to be updated /// Updated name of the pet /// Updated status of the pet - /// + /// Task of void System.Threading.Tasks.Task UpdatePetWithFormAsync (string petId, string name = null, string status = null); /// @@ -260,7 +260,7 @@ namespace IO.Swagger.Api /// ID of pet that needs to be updated /// Updated name of the pet /// Updated status of the pet - /// + /// Task of ApiResponse System.Threading.Tasks.Task> UpdatePetWithFormAsyncWithHttpInfo (string petId, string name = null, string status = null); /// @@ -282,7 +282,7 @@ namespace IO.Swagger.Api /// /// Pet id to delete /// - /// ApiResponse + /// ApiResponse of Object(void) ApiResponse DeletePetWithHttpInfo (long? petId, string apiKey = null); /// @@ -293,7 +293,7 @@ namespace IO.Swagger.Api /// /// Pet id to delete /// - /// + /// Task of void System.Threading.Tasks.Task DeletePetAsync (long? petId, string apiKey = null); /// @@ -304,7 +304,7 @@ namespace IO.Swagger.Api /// /// Pet id to delete /// - /// + /// Task of ApiResponse System.Threading.Tasks.Task> DeletePetAsyncWithHttpInfo (long? petId, string apiKey = null); /// @@ -328,7 +328,7 @@ namespace IO.Swagger.Api /// ID of pet to update /// Additional data to pass to server /// file to upload - /// ApiResponse + /// ApiResponse of Object(void) ApiResponse UploadFileWithHttpInfo (long? petId, string additionalMetadata = null, Stream file = null); /// @@ -340,7 +340,7 @@ namespace IO.Swagger.Api /// ID of pet to update /// Additional data to pass to server /// file to upload - /// + /// Task of void System.Threading.Tasks.Task UploadFileAsync (long? petId, string additionalMetadata = null, Stream file = null); /// @@ -352,7 +352,7 @@ namespace IO.Swagger.Api /// ID of pet to update /// Additional data to pass to server /// file to upload - /// + /// Task of ApiResponse System.Threading.Tasks.Task> UploadFileAsyncWithHttpInfo (long? petId, string additionalMetadata = null, Stream file = null); } @@ -447,7 +447,7 @@ namespace IO.Swagger.Api /// Update an existing pet /// /// Pet object that needs to be added to the store - /// + /// ApiResponse of Object(void) public ApiResponse UpdatePetWithHttpInfo (Pet body = null) { @@ -509,7 +509,7 @@ namespace IO.Swagger.Api /// Update an existing pet /// /// Pet object that needs to be added to the store - /// + /// Task of void public async System.Threading.Tasks.Task UpdatePetAsync (Pet body = null) { await UpdatePetAsyncWithHttpInfo(body); @@ -520,7 +520,7 @@ namespace IO.Swagger.Api /// Update an existing pet /// /// Pet object that needs to be added to the store - /// + /// Task of ApiResponse public async System.Threading.Tasks.Task> UpdatePetAsyncWithHttpInfo (Pet body = null) { @@ -592,7 +592,7 @@ namespace IO.Swagger.Api /// Add a new pet to the store /// /// Pet object that needs to be added to the store - /// + /// ApiResponse of Object(void) public ApiResponse AddPetWithHttpInfo (Pet body = null) { @@ -654,7 +654,7 @@ namespace IO.Swagger.Api /// Add a new pet to the store /// /// Pet object that needs to be added to the store - /// + /// Task of void public async System.Threading.Tasks.Task AddPetAsync (Pet body = null) { await AddPetAsyncWithHttpInfo(body); @@ -665,7 +665,7 @@ namespace IO.Swagger.Api /// Add a new pet to the store /// /// Pet object that needs to be added to the store - /// + /// Task of ApiResponse public async System.Threading.Tasks.Task> AddPetAsyncWithHttpInfo (Pet body = null) { @@ -727,7 +727,7 @@ namespace IO.Swagger.Api /// Finds Pets by status Multiple status values can be provided with comma seperated strings /// /// Status values that need to be considered for filter - /// + /// List<Pet> public List FindPetsByStatus (List status = null) { ApiResponse> response = FindPetsByStatusWithHttpInfo(status); @@ -738,7 +738,7 @@ namespace IO.Swagger.Api /// Finds Pets by status Multiple status values can be provided with comma seperated strings /// /// Status values that need to be considered for filter - /// + /// ApiResponse of List<Pet> public ApiResponse< List > FindPetsByStatusWithHttpInfo (List status = null) { @@ -800,7 +800,7 @@ namespace IO.Swagger.Api /// Finds Pets by status Multiple status values can be provided with comma seperated strings /// /// Status values that need to be considered for filter - /// + /// Task of List<Pet> public async System.Threading.Tasks.Task> FindPetsByStatusAsync (List status = null) { ApiResponse> response = await FindPetsByStatusAsyncWithHttpInfo(status); @@ -812,7 +812,7 @@ namespace IO.Swagger.Api /// Finds Pets by status Multiple status values can be provided with comma seperated strings /// /// Status values that need to be considered for filter - /// + /// Task of ApiResponse (List<Pet>) public async System.Threading.Tasks.Task>> FindPetsByStatusAsyncWithHttpInfo (List status = null) { @@ -874,7 +874,7 @@ namespace IO.Swagger.Api /// Finds Pets by tags Muliple tags can be provided with comma seperated strings. Use tag1, tag2, tag3 for testing. /// /// Tags to filter by - /// + /// List<Pet> public List FindPetsByTags (List tags = null) { ApiResponse> response = FindPetsByTagsWithHttpInfo(tags); @@ -885,7 +885,7 @@ namespace IO.Swagger.Api /// Finds Pets by tags Muliple tags can be provided with comma seperated strings. Use tag1, tag2, tag3 for testing. /// /// Tags to filter by - /// + /// ApiResponse of List<Pet> public ApiResponse< List > FindPetsByTagsWithHttpInfo (List tags = null) { @@ -947,7 +947,7 @@ namespace IO.Swagger.Api /// Finds Pets by tags Muliple tags can be provided with comma seperated strings. Use tag1, tag2, tag3 for testing. /// /// Tags to filter by - /// + /// Task of List<Pet> public async System.Threading.Tasks.Task> FindPetsByTagsAsync (List tags = null) { ApiResponse> response = await FindPetsByTagsAsyncWithHttpInfo(tags); @@ -959,7 +959,7 @@ namespace IO.Swagger.Api /// Finds Pets by tags Muliple tags can be provided with comma seperated strings. Use tag1, tag2, tag3 for testing. /// /// Tags to filter by - /// + /// Task of ApiResponse (List<Pet>) public async System.Threading.Tasks.Task>> FindPetsByTagsAsyncWithHttpInfo (List tags = null) { @@ -1032,7 +1032,7 @@ namespace IO.Swagger.Api /// Find pet by ID Returns a pet when ID < 10. ID > 10 or nonintegers will simulate API error conditions /// /// ID of pet that needs to be fetched - /// Pet + /// ApiResponse of Pet public ApiResponse< Pet > GetPetByIdWithHttpInfo (long? petId) { @@ -1097,7 +1097,7 @@ namespace IO.Swagger.Api /// Find pet by ID Returns a pet when ID < 10. ID > 10 or nonintegers will simulate API error conditions /// /// ID of pet that needs to be fetched - /// Pet + /// Task of Pet public async System.Threading.Tasks.Task GetPetByIdAsync (long? petId) { ApiResponse response = await GetPetByIdAsyncWithHttpInfo(petId); @@ -1109,7 +1109,7 @@ namespace IO.Swagger.Api /// Find pet by ID Returns a pet when ID < 10. ID > 10 or nonintegers will simulate API error conditions /// /// ID of pet that needs to be fetched - /// Pet + /// Task of ApiResponse (Pet) public async System.Threading.Tasks.Task> GetPetByIdAsyncWithHttpInfo (long? petId) { // verify the required parameter 'petId' is set @@ -1187,7 +1187,7 @@ namespace IO.Swagger.Api /// ID of pet that needs to be updated /// Updated name of the pet /// Updated status of the pet - /// + /// ApiResponse of Object(void) public ApiResponse UpdatePetWithFormWithHttpInfo (string petId, string name = null, string status = null) { @@ -1256,7 +1256,7 @@ namespace IO.Swagger.Api /// ID of pet that needs to be updated /// Updated name of the pet /// Updated status of the pet - /// + /// Task of void public async System.Threading.Tasks.Task UpdatePetWithFormAsync (string petId, string name = null, string status = null) { await UpdatePetWithFormAsyncWithHttpInfo(petId, name, status); @@ -1269,7 +1269,7 @@ namespace IO.Swagger.Api /// ID of pet that needs to be updated /// Updated name of the pet /// Updated status of the pet - /// + /// Task of ApiResponse public async System.Threading.Tasks.Task> UpdatePetWithFormAsyncWithHttpInfo (string petId, string name = null, string status = null) { // verify the required parameter 'petId' is set @@ -1347,7 +1347,7 @@ namespace IO.Swagger.Api /// /// Pet id to delete /// - /// + /// ApiResponse of Object(void) public ApiResponse DeletePetWithHttpInfo (long? petId, string apiKey = null) { @@ -1414,7 +1414,7 @@ namespace IO.Swagger.Api /// /// Pet id to delete /// - /// + /// Task of void public async System.Threading.Tasks.Task DeletePetAsync (long? petId, string apiKey = null) { await DeletePetAsyncWithHttpInfo(petId, apiKey); @@ -1426,7 +1426,7 @@ namespace IO.Swagger.Api /// /// Pet id to delete /// - /// + /// Task of ApiResponse public async System.Threading.Tasks.Task> DeletePetAsyncWithHttpInfo (long? petId, string apiKey = null) { // verify the required parameter 'petId' is set @@ -1505,7 +1505,7 @@ namespace IO.Swagger.Api /// ID of pet to update /// Additional data to pass to server /// file to upload - /// + /// ApiResponse of Object(void) public ApiResponse UploadFileWithHttpInfo (long? petId, string additionalMetadata = null, Stream file = null) { @@ -1574,7 +1574,7 @@ namespace IO.Swagger.Api /// ID of pet to update /// Additional data to pass to server /// file to upload - /// + /// Task of void public async System.Threading.Tasks.Task UploadFileAsync (long? petId, string additionalMetadata = null, Stream file = null) { await UploadFileAsyncWithHttpInfo(petId, additionalMetadata, file); @@ -1587,7 +1587,7 @@ namespace IO.Swagger.Api /// ID of pet to update /// Additional data to pass to server /// file to upload - /// + /// Task of ApiResponse public async System.Threading.Tasks.Task> UploadFileAsyncWithHttpInfo (long? petId, string additionalMetadata = null, Stream file = null) { // verify the required parameter 'petId' is set diff --git a/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Api/StoreApi.cs b/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Api/StoreApi.cs index 5b0ccf3f966..a9e9d6e9b74 100644 --- a/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Api/StoreApi.cs +++ b/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Api/StoreApi.cs @@ -21,7 +21,7 @@ namespace IO.Swagger.Api /// /// Returns a map of status codes to quantities /// - /// + /// Dictionary<string, int?> Dictionary GetInventory (); /// @@ -30,7 +30,7 @@ namespace IO.Swagger.Api /// /// Returns a map of status codes to quantities /// - /// ApiResponse< Dictionary > + /// ApiResponse of Dictionary<string, int?> ApiResponse> GetInventoryWithHttpInfo (); /// @@ -39,7 +39,7 @@ namespace IO.Swagger.Api /// /// Returns a map of status codes to quantities /// - /// + /// Task of Dictionary<string, int?> System.Threading.Tasks.Task> GetInventoryAsync (); /// @@ -48,7 +48,7 @@ namespace IO.Swagger.Api /// /// Returns a map of status codes to quantities /// - /// + /// Task of ApiResponse (Dictionary<string, int?>) System.Threading.Tasks.Task>> GetInventoryAsyncWithHttpInfo (); /// @@ -68,7 +68,7 @@ namespace IO.Swagger.Api /// /// /// order placed for purchasing the pet - /// ApiResponse< Order > + /// ApiResponse of Order ApiResponse PlaceOrderWithHttpInfo (Order body = null); /// @@ -78,7 +78,7 @@ namespace IO.Swagger.Api /// /// /// order placed for purchasing the pet - /// Order + /// Task of Order System.Threading.Tasks.Task PlaceOrderAsync (Order body = null); /// @@ -88,7 +88,7 @@ namespace IO.Swagger.Api /// /// /// order placed for purchasing the pet - /// Order + /// Task of ApiResponse (Order) System.Threading.Tasks.Task> PlaceOrderAsyncWithHttpInfo (Order body = null); /// @@ -108,7 +108,7 @@ namespace IO.Swagger.Api /// For valid response try integer IDs with value <= 5 or > 10. Other values will generated exceptions /// /// ID of pet that needs to be fetched - /// ApiResponse< Order > + /// ApiResponse of Order ApiResponse GetOrderByIdWithHttpInfo (string orderId); /// @@ -118,7 +118,7 @@ namespace IO.Swagger.Api /// For valid response try integer IDs with value <= 5 or > 10. Other values will generated exceptions /// /// ID of pet that needs to be fetched - /// Order + /// Task of Order System.Threading.Tasks.Task GetOrderByIdAsync (string orderId); /// @@ -128,7 +128,7 @@ namespace IO.Swagger.Api /// For valid response try integer IDs with value <= 5 or > 10. Other values will generated exceptions /// /// ID of pet that needs to be fetched - /// Order + /// Task of ApiResponse (Order) System.Threading.Tasks.Task> GetOrderByIdAsyncWithHttpInfo (string orderId); /// @@ -148,7 +148,7 @@ namespace IO.Swagger.Api /// For valid response try integer IDs with value < 1000. Anything above 1000 or nonintegers will generate API errors /// /// ID of the order that needs to be deleted - /// ApiResponse + /// ApiResponse of Object(void) ApiResponse DeleteOrderWithHttpInfo (string orderId); /// @@ -158,7 +158,7 @@ namespace IO.Swagger.Api /// For valid response try integer IDs with value < 1000. Anything above 1000 or nonintegers will generate API errors /// /// ID of the order that needs to be deleted - /// + /// Task of void System.Threading.Tasks.Task DeleteOrderAsync (string orderId); /// @@ -168,7 +168,7 @@ namespace IO.Swagger.Api /// For valid response try integer IDs with value < 1000. Anything above 1000 or nonintegers will generate API errors /// /// ID of the order that needs to be deleted - /// + /// Task of ApiResponse System.Threading.Tasks.Task> DeleteOrderAsyncWithHttpInfo (string orderId); } @@ -252,7 +252,7 @@ namespace IO.Swagger.Api /// /// Returns pet inventories by status Returns a map of status codes to quantities /// - /// + /// Dictionary<string, int?> public Dictionary GetInventory () { ApiResponse> response = GetInventoryWithHttpInfo(); @@ -262,7 +262,7 @@ namespace IO.Swagger.Api /// /// Returns pet inventories by status Returns a map of status codes to quantities /// - /// + /// ApiResponse of Dictionary<string, int?> public ApiResponse< Dictionary > GetInventoryWithHttpInfo () { @@ -322,7 +322,7 @@ namespace IO.Swagger.Api /// /// Returns pet inventories by status Returns a map of status codes to quantities /// - /// + /// Task of Dictionary<string, int?> public async System.Threading.Tasks.Task> GetInventoryAsync () { ApiResponse> response = await GetInventoryAsyncWithHttpInfo(); @@ -333,7 +333,7 @@ namespace IO.Swagger.Api /// /// Returns pet inventories by status Returns a map of status codes to quantities /// - /// + /// Task of ApiResponse (Dictionary<string, int?>) public async System.Threading.Tasks.Task>> GetInventoryAsyncWithHttpInfo () { @@ -405,7 +405,7 @@ namespace IO.Swagger.Api /// Place an order for a pet /// /// order placed for purchasing the pet - /// Order + /// ApiResponse of Order public ApiResponse< Order > PlaceOrderWithHttpInfo (Order body = null) { @@ -459,7 +459,7 @@ namespace IO.Swagger.Api /// Place an order for a pet /// /// order placed for purchasing the pet - /// Order + /// Task of Order public async System.Threading.Tasks.Task PlaceOrderAsync (Order body = null) { ApiResponse response = await PlaceOrderAsyncWithHttpInfo(body); @@ -471,7 +471,7 @@ namespace IO.Swagger.Api /// Place an order for a pet /// /// order placed for purchasing the pet - /// Order + /// Task of ApiResponse (Order) public async System.Threading.Tasks.Task> PlaceOrderAsyncWithHttpInfo (Order body = null) { @@ -536,7 +536,7 @@ namespace IO.Swagger.Api /// Find purchase order by ID For valid response try integer IDs with value <= 5 or > 10. Other values will generated exceptions /// /// ID of pet that needs to be fetched - /// Order + /// ApiResponse of Order public ApiResponse< Order > GetOrderByIdWithHttpInfo (string orderId) { @@ -593,7 +593,7 @@ namespace IO.Swagger.Api /// Find purchase order by ID For valid response try integer IDs with value <= 5 or > 10. Other values will generated exceptions /// /// ID of pet that needs to be fetched - /// Order + /// Task of Order public async System.Threading.Tasks.Task GetOrderByIdAsync (string orderId) { ApiResponse response = await GetOrderByIdAsyncWithHttpInfo(orderId); @@ -605,7 +605,7 @@ namespace IO.Swagger.Api /// Find purchase order by ID For valid response try integer IDs with value <= 5 or > 10. Other values will generated exceptions /// /// ID of pet that needs to be fetched - /// Order + /// Task of ApiResponse (Order) public async System.Threading.Tasks.Task> GetOrderByIdAsyncWithHttpInfo (string orderId) { // verify the required parameter 'orderId' is set @@ -671,7 +671,7 @@ namespace IO.Swagger.Api /// Delete purchase order by ID For valid response try integer IDs with value < 1000. Anything above 1000 or nonintegers will generate API errors /// /// ID of the order that needs to be deleted - /// + /// ApiResponse of Object(void) public ApiResponse DeleteOrderWithHttpInfo (string orderId) { @@ -728,7 +728,7 @@ namespace IO.Swagger.Api /// Delete purchase order by ID For valid response try integer IDs with value < 1000. Anything above 1000 or nonintegers will generate API errors /// /// ID of the order that needs to be deleted - /// + /// Task of void public async System.Threading.Tasks.Task DeleteOrderAsync (string orderId) { await DeleteOrderAsyncWithHttpInfo(orderId); @@ -739,7 +739,7 @@ namespace IO.Swagger.Api /// Delete purchase order by ID For valid response try integer IDs with value < 1000. Anything above 1000 or nonintegers will generate API errors /// /// ID of the order that needs to be deleted - /// + /// Task of ApiResponse public async System.Threading.Tasks.Task> DeleteOrderAsyncWithHttpInfo (string orderId) { // verify the required parameter 'orderId' is set diff --git a/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Api/UserApi.cs b/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Api/UserApi.cs index 5c19fdb7e37..5502fe15da1 100644 --- a/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Api/UserApi.cs +++ b/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Api/UserApi.cs @@ -32,7 +32,7 @@ namespace IO.Swagger.Api /// This can only be done by the logged in user. /// /// Created user object - /// ApiResponse + /// ApiResponse of Object(void) ApiResponse CreateUserWithHttpInfo (User body = null); /// @@ -42,7 +42,7 @@ namespace IO.Swagger.Api /// This can only be done by the logged in user. /// /// Created user object - /// + /// Task of void System.Threading.Tasks.Task CreateUserAsync (User body = null); /// @@ -52,7 +52,7 @@ namespace IO.Swagger.Api /// This can only be done by the logged in user. /// /// Created user object - /// + /// Task of ApiResponse System.Threading.Tasks.Task> CreateUserAsyncWithHttpInfo (User body = null); /// @@ -72,7 +72,7 @@ namespace IO.Swagger.Api /// /// /// List of user object - /// ApiResponse + /// ApiResponse of Object(void) ApiResponse CreateUsersWithArrayInputWithHttpInfo (List body = null); /// @@ -82,7 +82,7 @@ namespace IO.Swagger.Api /// /// /// List of user object - /// + /// Task of void System.Threading.Tasks.Task CreateUsersWithArrayInputAsync (List body = null); /// @@ -92,7 +92,7 @@ namespace IO.Swagger.Api /// /// /// List of user object - /// + /// Task of ApiResponse System.Threading.Tasks.Task> CreateUsersWithArrayInputAsyncWithHttpInfo (List body = null); /// @@ -112,7 +112,7 @@ namespace IO.Swagger.Api /// /// /// List of user object - /// ApiResponse + /// ApiResponse of Object(void) ApiResponse CreateUsersWithListInputWithHttpInfo (List body = null); /// @@ -122,7 +122,7 @@ namespace IO.Swagger.Api /// /// /// List of user object - /// + /// Task of void System.Threading.Tasks.Task CreateUsersWithListInputAsync (List body = null); /// @@ -132,7 +132,7 @@ namespace IO.Swagger.Api /// /// /// List of user object - /// + /// Task of ApiResponse System.Threading.Tasks.Task> CreateUsersWithListInputAsyncWithHttpInfo (List body = null); /// @@ -154,7 +154,7 @@ namespace IO.Swagger.Api /// /// The user name for login /// The password for login in clear text - /// ApiResponse< string > + /// ApiResponse of string ApiResponse LoginUserWithHttpInfo (string username = null, string password = null); /// @@ -165,7 +165,7 @@ namespace IO.Swagger.Api /// /// The user name for login /// The password for login in clear text - /// string + /// Task of string System.Threading.Tasks.Task LoginUserAsync (string username = null, string password = null); /// @@ -176,7 +176,7 @@ namespace IO.Swagger.Api /// /// The user name for login /// The password for login in clear text - /// string + /// Task of ApiResponse (string) System.Threading.Tasks.Task> LoginUserAsyncWithHttpInfo (string username = null, string password = null); /// @@ -194,7 +194,7 @@ namespace IO.Swagger.Api /// /// /// - /// ApiResponse + /// ApiResponse of Object(void) ApiResponse LogoutUserWithHttpInfo (); /// @@ -203,7 +203,7 @@ namespace IO.Swagger.Api /// /// /// - /// + /// Task of void System.Threading.Tasks.Task LogoutUserAsync (); /// @@ -212,7 +212,7 @@ namespace IO.Swagger.Api /// /// /// - /// + /// Task of ApiResponse System.Threading.Tasks.Task> LogoutUserAsyncWithHttpInfo (); /// @@ -232,7 +232,7 @@ namespace IO.Swagger.Api /// /// /// The name that needs to be fetched. Use user1 for testing. - /// ApiResponse< User > + /// ApiResponse of User ApiResponse GetUserByNameWithHttpInfo (string username); /// @@ -242,7 +242,7 @@ namespace IO.Swagger.Api /// /// /// The name that needs to be fetched. Use user1 for testing. - /// User + /// Task of User System.Threading.Tasks.Task GetUserByNameAsync (string username); /// @@ -252,7 +252,7 @@ namespace IO.Swagger.Api /// /// /// The name that needs to be fetched. Use user1 for testing. - /// User + /// Task of ApiResponse (User) System.Threading.Tasks.Task> GetUserByNameAsyncWithHttpInfo (string username); /// @@ -274,7 +274,7 @@ namespace IO.Swagger.Api /// /// name that need to be deleted /// Updated user object - /// ApiResponse + /// ApiResponse of Object(void) ApiResponse UpdateUserWithHttpInfo (string username, User body = null); /// @@ -285,7 +285,7 @@ namespace IO.Swagger.Api /// /// name that need to be deleted /// Updated user object - /// + /// Task of void System.Threading.Tasks.Task UpdateUserAsync (string username, User body = null); /// @@ -296,7 +296,7 @@ namespace IO.Swagger.Api /// /// name that need to be deleted /// Updated user object - /// + /// Task of ApiResponse System.Threading.Tasks.Task> UpdateUserAsyncWithHttpInfo (string username, User body = null); /// @@ -316,7 +316,7 @@ namespace IO.Swagger.Api /// This can only be done by the logged in user. /// /// The name that needs to be deleted - /// ApiResponse + /// ApiResponse of Object(void) ApiResponse DeleteUserWithHttpInfo (string username); /// @@ -326,7 +326,7 @@ namespace IO.Swagger.Api /// This can only be done by the logged in user. /// /// The name that needs to be deleted - /// + /// Task of void System.Threading.Tasks.Task DeleteUserAsync (string username); /// @@ -336,7 +336,7 @@ namespace IO.Swagger.Api /// This can only be done by the logged in user. /// /// The name that needs to be deleted - /// + /// Task of ApiResponse System.Threading.Tasks.Task> DeleteUserAsyncWithHttpInfo (string username); } @@ -431,7 +431,7 @@ namespace IO.Swagger.Api /// Create user This can only be done by the logged in user. /// /// Created user object - /// + /// ApiResponse of Object(void) public ApiResponse CreateUserWithHttpInfo (User body = null) { @@ -485,7 +485,7 @@ namespace IO.Swagger.Api /// Create user This can only be done by the logged in user. /// /// Created user object - /// + /// Task of void public async System.Threading.Tasks.Task CreateUserAsync (User body = null) { await CreateUserAsyncWithHttpInfo(body); @@ -496,7 +496,7 @@ namespace IO.Swagger.Api /// Create user This can only be done by the logged in user. /// /// Created user object - /// + /// Task of ApiResponse public async System.Threading.Tasks.Task> CreateUserAsyncWithHttpInfo (User body = null) { @@ -560,7 +560,7 @@ namespace IO.Swagger.Api /// Creates list of users with given input array /// /// List of user object - /// + /// ApiResponse of Object(void) public ApiResponse CreateUsersWithArrayInputWithHttpInfo (List body = null) { @@ -614,7 +614,7 @@ namespace IO.Swagger.Api /// Creates list of users with given input array /// /// List of user object - /// + /// Task of void public async System.Threading.Tasks.Task CreateUsersWithArrayInputAsync (List body = null) { await CreateUsersWithArrayInputAsyncWithHttpInfo(body); @@ -625,7 +625,7 @@ namespace IO.Swagger.Api /// Creates list of users with given input array /// /// List of user object - /// + /// Task of ApiResponse public async System.Threading.Tasks.Task> CreateUsersWithArrayInputAsyncWithHttpInfo (List body = null) { @@ -689,7 +689,7 @@ namespace IO.Swagger.Api /// Creates list of users with given input array /// /// List of user object - /// + /// ApiResponse of Object(void) public ApiResponse CreateUsersWithListInputWithHttpInfo (List body = null) { @@ -743,7 +743,7 @@ namespace IO.Swagger.Api /// Creates list of users with given input array /// /// List of user object - /// + /// Task of void public async System.Threading.Tasks.Task CreateUsersWithListInputAsync (List body = null) { await CreateUsersWithListInputAsyncWithHttpInfo(body); @@ -754,7 +754,7 @@ namespace IO.Swagger.Api /// Creates list of users with given input array /// /// List of user object - /// + /// Task of ApiResponse public async System.Threading.Tasks.Task> CreateUsersWithListInputAsyncWithHttpInfo (List body = null) { @@ -821,7 +821,7 @@ namespace IO.Swagger.Api /// /// The user name for login /// The password for login in clear text - /// string + /// ApiResponse of string public ApiResponse< string > LoginUserWithHttpInfo (string username = null, string password = null) { @@ -877,7 +877,7 @@ namespace IO.Swagger.Api /// /// The user name for login /// The password for login in clear text - /// string + /// Task of string public async System.Threading.Tasks.Task LoginUserAsync (string username = null, string password = null) { ApiResponse response = await LoginUserAsyncWithHttpInfo(username, password); @@ -890,7 +890,7 @@ namespace IO.Swagger.Api /// /// The user name for login /// The password for login in clear text - /// string + /// Task of ApiResponse (string) public async System.Threading.Tasks.Task> LoginUserAsyncWithHttpInfo (string username = null, string password = null) { @@ -953,7 +953,7 @@ namespace IO.Swagger.Api /// /// Logs out current logged in user session /// - /// + /// ApiResponse of Object(void) public ApiResponse LogoutUserWithHttpInfo () { @@ -1005,7 +1005,7 @@ namespace IO.Swagger.Api /// /// Logs out current logged in user session /// - /// + /// Task of void public async System.Threading.Tasks.Task LogoutUserAsync () { await LogoutUserAsyncWithHttpInfo(); @@ -1015,7 +1015,7 @@ namespace IO.Swagger.Api /// /// Logs out current logged in user session /// - /// + /// Task of ApiResponse public async System.Threading.Tasks.Task> LogoutUserAsyncWithHttpInfo () { @@ -1079,7 +1079,7 @@ namespace IO.Swagger.Api /// Get user by user name /// /// The name that needs to be fetched. Use user1 for testing. - /// User + /// ApiResponse of User public ApiResponse< User > GetUserByNameWithHttpInfo (string username) { @@ -1136,7 +1136,7 @@ namespace IO.Swagger.Api /// Get user by user name /// /// The name that needs to be fetched. Use user1 for testing. - /// User + /// Task of User public async System.Threading.Tasks.Task GetUserByNameAsync (string username) { ApiResponse response = await GetUserByNameAsyncWithHttpInfo(username); @@ -1148,7 +1148,7 @@ namespace IO.Swagger.Api /// Get user by user name /// /// The name that needs to be fetched. Use user1 for testing. - /// User + /// Task of ApiResponse (User) public async System.Threading.Tasks.Task> GetUserByNameAsyncWithHttpInfo (string username) { // verify the required parameter 'username' is set @@ -1216,7 +1216,7 @@ namespace IO.Swagger.Api /// /// name that need to be deleted /// Updated user object - /// + /// ApiResponse of Object(void) public ApiResponse UpdateUserWithHttpInfo (string username, User body = null) { @@ -1275,7 +1275,7 @@ namespace IO.Swagger.Api /// /// name that need to be deleted /// Updated user object - /// + /// Task of void public async System.Threading.Tasks.Task UpdateUserAsync (string username, User body = null) { await UpdateUserAsyncWithHttpInfo(username, body); @@ -1287,7 +1287,7 @@ namespace IO.Swagger.Api /// /// name that need to be deleted /// Updated user object - /// + /// Task of ApiResponse public async System.Threading.Tasks.Task> UpdateUserAsyncWithHttpInfo (string username, User body = null) { // verify the required parameter 'username' is set @@ -1354,7 +1354,7 @@ namespace IO.Swagger.Api /// Delete user This can only be done by the logged in user. /// /// The name that needs to be deleted - /// + /// ApiResponse of Object(void) public ApiResponse DeleteUserWithHttpInfo (string username) { @@ -1411,7 +1411,7 @@ namespace IO.Swagger.Api /// Delete user This can only be done by the logged in user. /// /// The name that needs to be deleted - /// + /// Task of void public async System.Threading.Tasks.Task DeleteUserAsync (string username) { await DeleteUserAsyncWithHttpInfo(username); @@ -1422,7 +1422,7 @@ namespace IO.Swagger.Api /// Delete user This can only be done by the logged in user. /// /// The name that needs to be deleted - /// + /// Task of ApiResponse public async System.Threading.Tasks.Task> DeleteUserAsyncWithHttpInfo (string username) { // verify the required parameter 'username' is set diff --git a/samples/client/petstore/csharp/SwaggerClientTest/SwaggerClientTest.userprefs b/samples/client/petstore/csharp/SwaggerClientTest/SwaggerClientTest.userprefs index 2b3d5191461..da9e64e0c90 100644 --- a/samples/client/petstore/csharp/SwaggerClientTest/SwaggerClientTest.userprefs +++ b/samples/client/petstore/csharp/SwaggerClientTest/SwaggerClientTest.userprefs @@ -1,8 +1,12 @@  - + - + + + + + @@ -10,9 +14,9 @@ - - - + + + diff --git a/samples/client/petstore/csharp/SwaggerClientTest/bin/Debug/SwaggerClientTest.dll.mdb b/samples/client/petstore/csharp/SwaggerClientTest/bin/Debug/SwaggerClientTest.dll.mdb index cca38f7b84ca63a0208d2fb4265550c10925511a..073b96f23b3261d5b6d69bd35e415e63676664f6 100644 GIT binary patch delta 78 zcmV-U0I~mw=mCi60k9qc5;}Zyl{J6zc<2kugqK#nS^%Drag>w90UHoELulQ44W>>9 k`Q;>8v69h~?*Xt74DN67$6X`xXfq}iTKMS_v#$bKabmY4bpQYW delta 78 zcmV-U0I~mw=mCi60k9qc62RfPR13UZwX4+t10Vt42LPUtag>w90UHn&s|PvB05J?( k9{xyAFZw90UHoELulQ44W>>9 k`Q;>8v69h~?*Xt74DN67$6X`xXfq}iTKMS_v#$bKabmY4bpQYW delta 78 zcmV-U0I~mw=mCi60k9qc62RfPR13UZwX4+t10Vt42LPUtag>w90UHn&s|PvB05J?( k9{xyAFZ Date: Fri, 4 Dec 2015 17:23:57 +0800 Subject: [PATCH 109/211] Accessing response status code and headers in Clojure client Closes #1656 --- .../src/main/resources/clojure/api.mustache | 11 ++- .../src/main/resources/clojure/core.mustache | 7 +- .../clojure/src/swagger_petstore/api/pet.clj | 99 ++++++++++++++----- .../src/swagger_petstore/api/store.clj | 35 ++++++- .../clojure/src/swagger_petstore/api/user.clj | 91 +++++++++++++---- .../clojure/src/swagger_petstore/core.clj | 7 +- .../test/swagger_petstore/api/pet_test.clj | 12 +++ 7 files changed, 208 insertions(+), 54 deletions(-) diff --git a/modules/swagger-codegen/src/main/resources/clojure/api.mustache b/modules/swagger-codegen/src/main/resources/clojure/api.mustache index 740027e224b..a6b598fc610 100644 --- a/modules/swagger-codegen/src/main/resources/clojure/api.mustache +++ b/modules/swagger-codegen/src/main/resources/clojure/api.mustache @@ -2,10 +2,10 @@ (:require [.core :refer [call-api check-required-params with-collection-format]]) (:import (java.io File))) <#operations><#operation> -(defn +(defn -with-http-info "<&summary><#notes> <¬es>"<#hasOptionalParams> - ([<#allParams><#required><#isFile>^File ] (<#allParams><#required> nil)) + ([<#allParams><#required><#isFile>^File ] (-with-http-info<#allParams><#required> nil)) <#hasOptionalParams>([<#allParams><#required><#isFile>^File <#hasOptionalParams>{:keys [<#allParams><^required><#isFile>^File ]}]<#hasRequiredParams> <#hasOptionalParams> (check-required-params<#allParams><#required> ) <#hasOptionalParams> (call-api "" : @@ -17,4 +17,11 @@ <#hasOptionalParams> :content-types [<#consumes>""<#hasMore> ] <#hasOptionalParams> :accepts [<#produces>""<#hasMore> ] <#hasOptionalParams> :auth-names [<#authMethods>"<&name>"<#hasMore> ]})<#hasOptionalParams>)) + +(defn + "<&summary><#notes> + <¬es>"<#hasOptionalParams> + ([<#allParams><#required><#isFile>^File ] (<#allParams><#required> nil)) + <#hasOptionalParams>([<#allParams><#required><#isFile>^File <#hasOptionalParams>optional-params] + <#hasOptionalParams> (:data (-with-http-info<#allParams><#required> <#hasOptionalParams> optional-params))<#hasOptionalParams>)) \ No newline at end of file diff --git a/modules/swagger-codegen/src/main/resources/clojure/core.mustache b/modules/swagger-codegen/src/main/resources/clojure/core.mustache index b05df804a7f..931d2b73c76 100644 --- a/modules/swagger-codegen/src/main/resources/clojure/core.mustache +++ b/modules/swagger-codegen/src/main/resources/clojure/core.mustache @@ -198,9 +198,10 @@ (try (parse-string body true) (catch JsonParseException e - ;; return the body string directly on JSON parsing error + ;; Return the body string directly on JSON parsing error. body)) - ;; for non-JSON response, return the body string directly + + ;; For other cases, return the body string directly. :else body)) (defn form-params->multipart @@ -236,4 +237,4 @@ (when debug (println "Response:") (println resp)) - (deserialize resp))) + (assoc resp :data (deserialize resp)))) diff --git a/samples/client/petstore/clojure/src/swagger_petstore/api/pet.clj b/samples/client/petstore/clojure/src/swagger_petstore/api/pet.clj index 8cf64f607b2..36bdefeffcd 100644 --- a/samples/client/petstore/clojure/src/swagger_petstore/api/pet.clj +++ b/samples/client/petstore/clojure/src/swagger_petstore/api/pet.clj @@ -2,12 +2,34 @@ (:require [swagger-petstore.core :refer [call-api check-required-params with-collection-format]]) (:import (java.io File))) +(defn update-pet-with-http-info + "Update an existing pet + " + ([] (update-pet-with-http-info nil)) + ([{:keys [body ]}] + (call-api "/pet" :put + {:path-params {} + :header-params {} + :query-params {} + :form-params {} + :body-param body + :content-types ["application/json" "application/xml"] + :accepts ["application/json" "application/xml"] + :auth-names ["petstore_auth"]}))) + (defn update-pet "Update an existing pet " ([] (update-pet nil)) + ([optional-params] + (:data (update-pet-with-http-info optional-params)))) + +(defn add-pet-with-http-info + "Add a new pet to the store + " + ([] (add-pet-with-http-info nil)) ([{:keys [body ]}] - (call-api "/pet" :put + (call-api "/pet" :post {:path-params {} :header-params {} :query-params {} @@ -21,21 +43,13 @@ "Add a new pet to the store " ([] (add-pet nil)) - ([{:keys [body ]}] - (call-api "/pet" :post - {:path-params {} - :header-params {} - :query-params {} - :form-params {} - :body-param body - :content-types ["application/json" "application/xml"] - :accepts ["application/json" "application/xml"] - :auth-names ["petstore_auth"]}))) + ([optional-params] + (:data (add-pet-with-http-info optional-params)))) -(defn find-pets-by-status +(defn find-pets-by-status-with-http-info "Finds Pets by status Multiple status values can be provided with comma seperated strings" - ([] (find-pets-by-status nil)) + ([] (find-pets-by-status-with-http-info nil)) ([{:keys [status ]}] (call-api "/pet/findByStatus" :get {:path-params {} @@ -46,10 +60,17 @@ :accepts ["application/json" "application/xml"] :auth-names ["petstore_auth"]}))) -(defn find-pets-by-tags +(defn find-pets-by-status + "Finds Pets by status + Multiple status values can be provided with comma seperated strings" + ([] (find-pets-by-status nil)) + ([optional-params] + (:data (find-pets-by-status-with-http-info optional-params)))) + +(defn find-pets-by-tags-with-http-info "Finds Pets by tags Muliple tags can be provided with comma seperated strings. Use tag1, tag2, tag3 for testing." - ([] (find-pets-by-tags nil)) + ([] (find-pets-by-tags-with-http-info nil)) ([{:keys [tags ]}] (call-api "/pet/findByTags" :get {:path-params {} @@ -60,7 +81,14 @@ :accepts ["application/json" "application/xml"] :auth-names ["petstore_auth"]}))) -(defn get-pet-by-id +(defn find-pets-by-tags + "Finds Pets by tags + Muliple tags can be provided with comma seperated strings. Use tag1, tag2, tag3 for testing." + ([] (find-pets-by-tags nil)) + ([optional-params] + (:data (find-pets-by-tags-with-http-info optional-params)))) + +(defn get-pet-by-id-with-http-info "Find pet by ID Returns a pet when ID < 10. ID > 10 or nonintegers will simulate API error conditions" [pet-id ] @@ -73,10 +101,16 @@ :accepts ["application/json" "application/xml"] :auth-names ["api_key"]})) -(defn update-pet-with-form +(defn get-pet-by-id + "Find pet by ID + Returns a pet when ID < 10. ID > 10 or nonintegers will simulate API error conditions" + [pet-id ] + (:data (get-pet-by-id-with-http-info pet-id))) + +(defn update-pet-with-form-with-http-info "Updates a pet in the store with form data " - ([pet-id ] (update-pet-with-form pet-id nil)) + ([pet-id ] (update-pet-with-form-with-http-info pet-id nil)) ([pet-id {:keys [name status ]}] (call-api "/pet/{petId}" :post {:path-params {"petId" pet-id } @@ -87,10 +121,17 @@ :accepts ["application/json" "application/xml"] :auth-names ["petstore_auth"]}))) -(defn delete-pet +(defn update-pet-with-form + "Updates a pet in the store with form data + " + ([pet-id ] (update-pet-with-form pet-id nil)) + ([pet-id optional-params] + (:data (update-pet-with-form-with-http-info pet-id optional-params)))) + +(defn delete-pet-with-http-info "Deletes a pet " - ([pet-id ] (delete-pet pet-id nil)) + ([pet-id ] (delete-pet-with-http-info pet-id nil)) ([pet-id {:keys [api-key ]}] (call-api "/pet/{petId}" :delete {:path-params {"petId" pet-id } @@ -101,10 +142,17 @@ :accepts ["application/json" "application/xml"] :auth-names ["petstore_auth"]}))) -(defn upload-file +(defn delete-pet + "Deletes a pet + " + ([pet-id ] (delete-pet pet-id nil)) + ([pet-id optional-params] + (:data (delete-pet-with-http-info pet-id optional-params)))) + +(defn upload-file-with-http-info "uploads an image " - ([pet-id ] (upload-file pet-id nil)) + ([pet-id ] (upload-file-with-http-info pet-id nil)) ([pet-id {:keys [additional-metadata ^File file ]}] (call-api "/pet/{petId}/uploadImage" :post {:path-params {"petId" pet-id } @@ -114,3 +162,10 @@ :content-types ["multipart/form-data"] :accepts ["application/json" "application/xml"] :auth-names ["petstore_auth"]}))) + +(defn upload-file + "uploads an image + " + ([pet-id ] (upload-file pet-id nil)) + ([pet-id optional-params] + (:data (upload-file-with-http-info pet-id optional-params)))) diff --git a/samples/client/petstore/clojure/src/swagger_petstore/api/store.clj b/samples/client/petstore/clojure/src/swagger_petstore/api/store.clj index d3b0d9f5abe..d3877e5887b 100644 --- a/samples/client/petstore/clojure/src/swagger_petstore/api/store.clj +++ b/samples/client/petstore/clojure/src/swagger_petstore/api/store.clj @@ -2,7 +2,7 @@ (:require [swagger-petstore.core :refer [call-api check-required-params with-collection-format]]) (:import (java.io File))) -(defn get-inventory +(defn get-inventory-with-http-info "Returns pet inventories by status Returns a map of status codes to quantities" [] @@ -15,10 +15,16 @@ :accepts ["application/json" "application/xml"] :auth-names ["api_key"]})) -(defn place-order +(defn get-inventory + "Returns pet inventories by status + Returns a map of status codes to quantities" + [] + (:data (get-inventory-with-http-info))) + +(defn place-order-with-http-info "Place an order for a pet " - ([] (place-order nil)) + ([] (place-order-with-http-info nil)) ([{:keys [body ]}] (call-api "/store/order" :post {:path-params {} @@ -30,7 +36,14 @@ :accepts ["application/json" "application/xml"] :auth-names []}))) -(defn get-order-by-id +(defn place-order + "Place an order for a pet + " + ([] (place-order nil)) + ([optional-params] + (:data (place-order-with-http-info optional-params)))) + +(defn get-order-by-id-with-http-info "Find purchase order by ID For valid response try integer IDs with value <= 5 or > 10. Other values will generated exceptions" [order-id ] @@ -43,7 +56,13 @@ :accepts ["application/json" "application/xml"] :auth-names []})) -(defn delete-order +(defn get-order-by-id + "Find purchase order by ID + For valid response try integer IDs with value <= 5 or > 10. Other values will generated exceptions" + [order-id ] + (:data (get-order-by-id-with-http-info order-id))) + +(defn delete-order-with-http-info "Delete purchase order by ID For valid response try integer IDs with value < 1000. Anything above 1000 or nonintegers will generate API errors" [order-id ] @@ -55,3 +74,9 @@ :content-types [] :accepts ["application/json" "application/xml"] :auth-names []})) + +(defn delete-order + "Delete purchase order by ID + For valid response try integer IDs with value < 1000. Anything above 1000 or nonintegers will generate API errors" + [order-id ] + (:data (delete-order-with-http-info order-id))) diff --git a/samples/client/petstore/clojure/src/swagger_petstore/api/user.clj b/samples/client/petstore/clojure/src/swagger_petstore/api/user.clj index 64ad38627ed..c25d97aa7c4 100644 --- a/samples/client/petstore/clojure/src/swagger_petstore/api/user.clj +++ b/samples/client/petstore/clojure/src/swagger_petstore/api/user.clj @@ -2,12 +2,34 @@ (:require [swagger-petstore.core :refer [call-api check-required-params with-collection-format]]) (:import (java.io File))) +(defn create-user-with-http-info + "Create user + This can only be done by the logged in user." + ([] (create-user-with-http-info nil)) + ([{:keys [body ]}] + (call-api "/user" :post + {:path-params {} + :header-params {} + :query-params {} + :form-params {} + :body-param body + :content-types [] + :accepts ["application/json" "application/xml"] + :auth-names []}))) + (defn create-user "Create user This can only be done by the logged in user." ([] (create-user nil)) + ([optional-params] + (:data (create-user-with-http-info optional-params)))) + +(defn create-users-with-array-input-with-http-info + "Creates list of users with given input array + " + ([] (create-users-with-array-input-with-http-info nil)) ([{:keys [body ]}] - (call-api "/user" :post + (call-api "/user/createWithArray" :post {:path-params {} :header-params {} :query-params {} @@ -21,8 +43,15 @@ "Creates list of users with given input array " ([] (create-users-with-array-input nil)) + ([optional-params] + (:data (create-users-with-array-input-with-http-info optional-params)))) + +(defn create-users-with-list-input-with-http-info + "Creates list of users with given input array + " + ([] (create-users-with-list-input-with-http-info nil)) ([{:keys [body ]}] - (call-api "/user/createWithArray" :post + (call-api "/user/createWithList" :post {:path-params {} :header-params {} :query-params {} @@ -36,21 +65,13 @@ "Creates list of users with given input array " ([] (create-users-with-list-input nil)) - ([{:keys [body ]}] - (call-api "/user/createWithList" :post - {:path-params {} - :header-params {} - :query-params {} - :form-params {} - :body-param body - :content-types [] - :accepts ["application/json" "application/xml"] - :auth-names []}))) + ([optional-params] + (:data (create-users-with-list-input-with-http-info optional-params)))) -(defn login-user +(defn login-user-with-http-info "Logs user into the system " - ([] (login-user nil)) + ([] (login-user-with-http-info nil)) ([{:keys [username password ]}] (call-api "/user/login" :get {:path-params {} @@ -61,7 +82,14 @@ :accepts ["application/json" "application/xml"] :auth-names []}))) -(defn logout-user +(defn login-user + "Logs user into the system + " + ([] (login-user nil)) + ([optional-params] + (:data (login-user-with-http-info optional-params)))) + +(defn logout-user-with-http-info "Logs out current logged in user session " [] @@ -74,7 +102,13 @@ :accepts ["application/json" "application/xml"] :auth-names []})) -(defn get-user-by-name +(defn logout-user + "Logs out current logged in user session + " + [] + (:data (logout-user-with-http-info))) + +(defn get-user-by-name-with-http-info "Get user by user name " [username ] @@ -87,10 +121,16 @@ :accepts ["application/json" "application/xml"] :auth-names []})) -(defn update-user +(defn get-user-by-name + "Get user by user name + " + [username ] + (:data (get-user-by-name-with-http-info username))) + +(defn update-user-with-http-info "Updated user This can only be done by the logged in user." - ([username ] (update-user username nil)) + ([username ] (update-user-with-http-info username nil)) ([username {:keys [body ]}] (call-api "/user/{username}" :put {:path-params {"username" username } @@ -102,7 +142,14 @@ :accepts ["application/json" "application/xml"] :auth-names []}))) -(defn delete-user +(defn update-user + "Updated user + This can only be done by the logged in user." + ([username ] (update-user username nil)) + ([username optional-params] + (:data (update-user-with-http-info username optional-params)))) + +(defn delete-user-with-http-info "Delete user This can only be done by the logged in user." [username ] @@ -114,3 +161,9 @@ :content-types [] :accepts ["application/json" "application/xml"] :auth-names []})) + +(defn delete-user + "Delete user + This can only be done by the logged in user." + [username ] + (:data (delete-user-with-http-info username))) diff --git a/samples/client/petstore/clojure/src/swagger_petstore/core.clj b/samples/client/petstore/clojure/src/swagger_petstore/core.clj index bcb9ed99ad2..523e38aae75 100644 --- a/samples/client/petstore/clojure/src/swagger_petstore/core.clj +++ b/samples/client/petstore/clojure/src/swagger_petstore/core.clj @@ -198,9 +198,10 @@ (try (parse-string body true) (catch JsonParseException e - ;; return the body string directly on JSON parsing error + ;; Return the body string directly on JSON parsing error. body)) - ;; for non-JSON response, return the body string directly + + ;; For other cases, return the body string directly. :else body)) (defn form-params->multipart @@ -236,4 +237,4 @@ (when debug (println "Response:") (println resp)) - (deserialize resp))) + (assoc resp :data (deserialize resp)))) diff --git a/samples/client/petstore/clojure/test/swagger_petstore/api/pet_test.clj b/samples/client/petstore/clojure/test/swagger_petstore/api/pet_test.clj index 281179150a7..c825b995e39 100644 --- a/samples/client/petstore/clojure/test/swagger_petstore/api/pet_test.clj +++ b/samples/client/petstore/clojure/test/swagger_petstore/api/pet_test.clj @@ -30,6 +30,18 @@ (is (= (get-in pet [:category :name]) (get-in fetched [:category :name]))) (delete-pet id))) +(deftest test-create-and-get-pet-with-http-info + (let [{:keys [id] :as pet} (make-random-pet) + _ (add-pet-with-http-info {:body pet}) + {:keys [status headers data]} (get-pet-by-id-with-http-info id)] + (is (= 200 status)) + (is (= "application/json" (:content-type headers))) + (is (identity data)) + (is (= id (:id data))) + (is (identity (:category data))) + (is (= (get-in pet [:category :name]) (get-in data [:category :name]))) + (delete-pet id))) + (deftest test-find-pets-by-status (let [status "pending" {:keys [id] :as pet} (make-random-pet {:status status}) From 0818f0c8ad92622e2ff8ff106251c16173ab3682 Mon Sep 17 00:00:00 2001 From: wing328 Date: Fri, 4 Dec 2015 17:38:29 +0800 Subject: [PATCH 110/211] add batch script for php --- bin/php-petstore.bat | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100755 bin/php-petstore.bat diff --git a/bin/php-petstore.bat b/bin/php-petstore.bat new file mode 100755 index 00000000000..8c4b1dc7662 --- /dev/null +++ b/bin/php-petstore.bat @@ -0,0 +1,10 @@ +set executable="./modules/swagger-codegen-cli/target/swagger-codegen-cli.jar" + +If Not Exist %executable% ( + mvn clean package +) + +set JAVA_OPTS="%JAVA_OPST% -XX:MaxPermSize=256M -Xmx1024M -DloggerPath=conf/log4j.properties" +set ags="generate -t modules\swagger-codegen\src\main\resources\php -i modules\swagger-codegen\src\test\resources\2_0\petstore.json -l php -o samples\client\petstore\php" + +java %JAVA_OPTS% -jar %executable% %ags% From 14ec9c42cb866693011560ad063536ff44bc424f Mon Sep 17 00:00:00 2001 From: wing328 Date: Fri, 4 Dec 2015 17:48:48 +0800 Subject: [PATCH 111/211] add ruby windows patch, fix php batch file --- bin/php-petstore.bat | 6 +++--- bin/ruby-petstore.bat | 10 ++++++++++ 2 files changed, 13 insertions(+), 3 deletions(-) create mode 100755 bin/ruby-petstore.bat diff --git a/bin/php-petstore.bat b/bin/php-petstore.bat index 8c4b1dc7662..cc10b72a609 100755 --- a/bin/php-petstore.bat +++ b/bin/php-petstore.bat @@ -1,10 +1,10 @@ -set executable="./modules/swagger-codegen-cli/target/swagger-codegen-cli.jar" +set executable=.\modules\swagger-codegen-cli\target\swagger-codegen-cli.jar If Not Exist %executable% ( mvn clean package ) -set JAVA_OPTS="%JAVA_OPST% -XX:MaxPermSize=256M -Xmx1024M -DloggerPath=conf/log4j.properties" -set ags="generate -t modules\swagger-codegen\src\main\resources\php -i modules\swagger-codegen\src\test\resources\2_0\petstore.json -l php -o samples\client\petstore\php" +set JAVA_OPTS=%JAVA_OPTS% -XX:MaxPermSize=256M -Xmx1024M -DloggerPath=conf/log4j.properties +set ags=generate -t modules\swagger-codegen\src\main\resources\php -i modules\swagger-codegen\src\test\resources\2_0\petstore.json -l php -o samples\client\petstore\php java %JAVA_OPTS% -jar %executable% %ags% diff --git a/bin/ruby-petstore.bat b/bin/ruby-petstore.bat new file mode 100755 index 00000000000..3642a6e19ba --- /dev/null +++ b/bin/ruby-petstore.bat @@ -0,0 +1,10 @@ +set executable=.\modules\swagger-codegen-cli\target\swagger-codegen-cli.jar + +If Not Exist %executable% ( + mvn clean package +) + +set JAVA_OPTS=%JAVA_OPTS% -XX:MaxPermSize=256M -Xmx1024M -DloggerPath=conf/log4j.properties +set ags=generate -t modules\swagger-codegen\src\main\resources\ruby -i modules\swagger-codegen\src\test\resources\2_0\petstore.json -l ruby -o samples\client\petstore\ruby + +java %JAVA_OPTS% -jar %executable% %ags% From 3f328a4994a6c974a8c5efd4f35c6766616b7323 Mon Sep 17 00:00:00 2001 From: wing328 Date: Fri, 4 Dec 2015 18:08:59 +0800 Subject: [PATCH 112/211] add batch files for other languages --- bin/windows/akka-scala-petstore.bat | 10 ++++++++++ bin/windows/android-java-petstore.bat | 10 ++++++++++ bin/windows/async-scala-petstore.sh | 10 ++++++++++ bin/windows/clojure-petstore.bat | 10 ++++++++++ bin/windows/csharp-petstore.bat | 10 ++++++++++ bin/windows/dart-petstore.bat | 10 ++++++++++ bin/windows/dynamic-html-petstore.bat | 10 ++++++++++ bin/windows/flash-petstore.bat | 10 ++++++++++ bin/windows/html-petstore.bat | 10 ++++++++++ bin/windows/java-petstore.bat | 10 ++++++++++ bin/windows/objc-petstore.bat | 10 ++++++++++ bin/windows/perl-petstore.bat | 10 ++++++++++ bin/{ => windows}/php-petstore.bat | 0 bin/windows/python-petstore.bat | 10 ++++++++++ bin/windows/qt5cpp-petstore.bat | 10 ++++++++++ bin/{ => windows}/ruby-petstore.bat | 0 bin/windows/scala-petstore.bat | 10 ++++++++++ bin/windows/swift-petstore.bat | 10 ++++++++++ bin/windows/tizen-petstore.bat | 10 ++++++++++ bin/windows/typescript-angular.bat | 10 ++++++++++ bin/windows/typescript-node.bat | 10 ++++++++++ 21 files changed, 190 insertions(+) create mode 100755 bin/windows/akka-scala-petstore.bat create mode 100755 bin/windows/android-java-petstore.bat create mode 100755 bin/windows/async-scala-petstore.sh create mode 100755 bin/windows/clojure-petstore.bat create mode 100755 bin/windows/csharp-petstore.bat create mode 100755 bin/windows/dart-petstore.bat create mode 100755 bin/windows/dynamic-html-petstore.bat create mode 100755 bin/windows/flash-petstore.bat create mode 100755 bin/windows/html-petstore.bat create mode 100755 bin/windows/java-petstore.bat create mode 100755 bin/windows/objc-petstore.bat create mode 100755 bin/windows/perl-petstore.bat rename bin/{ => windows}/php-petstore.bat (100%) create mode 100755 bin/windows/python-petstore.bat create mode 100755 bin/windows/qt5cpp-petstore.bat rename bin/{ => windows}/ruby-petstore.bat (100%) create mode 100755 bin/windows/scala-petstore.bat create mode 100755 bin/windows/swift-petstore.bat create mode 100755 bin/windows/tizen-petstore.bat create mode 100755 bin/windows/typescript-angular.bat create mode 100755 bin/windows/typescript-node.bat diff --git a/bin/windows/akka-scala-petstore.bat b/bin/windows/akka-scala-petstore.bat new file mode 100755 index 00000000000..ecd7433d2e2 --- /dev/null +++ b/bin/windows/akka-scala-petstore.bat @@ -0,0 +1,10 @@ +set executable=.\modules\swagger-codegen-cli\target\swagger-codegen-cli.jar + +If Not Exist %executable% ( + mvn clean package +) + +set JAVA_OPTS=%JAVA_OPTS% -XX:MaxPermSize=256M -Xmx1024M -DloggerPath=conf/log4j.properties +set ags=generate -t modules\swagger-codegen\src\main\resources\akka-scala -i modules\swagger-codegen\src\test\resources\2_0\petstore.json -l akka-scala -o samples\client\petstore\akka-scala + +java %JAVA_OPTS% -jar %executable% %ags% diff --git a/bin/windows/android-java-petstore.bat b/bin/windows/android-java-petstore.bat new file mode 100755 index 00000000000..73997ee789a --- /dev/null +++ b/bin/windows/android-java-petstore.bat @@ -0,0 +1,10 @@ +set executable=.\modules\swagger-codegen-cli\target\swagger-codegen-cli.jar + +If Not Exist %executable% ( + mvn clean package +) + +set JAVA_OPTS=%JAVA_OPTS% -XX:MaxPermSize=256M -Xmx1024M -DloggerPath=conf/log4j.properties +set ags=generate -t modules\swagger-codegen\src\main\resources\android-java -i modules\swagger-codegen\src\test\resources\2_0\petstore.json -l android -o samples\client\petstore\android-java + +java %JAVA_OPTS% -jar %executable% %ags% diff --git a/bin/windows/async-scala-petstore.sh b/bin/windows/async-scala-petstore.sh new file mode 100755 index 00000000000..d2b772b91b8 --- /dev/null +++ b/bin/windows/async-scala-petstore.sh @@ -0,0 +1,10 @@ +set executable=.\modules\swagger-codegen-cli\target\swagger-codegen-cli.jar + +If Not Exist %executable% ( + mvn clean package +) + +set JAVA_OPTS=%JAVA_OPTS% -XX:MaxPermSize=256M -Xmx1024M -DloggerPath=conf/log4j.properties +set ags=generate -t modules\swagger-codegen\src\main\resources\asyncscala -i modules\swagger-codegen\src\test\resources\2_0\petstore.json -l async-scala -o samples\client\petstore\async-scala + +java %JAVA_OPTS% -jar %executable% %ags% diff --git a/bin/windows/clojure-petstore.bat b/bin/windows/clojure-petstore.bat new file mode 100755 index 00000000000..bfbb6663d11 --- /dev/null +++ b/bin/windows/clojure-petstore.bat @@ -0,0 +1,10 @@ +set executable=.\modules\swagger-codegen-cli\target\swagger-codegen-cli.jar + +If Not Exist %executable% ( + mvn clean package +) + +set JAVA_OPTS=%JAVA_OPTS% -XX:MaxPermSize=256M -Xmx1024M -DloggerPath=conf/log4j.properties +set ags=generate -t modules\swagger-codegen\src\main\resources\clojure -i modules\swagger-codegen\src\test\resources\2_0\petstore.json -l clojure -o samples\client\petstore\clojure + +java %JAVA_OPTS% -jar %executable% %ags% diff --git a/bin/windows/csharp-petstore.bat b/bin/windows/csharp-petstore.bat new file mode 100755 index 00000000000..ddfc466c85e --- /dev/null +++ b/bin/windows/csharp-petstore.bat @@ -0,0 +1,10 @@ +set executable=.\modules\swagger-codegen-cli\target\swagger-codegen-cli.jar + +If Not Exist %executable% ( + mvn clean package +) + +set JAVA_OPTS=%JAVA_OPTS% -XX:MaxPermSize=256M -Xmx1024M -DloggerPath=conf/log4j.properties +set ags=generate -t modules\swagger-codegen\src\main\resources\csharp -i modules\swagger-codegen\src\test\resources\2_0\petstore.json -l csharp -o samples\client\petstore\csharp + +java %JAVA_OPTS% -jar %executable% %ags% diff --git a/bin/windows/dart-petstore.bat b/bin/windows/dart-petstore.bat new file mode 100755 index 00000000000..bbf77fed2cc --- /dev/null +++ b/bin/windows/dart-petstore.bat @@ -0,0 +1,10 @@ +set executable=.\modules\swagger-codegen-cli\target\swagger-codegen-cli.jar + +If Not Exist %executable% ( + mvn clean package +) + +set JAVA_OPTS=%JAVA_OPTS% -XX:MaxPermSize=256M -Xmx1024M -DloggerPath=conf/log4j.properties +set ags=generate -t modules\swagger-codegen\src\main\resources\dart -i modules\swagger-codegen\src\test\resources\2_0\petstore.json -l dart -o samples\client\petstore\dart + +java %JAVA_OPTS% -jar %executable% %ags% diff --git a/bin/windows/dynamic-html-petstore.bat b/bin/windows/dynamic-html-petstore.bat new file mode 100755 index 00000000000..27595a54a16 --- /dev/null +++ b/bin/windows/dynamic-html-petstore.bat @@ -0,0 +1,10 @@ +set executable=.\modules\swagger-codegen-cli\target\swagger-codegen-cli.jar + +If Not Exist %executable% ( + mvn clean package +) + +set JAVA_OPTS=%JAVA_OPTS% -XX:MaxPermSize=256M -Xmx1024M -DloggerPath=conf/log4j.properties +set ags=generate -t modules\swagger-codegen\src\main\resources\dynamic-html -i modules\swagger-codegen\src\test\resources\2_0\petstore.json -l dynamic-html -o samples\client\petstore\dynamic-html + +java %JAVA_OPTS% -jar %executable% %ags% diff --git a/bin/windows/flash-petstore.bat b/bin/windows/flash-petstore.bat new file mode 100755 index 00000000000..9e4445b77ea --- /dev/null +++ b/bin/windows/flash-petstore.bat @@ -0,0 +1,10 @@ +set executable=.\modules\swagger-codegen-cli\target\swagger-codegen-cli.jar + +If Not Exist %executable% ( + mvn clean package +) + +set JAVA_OPTS=%JAVA_OPTS% -XX:MaxPermSize=256M -Xmx1024M -DloggerPath=conf/log4j.properties +set ags=generate -t modules\swagger-codegen\src\main\resources\flash -i modules\swagger-codegen\src\test\resources\2_0\petstore.json -l flash -o samples\client\petstore\flash + +java %JAVA_OPTS% -jar %executable% %ags% diff --git a/bin/windows/html-petstore.bat b/bin/windows/html-petstore.bat new file mode 100755 index 00000000000..82cc490027a --- /dev/null +++ b/bin/windows/html-petstore.bat @@ -0,0 +1,10 @@ +set executable=.\modules\swagger-codegen-cli\target\swagger-codegen-cli.jar + +If Not Exist %executable% ( + mvn clean package +) + +set JAVA_OPTS=%JAVA_OPTS% -XX:MaxPermSize=256M -Xmx1024M -DloggerPath=conf/log4j.properties +set ags=generate -t modules\swagger-codegen\src\main\resources\html -i modules\swagger-codegen\src\test\resources\2_0\petstore.json -l html -o samples\client\petstore\html + +java %JAVA_OPTS% -jar %executable% %ags% diff --git a/bin/windows/java-petstore.bat b/bin/windows/java-petstore.bat new file mode 100755 index 00000000000..18544cbad36 --- /dev/null +++ b/bin/windows/java-petstore.bat @@ -0,0 +1,10 @@ +set executable=.\modules\swagger-codegen-cli\target\swagger-codegen-cli.jar + +If Not Exist %executable% ( + mvn clean package +) + +set JAVA_OPTS=%JAVA_OPTS% -XX:MaxPermSize=256M -Xmx1024M -DloggerPath=conf/log4j.properties +set ags=generate -t modules\swagger-codegen\src\main\resources\java -i modules\swagger-codegen\src\test\resources\2_0\petstore.json -l java -o samples\client\petstore\java + +java %JAVA_OPTS% -jar %executable% %ags% diff --git a/bin/windows/objc-petstore.bat b/bin/windows/objc-petstore.bat new file mode 100755 index 00000000000..777cc621501 --- /dev/null +++ b/bin/windows/objc-petstore.bat @@ -0,0 +1,10 @@ +set executable=.\modules\swagger-codegen-cli\target\swagger-codegen-cli.jar + +If Not Exist %executable% ( + mvn clean package +) + +set JAVA_OPTS=%JAVA_OPTS% -XX:MaxPermSize=256M -Xmx1024M -DloggerPath=conf/log4j.properties +set ags=generate -t modules\swagger-codegen\src\main\resources\objc -i modules\swagger-codegen\src\test\resources\2_0\petstore.json -l objc -o samples\client\petstore\objc + +java %JAVA_OPTS% -jar %executable% %ags% diff --git a/bin/windows/perl-petstore.bat b/bin/windows/perl-petstore.bat new file mode 100755 index 00000000000..da526e40dd7 --- /dev/null +++ b/bin/windows/perl-petstore.bat @@ -0,0 +1,10 @@ +set executable=.\modules\swagger-codegen-cli\target\swagger-codegen-cli.jar + +If Not Exist %executable% ( + mvn clean package +) + +set JAVA_OPTS=%JAVA_OPTS% -XX:MaxPermSize=256M -Xmx1024M -DloggerPath=conf/log4j.properties +set ags=generate -t modules\swagger-codegen\src\main\resources\perl -i modules\swagger-codegen\src\test\resources\2_0\petstore.json -l perl -o samples\client\petstore\perl + +java %JAVA_OPTS% -jar %executable% %ags% diff --git a/bin/php-petstore.bat b/bin/windows/php-petstore.bat similarity index 100% rename from bin/php-petstore.bat rename to bin/windows/php-petstore.bat diff --git a/bin/windows/python-petstore.bat b/bin/windows/python-petstore.bat new file mode 100755 index 00000000000..2762cf15b81 --- /dev/null +++ b/bin/windows/python-petstore.bat @@ -0,0 +1,10 @@ +set executable=.\modules\swagger-codegen-cli\target\swagger-codegen-cli.jar + +If Not Exist %executable% ( + mvn clean package +) + +set JAVA_OPTS=%JAVA_OPTS% -XX:MaxPermSize=256M -Xmx1024M -DloggerPath=conf/log4j.properties +set ags=generate -t modules\swagger-codegen\src\main\resources\python -i modules\swagger-codegen\src\test\resources\2_0\petstore.json -l python -o samples\client\petstore\python + +java %JAVA_OPTS% -jar %executable% %ags% diff --git a/bin/windows/qt5cpp-petstore.bat b/bin/windows/qt5cpp-petstore.bat new file mode 100755 index 00000000000..3c5b849a3f1 --- /dev/null +++ b/bin/windows/qt5cpp-petstore.bat @@ -0,0 +1,10 @@ +set executable=.\modules\swagger-codegen-cli\target\swagger-codegen-cli.jar + +If Not Exist %executable% ( + mvn clean package +) + +set JAVA_OPTS=%JAVA_OPTS% -XX:MaxPermSize=256M -Xmx1024M -DloggerPath=conf/log4j.properties +set ags=generate -t modules\swagger-codegen\src\main\resources\qt5cpp -i modules\swagger-codegen\src\test\resources\2_0\petstore.json -l qt5cpp -o samples\client\petstore\qt5cpp + +java %JAVA_OPTS% -jar %executable% %ags% diff --git a/bin/ruby-petstore.bat b/bin/windows/ruby-petstore.bat similarity index 100% rename from bin/ruby-petstore.bat rename to bin/windows/ruby-petstore.bat diff --git a/bin/windows/scala-petstore.bat b/bin/windows/scala-petstore.bat new file mode 100755 index 00000000000..5d72d6e0c61 --- /dev/null +++ b/bin/windows/scala-petstore.bat @@ -0,0 +1,10 @@ +set executable=.\modules\swagger-codegen-cli\target\swagger-codegen-cli.jar + +If Not Exist %executable% ( + mvn clean package +) + +set JAVA_OPTS=%JAVA_OPTS% -XX:MaxPermSize=256M -Xmx1024M -DloggerPath=conf/log4j.properties +set ags=generate -t modules\swagger-codegen\src\main\resources\scala -i modules\swagger-codegen\src\test\resources\2_0\petstore.json -l scala -o samples\client\petstore\scala + +java %JAVA_OPTS% -jar %executable% %ags% diff --git a/bin/windows/swift-petstore.bat b/bin/windows/swift-petstore.bat new file mode 100755 index 00000000000..31d19c18399 --- /dev/null +++ b/bin/windows/swift-petstore.bat @@ -0,0 +1,10 @@ +set executable=.\modules\swagger-codegen-cli\target\swagger-codegen-cli.jar + +If Not Exist %executable% ( + mvn clean package +) + +set JAVA_OPTS=%JAVA_OPTS% -XX:MaxPermSize=256M -Xmx1024M -DloggerPath=conf/log4j.properties +set ags=generate -t modules\swagger-codegen\src\main\resources\swift -i modules\swagger-codegen\src\test\resources\2_0\petstore.json -l swift -o samples\client\petstore\swift + +java %JAVA_OPTS% -jar %executable% %ags% diff --git a/bin/windows/tizen-petstore.bat b/bin/windows/tizen-petstore.bat new file mode 100755 index 00000000000..27122c2cb94 --- /dev/null +++ b/bin/windows/tizen-petstore.bat @@ -0,0 +1,10 @@ +set executable=.\modules\swagger-codegen-cli\target\swagger-codegen-cli.jar + +If Not Exist %executable% ( + mvn clean package +) + +set JAVA_OPTS=%JAVA_OPTS% -XX:MaxPermSize=256M -Xmx1024M -DloggerPath=conf/log4j.properties +set ags=generate -t modules\swagger-codegen\src\main\resources\tizen -i modules\swagger-codegen\src\test\resources\2_0\petstore.json -l tizen -o samples\client\petstore\tizen + +java %JAVA_OPTS% -jar %executable% %ags% diff --git a/bin/windows/typescript-angular.bat b/bin/windows/typescript-angular.bat new file mode 100755 index 00000000000..d77012e1b3d --- /dev/null +++ b/bin/windows/typescript-angular.bat @@ -0,0 +1,10 @@ +set executable=.\modules\swagger-codegen-cli\target\swagger-codegen-cli.jar + +If Not Exist %executable% ( + mvn clean package +) + +set JAVA_OPTS=%JAVA_OPTS% -XX:MaxPermSize=256M -Xmx1024M -DloggerPath=conf/log4j.properties +set ags=generate -t modules\swagger-codegen\src\main\resources\typescript-angular -i modules\swagger-codegen\src\test\resources\2_0\petstore.json -l typescript-angular -o samples\client\petstore\typescript-angular + +java %JAVA_OPTS% -jar %executable% %ags% diff --git a/bin/windows/typescript-node.bat b/bin/windows/typescript-node.bat new file mode 100755 index 00000000000..b6d47abd1af --- /dev/null +++ b/bin/windows/typescript-node.bat @@ -0,0 +1,10 @@ +set executable=.\modules\swagger-codegen-cli\target\swagger-codegen-cli.jar + +If Not Exist %executable% ( + mvn clean package +) + +set JAVA_OPTS=%JAVA_OPTS% -XX:MaxPermSize=256M -Xmx1024M -DloggerPath=conf/log4j.properties +set ags=generate -t modules\swagger-codegen\src\main\resources\typescript-node -i modules\swagger-codegen\src\test\resources\2_0\petstore.json -l typescript-node -o samples\client\petstore\typescript-node + +java %JAVA_OPTS% -jar %executable% %ags% From fe96d8769f5f2a868a913355cd91e58a21cf7b67 Mon Sep 17 00:00:00 2001 From: wing328 Date: Fri, 4 Dec 2015 18:16:46 +0800 Subject: [PATCH 113/211] minor fix to csharp and objc batch file --- bin/windows/csharp-petstore.bat | 2 +- bin/windows/objc-petstore.bat | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/bin/windows/csharp-petstore.bat b/bin/windows/csharp-petstore.bat index ddfc466c85e..227ed319441 100755 --- a/bin/windows/csharp-petstore.bat +++ b/bin/windows/csharp-petstore.bat @@ -5,6 +5,6 @@ If Not Exist %executable% ( ) set JAVA_OPTS=%JAVA_OPTS% -XX:MaxPermSize=256M -Xmx1024M -DloggerPath=conf/log4j.properties -set ags=generate -t modules\swagger-codegen\src\main\resources\csharp -i modules\swagger-codegen\src\test\resources\2_0\petstore.json -l csharp -o samples\client\petstore\csharp +set ags=generate -t modules\swagger-codegen\src\main\resources\csharp -i modules\swagger-codegen\src\test\resources\2_0\petstore.json -l csharp -o samples\client\petstore\csharp\SwaggerClientTest\Lib\SwaggerClient java %JAVA_OPTS% -jar %executable% %ags% diff --git a/bin/windows/objc-petstore.bat b/bin/windows/objc-petstore.bat index 777cc621501..a26b0dad566 100755 --- a/bin/windows/objc-petstore.bat +++ b/bin/windows/objc-petstore.bat @@ -7,4 +7,4 @@ If Not Exist %executable% ( set JAVA_OPTS=%JAVA_OPTS% -XX:MaxPermSize=256M -Xmx1024M -DloggerPath=conf/log4j.properties set ags=generate -t modules\swagger-codegen\src\main\resources\objc -i modules\swagger-codegen\src\test\resources\2_0\petstore.json -l objc -o samples\client\petstore\objc -java %JAVA_OPTS% -jar %executable% %ags% +java %JAVA_OPTS% -DappName=PetstoreClient -jar %executable% %ags% From 1f68d0f7b0661789bc81c2bf07359b1e5cbe5783 Mon Sep 17 00:00:00 2001 From: wing328 Date: Thu, 3 Dec 2015 00:44:15 +0800 Subject: [PATCH 114/211] fix issue with petstore in windows --- .../java/io/swagger/codegen/languages/PhpClientCodegen.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) 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 5b22fbdbadb..917342f9bbf 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 @@ -15,6 +15,7 @@ import java.io.File; import java.util.Arrays; import java.util.HashMap; import java.util.HashSet; +import java.util.regex.Matcher; import org.apache.commons.lang3.StringUtils; @@ -129,7 +130,7 @@ public class PhpClientCodegen extends DefaultCodegen implements CodegenConfig { return (getPackagePath() + File.separatorChar + basePath // Replace period, backslash, forward slash with file separator in package name - + packageName.replaceAll("[\\.\\\\/]", File.separator) + + packageName.replaceAll("[\\.\\\\/]", Matcher.quoteReplacement(File.separator)) // Trim prefix file separators from package path .replaceAll(regFirstPathSeparator, "")) // Trim trailing file separators from the overall path From e182ad7897fe2c186b85d37c383999ef2692aac5 Mon Sep 17 00:00:00 2001 From: wing328 Date: Fri, 4 Dec 2015 22:29:29 +0800 Subject: [PATCH 115/211] add log to php code gen --- .../codegen/languages/PhpClientCodegen.java | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 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 917342f9bbf..29f029acda9 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 @@ -19,7 +19,12 @@ import java.util.regex.Matcher; import org.apache.commons.lang3.StringUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + public class PhpClientCodegen extends DefaultCodegen implements CodegenConfig { + static Logger LOGGER = LoggerFactory.getLogger(PhpClientCodegen.class); + public static final String VARIABLE_NAMING_CONVENTION = "variableNamingConvention"; public static final String PACKAGE_PATH = "packagePath"; public static final String SRC_BASE_PATH = "srcBasePath"; @@ -109,6 +114,8 @@ public class PhpClientCodegen extends DefaultCodegen implements CodegenConfig { } public String toPackagePath(String packageName, String basePath) { + LOGGER.info("============================"); + LOGGER.info("packageName = " + packageName); packageName = packageName.replace(invokerPackage, ""); if (basePath != null && basePath.length() > 0) { basePath = basePath.replaceAll("[\\\\/]?$", "") + File.separatorChar; @@ -120,6 +127,7 @@ public class PhpClientCodegen extends DefaultCodegen implements CodegenConfig { } else { // for windows regFirstPathSeparator = "^\\\\"; } + LOGGER.info("regFirstPathSeparator = " + regFirstPathSeparator); String regLastPathSeparator; if ("/".equals(File.separator)) { // for mac, linux @@ -127,6 +135,8 @@ public class PhpClientCodegen extends DefaultCodegen implements CodegenConfig { } else { // for windows regLastPathSeparator = "\\\\$"; } + LOGGER.info("regLastPathSeparator= " + regLastPathSeparator); + LOGGER.info("packageName = " + packageName); return (getPackagePath() + File.separatorChar + basePath // Replace period, backslash, forward slash with file separator in package name @@ -218,11 +228,11 @@ public class PhpClientCodegen extends DefaultCodegen implements CodegenConfig { @Override public String apiFileFolder() { - return (outputFolder + "/" + toPackagePath(apiPackage(), srcBasePath)); + return (outputFolder + "/" + toPackagePath(apiPackage, srcBasePath)); } public String modelFileFolder() { - return (outputFolder + "/" + toPackagePath(modelPackage(), srcBasePath)); + return (outputFolder + "/" + toPackagePath(modelPackage, srcBasePath)); } @Override From ddd52f613f6f4cc64285c6a1654900d9888a27f1 Mon Sep 17 00:00:00 2001 From: wing328 Date: Fri, 4 Dec 2015 22:37:16 +0800 Subject: [PATCH 116/211] remove logging from php generator --- .../java/io/swagger/codegen/languages/PhpClientCodegen.java | 5 ----- 1 file changed, 5 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 29f029acda9..56df40219f5 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 @@ -114,8 +114,6 @@ public class PhpClientCodegen extends DefaultCodegen implements CodegenConfig { } public String toPackagePath(String packageName, String basePath) { - LOGGER.info("============================"); - LOGGER.info("packageName = " + packageName); packageName = packageName.replace(invokerPackage, ""); if (basePath != null && basePath.length() > 0) { basePath = basePath.replaceAll("[\\\\/]?$", "") + File.separatorChar; @@ -127,7 +125,6 @@ public class PhpClientCodegen extends DefaultCodegen implements CodegenConfig { } else { // for windows regFirstPathSeparator = "^\\\\"; } - LOGGER.info("regFirstPathSeparator = " + regFirstPathSeparator); String regLastPathSeparator; if ("/".equals(File.separator)) { // for mac, linux @@ -135,8 +132,6 @@ public class PhpClientCodegen extends DefaultCodegen implements CodegenConfig { } else { // for windows regLastPathSeparator = "\\\\$"; } - LOGGER.info("regLastPathSeparator= " + regLastPathSeparator); - LOGGER.info("packageName = " + packageName); return (getPackagePath() + File.separatorChar + basePath // Replace period, backslash, forward slash with file separator in package name From 4edeed6053187d6c41d121821ce44f3e8e08db86 Mon Sep 17 00:00:00 2001 From: Ian McEwen Date: Wed, 2 Dec 2015 10:05:37 -0700 Subject: [PATCH 117/211] Clojure client: put docstrings in the right place in core.clj. --- .../src/main/resources/clojure/core.mustache | 6 ++++-- .../client/petstore/clojure/src/swagger_petstore/core.clj | 6 ++++-- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/modules/swagger-codegen/src/main/resources/clojure/core.mustache b/modules/swagger-codegen/src/main/resources/clojure/core.mustache index b05df804a7f..1a5de110ef3 100644 --- a/modules/swagger-codegen/src/main/resources/clojure/core.mustache +++ b/modules/swagger-codegen/src/main/resources/clojure/core.mustache @@ -169,15 +169,17 @@ (map (fn [[k v]] [k (normalize-param v)])) (into {}))) -(defn json-mime? [mime] +(defn json-mime? "Check if the given MIME is a standard JSON MIME or :json." + [mime] (if mime (or (= :json mime) (re-matches #"application/json(;.*)?" (name mime))))) -(defn json-preferred-mime [mimes] +(defn json-preferred-mime "Choose a MIME from the given MIMEs with JSON preferred, i.e. return JSON if included, otherwise return the first one." + [mimes] (-> (filter json-mime? mimes) first (or (first mimes)))) diff --git a/samples/client/petstore/clojure/src/swagger_petstore/core.clj b/samples/client/petstore/clojure/src/swagger_petstore/core.clj index bcb9ed99ad2..0054d0ff82d 100644 --- a/samples/client/petstore/clojure/src/swagger_petstore/core.clj +++ b/samples/client/petstore/clojure/src/swagger_petstore/core.clj @@ -169,15 +169,17 @@ (map (fn [[k v]] [k (normalize-param v)])) (into {}))) -(defn json-mime? [mime] +(defn json-mime? "Check if the given MIME is a standard JSON MIME or :json." + [mime] (if mime (or (= :json mime) (re-matches #"application/json(;.*)?" (name mime))))) -(defn json-preferred-mime [mimes] +(defn json-preferred-mime "Choose a MIME from the given MIMEs with JSON preferred, i.e. return JSON if included, otherwise return the first one." + [mimes] (-> (filter json-mime? mimes) first (or (first mimes)))) From adb26d83f7a0d515f3c0c1a9fe63840b5727a12a Mon Sep 17 00:00:00 2001 From: Johannes Fiala Date: Sat, 5 Dec 2015 17:35:18 +0100 Subject: [PATCH 118/211] Add basic JS SDK support, see Document client SDK #1294 --- .../languages/JavascriptClientCodegen.java | 599 ++++++++++++++++ .../resources/Javascript/ApiClient.mustache | 654 ++++++++++++++++++ .../Javascript/Configuration.mustache | 22 + .../main/resources/Javascript/JSON.mustache | 55 ++ .../main/resources/Javascript/Pair.mustache | 39 ++ .../resources/Javascript/StringUtil.mustache | 51 ++ .../resources/Javascript/TypeRef.mustache | 26 + .../main/resources/Javascript/api.mustache | 113 +++ .../Javascript/apiException.mustache | 69 ++ .../Javascript/build.gradle.mustache | 107 +++ .../resources/Javascript/enumClass.mustache | 7 + .../Javascript/generatedAnnotation.mustache | 1 + .../Javascript/gradle.properties.mustache | 2 + .../main/resources/Javascript/model.mustache | 41 ++ .../resources/Javascript/model_full.mustache | 61 ++ .../main/resources/Javascript/pom.mustache | 171 +++++ .../Javascript/settings.gradle.mustache | 1 + 17 files changed, 2019 insertions(+) create mode 100644 modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/JavascriptClientCodegen.java create mode 100644 modules/swagger-codegen/src/main/resources/Javascript/ApiClient.mustache create mode 100644 modules/swagger-codegen/src/main/resources/Javascript/Configuration.mustache create mode 100644 modules/swagger-codegen/src/main/resources/Javascript/JSON.mustache create mode 100644 modules/swagger-codegen/src/main/resources/Javascript/Pair.mustache create mode 100644 modules/swagger-codegen/src/main/resources/Javascript/StringUtil.mustache create mode 100644 modules/swagger-codegen/src/main/resources/Javascript/TypeRef.mustache create mode 100644 modules/swagger-codegen/src/main/resources/Javascript/api.mustache create mode 100644 modules/swagger-codegen/src/main/resources/Javascript/apiException.mustache create mode 100644 modules/swagger-codegen/src/main/resources/Javascript/build.gradle.mustache create mode 100644 modules/swagger-codegen/src/main/resources/Javascript/enumClass.mustache create mode 100644 modules/swagger-codegen/src/main/resources/Javascript/generatedAnnotation.mustache create mode 100644 modules/swagger-codegen/src/main/resources/Javascript/gradle.properties.mustache create mode 100644 modules/swagger-codegen/src/main/resources/Javascript/model.mustache create mode 100644 modules/swagger-codegen/src/main/resources/Javascript/model_full.mustache create mode 100644 modules/swagger-codegen/src/main/resources/Javascript/pom.mustache create mode 100644 modules/swagger-codegen/src/main/resources/Javascript/settings.gradle.mustache diff --git a/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/JavascriptClientCodegen.java b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/JavascriptClientCodegen.java new file mode 100644 index 00000000000..0beda074ea9 --- /dev/null +++ b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/JavascriptClientCodegen.java @@ -0,0 +1,599 @@ +package io.swagger.codegen.languages; + +import com.google.common.base.Strings; + +import io.swagger.codegen.CliOption; +import io.swagger.codegen.CodegenConfig; +import io.swagger.codegen.CodegenConstants; +import io.swagger.codegen.CodegenModel; +import io.swagger.codegen.CodegenOperation; +import io.swagger.codegen.CodegenProperty; +import io.swagger.codegen.CodegenType; +import io.swagger.codegen.DefaultCodegen; +import io.swagger.codegen.SupportingFile; +import io.swagger.models.Model; +import io.swagger.models.properties.ArrayProperty; +import io.swagger.models.properties.LongProperty; +import io.swagger.models.properties.MapProperty; +import io.swagger.models.properties.Property; +import io.swagger.models.properties.RefProperty; + +import java.io.File; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Iterator; +import java.util.List; +import java.util.Map; + +import org.apache.commons.lang.StringUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class JavascriptClientCodegen extends DefaultCodegen implements CodegenConfig { + private static final Logger LOGGER = LoggerFactory.getLogger(JavascriptClientCodegen.class); + + protected String invokerPackage = "io.swagger.client"; + protected String groupId = "io.swagger"; + protected String artifactId = "swagger-java-client"; + protected String artifactVersion = "1.0.0"; + protected String sourceFolder = "src"; + protected String localVariablePrefix = ""; + protected boolean fullJavaUtil = false; + protected String javaUtilPrefix = ""; + protected Boolean serializableModel = false; + + public JavascriptClientCodegen() { + super(); + outputFolder = "generated-code/js"; + modelTemplateFiles.put("model.mustache", ".js"); + apiTemplateFiles.put("api.mustache", ".js"); + templateDir = "Javascript"; + apiPackage = "io.swagger.client.api"; + modelPackage = "io.swagger.client.model"; + + reservedWords = new HashSet( + Arrays.asList( + "abstract", "continue", "for", "new", "switch", "assert", + "default", "if", "package", "synchronized", "boolean", "do", "goto", "private", + "this", "break", "double", "implements", "protected", "throw", "byte", "else", + "import", "public", "throws", "case", "enum", "instanceof", "return", "transient", + "catch", "extends", "int", "short", "try", "char", "final", "interface", "static", + "void", "class", "finally", "long", "strictfp", "volatile", "const", "float", + "native", "super", "while") + ); + + languageSpecificPrimitives = new HashSet( + Arrays.asList( + "String", + "boolean", + "Boolean", + "Double", + "Integer", + "Long", + "Float", + "Object", + "byte[]") + ); + instantiationTypes.put("array", "ArrayList"); + instantiationTypes.put("map", "HashMap"); + + cliOptions.add(new CliOption(CodegenConstants.INVOKER_PACKAGE, CodegenConstants.INVOKER_PACKAGE_DESC)); + cliOptions.add(new CliOption(CodegenConstants.GROUP_ID, CodegenConstants.GROUP_ID_DESC)); + cliOptions.add(new CliOption(CodegenConstants.ARTIFACT_ID, CodegenConstants.ARTIFACT_ID_DESC)); + cliOptions.add(new CliOption(CodegenConstants.ARTIFACT_VERSION, CodegenConstants.ARTIFACT_VERSION_DESC)); + cliOptions.add(new CliOption(CodegenConstants.SOURCE_FOLDER, CodegenConstants.SOURCE_FOLDER_DESC)); + cliOptions.add(new CliOption(CodegenConstants.LOCAL_VARIABLE_PREFIX, CodegenConstants.LOCAL_VARIABLE_PREFIX_DESC)); + cliOptions.add(new CliOption(CodegenConstants.SERIALIZABLE_MODEL, CodegenConstants.SERIALIZABLE_MODEL_DESC)); + cliOptions.add(new CliOption("fullJavaUtil", "whether to use fully qualified name for classes under java.util (default to false)")); + + /* + supportedLibraries.put("", "HTTP client: Jersey client 1.18. JSON processing: Jackson 2.4.2"); + supportedLibraries.put("jersey2", "HTTP client: Jersey client 2.6"); + supportedLibraries.put("okhttp-gson", "HTTP client: OkHttp 2.4.0. JSON processing: Gson 2.3.1"); + supportedLibraries.put("retrofit", "HTTP client: OkHttp 2.4.0. JSON processing: Gson 2.3.1 (Retrofit 1.9.0)"); + cliOptions.add(buildLibraryCliOption(supportedLibraries));*/ + } + + @Override + public CodegenType getTag() { + return CodegenType.CLIENT; + } + + @Override + public String getName() { + return "javascript"; + } + + @Override + public String getHelp() { + return "Generates a Javascript client library."; + } + + @Override + public void processOpts() { + super.processOpts(); +/* + if (additionalProperties.containsKey(CodegenConstants.INVOKER_PACKAGE)) { + this.setInvokerPackage((String) additionalProperties.get(CodegenConstants.INVOKER_PACKAGE)); + } else { + //not set, use default to be passed to template + additionalProperties.put(CodegenConstants.INVOKER_PACKAGE, invokerPackage); + } + + if (additionalProperties.containsKey(CodegenConstants.GROUP_ID)) { + this.setGroupId((String) additionalProperties.get(CodegenConstants.GROUP_ID)); + } else { + //not set, use to be passed to template + additionalProperties.put(CodegenConstants.GROUP_ID, groupId); + } + + if (additionalProperties.containsKey(CodegenConstants.ARTIFACT_ID)) { + this.setArtifactId((String) additionalProperties.get(CodegenConstants.ARTIFACT_ID)); + } else { + //not set, use to be passed to template + additionalProperties.put(CodegenConstants.ARTIFACT_ID, artifactId); + } + + if (additionalProperties.containsKey(CodegenConstants.ARTIFACT_VERSION)) { + this.setArtifactVersion((String) additionalProperties.get(CodegenConstants.ARTIFACT_VERSION)); + } else { + //not set, use to be passed to template + additionalProperties.put(CodegenConstants.ARTIFACT_VERSION, artifactVersion); + } + + if (additionalProperties.containsKey(CodegenConstants.SOURCE_FOLDER)) { + this.setSourceFolder((String) additionalProperties.get(CodegenConstants.SOURCE_FOLDER)); + } + + + if (additionalProperties.containsKey(CodegenConstants.LOCAL_VARIABLE_PREFIX)) { + this.setLocalVariablePrefix((String) additionalProperties.get(CodegenConstants.LOCAL_VARIABLE_PREFIX)); + } + + if (additionalProperties.containsKey(CodegenConstants.SERIALIZABLE_MODEL)) { + this.setSerializableModel(Boolean.valueOf((String)additionalProperties.get(CodegenConstants.SERIALIZABLE_MODEL).toString())); + } + + if (additionalProperties.containsKey(CodegenConstants.LIBRARY)) { + this.setLibrary((String) additionalProperties.get(CodegenConstants.LIBRARY)); + } + + // need to put back serializableModel (boolean) into additionalProperties as value in additionalProperties is string + additionalProperties.put(CodegenConstants.SERIALIZABLE_MODEL, serializableModel); + + if (additionalProperties.containsKey("fullJavaUtil")) { + fullJavaUtil = Boolean.valueOf(additionalProperties.get("fullJavaUtil").toString()); + } + if (fullJavaUtil) { + javaUtilPrefix = "java.util."; + } + additionalProperties.put("fullJavaUtil", fullJavaUtil); + additionalProperties.put("javaUtilPrefix", javaUtilPrefix); + + if (fullJavaUtil) { + typeMapping.put("array", "java.util.List"); + typeMapping.put("map", "java.util.Map"); + typeMapping.put("DateTime", "java.util.Date"); + typeMapping.remove("List"); + importMapping.remove("Date"); + importMapping.remove("Map"); + importMapping.remove("HashMap"); + importMapping.remove("Array"); + importMapping.remove("ArrayList"); + importMapping.remove("List"); + importMapping.remove("Set"); + importMapping.remove("DateTime"); + instantiationTypes.put("array", "java.util.ArrayList"); + instantiationTypes.put("map", "java.util.HashMap"); + } + + this.sanitizeConfig(); + + final String invokerFolder = (sourceFolder + File.separator + invokerPackage).replace(".", File.separator); + supportingFiles.add(new SupportingFile("pom.mustache", "", "pom.xml")); + supportingFiles.add(new SupportingFile("build.gradle.mustache", "", "build.gradle")); + supportingFiles.add(new SupportingFile("settings.gradle.mustache", "", "settings.gradle")); + supportingFiles.add(new SupportingFile("gradle.properties.mustache", "", "gradle.properties")); + supportingFiles.add(new SupportingFile("ApiClient.mustache", invokerFolder, "ApiClient.java")); + supportingFiles.add(new SupportingFile("StringUtil.mustache", invokerFolder, "StringUtil.java")); + + final String authFolder = (sourceFolder + File.separator + invokerPackage + ".auth").replace(".", File.separator); + supportingFiles.add(new SupportingFile("auth/HttpBasicAuth.mustache", authFolder, "HttpBasicAuth.java")); + supportingFiles.add(new SupportingFile("auth/ApiKeyAuth.mustache", authFolder, "ApiKeyAuth.java")); + supportingFiles.add(new SupportingFile("auth/OAuth.mustache", authFolder, "OAuth.java")); + supportingFiles.add(new SupportingFile("auth/OAuthFlow.mustache", authFolder, "OAuthFlow.java")); + + if (!"retrofit".equals(getLibrary())) { + supportingFiles.add(new SupportingFile("apiException.mustache", invokerFolder, "ApiException.java")); + supportingFiles.add(new SupportingFile("Configuration.mustache", invokerFolder, "Configuration.java")); + supportingFiles.add(new SupportingFile("JSON.mustache", invokerFolder, "JSON.java")); + supportingFiles.add(new SupportingFile("Pair.mustache", invokerFolder, "Pair.java")); + supportingFiles.add(new SupportingFile("auth/Authentication.mustache", authFolder, "Authentication.java")); + } + + // library-specific files + if ("okhttp-gson".equals(getLibrary())) { + // the "okhttp-gson" library template requires "ApiCallback.mustache" for async call + supportingFiles.add(new SupportingFile("ApiCallback.mustache", invokerFolder, "ApiCallback.java")); + // "build.sbt" is for development with SBT + supportingFiles.add(new SupportingFile("build.sbt.mustache", "", "build.sbt")); + } else if ("retrofit".equals(getLibrary())) { + supportingFiles.add(new SupportingFile("auth/OAuthOkHttpClient.mustache", authFolder, "OAuthOkHttpClient.java")); + supportingFiles.add(new SupportingFile("CollectionFormats.mustache", invokerFolder, "CollectionFormats.java")); + } else { + supportingFiles.add(new SupportingFile("TypeRef.mustache", invokerFolder, "TypeRef.java")); + }*/ + } +/* + private void sanitizeConfig() { + // Sanitize any config options here. We also have to update the additionalProperties because + // the whole additionalProperties object is injected into the main object passed to the mustache layer + + this.setApiPackage(sanitizePackageName(apiPackage)); + if (additionalProperties.containsKey(CodegenConstants.API_PACKAGE)) { + this.additionalProperties.put(CodegenConstants.API_PACKAGE, apiPackage); + } + + this.setModelPackage(sanitizePackageName(modelPackage)); + if (additionalProperties.containsKey(CodegenConstants.MODEL_PACKAGE)) { + this.additionalProperties.put(CodegenConstants.MODEL_PACKAGE, modelPackage); + } + + this.setInvokerPackage(sanitizePackageName(invokerPackage)); + if (additionalProperties.containsKey(CodegenConstants.INVOKER_PACKAGE)) { + this.additionalProperties.put(CodegenConstants.INVOKER_PACKAGE, invokerPackage); + } + }*/ + + @Override + public String escapeReservedWord(String name) { + return "_" + name; + } + + @Override + public String apiFileFolder() { + return outputFolder + "/" + sourceFolder + "/" + apiPackage().replace('.', File.separatorChar); + } + + @Override + public String modelFileFolder() { + return outputFolder + "/" + sourceFolder + "/" + modelPackage().replace('.', File.separatorChar); + } + + @Override + public String toVarName(String name) { + // sanitize name + name = sanitizeName(name); + + if("_".equals(name)) { + name = "_u"; + } + + // if it's all uppper case, do nothing + if (name.matches("^[A-Z_]*$")) { + return name; + } + + // camelize (lower first character) the variable name + // pet_id => petId + name = camelize(name, true); + + // for reserved word or word starting with number, append _ + if (reservedWords.contains(name) || name.matches("^\\d.*")) { + name = escapeReservedWord(name); + } + + return name; + } + + @Override + public String toParamName(String name) { + // should be the same as variable name + return toVarName(name); + } + + @Override + public String toModelName(String name) { + name = sanitizeName(name); + + // model name cannot use reserved keyword, e.g. return + if (reservedWords.contains(name)) { + throw new RuntimeException(name + " (reserved word) cannot be used as a model name"); + } + + // camelize the model name + // phone_number => PhoneNumber + return camelize(name); + } + + @Override + public String toModelFilename(String name) { + // should be the same as the model name + return toModelName(name); + } + + @Override + public String getTypeDeclaration(Property p) { + if (p instanceof ArrayProperty) { + ArrayProperty ap = (ArrayProperty) p; + Property inner = ap.getItems(); + return getSwaggerType(p) + "<" + getTypeDeclaration(inner) + ">"; + } else if (p instanceof MapProperty) { + MapProperty mp = (MapProperty) p; + Property inner = mp.getAdditionalProperties(); + + return getSwaggerType(p) + ""; + } + return super.getTypeDeclaration(p); + } + + @Override + public String toDefaultValue(Property p) { + if (p instanceof ArrayProperty) { + final ArrayProperty ap = (ArrayProperty) p; + final String pattern; + if (fullJavaUtil) { + pattern = "new java.util.ArrayList<%s>()"; + } else { + pattern = "new ArrayList<%s>()"; + } + return String.format(pattern, getTypeDeclaration(ap.getItems())); + } else if (p instanceof MapProperty) { + final MapProperty ap = (MapProperty) p; + final String pattern; + if (fullJavaUtil) { + pattern = "new java.util.HashMap()"; + } else { + pattern = "new HashMap()"; + } + return String.format(pattern, getTypeDeclaration(ap.getAdditionalProperties())); + + } else if (p instanceof LongProperty) { + LongProperty dp = (LongProperty) p; + if (dp.getDefault() != null) { + return dp.getDefault().toString()+"l"; + } + return "null"; + + // added for Javascript + } else if (p instanceof RefProperty) { + RefProperty rp = (RefProperty)p; + System.out.println("rp: " + rp.getName() + rp.getAccess() + rp.getDescription() + rp.getExample() + rp.getFormat() + rp.getSimpleRef() + rp.getTitle() + rp.getType()); + + return "new " +rp.getSimpleRef() + "()"; + } + + System.out.println("property: " + p); + + return super.toDefaultValue(p); + } + + @Override + public String getSwaggerType(Property p) { + String swaggerType = super.getSwaggerType(p); + String type = null; + if (typeMapping.containsKey(swaggerType)) { + type = typeMapping.get(swaggerType); + if (languageSpecificPrimitives.contains(type) || type.indexOf(".") >= 0) { + return type; + } + } else { + type = swaggerType; + } + if (null == type) { + LOGGER.error("No Type defined for Property " + p); + } + return toModelName(type); + } + + @Override + public String toOperationId(String operationId) { + // throw exception if method name is empty + if (StringUtils.isEmpty(operationId)) { + throw new RuntimeException("Empty method/operation name (operationId) not allowed"); + } + + // method name cannot use reserved keyword, e.g. return + if (reservedWords.contains(operationId)) { + throw new RuntimeException(operationId + " (reserved word) cannot be used as method name"); + } + + return camelize(sanitizeName(operationId), true); + } + + @Override + public CodegenModel fromModel(String name, Model model, Map allDefinitions) { + CodegenModel codegenModel = super.fromModel(name, model, allDefinitions); + + if (allDefinitions != null && codegenModel != null && codegenModel.parent != null && codegenModel.hasEnums) { + final Model parentModel = allDefinitions.get(toModelName(codegenModel.parent)); + final CodegenModel parentCodegenModel = super.fromModel(codegenModel.parent, parentModel); + codegenModel = this.reconcileInlineEnums(codegenModel, parentCodegenModel); + } + + 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; + + // handle ArrayProperty + if (var.items != null) { + allowableValues = var.items.allowableValues; + } + + if (allowableValues == null) { + continue; + } + List values = (List) allowableValues.get("values"); + if (values == null) { + continue; + } + + // put "enumVars" map into `allowableValues", including `name` and `value` + List> enumVars = new ArrayList>(); + String commonPrefix = findCommonPrefixOfVars(values); + int truncateIdx = commonPrefix.length(); + for (String value : values) { + Map enumVar = new HashMap(); + String enumName; + if (truncateIdx == 0) { + enumName = value; + } else { + enumName = value.substring(truncateIdx); + if ("".equals(enumName)) { + enumName = value; + } + } + enumVar.put("name", toEnumVarName(enumName)); + enumVar.put("value", value); + enumVars.add(enumVar); + } + allowableValues.put("enumVars", enumVars); + } + } + return objs; + } + + public Map postProcessOperations(Map objs) { + if("retrofit".equals(getLibrary())) { + Map operations = (Map) objs.get("operations"); + if (operations != null) { + List ops = (List) operations.get("operation"); + for (CodegenOperation operation : ops) { + if (operation.hasConsumes == Boolean.TRUE) { + Map firstType = operation.consumes.get(0); + if (firstType != null) { + if ("multipart/form-data".equals(firstType.get("mediaType"))) { + operation.isMultipart = Boolean.TRUE; + } + } + } + if (operation.returnType == null) { + operation.returnType = "Void"; + } + } + } + } + return objs; + } + + protected boolean needToImport(String type) { + return super.needToImport(type) && type.indexOf(".") < 0; + } + + private String findCommonPrefixOfVars(List vars) { + String prefix = StringUtils.getCommonPrefix(vars.toArray(new String[vars.size()])); + // exclude trailing characters that should be part of a valid variable + // e.g. ["status-on", "status-off"] => "status-" (not "status-o") + return prefix.replaceAll("[a-zA-Z0-9]+\\z", ""); + } + + private String toEnumVarName(String value) { + String var = value.replaceAll("\\W+", "_").toUpperCase(); + if (var.matches("\\d.*")) { + return "_" + var; + } else { + return var; + } + } + + 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 + // the parent and child models, look for enums that match, and remove + // them from the child models and leave them in the parent. + // Because the child models extend the parents, the enums will be available via the parent. + + // Only bother with reconciliation if the parent model has enums. + if (parentCodegenModel.hasEnums) { + + // Get the properties for the parent and child models + final List parentModelCodegenProperties = parentCodegenModel.vars; + List codegenProperties = codegenModel.vars; + + // Iterate over all of the parent model properties + boolean removedChildEnum = false; + for (CodegenProperty parentModelCodegenPropery : parentModelCodegenProperties) { + // Look for enums + if (parentModelCodegenPropery.isEnum) { + // Now that we have found an enum in the parent class, + // and search the child class for the same enum. + Iterator iterator = codegenProperties.iterator(); + while (iterator.hasNext()) { + CodegenProperty codegenProperty = iterator.next(); + if (codegenProperty.isEnum && codegenProperty.equals(parentModelCodegenPropery)) { + // We found an enum in the child class that is + // a duplicate of the one in the parent, so remove it. + iterator.remove(); + removedChildEnum = true; + } + } + } + } + + if(removedChildEnum) { + // If we removed an entry from this model's vars, we need to ensure hasMore is updated + int count = 0, numVars = codegenProperties.size(); + for(CodegenProperty codegenProperty : codegenProperties) { + count += 1; + codegenProperty.hasMore = (count < numVars) ? true : null; + } + codegenModel.vars = codegenProperties; + } + } + + return codegenModel; + } + + public void setInvokerPackage(String invokerPackage) { + this.invokerPackage = invokerPackage; + } + + public void setGroupId(String groupId) { + this.groupId = groupId; + } + + public void setArtifactId(String artifactId) { + this.artifactId = artifactId; + } + + public void setArtifactVersion(String artifactVersion) { + this.artifactVersion = artifactVersion; + } + + public void setSourceFolder(String sourceFolder) { + this.sourceFolder = sourceFolder; + } + + public void setLocalVariablePrefix(String localVariablePrefix) { + this.localVariablePrefix = localVariablePrefix; + } + + + public Boolean getSerializableModel() { + return serializableModel; + } + + public void setSerializableModel(Boolean serializableModel) { + this.serializableModel = serializableModel; + } + + private String sanitizePackageName(String packageName) { + packageName = packageName.trim(); + packageName = packageName.replaceAll("[^a-zA-Z0-9_\\.]", "_"); + if(Strings.isNullOrEmpty(packageName)) { + return "invalidPackageName"; + } + return packageName; + } + +} diff --git a/modules/swagger-codegen/src/main/resources/Javascript/ApiClient.mustache b/modules/swagger-codegen/src/main/resources/Javascript/ApiClient.mustache new file mode 100644 index 00000000000..18d27ede7c3 --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/Javascript/ApiClient.mustache @@ -0,0 +1,654 @@ +package {{invokerPackage}}; + +import com.sun.jersey.api.client.Client; +import com.sun.jersey.api.client.ClientResponse; +import com.sun.jersey.api.client.config.ClientConfig; +import com.sun.jersey.api.client.config.DefaultClientConfig; +import com.sun.jersey.api.client.filter.LoggingFilter; +import com.sun.jersey.api.client.WebResource.Builder; + +import com.sun.jersey.multipart.FormDataMultiPart; +import com.sun.jersey.multipart.file.FileDataBodyPart; + +import javax.ws.rs.core.Response.Status.Family; +import javax.ws.rs.core.MediaType; + +import java.util.Collection; +import java.util.Collections; +import java.util.Map; +import java.util.Map.Entry; +import java.util.HashMap; +import java.util.List; +import java.util.ArrayList; +import java.util.Date; +import java.util.TimeZone; + +import java.net.URLEncoder; + +import java.io.IOException; +import java.io.File; +import java.io.UnsupportedEncodingException; +import java.io.DataInputStream; + +import java.text.DateFormat; +import java.text.SimpleDateFormat; +import java.text.ParseException; + +import {{invokerPackage}}.auth.Authentication; +import {{invokerPackage}}.auth.HttpBasicAuth; +import {{invokerPackage}}.auth.ApiKeyAuth; +import {{invokerPackage}}.auth.OAuth; + +{{>generatedAnnotation}} +public class ApiClient { + private Map hostMap = new HashMap(); + private Map defaultHeaderMap = new HashMap(); + private boolean debugging = false; + private String basePath = "{{basePath}}"; + private JSON json = new JSON(); + + private Map authentications; + + private int statusCode; + private Map> responseHeaders; + + private DateFormat dateFormat; + + public ApiClient() { + // Use ISO 8601 format for date and datetime. + // See https://en.wikipedia.org/wiki/ISO_8601 + this.dateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ"); + + // Use UTC as the default time zone. + this.dateFormat.setTimeZone(TimeZone.getTimeZone("UTC")); + + // Set default User-Agent. + setUserAgent("Java-Swagger"); + + // Setup authentications (key: authentication name, value: authentication). + authentications = new HashMap();{{#authMethods}}{{#isBasic}} + authentications.put("{{name}}", new HttpBasicAuth());{{/isBasic}}{{#isApiKey}} + authentications.put("{{name}}", new ApiKeyAuth({{#isKeyInHeader}}"header"{{/isKeyInHeader}}{{^isKeyInHeader}}"query"{{/isKeyInHeader}}, "{{keyParamName}}"));{{/isApiKey}}{{#isOAuth}} + authentications.put("{{name}}", new OAuth());{{/isOAuth}}{{/authMethods}} + // Prevent the authentications from being modified. + authentications = Collections.unmodifiableMap(authentications); + } + + public String getBasePath() { + return basePath; + } + + public ApiClient setBasePath(String basePath) { + this.basePath = basePath; + 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). + */ + public Map getAuthentications() { + return authentications; + } + + /** + * Get authentication for the given name. + * + * @param authName The authentication name + * @return The authentication, null if not found + */ + public Authentication getAuthentication(String authName) { + return authentications.get(authName); + } + + /** + * Helper method to set username for the first HTTP basic authentication. + */ + public void setUsername(String username) { + for (Authentication auth : authentications.values()) { + if (auth instanceof HttpBasicAuth) { + ((HttpBasicAuth) auth).setUsername(username); + return; + } + } + throw new RuntimeException("No HTTP basic authentication configured!"); + } + + /** + * Helper method to set password for the first HTTP basic authentication. + */ + public void setPassword(String password) { + for (Authentication auth : authentications.values()) { + if (auth instanceof HttpBasicAuth) { + ((HttpBasicAuth) auth).setPassword(password); + return; + } + } + throw new RuntimeException("No HTTP basic authentication configured!"); + } + + /** + * Helper method to set API key value for the first API key authentication. + */ + public void setApiKey(String apiKey) { + for (Authentication auth : authentications.values()) { + if (auth instanceof ApiKeyAuth) { + ((ApiKeyAuth) auth).setApiKey(apiKey); + return; + } + } + throw new RuntimeException("No API key authentication configured!"); + } + + /** + * Helper method to set API key prefix for the first API key authentication. + */ + public void setApiKeyPrefix(String apiKeyPrefix) { + for (Authentication auth : authentications.values()) { + if (auth instanceof ApiKeyAuth) { + ((ApiKeyAuth) auth).setApiKeyPrefix(apiKeyPrefix); + return; + } + } + throw new RuntimeException("No API key authentication configured!"); + } + + /** + * Set the User-Agent header's value (by adding to the default header map). + */ + public ApiClient setUserAgent(String userAgent) { + addDefaultHeader("User-Agent", userAgent); + return this; + } + + /** + * Add a default header. + * + * @param key The header's key + * @param value The header's value + */ + public ApiClient addDefaultHeader(String key, String value) { + defaultHeaderMap.put(key, value); + return this; + } + + /** + * Check that whether debugging is enabled for this API client. + */ + public boolean isDebugging() { + return debugging; + } + + /** + * Enable/disable debugging for this API client. + * + * @param debugging To enable (true) or disable (false) debugging + */ + public ApiClient setDebugging(boolean debugging) { + this.debugging = debugging; + return this; + } + + /** + * Get the date format used to parse/format date parameters. + */ + public DateFormat getDateFormat() { + return dateFormat; + } + + /** + * Set the date format used to parse/format date parameters. + */ + public ApiClient setDateFormat(DateFormat dateFormat) { + this.dateFormat = dateFormat; + return this; + } + + /** + * Parse the given string into Date object. + */ + public Date parseDate(String str) { + try { + return dateFormat.parse(str); + } catch (java.text.ParseException e) { + throw new RuntimeException(e); + } + } + + /** + * Format the given Date object into string. + */ + public String formatDate(Date date) { + return dateFormat.format(date); + } + + /** + * Format the given parameter object into string. + */ + public String parameterToString(Object param) { + if (param == null) { + return ""; + } else if (param instanceof Date) { + return formatDate((Date) param); + } else if (param instanceof Collection) { + StringBuilder b = new StringBuilder(); + for(Object o : (Collection)param) { + if(b.length() > 0) { + b.append(","); + } + b.append(String.valueOf(o)); + } + return b.toString(); + } else { + return String.valueOf(param); + } + } + + /* + Format to {@code Pair} objects. + */ + public List parameterToPairs(String collectionFormat, String name, Object value){ + List params = new ArrayList(); + + // preconditions + if (name == null || name.isEmpty() || value == null) return params; + + Collection valueCollection = null; + if (value instanceof Collection) { + valueCollection = (Collection) value; + } else { + params.add(new Pair(name, parameterToString(value))); + return params; + } + + if (valueCollection.isEmpty()){ + return params; + } + + // get the collection format + collectionFormat = (collectionFormat == null || collectionFormat.isEmpty() ? "csv" : collectionFormat); // default: csv + + // create the params based on the collection format + if (collectionFormat.equals("multi")) { + for (Object item : valueCollection) { + params.add(new Pair(name, parameterToString(item))); + } + + return params; + } + + String delimiter = ","; + + if (collectionFormat.equals("csv")) { + delimiter = ","; + } else if (collectionFormat.equals("ssv")) { + delimiter = " "; + } else if (collectionFormat.equals("tsv")) { + delimiter = "\t"; + } else if (collectionFormat.equals("pipes")) { + delimiter = "|"; + } + + StringBuilder sb = new StringBuilder() ; + for (Object item : valueCollection) { + sb.append(delimiter); + sb.append(parameterToString(item)); + } + + params.add(new Pair(name, sb.substring(1))); + + return params; + } + + /** + * Select the Accept header's value from the given accepts array: + * if JSON exists in the given array, use it; + * otherwise use all of them (joining into a string) + * + * @param accepts The accepts array to select from + * @return The Accept header to use. If the given array is empty, + * null will be returned (not to set the Accept header explicitly). + */ + public String selectHeaderAccept(String[] accepts) { + if (accepts.length == 0) return null; + if (StringUtil.containsIgnoreCase(accepts, "application/json")) return "application/json"; + return StringUtil.join(accepts, ","); + } + + /** + * Select the Content-Type header's value from the given array: + * if JSON exists in the given array, use it; + * otherwise use the first one of the array. + * + * @param contentTypes The Content-Type array to select from + * @return The Content-Type header to use. If the given array is empty, + * JSON will be used. + */ + public String selectHeaderContentType(String[] contentTypes) { + if (contentTypes.length == 0) return "application/json"; + if (StringUtil.containsIgnoreCase(contentTypes, "application/json")) return "application/json"; + return contentTypes[0]; + } + + /** + * Escape the given string to be used as URL query value. + */ + public String escapeString(String str) { + try { + return URLEncoder.encode(str, "utf8").replaceAll("\\+", "%20"); + } catch (UnsupportedEncodingException e) { + return str; + } + } + + /** + * Serialize the given Java object into string according the given + * Content-Type (only JSON is supported for now). + */ + public String serialize(Object obj, String contentType) throws ApiException { + if (contentType.startsWith("application/json")) { + return json.serialize(obj); + } else { + throw new ApiException(400, "can not serialize object into Content-Type: " + contentType); + } + } + + /** + * Deserialize response body to Java object according to the Content-Type. + */ + public T deserialize(ClientResponse response, TypeRef returnType) throws ApiException { + String contentType = null; + List contentTypes = response.getHeaders().get("Content-Type"); + if (contentTypes != null && !contentTypes.isEmpty()) + contentType = contentTypes.get(0); + if (contentType == null) + throw new ApiException(500, "missing Content-Type in response"); + + String body; + if (response.hasEntity()) + body = (String) response.getEntity(String.class); + else + body = ""; + + if (contentType.startsWith("application/json")) { + return json.deserialize(body, returnType); + } else if (returnType.getType().equals(String.class)) { + // Expecting string, return the raw response body. + return (T) body; + } else { + throw new ApiException( + 500, + "Content type \"" + contentType + "\" is not supported for type: " + + returnType.getType() + ); + } + } + + private ClientResponse getAPIResponse(String path, String method, List queryParams, Object body, byte[] binaryBody, Map headerParams, Map formParams, String accept, String contentType, String[] authNames) throws ApiException { + + if (body != null && binaryBody != null){ + throw new ApiException(500, "either body or binaryBody must be null"); + } + + updateParamsForAuth(authNames, queryParams, headerParams); + + Client client = getClient(); + + StringBuilder b = new StringBuilder(); + b.append("?"); + if (queryParams != null){ + for (Pair queryParam : queryParams){ + if (!queryParam.getName().isEmpty()) { + b.append(escapeString(queryParam.getName())); + b.append("="); + b.append(escapeString(queryParam.getValue())); + b.append("&"); + } + } + } + + String querystring = b.substring(0, b.length() - 1); + + Builder builder; + if (accept == null) + builder = client.resource(basePath + path + querystring).getRequestBuilder(); + else + builder = client.resource(basePath + path + querystring).accept(accept); + + for (String key : headerParams.keySet()) { + builder = builder.header(key, headerParams.get(key)); + } + for (String key : defaultHeaderMap.keySet()) { + if (!headerParams.containsKey(key)) { + builder = builder.header(key, defaultHeaderMap.get(key)); + } + } + + String encodedFormParams = null; + if (contentType.startsWith("multipart/form-data")) { + FormDataMultiPart mp = new FormDataMultiPart(); + for (Entry param: formParams.entrySet()) { + if (param.getValue() instanceof File) { + File file = (File) param.getValue(); + mp.field(param.getKey(), file.getName()); + mp.bodyPart(new FileDataBodyPart(param.getKey(), file, MediaType.MULTIPART_FORM_DATA_TYPE)); + } else { + mp.field(param.getKey(), parameterToString(param.getValue()), MediaType.MULTIPART_FORM_DATA_TYPE); + } + } + body = mp; + } else if (contentType.startsWith("application/x-www-form-urlencoded")) { + encodedFormParams = this.getXWWWFormUrlencodedParams(formParams); + } + + ClientResponse response = null; + + if ("GET".equals(method)) { + response = (ClientResponse) builder.get(ClientResponse.class); + } else if ("POST".equals(method)) { + if (encodedFormParams != null) { + response = builder.type(contentType).post(ClientResponse.class, encodedFormParams); + } else if (body == null) { + if(binaryBody == null) + response = builder.post(ClientResponse.class, null); + else + response = builder.type(contentType).post(ClientResponse.class, binaryBody); + } else if (body instanceof FormDataMultiPart) { + response = builder.type(contentType).post(ClientResponse.class, body); + } else { + response = builder.type(contentType).post(ClientResponse.class, serialize(body, contentType)); + } + } else if ("PUT".equals(method)) { + if (encodedFormParams != null) { + response = builder.type(contentType).put(ClientResponse.class, encodedFormParams); + } else if(body == null) { + if(binaryBody == null) + response = builder.put(ClientResponse.class, null); + else + response = builder.type(contentType).put(ClientResponse.class, binaryBody); + } else { + response = builder.type(contentType).put(ClientResponse.class, serialize(body, contentType)); + } + } else if ("DELETE".equals(method)) { + if (encodedFormParams != null) { + response = builder.type(contentType).delete(ClientResponse.class, encodedFormParams); + } else if(body == null) { + if(binaryBody == null) + response = builder.delete(ClientResponse.class); + else + response = builder.type(contentType).delete(ClientResponse.class, binaryBody); + } else { + response = builder.type(contentType).delete(ClientResponse.class, serialize(body, contentType)); + } + } else { + throw new ApiException(500, "unknown method type " + method); + } + return response; + } + + /** + * Invoke API by sending HTTP request with the given options. + * + * @param path The sub-path of the HTTP URL + * @param method The request method, one of "GET", "POST", "PUT", and "DELETE" + * @param queryParams The query parameters + * @param body The request body object - if it is not binary, otherwise null + * @param binaryBody The request body object - if it is binary, otherwise null + * @param headerParams The header parameters + * @param formParams The form parameters + * @param accept The request's Accept header + * @param contentType The request's Content-Type header + * @param authNames The authentications to apply + * @return The response body in type of string + */ + public T invokeAPI(String path, String method, List queryParams, Object body, byte[] binaryBody, Map headerParams, Map formParams, String accept, String contentType, String[] authNames, TypeRef returnType) throws ApiException { + + 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) { + if (returnType == null) + return null; + else + return deserialize(response, returnType); + } else { + String message = "error"; + String respBody = null; + if (response.hasEntity()) { + try { + respBody = String.valueOf(response.getEntity(String.class)); + message = respBody; + } catch (RuntimeException e) { + // e.printStackTrace(); + } + } + throw new ApiException( + response.getStatusInfo().getStatusCode(), + message, + response.getHeaders(), + respBody); + } + } + /** + * Invoke API by sending HTTP request with the given options - return binary result + * + * @param path The sub-path of the HTTP URL + * @param method The request method, one of "GET", "POST", "PUT", and "DELETE" + * @param queryParams The query parameters + * @param body The request body object - if it is not binary, otherwise null + * @param binaryBody The request body object - if it is binary, otherwise null + * @param headerParams The header parameters + * @param formParams The form parameters + * @param accept The request's Accept header + * @param contentType The request's Content-Type header + * @param authNames The authentications to apply + * @return The response body in type of string + */ + public byte[] invokeBinaryAPI(String path, String method, List queryParams, Object body, byte[] binaryBody, Map headerParams, Map formParams, String accept, String contentType, String[]authNames) throws ApiException { + + ClientResponse response = getAPIResponse(path, method, queryParams, body, binaryBody, headerParams, formParams, accept, contentType, authNames); + + if(response.getStatusInfo() == ClientResponse.Status.NO_CONTENT) { + return null; + } + else if(response.getStatusInfo().getFamily() == Family.SUCCESSFUL) { + if(response.hasEntity()) { + DataInputStream stream = new DataInputStream(response.getEntityInputStream()); + byte[] data = new byte[response.getLength()]; + try { + stream.readFully(data); + } catch (IOException ex) { + throw new ApiException(500, "Error obtaining binary response data"); + } + return data; + } + else { + return new byte[0]; + } + } + else { + String message = "error"; + if(response.hasEntity()) { + try{ + message = String.valueOf(response.getEntity(String.class)); + } + catch (RuntimeException e) { + // e.printStackTrace(); + } + } + throw new ApiException( + response.getStatusInfo().getStatusCode(), + message); + } + } + + /** + * Update query and header parameters based on authentication settings. + * + * @param authNames The authentications to apply + */ + private void updateParamsForAuth(String[] authNames, List queryParams, Map headerParams) { + for (String authName : authNames) { + Authentication auth = authentications.get(authName); + if (auth == null) throw new RuntimeException("Authentication undefined: " + authName); + auth.applyToParams(queryParams, headerParams); + } + } + + /** + * Encode the given form parameters as request body. + */ + private String getXWWWFormUrlencodedParams(Map formParams) { + StringBuilder formParamBuilder = new StringBuilder(); + + for (Entry param : formParams.entrySet()) { + String keyStr = param.getKey(); + String valueStr = parameterToString(param.getValue()); + try { + formParamBuilder.append(URLEncoder.encode(param.getKey(), "utf8")) + .append("=") + .append(URLEncoder.encode(valueStr, "utf8")); + formParamBuilder.append("&"); + } catch (UnsupportedEncodingException e) { + // move on to next + } + } + + String encodedFormParams = formParamBuilder.toString(); + if (encodedFormParams.endsWith("&")) { + encodedFormParams = encodedFormParams.substring(0, encodedFormParams.length() - 1); + } + + return encodedFormParams; + } + + /** + * Get an existing client or create a new client to handle HTTP request. + */ + private Client getClient() { + if(!hostMap.containsKey(basePath)) { + Client client = Client.create(); + if (debugging) + client.addFilter(new LoggingFilter()); + hostMap.put(basePath, client); + } + return hostMap.get(basePath); + } +} diff --git a/modules/swagger-codegen/src/main/resources/Javascript/Configuration.mustache b/modules/swagger-codegen/src/main/resources/Javascript/Configuration.mustache new file mode 100644 index 00000000000..4629c4e17be --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/Javascript/Configuration.mustache @@ -0,0 +1,22 @@ +package {{invokerPackage}}; + +{{>generatedAnnotation}} +public class Configuration { + private static ApiClient defaultApiClient = new ApiClient(); + + /** + * Get the default API client, which would be used when creating API + * instances without providing an API client. + */ + public static ApiClient getDefaultApiClient() { + return defaultApiClient; + } + + /** + * Set the default API client, which would be used when creating API + * instances without providing an API client. + */ + public static void setDefaultApiClient(ApiClient apiClient) { + defaultApiClient = apiClient; + } +} diff --git a/modules/swagger-codegen/src/main/resources/Javascript/JSON.mustache b/modules/swagger-codegen/src/main/resources/Javascript/JSON.mustache new file mode 100644 index 00000000000..43b38f6e21d --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/Javascript/JSON.mustache @@ -0,0 +1,55 @@ +package {{invokerPackage}}; + +import com.fasterxml.jackson.annotation.*; +import com.fasterxml.jackson.databind.*; +import com.fasterxml.jackson.datatype.joda.*; + +import java.io.IOException; + +{{>generatedAnnotation}} +public class JSON { + private ObjectMapper mapper; + + public JSON() { + mapper = new ObjectMapper(); + mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL); + 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()); + } + + /** + * Serialize the given Java object into JSON string. + */ + public String serialize(Object obj) throws ApiException { + try { + if (obj != null) + return mapper.writeValueAsString(obj); + else + return null; + } catch (Exception e) { + throw new ApiException(400, e.getMessage()); + } + } + + /** + * Deserialize the given JSON string to Java object. + * + * @param body The JSON string + * @param returnType The type to deserialize inot + * @return The deserialized Java object + */ + public T deserialize(String body, TypeRef returnType) throws ApiException { + JavaType javaType = mapper.constructType(returnType.getType()); + try { + return mapper.readValue(body, javaType); + } catch (IOException e) { + if (returnType.getType().equals(String.class)) + return (T) body; + else + throw new ApiException(500, e.getMessage(), null, body); + } + } +} diff --git a/modules/swagger-codegen/src/main/resources/Javascript/Pair.mustache b/modules/swagger-codegen/src/main/resources/Javascript/Pair.mustache new file mode 100644 index 00000000000..e2a47317afe --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/Javascript/Pair.mustache @@ -0,0 +1,39 @@ +package {{invokerPackage}}; + +{{>generatedAnnotation}} +public class Pair { + private String name = ""; + private String value = ""; + + public Pair (String name, String value) { + setName(name); + setValue(value); + } + + private void setName(String name) { + if (!isValidString(name)) return; + + this.name = name; + } + + private void setValue(String value) { + if (!isValidString(value)) return; + + this.value = value; + } + + public String getName() { + return this.name; + } + + public String getValue() { + return this.value; + } + + private boolean isValidString(String arg) { + if (arg == null) return false; + if (arg.trim().isEmpty()) return false; + + return true; + } +} diff --git a/modules/swagger-codegen/src/main/resources/Javascript/StringUtil.mustache b/modules/swagger-codegen/src/main/resources/Javascript/StringUtil.mustache new file mode 100644 index 00000000000..c9583f1bc63 --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/Javascript/StringUtil.mustache @@ -0,0 +1,51 @@ +package {{invokerPackage}}; + +{{>generatedAnnotation}} +public class StringUtil { + /** + * Check if the given array contains the given value (with case-insensitive comparison). + * + * @param array The array + * @param value The value to search + * @return true if the array contains the value + */ + public static boolean containsIgnoreCase(String[] array, String value) { + for (String str : array) { + if (value == null && str == null) return true; + if (value != null && value.equalsIgnoreCase(str)) return true; + } + return false; + } + + /** + * Join an array of strings with the given separator. + *

+ * Note: This might be replaced by utility method from commons-lang or guava someday + * if one of those libraries is added as dependency. + *

+ * + * @param array The array of strings + * @param separator The separator + * @return the resulting string + */ + public static String join(String[] array, String separator) { + int len = array.length; + if (len == 0) return ""; + + StringBuilder out = new StringBuilder(); + out.append(array[0]); + for (int i = 1; i < len; i++) { + out.append(separator).append(array[i]); + } + return out.toString(); + } + + /** + * Convert the given object to string with each line indented by 4 spaces + * (except the first line). + */ + public static String toIndentedString(Object o) { + if (o == null) return "null"; + return o.toString().replace("\n", "\n "); + } +} diff --git a/modules/swagger-codegen/src/main/resources/Javascript/TypeRef.mustache b/modules/swagger-codegen/src/main/resources/Javascript/TypeRef.mustache new file mode 100644 index 00000000000..9e9ba5f8895 --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/Javascript/TypeRef.mustache @@ -0,0 +1,26 @@ +package {{invokerPackage}}; + +import java.lang.reflect.ParameterizedType; +import java.lang.reflect.Type; + +{{>generatedAnnotation}} +public class TypeRef { + private final Type type; + + public TypeRef() { + this.type = getGenericType(getClass()); + } + + private static Type getGenericType(Class klass) { + Type superclass = klass.getGenericSuperclass(); + if (superclass instanceof Class) { + throw new RuntimeException("No type parameter provided"); + } + ParameterizedType parameterized = (ParameterizedType) superclass; + return parameterized.getActualTypeArguments()[0]; + } + + public Type getType() { + return type; + } +} diff --git a/modules/swagger-codegen/src/main/resources/Javascript/api.mustache b/modules/swagger-codegen/src/main/resources/Javascript/api.mustache new file mode 100644 index 00000000000..9e41b237c68 --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/Javascript/api.mustache @@ -0,0 +1,113 @@ +/* + * {{>generatedAnnotation}} + */ +function {{classname}}() { + var self = this; +{{#operations}} + {{#operation}} + /** + * {{summary}} + * {{notes}} +{{#allParams}} * @param {{=<% %>=}}{<% dataType %>} <%={{ }}=%> {{paramName}} {{description}} +{{/allParams}} * @param {function} callback the callback function + * @return {{#returnType}}{{{returnType}}}{{/returnType}}{{^returnType}}void{{/returnType}} + */ + self.{{nickname}} = function({{#allParams}}{{paramName}}{{#hasMore}}, {{/hasMore}}{{/allParams}}, callback) { + + var {{localVariablePrefix}}postBody = {{#bodyParam}}{{^isBinary}}JSON.stringify({{paramName}}){{/isBinary}}{{#isBinary}}null{{/isBinary}}{{/bodyParam}}{{^bodyParam}}null{{/bodyParam}}; + var {{localVariablePrefix}}postBinaryBody = {{#bodyParam}}{{#isBinary}}{{paramName}}{{/isBinary}}{{^isBinary}}null{{/isBinary}}{{/bodyParam}}{{^bodyParam}}null{{/bodyParam}}; + {{#allParams}}{{#required}} + // verify the required parameter '{{paramName}}' is set + if ({{paramName}} == null) { + //throw new ApiException(400, "Missing the required parameter '{{paramName}}' when calling {{nickname}}"); + var errorRequiredMsg = "Missing the required parameter '{{paramName}}' when calling {{nickname}}"; + throw errorRequiredMsg; + } + {{/required}}{{/allParams}} + // create path and map variables + var {{localVariablePrefix}}path = '{{basePath}}' + self.replaceAll(self.replaceAll("{{{path}}}", "\\{format\\}","json"){{#pathParams}} +, "\\{" + "{{baseName}}" + "\\}", {{localVariablePrefix}}apiClient.escapeString({{{paramName}}}.toString())){{/pathParams}}); + + var queryParams = {}; + var headerParams = {}; + var formParams = {}; + + {{#queryParams}} + queryParams.{{baseName}} = {{paramName}}; + {{/queryParams}} + {{#headerParams}}if ({{paramName}} != null) + {{localVariablePrefix}}headerParams.put("{{baseName}}", {{localVariablePrefix}}apiClient.parameterToString({{paramName}})); + {{/headerParams}} + {{#formParams}}if ({{paramName}} != null) + {{localVariablePrefix}}formParams.put("{{baseName}}", {{paramName}}); + {{/formParams}} + + path += self.createQueryString(queryParams); + + if (console) { + console.log('path: ' + path); + console.log('queryParams: ' + queryParams); + } + + {{#isResponseBinary}} + byte[] {{localVariablePrefix}}response = null; + {{localVariablePrefix}}response = {{localVariablePrefix}}apiClient.invokeBinaryAPI({{localVariablePrefix}}path, "{{httpMethod}}", {{localVariablePrefix}}queryParams,{{localVariablePrefix}} postBody, {{localVariablePrefix}}postBinaryBody, {{localVariablePrefix}}headerParams, {{localVariablePrefix}}formParams, {{localVariablePrefix}}accept, {{localVariablePrefix}}contentType, {{localVariablePrefix}}authNames); + return {{localVariablePrefix}}response; + {{/isResponseBinary}} + + {{^isResponseBinary}} + {{#returnType}} + //TypeRef {{localVariablePrefix}}returnType = new TypeRef<{{{returnType}}}>() {}; + //return {{localVariablePrefix}}apiClient.invokeAPI({{localVariablePrefix}}path, "{{httpMethod}}", {{localVariablePrefix}}queryParams, {{localVariablePrefix}}postBody, {{localVariablePrefix}}postBinaryBody, {{localVariablePrefix}}headerParams, {{localVariablePrefix}}formParams, {{localVariablePrefix}}accept, {{localVariablePrefix}}contentType, {{localVariablePrefix}}authNames, {{localVariablePrefix}}returnType); + + var options = {type: "{{httpMethod}}", async: true, contentType: "application/json", dataType: "json", data: postBody}; + var request = $.ajax(path, options); + //request.fail(function(jqXHR, textStatus, errorThrown){ + // errorHandler(jqXHR, textStatus, errorThrown); + //}); + + + request.done(function(response, textStatus, jqXHR){ + /** + * @returns {{{returnType}}} + */ + var myResponse = response; + callback(myResponse, textStatus, jqXHR); + }); + + {{/returnType}}{{^returnType}} + {{localVariablePrefix}}apiClient.invokeAPI({{localVariablePrefix}}path, "{{httpMethod}}", {{localVariablePrefix}}queryParams, {{localVariablePrefix}}postBody, {{localVariablePrefix}}postBinaryBody, {{localVariablePrefix}}headerParams, {{localVariablePrefix}}formParams, {{localVariablePrefix}}accept, {{localVariablePrefix}}contentType, {{localVariablePrefix}}authNames, null); + {{/returnType}} + {{/isResponseBinary}} + + + } + {{/operation}} + +{{/operations}} + +self.replaceAll = function (haystack, needle, replace) { + var result= haystack; + if (needle !=null && replace!=null) { + result= haystack.replace(new RegExp(needle, 'g'), replace); + } + return result; +} + +self.createQueryString = function (queryParams) { + var queryString =''; + var i = 0; + for (var queryParamName in queryParams) { + if (i==0) { + queryString += '?' ; + } else { + queryString += '&' ; + } + + queryString += queryParamName + '=' + encodeURIComponent(queryParams[queryParamName]); + i++; + } + + return queryString; +} +} diff --git a/modules/swagger-codegen/src/main/resources/Javascript/apiException.mustache b/modules/swagger-codegen/src/main/resources/Javascript/apiException.mustache new file mode 100644 index 00000000000..b9a62a6b231 --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/Javascript/apiException.mustache @@ -0,0 +1,69 @@ +package {{invokerPackage}}; + +import java.util.Map; +import java.util.List; + +{{>generatedAnnotation}} +public class ApiException extends Exception { + private int code = 0; + private Map> responseHeaders = null; + private String responseBody = null; + + public ApiException() {} + + public ApiException(Throwable throwable) { + super(throwable); + } + + public ApiException(String message) { + super(message); + } + + public ApiException(String message, Throwable throwable, int code, Map> responseHeaders, String responseBody) { + super(message, throwable); + this.code = code; + this.responseHeaders = responseHeaders; + this.responseBody = responseBody; + } + + public ApiException(String message, int code, Map> responseHeaders, String responseBody) { + this(message, (Throwable) null, code, responseHeaders, responseBody); + } + + public ApiException(String message, Throwable throwable, int code, Map> responseHeaders) { + this(message, throwable, code, responseHeaders, null); + } + + public ApiException(int code, Map> responseHeaders, String responseBody) { + this((String) null, (Throwable) null, code, responseHeaders, responseBody); + } + + public ApiException(int code, String message) { + super(message); + this.code = code; + } + + public ApiException(int code, String message, Map> responseHeaders, String responseBody) { + this(code, message); + this.responseHeaders = responseHeaders; + this.responseBody = responseBody; + } + + public int getCode() { + return code; + } + + /** + * Get the HTTP response headers. + */ + public Map> getResponseHeaders() { + return responseHeaders; + } + + /** + * Get the HTTP response body. + */ + public String getResponseBody() { + return responseBody; + } +} diff --git a/modules/swagger-codegen/src/main/resources/Javascript/build.gradle.mustache b/modules/swagger-codegen/src/main/resources/Javascript/build.gradle.mustache new file mode 100644 index 00000000000..971dcd816a4 --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/Javascript/build.gradle.mustache @@ -0,0 +1,107 @@ +group = '{{groupId}}' +version = '{{artifactVersion}}' + +buildscript { + repositories { + jcenter() + } + dependencies { + classpath 'com.android.tools.build:gradle:1.2.2' + classpath 'com.github.dcendents:android-maven-plugin:1.2' + } +} + +repositories { + jcenter() +} + + +if(hasProperty('target') && target == 'android') { + + apply plugin: 'com.android.library' + apply plugin: 'com.github.dcendents.android-maven' + + android { + compileSdkVersion 22 + buildToolsVersion '22.0.0' + defaultConfig { + minSdkVersion 14 + targetSdkVersion 22 + } + compileOptions { + sourceCompatibility JavaVersion.VERSION_1_7 + targetCompatibility JavaVersion.VERSION_1_7 + } + + // Rename the aar correctly + libraryVariants.all { variant -> + variant.outputs.each { output -> + def outputFile = output.outputFile + if (outputFile != null && outputFile.name.endsWith('.aar')) { + def fileName = "${project.name}-${variant.baseName}-${version}.aar" + output.outputFile = new File(outputFile.parent, fileName) + } + } + } + } + + afterEvaluate { + android.libraryVariants.all { variant -> + def task = project.tasks.create "jar${variant.name.capitalize()}", Jar + task.description = "Create jar artifact for ${variant.name}" + task.dependsOn variant.javaCompile + task.from variant.javaCompile.destinationDir + task.destinationDir = project.file("${project.buildDir}/outputs/jar") + task.archiveName = "${project.name}-${variant.baseName}-${version}.jar" + artifacts.add('archives', task); + } + } + + task sourcesJar(type: Jar) { + from android.sourceSets.main.java.srcDirs + classifier = 'sources' + } + + artifacts { + archives sourcesJar + } + +} else { + + apply plugin: 'java' + apply plugin: 'maven' + + sourceCompatibility = JavaVersion.VERSION_1_7 + targetCompatibility = JavaVersion.VERSION_1_7 + + install { + repositories.mavenInstaller { + pom.artifactId = '{{artifactId}}' + } + } + + task execute(type:JavaExec) { + main = System.getProperty('mainClass') + classpath = sourceSets.main.runtimeClasspath + } +} + +ext { + swagger_annotations_version = "1.5.0" + jackson_version = "2.4.2" + jersey_version = "1.18" + jodatime_version = "2.3" + junit_version = "4.8.1" +} + +dependencies { + compile "io.swagger:swagger-annotations:$swagger_annotations_version" + compile "com.sun.jersey:jersey-client:$jersey_version" + compile "com.sun.jersey.contribs:jersey-multipart:$jersey_version" + compile "com.fasterxml.jackson.core:jackson-core:$jackson_version" + compile "com.fasterxml.jackson.core:jackson-annotations:$jackson_version" + compile "com.fasterxml.jackson.core:jackson-databind:$jackson_version" + compile "com.fasterxml.jackson.datatype:jackson-datatype-joda:2.1.5" + compile "joda-time:joda-time:$jodatime_version" + testCompile "junit:junit:$junit_version" +} diff --git a/modules/swagger-codegen/src/main/resources/Javascript/enumClass.mustache b/modules/swagger-codegen/src/main/resources/Javascript/enumClass.mustache new file mode 100644 index 00000000000..bbbd802800d --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/Javascript/enumClass.mustache @@ -0,0 +1,7 @@ +function {{datatypeWithEnum}}() { + var self = this; + +{{#allowableValues}}{{#enumVars}} self.{{name}} = "{{value}}"{{^-last}}, + {{/-last}}{{#-last}};{{/-last}}{{/enumVars}}{{/allowableValues}} + +} diff --git a/modules/swagger-codegen/src/main/resources/Javascript/generatedAnnotation.mustache b/modules/swagger-codegen/src/main/resources/Javascript/generatedAnnotation.mustache new file mode 100644 index 00000000000..49110fc1ad9 --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/Javascript/generatedAnnotation.mustache @@ -0,0 +1 @@ +@javax.annotation.Generated(value = "{{generatorClass}}", date = "{{generatedDate}}") \ No newline at end of file diff --git a/modules/swagger-codegen/src/main/resources/Javascript/gradle.properties.mustache b/modules/swagger-codegen/src/main/resources/Javascript/gradle.properties.mustache new file mode 100644 index 00000000000..05644f0754a --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/Javascript/gradle.properties.mustache @@ -0,0 +1,2 @@ +# Uncomment to build for Android +#target = android \ No newline at end of file diff --git a/modules/swagger-codegen/src/main/resources/Javascript/model.mustache b/modules/swagger-codegen/src/main/resources/Javascript/model.mustache new file mode 100644 index 00000000000..8e3c02ffd04 --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/Javascript/model.mustache @@ -0,0 +1,41 @@ +{{#models}}{{#model}} +{{#vars}}{{#isEnum}}{{>enumClass}}{{/isEnum}}{{#items.isEnum}}{{#items}} +{{>enumClass}}{{/items}}*/{{/items.isEnum}}{{/vars}} +{{#description}}/** + * {{description}} + **/{{/description}} +function {{classname}}() { {{#parent}}/* extends {{{parent}}}*/{{/parent}} + var self = this; + {{#vars}} + /**{{#description}} + * {{{description}}}{{/description}} + * datatype: {{{datatypeWithEnum}}}{{#minimum}} + * minimum: {{minimum}}{{/minimum}}{{#maximum}} + * maximum: {{maximum}}{{/maximum}} + **/ + self.{{name}} = {{{defaultValue}}}; + {{/vars}} + + {{#vars}} + /**{{#description}} + * get {{{description}}}{{/description}}{{#minimum}} + * minimum: {{minimum}}{{/minimum}}{{#maximum}} + * maximum: {{maximum}}{{/maximum}} + * @return {{=<% %>=}}{<% datatypeWithEnum %>}<%={{ }}=%> + **/ + self.{{getter}} = function() { + return self.{{name}}; + } + + /**{{#description}} + * set {{{description}}}{{/description}} + * @param {{=<% %>=}}{<% datatypeWithEnum %>}<%={{ }}=%> {{name}} + **/ + self.{{setter}} = function ({{name}}) { + self.{{name}} = {{name}}; + } + {{/vars}} + +} +{{/model}} +{{/models}} diff --git a/modules/swagger-codegen/src/main/resources/Javascript/model_full.mustache b/modules/swagger-codegen/src/main/resources/Javascript/model_full.mustache new file mode 100644 index 00000000000..11f4b9c7fca --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/Javascript/model_full.mustache @@ -0,0 +1,61 @@ +//package {{package}}; + +//import {{invokerPackage}}.StringUtil; +//{{#imports}}import {{import}}; +//{{/imports}} + +//{{#serializableModel}} +//import java.io.Serializable;{{/serializableModel}} + +//import io.swagger.annotations.*; +//import com.fasterxml.jackson.annotation.JsonProperty; +{{#models}} + +{{#model}}{{#description}} +/** + * {{description}} + **/{{/description}} +//@ApiModel(description = "{{{description}}}") +// {{>generatedAnnotation}} +//public class {{classname}} {{#parent}}extends {{{parent}}}{{/parent}} /* {{#serializableModel}}implements Serializable{{/serializableModel}} */ { +function {{classname}}() { + var self = this; + + {{#vars}}/*{{#isEnum}} + +{{>enumClass}}{{/isEnum}}{{#items.isEnum}}{{#items}} + +{{>enumClass}}{{/items}}{{/items.isEnum}}*/ + //private {{{datatypeWithEnum}}} {{name}} = {{{defaultValue}}}; + self.{{name}} = {{{defaultValue}}}; + {{/vars}} + + {{#vars}} + /**{{#description}} + * {{{description}}}{{/description}}{{#minimum}} + * minimum: {{minimum}}{{/minimum}}{{#maximum}} + * maximum: {{maximum}}{{/maximum}} + **/ + //@ApiModelProperty({{#required}}required = {{required}}, {{/required}}value = "{{{description}}}") + //@JsonProperty("{{baseName}}") + //public {{{datatypeWithEnum}}} {{getter}}() { + // return {{name}}; + //} + //public void {{setter}}({{{datatypeWithEnum}}} {{name}}) { + // this.{{name}} = {{name}}; + //} + + {{/vars}} + + //@Override + //public String toString() { + // StringBuilder sb = new StringBuilder(); + // sb.append("class {{classname}} {\n"); + // {{#parent}}sb.append(" ").append(StringUtil.toIndentedString(super.toString())).append("\n");{{/parent}} + // {{#vars}}sb.append(" {{name}}: ").append(StringUtil.toIndentedString({{name}})).append("\n"); + // {{/vars}}sb.append("}"); + // return sb.toString(); + //} +} +{{/model}} +{{/models}} diff --git a/modules/swagger-codegen/src/main/resources/Javascript/pom.mustache b/modules/swagger-codegen/src/main/resources/Javascript/pom.mustache new file mode 100644 index 00000000000..c7dd1865518 --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/Javascript/pom.mustache @@ -0,0 +1,171 @@ + + 4.0.0 + {{groupId}} + {{artifactId}} + jar + {{artifactId}} + {{artifactVersion}} + + scm:git:git@github.com:swagger-api/swagger-mustache.git + scm:git:git@github.com:swagger-api/swagger-codegen.git + https://github.com/swagger-api/swagger-codegen + + + 2.2.0 + + + + + + org.apache.maven.plugins + maven-surefire-plugin + 2.12 + + + + loggerPath + conf/log4j.properties + + + -Xms512m -Xmx1500m + methods + pertest + + + + maven-dependency-plugin + + + package + + copy-dependencies + + + ${project.build.directory}/lib + + + + + + + + org.apache.maven.plugins + maven-jar-plugin + 2.2 + + + + jar + test-jar + + + + + + + + + org.codehaus.mojo + build-helper-maven-plugin + + + add_sources + generate-sources + + add-source + + + + src/main/java + + + + + add_test_sources + generate-test-sources + + add-test-source + + + + src/test/java + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + 2.3.2 + + 1.6 + 1.6 + + + + + + + io.swagger + swagger-annotations + ${swagger-annotations-version} + + + + + com.sun.jersey + jersey-client + ${jersey-version} + + + com.sun.jersey.contribs + jersey-multipart + ${jersey-version} + + + + + com.fasterxml.jackson.core + jackson-core + ${jackson-version} + + + com.fasterxml.jackson.core + jackson-annotations + ${jackson-version} + + + com.fasterxml.jackson.core + jackson-databind + ${jackson-version} + + + com.fasterxml.jackson.datatype + jackson-datatype-joda + 2.1.5 + + + joda-time + joda-time + ${jodatime-version} + + + + + junit + junit + ${junit-version} + test + + + + 1.5.4 + 1.18 + 2.4.2 + 2.3 + 1.0.0 + 4.8.1 + + diff --git a/modules/swagger-codegen/src/main/resources/Javascript/settings.gradle.mustache b/modules/swagger-codegen/src/main/resources/Javascript/settings.gradle.mustache new file mode 100644 index 00000000000..b8fd6c4c41f --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/Javascript/settings.gradle.mustache @@ -0,0 +1 @@ +rootProject.name = "{{artifactId}}" \ No newline at end of file From 7c4471a4d6e2fbf32909f36455a7f94de46f2668 Mon Sep 17 00:00:00 2001 From: Johannes Fiala Date: Sat, 5 Dec 2015 17:35:18 +0100 Subject: [PATCH 119/211] Adapt output path for api/model --- .../languages/JavascriptClientCodegen.java | 599 ++++++++++++++++ .../resources/Javascript/ApiClient.mustache | 654 ++++++++++++++++++ .../Javascript/Configuration.mustache | 22 + .../main/resources/Javascript/JSON.mustache | 55 ++ .../main/resources/Javascript/Pair.mustache | 39 ++ .../resources/Javascript/StringUtil.mustache | 51 ++ .../resources/Javascript/TypeRef.mustache | 26 + .../main/resources/Javascript/api.mustache | 113 +++ .../Javascript/apiException.mustache | 69 ++ .../Javascript/build.gradle.mustache | 107 +++ .../resources/Javascript/enumClass.mustache | 7 + .../Javascript/generatedAnnotation.mustache | 1 + .../Javascript/gradle.properties.mustache | 2 + .../main/resources/Javascript/model.mustache | 41 ++ .../resources/Javascript/model_full.mustache | 61 ++ .../main/resources/Javascript/pom.mustache | 171 +++++ .../Javascript/settings.gradle.mustache | 1 + 17 files changed, 2019 insertions(+) create mode 100644 modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/JavascriptClientCodegen.java create mode 100644 modules/swagger-codegen/src/main/resources/Javascript/ApiClient.mustache create mode 100644 modules/swagger-codegen/src/main/resources/Javascript/Configuration.mustache create mode 100644 modules/swagger-codegen/src/main/resources/Javascript/JSON.mustache create mode 100644 modules/swagger-codegen/src/main/resources/Javascript/Pair.mustache create mode 100644 modules/swagger-codegen/src/main/resources/Javascript/StringUtil.mustache create mode 100644 modules/swagger-codegen/src/main/resources/Javascript/TypeRef.mustache create mode 100644 modules/swagger-codegen/src/main/resources/Javascript/api.mustache create mode 100644 modules/swagger-codegen/src/main/resources/Javascript/apiException.mustache create mode 100644 modules/swagger-codegen/src/main/resources/Javascript/build.gradle.mustache create mode 100644 modules/swagger-codegen/src/main/resources/Javascript/enumClass.mustache create mode 100644 modules/swagger-codegen/src/main/resources/Javascript/generatedAnnotation.mustache create mode 100644 modules/swagger-codegen/src/main/resources/Javascript/gradle.properties.mustache create mode 100644 modules/swagger-codegen/src/main/resources/Javascript/model.mustache create mode 100644 modules/swagger-codegen/src/main/resources/Javascript/model_full.mustache create mode 100644 modules/swagger-codegen/src/main/resources/Javascript/pom.mustache create mode 100644 modules/swagger-codegen/src/main/resources/Javascript/settings.gradle.mustache diff --git a/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/JavascriptClientCodegen.java b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/JavascriptClientCodegen.java new file mode 100644 index 00000000000..eb5bd743153 --- /dev/null +++ b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/JavascriptClientCodegen.java @@ -0,0 +1,599 @@ +package io.swagger.codegen.languages; + +import com.google.common.base.Strings; + +import io.swagger.codegen.CliOption; +import io.swagger.codegen.CodegenConfig; +import io.swagger.codegen.CodegenConstants; +import io.swagger.codegen.CodegenModel; +import io.swagger.codegen.CodegenOperation; +import io.swagger.codegen.CodegenProperty; +import io.swagger.codegen.CodegenType; +import io.swagger.codegen.DefaultCodegen; +import io.swagger.codegen.SupportingFile; +import io.swagger.models.Model; +import io.swagger.models.properties.ArrayProperty; +import io.swagger.models.properties.LongProperty; +import io.swagger.models.properties.MapProperty; +import io.swagger.models.properties.Property; +import io.swagger.models.properties.RefProperty; + +import java.io.File; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Iterator; +import java.util.List; +import java.util.Map; + +import org.apache.commons.lang.StringUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class JavascriptClientCodegen extends DefaultCodegen implements CodegenConfig { + private static final Logger LOGGER = LoggerFactory.getLogger(JavascriptClientCodegen.class); + + protected String invokerPackage = "io.swagger.client"; + protected String groupId = "io.swagger"; + protected String artifactId = "swagger-java-client"; + protected String artifactVersion = "1.0.0"; + protected String sourceFolder = "src"; + protected String localVariablePrefix = ""; + protected boolean fullJavaUtil = false; + protected String javaUtilPrefix = ""; + protected Boolean serializableModel = false; + + public JavascriptClientCodegen() { + super(); + outputFolder = "generated-code/js"; + modelTemplateFiles.put("model.mustache", ".js"); + apiTemplateFiles.put("api.mustache", ".js"); + templateDir = "Javascript"; + apiPackage = "api"; + modelPackage = "model"; + + reservedWords = new HashSet( + Arrays.asList( + "abstract", "continue", "for", "new", "switch", "assert", + "default", "if", "package", "synchronized", "boolean", "do", "goto", "private", + "this", "break", "double", "implements", "protected", "throw", "byte", "else", + "import", "public", "throws", "case", "enum", "instanceof", "return", "transient", + "catch", "extends", "int", "short", "try", "char", "final", "interface", "static", + "void", "class", "finally", "long", "strictfp", "volatile", "const", "float", + "native", "super", "while") + ); + + languageSpecificPrimitives = new HashSet( + Arrays.asList( + "String", + "boolean", + "Boolean", + "Double", + "Integer", + "Long", + "Float", + "Object", + "byte[]") + ); + instantiationTypes.put("array", "ArrayList"); + instantiationTypes.put("map", "HashMap"); + + cliOptions.add(new CliOption(CodegenConstants.INVOKER_PACKAGE, CodegenConstants.INVOKER_PACKAGE_DESC)); + cliOptions.add(new CliOption(CodegenConstants.GROUP_ID, CodegenConstants.GROUP_ID_DESC)); + cliOptions.add(new CliOption(CodegenConstants.ARTIFACT_ID, CodegenConstants.ARTIFACT_ID_DESC)); + cliOptions.add(new CliOption(CodegenConstants.ARTIFACT_VERSION, CodegenConstants.ARTIFACT_VERSION_DESC)); + cliOptions.add(new CliOption(CodegenConstants.SOURCE_FOLDER, CodegenConstants.SOURCE_FOLDER_DESC)); + cliOptions.add(new CliOption(CodegenConstants.LOCAL_VARIABLE_PREFIX, CodegenConstants.LOCAL_VARIABLE_PREFIX_DESC)); + cliOptions.add(new CliOption(CodegenConstants.SERIALIZABLE_MODEL, CodegenConstants.SERIALIZABLE_MODEL_DESC)); + cliOptions.add(new CliOption("fullJavaUtil", "whether to use fully qualified name for classes under java.util (default to false)")); + + /* + supportedLibraries.put("", "HTTP client: Jersey client 1.18. JSON processing: Jackson 2.4.2"); + supportedLibraries.put("jersey2", "HTTP client: Jersey client 2.6"); + supportedLibraries.put("okhttp-gson", "HTTP client: OkHttp 2.4.0. JSON processing: Gson 2.3.1"); + supportedLibraries.put("retrofit", "HTTP client: OkHttp 2.4.0. JSON processing: Gson 2.3.1 (Retrofit 1.9.0)"); + cliOptions.add(buildLibraryCliOption(supportedLibraries));*/ + } + + @Override + public CodegenType getTag() { + return CodegenType.CLIENT; + } + + @Override + public String getName() { + return "javascript"; + } + + @Override + public String getHelp() { + return "Generates a Javascript client library."; + } + + @Override + public void processOpts() { + super.processOpts(); +/* + if (additionalProperties.containsKey(CodegenConstants.INVOKER_PACKAGE)) { + this.setInvokerPackage((String) additionalProperties.get(CodegenConstants.INVOKER_PACKAGE)); + } else { + //not set, use default to be passed to template + additionalProperties.put(CodegenConstants.INVOKER_PACKAGE, invokerPackage); + } + + if (additionalProperties.containsKey(CodegenConstants.GROUP_ID)) { + this.setGroupId((String) additionalProperties.get(CodegenConstants.GROUP_ID)); + } else { + //not set, use to be passed to template + additionalProperties.put(CodegenConstants.GROUP_ID, groupId); + } + + if (additionalProperties.containsKey(CodegenConstants.ARTIFACT_ID)) { + this.setArtifactId((String) additionalProperties.get(CodegenConstants.ARTIFACT_ID)); + } else { + //not set, use to be passed to template + additionalProperties.put(CodegenConstants.ARTIFACT_ID, artifactId); + } + + if (additionalProperties.containsKey(CodegenConstants.ARTIFACT_VERSION)) { + this.setArtifactVersion((String) additionalProperties.get(CodegenConstants.ARTIFACT_VERSION)); + } else { + //not set, use to be passed to template + additionalProperties.put(CodegenConstants.ARTIFACT_VERSION, artifactVersion); + } + + if (additionalProperties.containsKey(CodegenConstants.SOURCE_FOLDER)) { + this.setSourceFolder((String) additionalProperties.get(CodegenConstants.SOURCE_FOLDER)); + } + + + if (additionalProperties.containsKey(CodegenConstants.LOCAL_VARIABLE_PREFIX)) { + this.setLocalVariablePrefix((String) additionalProperties.get(CodegenConstants.LOCAL_VARIABLE_PREFIX)); + } + + if (additionalProperties.containsKey(CodegenConstants.SERIALIZABLE_MODEL)) { + this.setSerializableModel(Boolean.valueOf((String)additionalProperties.get(CodegenConstants.SERIALIZABLE_MODEL).toString())); + } + + if (additionalProperties.containsKey(CodegenConstants.LIBRARY)) { + this.setLibrary((String) additionalProperties.get(CodegenConstants.LIBRARY)); + } + + // need to put back serializableModel (boolean) into additionalProperties as value in additionalProperties is string + additionalProperties.put(CodegenConstants.SERIALIZABLE_MODEL, serializableModel); + + if (additionalProperties.containsKey("fullJavaUtil")) { + fullJavaUtil = Boolean.valueOf(additionalProperties.get("fullJavaUtil").toString()); + } + if (fullJavaUtil) { + javaUtilPrefix = "java.util."; + } + additionalProperties.put("fullJavaUtil", fullJavaUtil); + additionalProperties.put("javaUtilPrefix", javaUtilPrefix); + + if (fullJavaUtil) { + typeMapping.put("array", "java.util.List"); + typeMapping.put("map", "java.util.Map"); + typeMapping.put("DateTime", "java.util.Date"); + typeMapping.remove("List"); + importMapping.remove("Date"); + importMapping.remove("Map"); + importMapping.remove("HashMap"); + importMapping.remove("Array"); + importMapping.remove("ArrayList"); + importMapping.remove("List"); + importMapping.remove("Set"); + importMapping.remove("DateTime"); + instantiationTypes.put("array", "java.util.ArrayList"); + instantiationTypes.put("map", "java.util.HashMap"); + } + + this.sanitizeConfig(); + + final String invokerFolder = (sourceFolder + File.separator + invokerPackage).replace(".", File.separator); + supportingFiles.add(new SupportingFile("pom.mustache", "", "pom.xml")); + supportingFiles.add(new SupportingFile("build.gradle.mustache", "", "build.gradle")); + supportingFiles.add(new SupportingFile("settings.gradle.mustache", "", "settings.gradle")); + supportingFiles.add(new SupportingFile("gradle.properties.mustache", "", "gradle.properties")); + supportingFiles.add(new SupportingFile("ApiClient.mustache", invokerFolder, "ApiClient.java")); + supportingFiles.add(new SupportingFile("StringUtil.mustache", invokerFolder, "StringUtil.java")); + + final String authFolder = (sourceFolder + File.separator + invokerPackage + ".auth").replace(".", File.separator); + supportingFiles.add(new SupportingFile("auth/HttpBasicAuth.mustache", authFolder, "HttpBasicAuth.java")); + supportingFiles.add(new SupportingFile("auth/ApiKeyAuth.mustache", authFolder, "ApiKeyAuth.java")); + supportingFiles.add(new SupportingFile("auth/OAuth.mustache", authFolder, "OAuth.java")); + supportingFiles.add(new SupportingFile("auth/OAuthFlow.mustache", authFolder, "OAuthFlow.java")); + + if (!"retrofit".equals(getLibrary())) { + supportingFiles.add(new SupportingFile("apiException.mustache", invokerFolder, "ApiException.java")); + supportingFiles.add(new SupportingFile("Configuration.mustache", invokerFolder, "Configuration.java")); + supportingFiles.add(new SupportingFile("JSON.mustache", invokerFolder, "JSON.java")); + supportingFiles.add(new SupportingFile("Pair.mustache", invokerFolder, "Pair.java")); + supportingFiles.add(new SupportingFile("auth/Authentication.mustache", authFolder, "Authentication.java")); + } + + // library-specific files + if ("okhttp-gson".equals(getLibrary())) { + // the "okhttp-gson" library template requires "ApiCallback.mustache" for async call + supportingFiles.add(new SupportingFile("ApiCallback.mustache", invokerFolder, "ApiCallback.java")); + // "build.sbt" is for development with SBT + supportingFiles.add(new SupportingFile("build.sbt.mustache", "", "build.sbt")); + } else if ("retrofit".equals(getLibrary())) { + supportingFiles.add(new SupportingFile("auth/OAuthOkHttpClient.mustache", authFolder, "OAuthOkHttpClient.java")); + supportingFiles.add(new SupportingFile("CollectionFormats.mustache", invokerFolder, "CollectionFormats.java")); + } else { + supportingFiles.add(new SupportingFile("TypeRef.mustache", invokerFolder, "TypeRef.java")); + }*/ + } +/* + private void sanitizeConfig() { + // Sanitize any config options here. We also have to update the additionalProperties because + // the whole additionalProperties object is injected into the main object passed to the mustache layer + + this.setApiPackage(sanitizePackageName(apiPackage)); + if (additionalProperties.containsKey(CodegenConstants.API_PACKAGE)) { + this.additionalProperties.put(CodegenConstants.API_PACKAGE, apiPackage); + } + + this.setModelPackage(sanitizePackageName(modelPackage)); + if (additionalProperties.containsKey(CodegenConstants.MODEL_PACKAGE)) { + this.additionalProperties.put(CodegenConstants.MODEL_PACKAGE, modelPackage); + } + + this.setInvokerPackage(sanitizePackageName(invokerPackage)); + if (additionalProperties.containsKey(CodegenConstants.INVOKER_PACKAGE)) { + this.additionalProperties.put(CodegenConstants.INVOKER_PACKAGE, invokerPackage); + } + }*/ + + @Override + public String escapeReservedWord(String name) { + return "_" + name; + } + + @Override + public String apiFileFolder() { + return outputFolder + "/" + sourceFolder + "/" + apiPackage().replace('.', File.separatorChar); + } + + @Override + public String modelFileFolder() { + return outputFolder + "/" + sourceFolder + "/" + modelPackage().replace('.', File.separatorChar); + } + + @Override + public String toVarName(String name) { + // sanitize name + name = sanitizeName(name); + + if("_".equals(name)) { + name = "_u"; + } + + // if it's all uppper case, do nothing + if (name.matches("^[A-Z_]*$")) { + return name; + } + + // camelize (lower first character) the variable name + // pet_id => petId + name = camelize(name, true); + + // for reserved word or word starting with number, append _ + if (reservedWords.contains(name) || name.matches("^\\d.*")) { + name = escapeReservedWord(name); + } + + return name; + } + + @Override + public String toParamName(String name) { + // should be the same as variable name + return toVarName(name); + } + + @Override + public String toModelName(String name) { + name = sanitizeName(name); + + // model name cannot use reserved keyword, e.g. return + if (reservedWords.contains(name)) { + throw new RuntimeException(name + " (reserved word) cannot be used as a model name"); + } + + // camelize the model name + // phone_number => PhoneNumber + return camelize(name); + } + + @Override + public String toModelFilename(String name) { + // should be the same as the model name + return toModelName(name); + } + + @Override + public String getTypeDeclaration(Property p) { + if (p instanceof ArrayProperty) { + ArrayProperty ap = (ArrayProperty) p; + Property inner = ap.getItems(); + return getSwaggerType(p) + "<" + getTypeDeclaration(inner) + ">"; + } else if (p instanceof MapProperty) { + MapProperty mp = (MapProperty) p; + Property inner = mp.getAdditionalProperties(); + + return getSwaggerType(p) + ""; + } + return super.getTypeDeclaration(p); + } + + @Override + public String toDefaultValue(Property p) { + if (p instanceof ArrayProperty) { + final ArrayProperty ap = (ArrayProperty) p; + final String pattern; + if (fullJavaUtil) { + pattern = "new java.util.ArrayList<%s>()"; + } else { + pattern = "new ArrayList<%s>()"; + } + return String.format(pattern, getTypeDeclaration(ap.getItems())); + } else if (p instanceof MapProperty) { + final MapProperty ap = (MapProperty) p; + final String pattern; + if (fullJavaUtil) { + pattern = "new java.util.HashMap()"; + } else { + pattern = "new HashMap()"; + } + return String.format(pattern, getTypeDeclaration(ap.getAdditionalProperties())); + + } else if (p instanceof LongProperty) { + LongProperty dp = (LongProperty) p; + if (dp.getDefault() != null) { + return dp.getDefault().toString()+"l"; + } + return "null"; + + // added for Javascript + } else if (p instanceof RefProperty) { + RefProperty rp = (RefProperty)p; + System.out.println("rp: " + rp.getName() + rp.getAccess() + rp.getDescription() + rp.getExample() + rp.getFormat() + rp.getSimpleRef() + rp.getTitle() + rp.getType()); + + return "new " +rp.getSimpleRef() + "()"; + } + + System.out.println("property: " + p); + + return super.toDefaultValue(p); + } + + @Override + public String getSwaggerType(Property p) { + String swaggerType = super.getSwaggerType(p); + String type = null; + if (typeMapping.containsKey(swaggerType)) { + type = typeMapping.get(swaggerType); + if (languageSpecificPrimitives.contains(type) || type.indexOf(".") >= 0) { + return type; + } + } else { + type = swaggerType; + } + if (null == type) { + LOGGER.error("No Type defined for Property " + p); + } + return toModelName(type); + } + + @Override + public String toOperationId(String operationId) { + // throw exception if method name is empty + if (StringUtils.isEmpty(operationId)) { + throw new RuntimeException("Empty method/operation name (operationId) not allowed"); + } + + // method name cannot use reserved keyword, e.g. return + if (reservedWords.contains(operationId)) { + throw new RuntimeException(operationId + " (reserved word) cannot be used as method name"); + } + + return camelize(sanitizeName(operationId), true); + } + + @Override + public CodegenModel fromModel(String name, Model model, Map allDefinitions) { + CodegenModel codegenModel = super.fromModel(name, model, allDefinitions); + + if (allDefinitions != null && codegenModel != null && codegenModel.parent != null && codegenModel.hasEnums) { + final Model parentModel = allDefinitions.get(toModelName(codegenModel.parent)); + final CodegenModel parentCodegenModel = super.fromModel(codegenModel.parent, parentModel); + codegenModel = this.reconcileInlineEnums(codegenModel, parentCodegenModel); + } + + 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; + + // handle ArrayProperty + if (var.items != null) { + allowableValues = var.items.allowableValues; + } + + if (allowableValues == null) { + continue; + } + List values = (List) allowableValues.get("values"); + if (values == null) { + continue; + } + + // put "enumVars" map into `allowableValues", including `name` and `value` + List> enumVars = new ArrayList>(); + String commonPrefix = findCommonPrefixOfVars(values); + int truncateIdx = commonPrefix.length(); + for (String value : values) { + Map enumVar = new HashMap(); + String enumName; + if (truncateIdx == 0) { + enumName = value; + } else { + enumName = value.substring(truncateIdx); + if ("".equals(enumName)) { + enumName = value; + } + } + enumVar.put("name", toEnumVarName(enumName)); + enumVar.put("value", value); + enumVars.add(enumVar); + } + allowableValues.put("enumVars", enumVars); + } + } + return objs; + } + + public Map postProcessOperations(Map objs) { + if("retrofit".equals(getLibrary())) { + Map operations = (Map) objs.get("operations"); + if (operations != null) { + List ops = (List) operations.get("operation"); + for (CodegenOperation operation : ops) { + if (operation.hasConsumes == Boolean.TRUE) { + Map firstType = operation.consumes.get(0); + if (firstType != null) { + if ("multipart/form-data".equals(firstType.get("mediaType"))) { + operation.isMultipart = Boolean.TRUE; + } + } + } + if (operation.returnType == null) { + operation.returnType = "Void"; + } + } + } + } + return objs; + } + + protected boolean needToImport(String type) { + return super.needToImport(type) && type.indexOf(".") < 0; + } + + private String findCommonPrefixOfVars(List vars) { + String prefix = StringUtils.getCommonPrefix(vars.toArray(new String[vars.size()])); + // exclude trailing characters that should be part of a valid variable + // e.g. ["status-on", "status-off"] => "status-" (not "status-o") + return prefix.replaceAll("[a-zA-Z0-9]+\\z", ""); + } + + private String toEnumVarName(String value) { + String var = value.replaceAll("\\W+", "_").toUpperCase(); + if (var.matches("\\d.*")) { + return "_" + var; + } else { + return var; + } + } + + 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 + // the parent and child models, look for enums that match, and remove + // them from the child models and leave them in the parent. + // Because the child models extend the parents, the enums will be available via the parent. + + // Only bother with reconciliation if the parent model has enums. + if (parentCodegenModel.hasEnums) { + + // Get the properties for the parent and child models + final List parentModelCodegenProperties = parentCodegenModel.vars; + List codegenProperties = codegenModel.vars; + + // Iterate over all of the parent model properties + boolean removedChildEnum = false; + for (CodegenProperty parentModelCodegenPropery : parentModelCodegenProperties) { + // Look for enums + if (parentModelCodegenPropery.isEnum) { + // Now that we have found an enum in the parent class, + // and search the child class for the same enum. + Iterator iterator = codegenProperties.iterator(); + while (iterator.hasNext()) { + CodegenProperty codegenProperty = iterator.next(); + if (codegenProperty.isEnum && codegenProperty.equals(parentModelCodegenPropery)) { + // We found an enum in the child class that is + // a duplicate of the one in the parent, so remove it. + iterator.remove(); + removedChildEnum = true; + } + } + } + } + + if(removedChildEnum) { + // If we removed an entry from this model's vars, we need to ensure hasMore is updated + int count = 0, numVars = codegenProperties.size(); + for(CodegenProperty codegenProperty : codegenProperties) { + count += 1; + codegenProperty.hasMore = (count < numVars) ? true : null; + } + codegenModel.vars = codegenProperties; + } + } + + return codegenModel; + } + + public void setInvokerPackage(String invokerPackage) { + this.invokerPackage = invokerPackage; + } + + public void setGroupId(String groupId) { + this.groupId = groupId; + } + + public void setArtifactId(String artifactId) { + this.artifactId = artifactId; + } + + public void setArtifactVersion(String artifactVersion) { + this.artifactVersion = artifactVersion; + } + + public void setSourceFolder(String sourceFolder) { + this.sourceFolder = sourceFolder; + } + + public void setLocalVariablePrefix(String localVariablePrefix) { + this.localVariablePrefix = localVariablePrefix; + } + + + public Boolean getSerializableModel() { + return serializableModel; + } + + public void setSerializableModel(Boolean serializableModel) { + this.serializableModel = serializableModel; + } + + private String sanitizePackageName(String packageName) { + packageName = packageName.trim(); + packageName = packageName.replaceAll("[^a-zA-Z0-9_\\.]", "_"); + if(Strings.isNullOrEmpty(packageName)) { + return "invalidPackageName"; + } + return packageName; + } + +} diff --git a/modules/swagger-codegen/src/main/resources/Javascript/ApiClient.mustache b/modules/swagger-codegen/src/main/resources/Javascript/ApiClient.mustache new file mode 100644 index 00000000000..18d27ede7c3 --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/Javascript/ApiClient.mustache @@ -0,0 +1,654 @@ +package {{invokerPackage}}; + +import com.sun.jersey.api.client.Client; +import com.sun.jersey.api.client.ClientResponse; +import com.sun.jersey.api.client.config.ClientConfig; +import com.sun.jersey.api.client.config.DefaultClientConfig; +import com.sun.jersey.api.client.filter.LoggingFilter; +import com.sun.jersey.api.client.WebResource.Builder; + +import com.sun.jersey.multipart.FormDataMultiPart; +import com.sun.jersey.multipart.file.FileDataBodyPart; + +import javax.ws.rs.core.Response.Status.Family; +import javax.ws.rs.core.MediaType; + +import java.util.Collection; +import java.util.Collections; +import java.util.Map; +import java.util.Map.Entry; +import java.util.HashMap; +import java.util.List; +import java.util.ArrayList; +import java.util.Date; +import java.util.TimeZone; + +import java.net.URLEncoder; + +import java.io.IOException; +import java.io.File; +import java.io.UnsupportedEncodingException; +import java.io.DataInputStream; + +import java.text.DateFormat; +import java.text.SimpleDateFormat; +import java.text.ParseException; + +import {{invokerPackage}}.auth.Authentication; +import {{invokerPackage}}.auth.HttpBasicAuth; +import {{invokerPackage}}.auth.ApiKeyAuth; +import {{invokerPackage}}.auth.OAuth; + +{{>generatedAnnotation}} +public class ApiClient { + private Map hostMap = new HashMap(); + private Map defaultHeaderMap = new HashMap(); + private boolean debugging = false; + private String basePath = "{{basePath}}"; + private JSON json = new JSON(); + + private Map authentications; + + private int statusCode; + private Map> responseHeaders; + + private DateFormat dateFormat; + + public ApiClient() { + // Use ISO 8601 format for date and datetime. + // See https://en.wikipedia.org/wiki/ISO_8601 + this.dateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ"); + + // Use UTC as the default time zone. + this.dateFormat.setTimeZone(TimeZone.getTimeZone("UTC")); + + // Set default User-Agent. + setUserAgent("Java-Swagger"); + + // Setup authentications (key: authentication name, value: authentication). + authentications = new HashMap();{{#authMethods}}{{#isBasic}} + authentications.put("{{name}}", new HttpBasicAuth());{{/isBasic}}{{#isApiKey}} + authentications.put("{{name}}", new ApiKeyAuth({{#isKeyInHeader}}"header"{{/isKeyInHeader}}{{^isKeyInHeader}}"query"{{/isKeyInHeader}}, "{{keyParamName}}"));{{/isApiKey}}{{#isOAuth}} + authentications.put("{{name}}", new OAuth());{{/isOAuth}}{{/authMethods}} + // Prevent the authentications from being modified. + authentications = Collections.unmodifiableMap(authentications); + } + + public String getBasePath() { + return basePath; + } + + public ApiClient setBasePath(String basePath) { + this.basePath = basePath; + 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). + */ + public Map getAuthentications() { + return authentications; + } + + /** + * Get authentication for the given name. + * + * @param authName The authentication name + * @return The authentication, null if not found + */ + public Authentication getAuthentication(String authName) { + return authentications.get(authName); + } + + /** + * Helper method to set username for the first HTTP basic authentication. + */ + public void setUsername(String username) { + for (Authentication auth : authentications.values()) { + if (auth instanceof HttpBasicAuth) { + ((HttpBasicAuth) auth).setUsername(username); + return; + } + } + throw new RuntimeException("No HTTP basic authentication configured!"); + } + + /** + * Helper method to set password for the first HTTP basic authentication. + */ + public void setPassword(String password) { + for (Authentication auth : authentications.values()) { + if (auth instanceof HttpBasicAuth) { + ((HttpBasicAuth) auth).setPassword(password); + return; + } + } + throw new RuntimeException("No HTTP basic authentication configured!"); + } + + /** + * Helper method to set API key value for the first API key authentication. + */ + public void setApiKey(String apiKey) { + for (Authentication auth : authentications.values()) { + if (auth instanceof ApiKeyAuth) { + ((ApiKeyAuth) auth).setApiKey(apiKey); + return; + } + } + throw new RuntimeException("No API key authentication configured!"); + } + + /** + * Helper method to set API key prefix for the first API key authentication. + */ + public void setApiKeyPrefix(String apiKeyPrefix) { + for (Authentication auth : authentications.values()) { + if (auth instanceof ApiKeyAuth) { + ((ApiKeyAuth) auth).setApiKeyPrefix(apiKeyPrefix); + return; + } + } + throw new RuntimeException("No API key authentication configured!"); + } + + /** + * Set the User-Agent header's value (by adding to the default header map). + */ + public ApiClient setUserAgent(String userAgent) { + addDefaultHeader("User-Agent", userAgent); + return this; + } + + /** + * Add a default header. + * + * @param key The header's key + * @param value The header's value + */ + public ApiClient addDefaultHeader(String key, String value) { + defaultHeaderMap.put(key, value); + return this; + } + + /** + * Check that whether debugging is enabled for this API client. + */ + public boolean isDebugging() { + return debugging; + } + + /** + * Enable/disable debugging for this API client. + * + * @param debugging To enable (true) or disable (false) debugging + */ + public ApiClient setDebugging(boolean debugging) { + this.debugging = debugging; + return this; + } + + /** + * Get the date format used to parse/format date parameters. + */ + public DateFormat getDateFormat() { + return dateFormat; + } + + /** + * Set the date format used to parse/format date parameters. + */ + public ApiClient setDateFormat(DateFormat dateFormat) { + this.dateFormat = dateFormat; + return this; + } + + /** + * Parse the given string into Date object. + */ + public Date parseDate(String str) { + try { + return dateFormat.parse(str); + } catch (java.text.ParseException e) { + throw new RuntimeException(e); + } + } + + /** + * Format the given Date object into string. + */ + public String formatDate(Date date) { + return dateFormat.format(date); + } + + /** + * Format the given parameter object into string. + */ + public String parameterToString(Object param) { + if (param == null) { + return ""; + } else if (param instanceof Date) { + return formatDate((Date) param); + } else if (param instanceof Collection) { + StringBuilder b = new StringBuilder(); + for(Object o : (Collection)param) { + if(b.length() > 0) { + b.append(","); + } + b.append(String.valueOf(o)); + } + return b.toString(); + } else { + return String.valueOf(param); + } + } + + /* + Format to {@code Pair} objects. + */ + public List parameterToPairs(String collectionFormat, String name, Object value){ + List params = new ArrayList(); + + // preconditions + if (name == null || name.isEmpty() || value == null) return params; + + Collection valueCollection = null; + if (value instanceof Collection) { + valueCollection = (Collection) value; + } else { + params.add(new Pair(name, parameterToString(value))); + return params; + } + + if (valueCollection.isEmpty()){ + return params; + } + + // get the collection format + collectionFormat = (collectionFormat == null || collectionFormat.isEmpty() ? "csv" : collectionFormat); // default: csv + + // create the params based on the collection format + if (collectionFormat.equals("multi")) { + for (Object item : valueCollection) { + params.add(new Pair(name, parameterToString(item))); + } + + return params; + } + + String delimiter = ","; + + if (collectionFormat.equals("csv")) { + delimiter = ","; + } else if (collectionFormat.equals("ssv")) { + delimiter = " "; + } else if (collectionFormat.equals("tsv")) { + delimiter = "\t"; + } else if (collectionFormat.equals("pipes")) { + delimiter = "|"; + } + + StringBuilder sb = new StringBuilder() ; + for (Object item : valueCollection) { + sb.append(delimiter); + sb.append(parameterToString(item)); + } + + params.add(new Pair(name, sb.substring(1))); + + return params; + } + + /** + * Select the Accept header's value from the given accepts array: + * if JSON exists in the given array, use it; + * otherwise use all of them (joining into a string) + * + * @param accepts The accepts array to select from + * @return The Accept header to use. If the given array is empty, + * null will be returned (not to set the Accept header explicitly). + */ + public String selectHeaderAccept(String[] accepts) { + if (accepts.length == 0) return null; + if (StringUtil.containsIgnoreCase(accepts, "application/json")) return "application/json"; + return StringUtil.join(accepts, ","); + } + + /** + * Select the Content-Type header's value from the given array: + * if JSON exists in the given array, use it; + * otherwise use the first one of the array. + * + * @param contentTypes The Content-Type array to select from + * @return The Content-Type header to use. If the given array is empty, + * JSON will be used. + */ + public String selectHeaderContentType(String[] contentTypes) { + if (contentTypes.length == 0) return "application/json"; + if (StringUtil.containsIgnoreCase(contentTypes, "application/json")) return "application/json"; + return contentTypes[0]; + } + + /** + * Escape the given string to be used as URL query value. + */ + public String escapeString(String str) { + try { + return URLEncoder.encode(str, "utf8").replaceAll("\\+", "%20"); + } catch (UnsupportedEncodingException e) { + return str; + } + } + + /** + * Serialize the given Java object into string according the given + * Content-Type (only JSON is supported for now). + */ + public String serialize(Object obj, String contentType) throws ApiException { + if (contentType.startsWith("application/json")) { + return json.serialize(obj); + } else { + throw new ApiException(400, "can not serialize object into Content-Type: " + contentType); + } + } + + /** + * Deserialize response body to Java object according to the Content-Type. + */ + public T deserialize(ClientResponse response, TypeRef returnType) throws ApiException { + String contentType = null; + List contentTypes = response.getHeaders().get("Content-Type"); + if (contentTypes != null && !contentTypes.isEmpty()) + contentType = contentTypes.get(0); + if (contentType == null) + throw new ApiException(500, "missing Content-Type in response"); + + String body; + if (response.hasEntity()) + body = (String) response.getEntity(String.class); + else + body = ""; + + if (contentType.startsWith("application/json")) { + return json.deserialize(body, returnType); + } else if (returnType.getType().equals(String.class)) { + // Expecting string, return the raw response body. + return (T) body; + } else { + throw new ApiException( + 500, + "Content type \"" + contentType + "\" is not supported for type: " + + returnType.getType() + ); + } + } + + private ClientResponse getAPIResponse(String path, String method, List queryParams, Object body, byte[] binaryBody, Map headerParams, Map formParams, String accept, String contentType, String[] authNames) throws ApiException { + + if (body != null && binaryBody != null){ + throw new ApiException(500, "either body or binaryBody must be null"); + } + + updateParamsForAuth(authNames, queryParams, headerParams); + + Client client = getClient(); + + StringBuilder b = new StringBuilder(); + b.append("?"); + if (queryParams != null){ + for (Pair queryParam : queryParams){ + if (!queryParam.getName().isEmpty()) { + b.append(escapeString(queryParam.getName())); + b.append("="); + b.append(escapeString(queryParam.getValue())); + b.append("&"); + } + } + } + + String querystring = b.substring(0, b.length() - 1); + + Builder builder; + if (accept == null) + builder = client.resource(basePath + path + querystring).getRequestBuilder(); + else + builder = client.resource(basePath + path + querystring).accept(accept); + + for (String key : headerParams.keySet()) { + builder = builder.header(key, headerParams.get(key)); + } + for (String key : defaultHeaderMap.keySet()) { + if (!headerParams.containsKey(key)) { + builder = builder.header(key, defaultHeaderMap.get(key)); + } + } + + String encodedFormParams = null; + if (contentType.startsWith("multipart/form-data")) { + FormDataMultiPart mp = new FormDataMultiPart(); + for (Entry param: formParams.entrySet()) { + if (param.getValue() instanceof File) { + File file = (File) param.getValue(); + mp.field(param.getKey(), file.getName()); + mp.bodyPart(new FileDataBodyPart(param.getKey(), file, MediaType.MULTIPART_FORM_DATA_TYPE)); + } else { + mp.field(param.getKey(), parameterToString(param.getValue()), MediaType.MULTIPART_FORM_DATA_TYPE); + } + } + body = mp; + } else if (contentType.startsWith("application/x-www-form-urlencoded")) { + encodedFormParams = this.getXWWWFormUrlencodedParams(formParams); + } + + ClientResponse response = null; + + if ("GET".equals(method)) { + response = (ClientResponse) builder.get(ClientResponse.class); + } else if ("POST".equals(method)) { + if (encodedFormParams != null) { + response = builder.type(contentType).post(ClientResponse.class, encodedFormParams); + } else if (body == null) { + if(binaryBody == null) + response = builder.post(ClientResponse.class, null); + else + response = builder.type(contentType).post(ClientResponse.class, binaryBody); + } else if (body instanceof FormDataMultiPart) { + response = builder.type(contentType).post(ClientResponse.class, body); + } else { + response = builder.type(contentType).post(ClientResponse.class, serialize(body, contentType)); + } + } else if ("PUT".equals(method)) { + if (encodedFormParams != null) { + response = builder.type(contentType).put(ClientResponse.class, encodedFormParams); + } else if(body == null) { + if(binaryBody == null) + response = builder.put(ClientResponse.class, null); + else + response = builder.type(contentType).put(ClientResponse.class, binaryBody); + } else { + response = builder.type(contentType).put(ClientResponse.class, serialize(body, contentType)); + } + } else if ("DELETE".equals(method)) { + if (encodedFormParams != null) { + response = builder.type(contentType).delete(ClientResponse.class, encodedFormParams); + } else if(body == null) { + if(binaryBody == null) + response = builder.delete(ClientResponse.class); + else + response = builder.type(contentType).delete(ClientResponse.class, binaryBody); + } else { + response = builder.type(contentType).delete(ClientResponse.class, serialize(body, contentType)); + } + } else { + throw new ApiException(500, "unknown method type " + method); + } + return response; + } + + /** + * Invoke API by sending HTTP request with the given options. + * + * @param path The sub-path of the HTTP URL + * @param method The request method, one of "GET", "POST", "PUT", and "DELETE" + * @param queryParams The query parameters + * @param body The request body object - if it is not binary, otherwise null + * @param binaryBody The request body object - if it is binary, otherwise null + * @param headerParams The header parameters + * @param formParams The form parameters + * @param accept The request's Accept header + * @param contentType The request's Content-Type header + * @param authNames The authentications to apply + * @return The response body in type of string + */ + public T invokeAPI(String path, String method, List queryParams, Object body, byte[] binaryBody, Map headerParams, Map formParams, String accept, String contentType, String[] authNames, TypeRef returnType) throws ApiException { + + 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) { + if (returnType == null) + return null; + else + return deserialize(response, returnType); + } else { + String message = "error"; + String respBody = null; + if (response.hasEntity()) { + try { + respBody = String.valueOf(response.getEntity(String.class)); + message = respBody; + } catch (RuntimeException e) { + // e.printStackTrace(); + } + } + throw new ApiException( + response.getStatusInfo().getStatusCode(), + message, + response.getHeaders(), + respBody); + } + } + /** + * Invoke API by sending HTTP request with the given options - return binary result + * + * @param path The sub-path of the HTTP URL + * @param method The request method, one of "GET", "POST", "PUT", and "DELETE" + * @param queryParams The query parameters + * @param body The request body object - if it is not binary, otherwise null + * @param binaryBody The request body object - if it is binary, otherwise null + * @param headerParams The header parameters + * @param formParams The form parameters + * @param accept The request's Accept header + * @param contentType The request's Content-Type header + * @param authNames The authentications to apply + * @return The response body in type of string + */ + public byte[] invokeBinaryAPI(String path, String method, List queryParams, Object body, byte[] binaryBody, Map headerParams, Map formParams, String accept, String contentType, String[]authNames) throws ApiException { + + ClientResponse response = getAPIResponse(path, method, queryParams, body, binaryBody, headerParams, formParams, accept, contentType, authNames); + + if(response.getStatusInfo() == ClientResponse.Status.NO_CONTENT) { + return null; + } + else if(response.getStatusInfo().getFamily() == Family.SUCCESSFUL) { + if(response.hasEntity()) { + DataInputStream stream = new DataInputStream(response.getEntityInputStream()); + byte[] data = new byte[response.getLength()]; + try { + stream.readFully(data); + } catch (IOException ex) { + throw new ApiException(500, "Error obtaining binary response data"); + } + return data; + } + else { + return new byte[0]; + } + } + else { + String message = "error"; + if(response.hasEntity()) { + try{ + message = String.valueOf(response.getEntity(String.class)); + } + catch (RuntimeException e) { + // e.printStackTrace(); + } + } + throw new ApiException( + response.getStatusInfo().getStatusCode(), + message); + } + } + + /** + * Update query and header parameters based on authentication settings. + * + * @param authNames The authentications to apply + */ + private void updateParamsForAuth(String[] authNames, List queryParams, Map headerParams) { + for (String authName : authNames) { + Authentication auth = authentications.get(authName); + if (auth == null) throw new RuntimeException("Authentication undefined: " + authName); + auth.applyToParams(queryParams, headerParams); + } + } + + /** + * Encode the given form parameters as request body. + */ + private String getXWWWFormUrlencodedParams(Map formParams) { + StringBuilder formParamBuilder = new StringBuilder(); + + for (Entry param : formParams.entrySet()) { + String keyStr = param.getKey(); + String valueStr = parameterToString(param.getValue()); + try { + formParamBuilder.append(URLEncoder.encode(param.getKey(), "utf8")) + .append("=") + .append(URLEncoder.encode(valueStr, "utf8")); + formParamBuilder.append("&"); + } catch (UnsupportedEncodingException e) { + // move on to next + } + } + + String encodedFormParams = formParamBuilder.toString(); + if (encodedFormParams.endsWith("&")) { + encodedFormParams = encodedFormParams.substring(0, encodedFormParams.length() - 1); + } + + return encodedFormParams; + } + + /** + * Get an existing client or create a new client to handle HTTP request. + */ + private Client getClient() { + if(!hostMap.containsKey(basePath)) { + Client client = Client.create(); + if (debugging) + client.addFilter(new LoggingFilter()); + hostMap.put(basePath, client); + } + return hostMap.get(basePath); + } +} diff --git a/modules/swagger-codegen/src/main/resources/Javascript/Configuration.mustache b/modules/swagger-codegen/src/main/resources/Javascript/Configuration.mustache new file mode 100644 index 00000000000..4629c4e17be --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/Javascript/Configuration.mustache @@ -0,0 +1,22 @@ +package {{invokerPackage}}; + +{{>generatedAnnotation}} +public class Configuration { + private static ApiClient defaultApiClient = new ApiClient(); + + /** + * Get the default API client, which would be used when creating API + * instances without providing an API client. + */ + public static ApiClient getDefaultApiClient() { + return defaultApiClient; + } + + /** + * Set the default API client, which would be used when creating API + * instances without providing an API client. + */ + public static void setDefaultApiClient(ApiClient apiClient) { + defaultApiClient = apiClient; + } +} diff --git a/modules/swagger-codegen/src/main/resources/Javascript/JSON.mustache b/modules/swagger-codegen/src/main/resources/Javascript/JSON.mustache new file mode 100644 index 00000000000..43b38f6e21d --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/Javascript/JSON.mustache @@ -0,0 +1,55 @@ +package {{invokerPackage}}; + +import com.fasterxml.jackson.annotation.*; +import com.fasterxml.jackson.databind.*; +import com.fasterxml.jackson.datatype.joda.*; + +import java.io.IOException; + +{{>generatedAnnotation}} +public class JSON { + private ObjectMapper mapper; + + public JSON() { + mapper = new ObjectMapper(); + mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL); + 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()); + } + + /** + * Serialize the given Java object into JSON string. + */ + public String serialize(Object obj) throws ApiException { + try { + if (obj != null) + return mapper.writeValueAsString(obj); + else + return null; + } catch (Exception e) { + throw new ApiException(400, e.getMessage()); + } + } + + /** + * Deserialize the given JSON string to Java object. + * + * @param body The JSON string + * @param returnType The type to deserialize inot + * @return The deserialized Java object + */ + public T deserialize(String body, TypeRef returnType) throws ApiException { + JavaType javaType = mapper.constructType(returnType.getType()); + try { + return mapper.readValue(body, javaType); + } catch (IOException e) { + if (returnType.getType().equals(String.class)) + return (T) body; + else + throw new ApiException(500, e.getMessage(), null, body); + } + } +} diff --git a/modules/swagger-codegen/src/main/resources/Javascript/Pair.mustache b/modules/swagger-codegen/src/main/resources/Javascript/Pair.mustache new file mode 100644 index 00000000000..e2a47317afe --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/Javascript/Pair.mustache @@ -0,0 +1,39 @@ +package {{invokerPackage}}; + +{{>generatedAnnotation}} +public class Pair { + private String name = ""; + private String value = ""; + + public Pair (String name, String value) { + setName(name); + setValue(value); + } + + private void setName(String name) { + if (!isValidString(name)) return; + + this.name = name; + } + + private void setValue(String value) { + if (!isValidString(value)) return; + + this.value = value; + } + + public String getName() { + return this.name; + } + + public String getValue() { + return this.value; + } + + private boolean isValidString(String arg) { + if (arg == null) return false; + if (arg.trim().isEmpty()) return false; + + return true; + } +} diff --git a/modules/swagger-codegen/src/main/resources/Javascript/StringUtil.mustache b/modules/swagger-codegen/src/main/resources/Javascript/StringUtil.mustache new file mode 100644 index 00000000000..c9583f1bc63 --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/Javascript/StringUtil.mustache @@ -0,0 +1,51 @@ +package {{invokerPackage}}; + +{{>generatedAnnotation}} +public class StringUtil { + /** + * Check if the given array contains the given value (with case-insensitive comparison). + * + * @param array The array + * @param value The value to search + * @return true if the array contains the value + */ + public static boolean containsIgnoreCase(String[] array, String value) { + for (String str : array) { + if (value == null && str == null) return true; + if (value != null && value.equalsIgnoreCase(str)) return true; + } + return false; + } + + /** + * Join an array of strings with the given separator. + *

+ * Note: This might be replaced by utility method from commons-lang or guava someday + * if one of those libraries is added as dependency. + *

+ * + * @param array The array of strings + * @param separator The separator + * @return the resulting string + */ + public static String join(String[] array, String separator) { + int len = array.length; + if (len == 0) return ""; + + StringBuilder out = new StringBuilder(); + out.append(array[0]); + for (int i = 1; i < len; i++) { + out.append(separator).append(array[i]); + } + return out.toString(); + } + + /** + * Convert the given object to string with each line indented by 4 spaces + * (except the first line). + */ + public static String toIndentedString(Object o) { + if (o == null) return "null"; + return o.toString().replace("\n", "\n "); + } +} diff --git a/modules/swagger-codegen/src/main/resources/Javascript/TypeRef.mustache b/modules/swagger-codegen/src/main/resources/Javascript/TypeRef.mustache new file mode 100644 index 00000000000..9e9ba5f8895 --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/Javascript/TypeRef.mustache @@ -0,0 +1,26 @@ +package {{invokerPackage}}; + +import java.lang.reflect.ParameterizedType; +import java.lang.reflect.Type; + +{{>generatedAnnotation}} +public class TypeRef { + private final Type type; + + public TypeRef() { + this.type = getGenericType(getClass()); + } + + private static Type getGenericType(Class klass) { + Type superclass = klass.getGenericSuperclass(); + if (superclass instanceof Class) { + throw new RuntimeException("No type parameter provided"); + } + ParameterizedType parameterized = (ParameterizedType) superclass; + return parameterized.getActualTypeArguments()[0]; + } + + public Type getType() { + return type; + } +} diff --git a/modules/swagger-codegen/src/main/resources/Javascript/api.mustache b/modules/swagger-codegen/src/main/resources/Javascript/api.mustache new file mode 100644 index 00000000000..9e41b237c68 --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/Javascript/api.mustache @@ -0,0 +1,113 @@ +/* + * {{>generatedAnnotation}} + */ +function {{classname}}() { + var self = this; +{{#operations}} + {{#operation}} + /** + * {{summary}} + * {{notes}} +{{#allParams}} * @param {{=<% %>=}}{<% dataType %>} <%={{ }}=%> {{paramName}} {{description}} +{{/allParams}} * @param {function} callback the callback function + * @return {{#returnType}}{{{returnType}}}{{/returnType}}{{^returnType}}void{{/returnType}} + */ + self.{{nickname}} = function({{#allParams}}{{paramName}}{{#hasMore}}, {{/hasMore}}{{/allParams}}, callback) { + + var {{localVariablePrefix}}postBody = {{#bodyParam}}{{^isBinary}}JSON.stringify({{paramName}}){{/isBinary}}{{#isBinary}}null{{/isBinary}}{{/bodyParam}}{{^bodyParam}}null{{/bodyParam}}; + var {{localVariablePrefix}}postBinaryBody = {{#bodyParam}}{{#isBinary}}{{paramName}}{{/isBinary}}{{^isBinary}}null{{/isBinary}}{{/bodyParam}}{{^bodyParam}}null{{/bodyParam}}; + {{#allParams}}{{#required}} + // verify the required parameter '{{paramName}}' is set + if ({{paramName}} == null) { + //throw new ApiException(400, "Missing the required parameter '{{paramName}}' when calling {{nickname}}"); + var errorRequiredMsg = "Missing the required parameter '{{paramName}}' when calling {{nickname}}"; + throw errorRequiredMsg; + } + {{/required}}{{/allParams}} + // create path and map variables + var {{localVariablePrefix}}path = '{{basePath}}' + self.replaceAll(self.replaceAll("{{{path}}}", "\\{format\\}","json"){{#pathParams}} +, "\\{" + "{{baseName}}" + "\\}", {{localVariablePrefix}}apiClient.escapeString({{{paramName}}}.toString())){{/pathParams}}); + + var queryParams = {}; + var headerParams = {}; + var formParams = {}; + + {{#queryParams}} + queryParams.{{baseName}} = {{paramName}}; + {{/queryParams}} + {{#headerParams}}if ({{paramName}} != null) + {{localVariablePrefix}}headerParams.put("{{baseName}}", {{localVariablePrefix}}apiClient.parameterToString({{paramName}})); + {{/headerParams}} + {{#formParams}}if ({{paramName}} != null) + {{localVariablePrefix}}formParams.put("{{baseName}}", {{paramName}}); + {{/formParams}} + + path += self.createQueryString(queryParams); + + if (console) { + console.log('path: ' + path); + console.log('queryParams: ' + queryParams); + } + + {{#isResponseBinary}} + byte[] {{localVariablePrefix}}response = null; + {{localVariablePrefix}}response = {{localVariablePrefix}}apiClient.invokeBinaryAPI({{localVariablePrefix}}path, "{{httpMethod}}", {{localVariablePrefix}}queryParams,{{localVariablePrefix}} postBody, {{localVariablePrefix}}postBinaryBody, {{localVariablePrefix}}headerParams, {{localVariablePrefix}}formParams, {{localVariablePrefix}}accept, {{localVariablePrefix}}contentType, {{localVariablePrefix}}authNames); + return {{localVariablePrefix}}response; + {{/isResponseBinary}} + + {{^isResponseBinary}} + {{#returnType}} + //TypeRef {{localVariablePrefix}}returnType = new TypeRef<{{{returnType}}}>() {}; + //return {{localVariablePrefix}}apiClient.invokeAPI({{localVariablePrefix}}path, "{{httpMethod}}", {{localVariablePrefix}}queryParams, {{localVariablePrefix}}postBody, {{localVariablePrefix}}postBinaryBody, {{localVariablePrefix}}headerParams, {{localVariablePrefix}}formParams, {{localVariablePrefix}}accept, {{localVariablePrefix}}contentType, {{localVariablePrefix}}authNames, {{localVariablePrefix}}returnType); + + var options = {type: "{{httpMethod}}", async: true, contentType: "application/json", dataType: "json", data: postBody}; + var request = $.ajax(path, options); + //request.fail(function(jqXHR, textStatus, errorThrown){ + // errorHandler(jqXHR, textStatus, errorThrown); + //}); + + + request.done(function(response, textStatus, jqXHR){ + /** + * @returns {{{returnType}}} + */ + var myResponse = response; + callback(myResponse, textStatus, jqXHR); + }); + + {{/returnType}}{{^returnType}} + {{localVariablePrefix}}apiClient.invokeAPI({{localVariablePrefix}}path, "{{httpMethod}}", {{localVariablePrefix}}queryParams, {{localVariablePrefix}}postBody, {{localVariablePrefix}}postBinaryBody, {{localVariablePrefix}}headerParams, {{localVariablePrefix}}formParams, {{localVariablePrefix}}accept, {{localVariablePrefix}}contentType, {{localVariablePrefix}}authNames, null); + {{/returnType}} + {{/isResponseBinary}} + + + } + {{/operation}} + +{{/operations}} + +self.replaceAll = function (haystack, needle, replace) { + var result= haystack; + if (needle !=null && replace!=null) { + result= haystack.replace(new RegExp(needle, 'g'), replace); + } + return result; +} + +self.createQueryString = function (queryParams) { + var queryString =''; + var i = 0; + for (var queryParamName in queryParams) { + if (i==0) { + queryString += '?' ; + } else { + queryString += '&' ; + } + + queryString += queryParamName + '=' + encodeURIComponent(queryParams[queryParamName]); + i++; + } + + return queryString; +} +} diff --git a/modules/swagger-codegen/src/main/resources/Javascript/apiException.mustache b/modules/swagger-codegen/src/main/resources/Javascript/apiException.mustache new file mode 100644 index 00000000000..b9a62a6b231 --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/Javascript/apiException.mustache @@ -0,0 +1,69 @@ +package {{invokerPackage}}; + +import java.util.Map; +import java.util.List; + +{{>generatedAnnotation}} +public class ApiException extends Exception { + private int code = 0; + private Map> responseHeaders = null; + private String responseBody = null; + + public ApiException() {} + + public ApiException(Throwable throwable) { + super(throwable); + } + + public ApiException(String message) { + super(message); + } + + public ApiException(String message, Throwable throwable, int code, Map> responseHeaders, String responseBody) { + super(message, throwable); + this.code = code; + this.responseHeaders = responseHeaders; + this.responseBody = responseBody; + } + + public ApiException(String message, int code, Map> responseHeaders, String responseBody) { + this(message, (Throwable) null, code, responseHeaders, responseBody); + } + + public ApiException(String message, Throwable throwable, int code, Map> responseHeaders) { + this(message, throwable, code, responseHeaders, null); + } + + public ApiException(int code, Map> responseHeaders, String responseBody) { + this((String) null, (Throwable) null, code, responseHeaders, responseBody); + } + + public ApiException(int code, String message) { + super(message); + this.code = code; + } + + public ApiException(int code, String message, Map> responseHeaders, String responseBody) { + this(code, message); + this.responseHeaders = responseHeaders; + this.responseBody = responseBody; + } + + public int getCode() { + return code; + } + + /** + * Get the HTTP response headers. + */ + public Map> getResponseHeaders() { + return responseHeaders; + } + + /** + * Get the HTTP response body. + */ + public String getResponseBody() { + return responseBody; + } +} diff --git a/modules/swagger-codegen/src/main/resources/Javascript/build.gradle.mustache b/modules/swagger-codegen/src/main/resources/Javascript/build.gradle.mustache new file mode 100644 index 00000000000..971dcd816a4 --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/Javascript/build.gradle.mustache @@ -0,0 +1,107 @@ +group = '{{groupId}}' +version = '{{artifactVersion}}' + +buildscript { + repositories { + jcenter() + } + dependencies { + classpath 'com.android.tools.build:gradle:1.2.2' + classpath 'com.github.dcendents:android-maven-plugin:1.2' + } +} + +repositories { + jcenter() +} + + +if(hasProperty('target') && target == 'android') { + + apply plugin: 'com.android.library' + apply plugin: 'com.github.dcendents.android-maven' + + android { + compileSdkVersion 22 + buildToolsVersion '22.0.0' + defaultConfig { + minSdkVersion 14 + targetSdkVersion 22 + } + compileOptions { + sourceCompatibility JavaVersion.VERSION_1_7 + targetCompatibility JavaVersion.VERSION_1_7 + } + + // Rename the aar correctly + libraryVariants.all { variant -> + variant.outputs.each { output -> + def outputFile = output.outputFile + if (outputFile != null && outputFile.name.endsWith('.aar')) { + def fileName = "${project.name}-${variant.baseName}-${version}.aar" + output.outputFile = new File(outputFile.parent, fileName) + } + } + } + } + + afterEvaluate { + android.libraryVariants.all { variant -> + def task = project.tasks.create "jar${variant.name.capitalize()}", Jar + task.description = "Create jar artifact for ${variant.name}" + task.dependsOn variant.javaCompile + task.from variant.javaCompile.destinationDir + task.destinationDir = project.file("${project.buildDir}/outputs/jar") + task.archiveName = "${project.name}-${variant.baseName}-${version}.jar" + artifacts.add('archives', task); + } + } + + task sourcesJar(type: Jar) { + from android.sourceSets.main.java.srcDirs + classifier = 'sources' + } + + artifacts { + archives sourcesJar + } + +} else { + + apply plugin: 'java' + apply plugin: 'maven' + + sourceCompatibility = JavaVersion.VERSION_1_7 + targetCompatibility = JavaVersion.VERSION_1_7 + + install { + repositories.mavenInstaller { + pom.artifactId = '{{artifactId}}' + } + } + + task execute(type:JavaExec) { + main = System.getProperty('mainClass') + classpath = sourceSets.main.runtimeClasspath + } +} + +ext { + swagger_annotations_version = "1.5.0" + jackson_version = "2.4.2" + jersey_version = "1.18" + jodatime_version = "2.3" + junit_version = "4.8.1" +} + +dependencies { + compile "io.swagger:swagger-annotations:$swagger_annotations_version" + compile "com.sun.jersey:jersey-client:$jersey_version" + compile "com.sun.jersey.contribs:jersey-multipart:$jersey_version" + compile "com.fasterxml.jackson.core:jackson-core:$jackson_version" + compile "com.fasterxml.jackson.core:jackson-annotations:$jackson_version" + compile "com.fasterxml.jackson.core:jackson-databind:$jackson_version" + compile "com.fasterxml.jackson.datatype:jackson-datatype-joda:2.1.5" + compile "joda-time:joda-time:$jodatime_version" + testCompile "junit:junit:$junit_version" +} diff --git a/modules/swagger-codegen/src/main/resources/Javascript/enumClass.mustache b/modules/swagger-codegen/src/main/resources/Javascript/enumClass.mustache new file mode 100644 index 00000000000..bbbd802800d --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/Javascript/enumClass.mustache @@ -0,0 +1,7 @@ +function {{datatypeWithEnum}}() { + var self = this; + +{{#allowableValues}}{{#enumVars}} self.{{name}} = "{{value}}"{{^-last}}, + {{/-last}}{{#-last}};{{/-last}}{{/enumVars}}{{/allowableValues}} + +} diff --git a/modules/swagger-codegen/src/main/resources/Javascript/generatedAnnotation.mustache b/modules/swagger-codegen/src/main/resources/Javascript/generatedAnnotation.mustache new file mode 100644 index 00000000000..49110fc1ad9 --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/Javascript/generatedAnnotation.mustache @@ -0,0 +1 @@ +@javax.annotation.Generated(value = "{{generatorClass}}", date = "{{generatedDate}}") \ No newline at end of file diff --git a/modules/swagger-codegen/src/main/resources/Javascript/gradle.properties.mustache b/modules/swagger-codegen/src/main/resources/Javascript/gradle.properties.mustache new file mode 100644 index 00000000000..05644f0754a --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/Javascript/gradle.properties.mustache @@ -0,0 +1,2 @@ +# Uncomment to build for Android +#target = android \ No newline at end of file diff --git a/modules/swagger-codegen/src/main/resources/Javascript/model.mustache b/modules/swagger-codegen/src/main/resources/Javascript/model.mustache new file mode 100644 index 00000000000..8e3c02ffd04 --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/Javascript/model.mustache @@ -0,0 +1,41 @@ +{{#models}}{{#model}} +{{#vars}}{{#isEnum}}{{>enumClass}}{{/isEnum}}{{#items.isEnum}}{{#items}} +{{>enumClass}}{{/items}}*/{{/items.isEnum}}{{/vars}} +{{#description}}/** + * {{description}} + **/{{/description}} +function {{classname}}() { {{#parent}}/* extends {{{parent}}}*/{{/parent}} + var self = this; + {{#vars}} + /**{{#description}} + * {{{description}}}{{/description}} + * datatype: {{{datatypeWithEnum}}}{{#minimum}} + * minimum: {{minimum}}{{/minimum}}{{#maximum}} + * maximum: {{maximum}}{{/maximum}} + **/ + self.{{name}} = {{{defaultValue}}}; + {{/vars}} + + {{#vars}} + /**{{#description}} + * get {{{description}}}{{/description}}{{#minimum}} + * minimum: {{minimum}}{{/minimum}}{{#maximum}} + * maximum: {{maximum}}{{/maximum}} + * @return {{=<% %>=}}{<% datatypeWithEnum %>}<%={{ }}=%> + **/ + self.{{getter}} = function() { + return self.{{name}}; + } + + /**{{#description}} + * set {{{description}}}{{/description}} + * @param {{=<% %>=}}{<% datatypeWithEnum %>}<%={{ }}=%> {{name}} + **/ + self.{{setter}} = function ({{name}}) { + self.{{name}} = {{name}}; + } + {{/vars}} + +} +{{/model}} +{{/models}} diff --git a/modules/swagger-codegen/src/main/resources/Javascript/model_full.mustache b/modules/swagger-codegen/src/main/resources/Javascript/model_full.mustache new file mode 100644 index 00000000000..11f4b9c7fca --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/Javascript/model_full.mustache @@ -0,0 +1,61 @@ +//package {{package}}; + +//import {{invokerPackage}}.StringUtil; +//{{#imports}}import {{import}}; +//{{/imports}} + +//{{#serializableModel}} +//import java.io.Serializable;{{/serializableModel}} + +//import io.swagger.annotations.*; +//import com.fasterxml.jackson.annotation.JsonProperty; +{{#models}} + +{{#model}}{{#description}} +/** + * {{description}} + **/{{/description}} +//@ApiModel(description = "{{{description}}}") +// {{>generatedAnnotation}} +//public class {{classname}} {{#parent}}extends {{{parent}}}{{/parent}} /* {{#serializableModel}}implements Serializable{{/serializableModel}} */ { +function {{classname}}() { + var self = this; + + {{#vars}}/*{{#isEnum}} + +{{>enumClass}}{{/isEnum}}{{#items.isEnum}}{{#items}} + +{{>enumClass}}{{/items}}{{/items.isEnum}}*/ + //private {{{datatypeWithEnum}}} {{name}} = {{{defaultValue}}}; + self.{{name}} = {{{defaultValue}}}; + {{/vars}} + + {{#vars}} + /**{{#description}} + * {{{description}}}{{/description}}{{#minimum}} + * minimum: {{minimum}}{{/minimum}}{{#maximum}} + * maximum: {{maximum}}{{/maximum}} + **/ + //@ApiModelProperty({{#required}}required = {{required}}, {{/required}}value = "{{{description}}}") + //@JsonProperty("{{baseName}}") + //public {{{datatypeWithEnum}}} {{getter}}() { + // return {{name}}; + //} + //public void {{setter}}({{{datatypeWithEnum}}} {{name}}) { + // this.{{name}} = {{name}}; + //} + + {{/vars}} + + //@Override + //public String toString() { + // StringBuilder sb = new StringBuilder(); + // sb.append("class {{classname}} {\n"); + // {{#parent}}sb.append(" ").append(StringUtil.toIndentedString(super.toString())).append("\n");{{/parent}} + // {{#vars}}sb.append(" {{name}}: ").append(StringUtil.toIndentedString({{name}})).append("\n"); + // {{/vars}}sb.append("}"); + // return sb.toString(); + //} +} +{{/model}} +{{/models}} diff --git a/modules/swagger-codegen/src/main/resources/Javascript/pom.mustache b/modules/swagger-codegen/src/main/resources/Javascript/pom.mustache new file mode 100644 index 00000000000..c7dd1865518 --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/Javascript/pom.mustache @@ -0,0 +1,171 @@ + + 4.0.0 + {{groupId}} + {{artifactId}} + jar + {{artifactId}} + {{artifactVersion}} + + scm:git:git@github.com:swagger-api/swagger-mustache.git + scm:git:git@github.com:swagger-api/swagger-codegen.git + https://github.com/swagger-api/swagger-codegen + + + 2.2.0 + + + + + + org.apache.maven.plugins + maven-surefire-plugin + 2.12 + + + + loggerPath + conf/log4j.properties + + + -Xms512m -Xmx1500m + methods + pertest + + + + maven-dependency-plugin + + + package + + copy-dependencies + + + ${project.build.directory}/lib + + + + + + + + org.apache.maven.plugins + maven-jar-plugin + 2.2 + + + + jar + test-jar + + + + + + + + + org.codehaus.mojo + build-helper-maven-plugin + + + add_sources + generate-sources + + add-source + + + + src/main/java + + + + + add_test_sources + generate-test-sources + + add-test-source + + + + src/test/java + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + 2.3.2 + + 1.6 + 1.6 + + + + + + + io.swagger + swagger-annotations + ${swagger-annotations-version} + + + + + com.sun.jersey + jersey-client + ${jersey-version} + + + com.sun.jersey.contribs + jersey-multipart + ${jersey-version} + + + + + com.fasterxml.jackson.core + jackson-core + ${jackson-version} + + + com.fasterxml.jackson.core + jackson-annotations + ${jackson-version} + + + com.fasterxml.jackson.core + jackson-databind + ${jackson-version} + + + com.fasterxml.jackson.datatype + jackson-datatype-joda + 2.1.5 + + + joda-time + joda-time + ${jodatime-version} + + + + + junit + junit + ${junit-version} + test + + + + 1.5.4 + 1.18 + 2.4.2 + 2.3 + 1.0.0 + 4.8.1 + + diff --git a/modules/swagger-codegen/src/main/resources/Javascript/settings.gradle.mustache b/modules/swagger-codegen/src/main/resources/Javascript/settings.gradle.mustache new file mode 100644 index 00000000000..b8fd6c4c41f --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/Javascript/settings.gradle.mustache @@ -0,0 +1 @@ +rootProject.name = "{{artifactId}}" \ No newline at end of file From 3c3c93a53da9f03d100939dc68e7891163944d0e Mon Sep 17 00:00:00 2001 From: Johannes Fiala Date: Sat, 5 Dec 2015 21:11:55 +0100 Subject: [PATCH 120/211] refine handling of nested properties #1294 --- .../io/swagger/codegen/DefaultCodegen.java | 18 +++++------ .../languages/JavascriptClientCodegen.java | 30 +++++++++++-------- .../main/resources/Javascript/api.mustache | 2 +- .../main/resources/Javascript/model.mustache | 2 +- 4 files changed, 28 insertions(+), 24 deletions(-) diff --git a/modules/swagger-codegen/src/main/java/io/swagger/codegen/DefaultCodegen.java b/modules/swagger-codegen/src/main/java/io/swagger/codegen/DefaultCodegen.java index edeb9e89c88..29ccd153d00 100644 --- a/modules/swagger-codegen/src/main/java/io/swagger/codegen/DefaultCodegen.java +++ b/modules/swagger-codegen/src/main/java/io/swagger/codegen/DefaultCodegen.java @@ -588,39 +588,39 @@ public class DefaultCodegen { */ public String toDefaultValueWithParam(String name, Property p) { if (p instanceof StringProperty) { - return "data." + name + ";"; + return " = data." + name + ";"; } else if (p instanceof BooleanProperty) { - return "data." + name + ";"; + return " = data." + name + ";"; } else if (p instanceof DateProperty) { - return "data." + name + ";"; + return " = data." + name + ";"; } else if (p instanceof DateTimeProperty) { - return "data." + name + ";"; + return " = data." + name + ";"; } else if (p instanceof DoubleProperty) { DoubleProperty dp = (DoubleProperty) p; if (dp.getDefault() != null) { return dp.getDefault().toString(); } - return "data." + name + ";"; + return " = data." + name + ";"; } else if (p instanceof FloatProperty) { FloatProperty dp = (FloatProperty) p; if (dp.getDefault() != null) { return dp.getDefault().toString(); } - return "data." + name + ";"; + return " = data." + name + ";"; } else if (p instanceof IntegerProperty) { IntegerProperty dp = (IntegerProperty) p; if (dp.getDefault() != null) { return dp.getDefault().toString(); } - return "data." + name + ";"; + return " = data." + name + ";"; } else if (p instanceof LongProperty) { LongProperty dp = (LongProperty) p; if (dp.getDefault() != null) { return dp.getDefault().toString(); } - return "data." + name + ";"; + return " = data." + name + ";"; } else { - return "data." + name + ";"; + return " = data." + name + ";"; } } diff --git a/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/JavascriptClientCodegen.java b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/JavascriptClientCodegen.java index 264d1074d9b..8526b9c48c5 100644 --- a/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/JavascriptClientCodegen.java +++ b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/JavascriptClientCodegen.java @@ -334,11 +334,13 @@ public class JavascriptClientCodegen extends DefaultCodegen implements CodegenCo if (p instanceof ArrayProperty) { final ArrayProperty ap = (ArrayProperty) p; final String pattern; - if (fullJavaUtil) { - pattern = "new java.util.ArrayList<%s>()"; - } else { - pattern = "new ArrayList<%s>()"; - } + //if (fullJavaUtil) { + // pattern = "new ArrayList()"; + //} else { + // pattern = "new ArrayList<%s>()"; + //} + + pattern = "new Array()"; return String.format(pattern, getTypeDeclaration(ap.getItems())); } else if (p instanceof MapProperty) { final MapProperty ap = (MapProperty) p; @@ -376,17 +378,19 @@ public class JavascriptClientCodegen extends DefaultCodegen implements CodegenCo if (p instanceof ArrayProperty) { final ArrayProperty ap = (ArrayProperty) p; final String pattern; - if (fullJavaUtil) { - pattern = "new java.util.ArrayList<%s>()"; - } else { - pattern = "new ArrayList<%s>()" ; - } +// if (fullJavaUtil) { +// pattern = "new java.util.ArrayList<%s>()"; +// } else { +// pattern = "new ArrayList<%s>()" ; +// } + pattern = " = new Array()" ; + return String.format(pattern, getTypeDeclaration(ap.getItems()))+ ";"; } else if (p instanceof MapProperty) { final MapProperty ap = (MapProperty) p; final String pattern; if (fullJavaUtil) { - pattern = "new java.util.HashMap()"; + pattern = " = new java.util.HashMap()"; } else { pattern = "new HashMap()"; } @@ -394,14 +398,14 @@ public class JavascriptClientCodegen extends DefaultCodegen implements CodegenCo } else if (p instanceof LongProperty) { LongProperty dp = (LongProperty) p; - return "data." + name + ";"; + return " = data." + name + ";"; // added for Javascript } else if (p instanceof RefProperty) { RefProperty rp = (RefProperty)p; System.out.println("rp: " + rp.getName() + rp.getAccess() + rp.getDescription() + rp.getExample() + rp.getFormat() + rp.getSimpleRef() + rp.getTitle() + rp.getType()); - return "new " +rp.getSimpleRef() + "(data." + name + ");"; + return ".constructFromObject(data." + name + ");"; } System.out.println("property: " + p); diff --git a/modules/swagger-codegen/src/main/resources/Javascript/api.mustache b/modules/swagger-codegen/src/main/resources/Javascript/api.mustache index 5e8254a143c..b4ae1c4096e 100644 --- a/modules/swagger-codegen/src/main/resources/Javascript/api.mustache +++ b/modules/swagger-codegen/src/main/resources/Javascript/api.mustache @@ -26,7 +26,7 @@ function {{classname}}() { {{/required}}{{/allParams}} // create path and map variables var {{localVariablePrefix}}path = '{{basePath}}' + replaceAll(replaceAll("{{{path}}}", "\\{format\\}","json"){{#pathParams}} -, "\\{" + "{{baseName}}" + "\\}", {{localVariablePrefix}}apiClient.escapeString({{{paramName}}}.toString())){{/pathParams}}); +, "\\{" + "{{baseName}}" + "\\}", {{localVariablePrefix}}apiClient.escapeString({{{paramName}}}.toString()){{/pathParams}}); var queryParams = {}; var headerParams = {}; diff --git a/modules/swagger-codegen/src/main/resources/Javascript/model.mustache b/modules/swagger-codegen/src/main/resources/Javascript/model.mustache index 84812052df0..ca5e2c3230e 100644 --- a/modules/swagger-codegen/src/main/resources/Javascript/model.mustache +++ b/modules/swagger-codegen/src/main/resources/Javascript/model.mustache @@ -18,7 +18,7 @@ function {{classname}}() { {{#parent}}/* extends {{{parent}}}*/{{/parent}} self.constructFromObject = function(data) { {{#vars}} - self.{{name}} = {{{defaultValueWithParam}}} + self.{{name}}{{{defaultValueWithParam}}} {{/vars}} } From 34fb2c561f81c6e81bb61397a67791e6b4ddeab3 Mon Sep 17 00:00:00 2001 From: Johannes Fiala Date: Sat, 5 Dec 2015 21:11:55 +0100 Subject: [PATCH 121/211] cleanup build error due to missing CodegenConfig configuration entry #1294 --- .../io/swagger/codegen/DefaultCodegen.java | 18 +++++------ .../languages/JavascriptClientCodegen.java | 30 +++++++++++-------- .../main/resources/Javascript/api.mustache | 2 +- .../main/resources/Javascript/model.mustache | 2 +- .../services/io.swagger.codegen.CodegenConfig | 1 + 5 files changed, 29 insertions(+), 24 deletions(-) diff --git a/modules/swagger-codegen/src/main/java/io/swagger/codegen/DefaultCodegen.java b/modules/swagger-codegen/src/main/java/io/swagger/codegen/DefaultCodegen.java index edeb9e89c88..29ccd153d00 100644 --- a/modules/swagger-codegen/src/main/java/io/swagger/codegen/DefaultCodegen.java +++ b/modules/swagger-codegen/src/main/java/io/swagger/codegen/DefaultCodegen.java @@ -588,39 +588,39 @@ public class DefaultCodegen { */ public String toDefaultValueWithParam(String name, Property p) { if (p instanceof StringProperty) { - return "data." + name + ";"; + return " = data." + name + ";"; } else if (p instanceof BooleanProperty) { - return "data." + name + ";"; + return " = data." + name + ";"; } else if (p instanceof DateProperty) { - return "data." + name + ";"; + return " = data." + name + ";"; } else if (p instanceof DateTimeProperty) { - return "data." + name + ";"; + return " = data." + name + ";"; } else if (p instanceof DoubleProperty) { DoubleProperty dp = (DoubleProperty) p; if (dp.getDefault() != null) { return dp.getDefault().toString(); } - return "data." + name + ";"; + return " = data." + name + ";"; } else if (p instanceof FloatProperty) { FloatProperty dp = (FloatProperty) p; if (dp.getDefault() != null) { return dp.getDefault().toString(); } - return "data." + name + ";"; + return " = data." + name + ";"; } else if (p instanceof IntegerProperty) { IntegerProperty dp = (IntegerProperty) p; if (dp.getDefault() != null) { return dp.getDefault().toString(); } - return "data." + name + ";"; + return " = data." + name + ";"; } else if (p instanceof LongProperty) { LongProperty dp = (LongProperty) p; if (dp.getDefault() != null) { return dp.getDefault().toString(); } - return "data." + name + ";"; + return " = data." + name + ";"; } else { - return "data." + name + ";"; + return " = data." + name + ";"; } } diff --git a/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/JavascriptClientCodegen.java b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/JavascriptClientCodegen.java index 264d1074d9b..8526b9c48c5 100644 --- a/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/JavascriptClientCodegen.java +++ b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/JavascriptClientCodegen.java @@ -334,11 +334,13 @@ public class JavascriptClientCodegen extends DefaultCodegen implements CodegenCo if (p instanceof ArrayProperty) { final ArrayProperty ap = (ArrayProperty) p; final String pattern; - if (fullJavaUtil) { - pattern = "new java.util.ArrayList<%s>()"; - } else { - pattern = "new ArrayList<%s>()"; - } + //if (fullJavaUtil) { + // pattern = "new ArrayList()"; + //} else { + // pattern = "new ArrayList<%s>()"; + //} + + pattern = "new Array()"; return String.format(pattern, getTypeDeclaration(ap.getItems())); } else if (p instanceof MapProperty) { final MapProperty ap = (MapProperty) p; @@ -376,17 +378,19 @@ public class JavascriptClientCodegen extends DefaultCodegen implements CodegenCo if (p instanceof ArrayProperty) { final ArrayProperty ap = (ArrayProperty) p; final String pattern; - if (fullJavaUtil) { - pattern = "new java.util.ArrayList<%s>()"; - } else { - pattern = "new ArrayList<%s>()" ; - } +// if (fullJavaUtil) { +// pattern = "new java.util.ArrayList<%s>()"; +// } else { +// pattern = "new ArrayList<%s>()" ; +// } + pattern = " = new Array()" ; + return String.format(pattern, getTypeDeclaration(ap.getItems()))+ ";"; } else if (p instanceof MapProperty) { final MapProperty ap = (MapProperty) p; final String pattern; if (fullJavaUtil) { - pattern = "new java.util.HashMap()"; + pattern = " = new java.util.HashMap()"; } else { pattern = "new HashMap()"; } @@ -394,14 +398,14 @@ public class JavascriptClientCodegen extends DefaultCodegen implements CodegenCo } else if (p instanceof LongProperty) { LongProperty dp = (LongProperty) p; - return "data." + name + ";"; + return " = data." + name + ";"; // added for Javascript } else if (p instanceof RefProperty) { RefProperty rp = (RefProperty)p; System.out.println("rp: " + rp.getName() + rp.getAccess() + rp.getDescription() + rp.getExample() + rp.getFormat() + rp.getSimpleRef() + rp.getTitle() + rp.getType()); - return "new " +rp.getSimpleRef() + "(data." + name + ");"; + return ".constructFromObject(data." + name + ");"; } System.out.println("property: " + p); diff --git a/modules/swagger-codegen/src/main/resources/Javascript/api.mustache b/modules/swagger-codegen/src/main/resources/Javascript/api.mustache index 5e8254a143c..b4ae1c4096e 100644 --- a/modules/swagger-codegen/src/main/resources/Javascript/api.mustache +++ b/modules/swagger-codegen/src/main/resources/Javascript/api.mustache @@ -26,7 +26,7 @@ function {{classname}}() { {{/required}}{{/allParams}} // create path and map variables var {{localVariablePrefix}}path = '{{basePath}}' + replaceAll(replaceAll("{{{path}}}", "\\{format\\}","json"){{#pathParams}} -, "\\{" + "{{baseName}}" + "\\}", {{localVariablePrefix}}apiClient.escapeString({{{paramName}}}.toString())){{/pathParams}}); +, "\\{" + "{{baseName}}" + "\\}", {{localVariablePrefix}}apiClient.escapeString({{{paramName}}}.toString()){{/pathParams}}); var queryParams = {}; var headerParams = {}; diff --git a/modules/swagger-codegen/src/main/resources/Javascript/model.mustache b/modules/swagger-codegen/src/main/resources/Javascript/model.mustache index 84812052df0..ca5e2c3230e 100644 --- a/modules/swagger-codegen/src/main/resources/Javascript/model.mustache +++ b/modules/swagger-codegen/src/main/resources/Javascript/model.mustache @@ -18,7 +18,7 @@ function {{classname}}() { {{#parent}}/* extends {{{parent}}}*/{{/parent}} self.constructFromObject = function(data) { {{#vars}} - self.{{name}} = {{{defaultValueWithParam}}} + self.{{name}}{{{defaultValueWithParam}}} {{/vars}} } 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 dd6e4d60b55..349fe78b4a0 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 @@ -5,6 +5,7 @@ io.swagger.codegen.languages.DartClientCodegen io.swagger.codegen.languages.FlashClientCodegen io.swagger.codegen.languages.FlaskConnexionCodegen io.swagger.codegen.languages.JavaClientCodegen +io.swagger.codegen.languages.JavascriptClientCodegen io.swagger.codegen.languages.JaxRSServerCodegen io.swagger.codegen.languages.JavaInflectorServerCodegen io.swagger.codegen.languages.NodeJSServerCodegen From 1a8a03ee52dd8262ddd544608f421120f3a985cb Mon Sep 17 00:00:00 2001 From: Johannes Fiala Date: Sun, 6 Dec 2015 10:36:12 +0100 Subject: [PATCH 122/211] cleanup unused templates #1294 --- .../resources/Javascript/model_full.mustache | 61 ------------------- 1 file changed, 61 deletions(-) delete mode 100644 modules/swagger-codegen/src/main/resources/Javascript/model_full.mustache diff --git a/modules/swagger-codegen/src/main/resources/Javascript/model_full.mustache b/modules/swagger-codegen/src/main/resources/Javascript/model_full.mustache deleted file mode 100644 index 11f4b9c7fca..00000000000 --- a/modules/swagger-codegen/src/main/resources/Javascript/model_full.mustache +++ /dev/null @@ -1,61 +0,0 @@ -//package {{package}}; - -//import {{invokerPackage}}.StringUtil; -//{{#imports}}import {{import}}; -//{{/imports}} - -//{{#serializableModel}} -//import java.io.Serializable;{{/serializableModel}} - -//import io.swagger.annotations.*; -//import com.fasterxml.jackson.annotation.JsonProperty; -{{#models}} - -{{#model}}{{#description}} -/** - * {{description}} - **/{{/description}} -//@ApiModel(description = "{{{description}}}") -// {{>generatedAnnotation}} -//public class {{classname}} {{#parent}}extends {{{parent}}}{{/parent}} /* {{#serializableModel}}implements Serializable{{/serializableModel}} */ { -function {{classname}}() { - var self = this; - - {{#vars}}/*{{#isEnum}} - -{{>enumClass}}{{/isEnum}}{{#items.isEnum}}{{#items}} - -{{>enumClass}}{{/items}}{{/items.isEnum}}*/ - //private {{{datatypeWithEnum}}} {{name}} = {{{defaultValue}}}; - self.{{name}} = {{{defaultValue}}}; - {{/vars}} - - {{#vars}} - /**{{#description}} - * {{{description}}}{{/description}}{{#minimum}} - * minimum: {{minimum}}{{/minimum}}{{#maximum}} - * maximum: {{maximum}}{{/maximum}} - **/ - //@ApiModelProperty({{#required}}required = {{required}}, {{/required}}value = "{{{description}}}") - //@JsonProperty("{{baseName}}") - //public {{{datatypeWithEnum}}} {{getter}}() { - // return {{name}}; - //} - //public void {{setter}}({{{datatypeWithEnum}}} {{name}}) { - // this.{{name}} = {{name}}; - //} - - {{/vars}} - - //@Override - //public String toString() { - // StringBuilder sb = new StringBuilder(); - // sb.append("class {{classname}} {\n"); - // {{#parent}}sb.append(" ").append(StringUtil.toIndentedString(super.toString())).append("\n");{{/parent}} - // {{#vars}}sb.append(" {{name}}: ").append(StringUtil.toIndentedString({{name}})).append("\n"); - // {{/vars}}sb.append("}"); - // return sb.toString(); - //} -} -{{/model}} -{{/models}} From 8fd6b604d34cedaeda1d738fcbab729cde9ba43d Mon Sep 17 00:00:00 2001 From: Johannes Fiala Date: Sun, 6 Dec 2015 10:37:06 +0100 Subject: [PATCH 123/211] Add all required parameters as default constructor parameters #1294 --- .../java/io/swagger/codegen/CodegenModel.java | 7 +++++++ .../java/io/swagger/codegen/DefaultCodegen.java | 4 ++++ .../src/main/resources/Javascript/api.mustache | 16 +++++++++++----- .../src/main/resources/Javascript/model.mustache | 10 +++++++--- 4 files changed, 29 insertions(+), 8 deletions(-) diff --git a/modules/swagger-codegen/src/main/java/io/swagger/codegen/CodegenModel.java b/modules/swagger-codegen/src/main/java/io/swagger/codegen/CodegenModel.java index f4dcd074404..d9aea7da624 100644 --- a/modules/swagger-codegen/src/main/java/io/swagger/codegen/CodegenModel.java +++ b/modules/swagger-codegen/src/main/java/io/swagger/codegen/CodegenModel.java @@ -13,6 +13,13 @@ public class CodegenModel { public String unescapedDescription; public String defaultValue; public List vars = new ArrayList(); + + // list of all required parameters + public Set mandatory = new HashSet(); + + // TODO: temporary solution to get a delimited list of default constructor parameters, should be replaced if there is a better way of injecting the mandatory parameters into the mustache templates + public String mandatoryParams; + public Set imports = new HashSet(); public Boolean hasVars, emptyVars, hasMoreModels, hasEnums; public ExternalDocs externalDocs; diff --git a/modules/swagger-codegen/src/main/java/io/swagger/codegen/DefaultCodegen.java b/modules/swagger-codegen/src/main/java/io/swagger/codegen/DefaultCodegen.java index 29ccd153d00..e1292cbac95 100644 --- a/modules/swagger-codegen/src/main/java/io/swagger/codegen/DefaultCodegen.java +++ b/modules/swagger-codegen/src/main/java/io/swagger/codegen/DefaultCodegen.java @@ -1881,6 +1881,10 @@ public class DefaultCodegen { m.vars.add(cp); } } + + m.mandatory = mandatory; + m.mandatoryParams = StringUtils.join(mandatory, ", "); + } else { m.emptyVars = true; m.hasVars = false; diff --git a/modules/swagger-codegen/src/main/resources/Javascript/api.mustache b/modules/swagger-codegen/src/main/resources/Javascript/api.mustache index b4ae1c4096e..6d4f4541649 100644 --- a/modules/swagger-codegen/src/main/resources/Javascript/api.mustache +++ b/modules/swagger-codegen/src/main/resources/Javascript/api.mustache @@ -25,7 +25,13 @@ function {{classname}}() { } {{/required}}{{/allParams}} // create path and map variables - var {{localVariablePrefix}}path = '{{basePath}}' + replaceAll(replaceAll("{{{path}}}", "\\{format\\}","json"){{#pathParams}} + var basePath = '{{basePath}}'; + // if basePath ends with a /, remove it as path starts with a leading / + if (basePath.substring(basePath.length-1, basePath.length)=='/') { + basePath = basePath.substring(0, basePath.length-1); + } + + var {{localVariablePrefix}}path = basePath + replaceAll(replaceAll("{{{path}}}", "\\{format\\}","json"){{#pathParams}} , "\\{" + "{{baseName}}" + "\\}", {{localVariablePrefix}}apiClient.escapeString({{{paramName}}}.toString()){{/pathParams}}); var queryParams = {}; @@ -44,10 +50,10 @@ function {{classname}}() { path += createQueryString(queryParams); - if (console) { - console.log('path: ' + path); - console.log('queryParams: ' + queryParams); - } + //if (console) { + //console.log('path: ' + path); + //console.log('queryParams: ' + queryParams); + //} {{#isResponseBinary}} byte[] {{localVariablePrefix}}response = null; diff --git a/modules/swagger-codegen/src/main/resources/Javascript/model.mustache b/modules/swagger-codegen/src/main/resources/Javascript/model.mustache index ca5e2c3230e..792fde00b12 100644 --- a/modules/swagger-codegen/src/main/resources/Javascript/model.mustache +++ b/modules/swagger-codegen/src/main/resources/Javascript/model.mustache @@ -4,16 +4,17 @@ {{#description}}/** * {{description}} **/{{/description}} -function {{classname}}() { {{#parent}}/* extends {{{parent}}}*/{{/parent}} +function {{classname}}({{mandatoryParams}}) { {{#parent}}/* extends {{{parent}}}*/{{/parent}} var self = this; {{#vars}} /**{{#description}} * {{{description}}}{{/description}} - * datatype: {{{datatypeWithEnum}}}{{#minimum}} + * datatype: {{{datatypeWithEnum}}}{{#required}} + * required{{/required}}{{#minimum}} * minimum: {{minimum}}{{/minimum}}{{#maximum}} * maximum: {{maximum}}{{/maximum}} **/ - self.{{name}} = {{{defaultValue}}}; + self.{{name}} = {{#required}}{{name}}{{/required}}{{^required}}{{{defaultValue}}}{{/required}}; {{/vars}} self.constructFromObject = function(data) { @@ -42,6 +43,9 @@ function {{classname}}() { {{#parent}}/* extends {{{parent}}}*/{{/parent}} } {{/vars}} + self.toJson = function () { + return JSON.stringify(self); + } } {{/model}} {{/models}} From da15cf78675542a5518f7e19b20353d1170f8322 Mon Sep 17 00:00:00 2001 From: Johannes Fiala Date: Sun, 6 Dec 2015 10:38:50 +0100 Subject: [PATCH 124/211] Ignore settings #1294 --- modules/swagger-codegen/.gitignore | 1 + 1 file changed, 1 insertion(+) create mode 100644 modules/swagger-codegen/.gitignore diff --git a/modules/swagger-codegen/.gitignore b/modules/swagger-codegen/.gitignore new file mode 100644 index 00000000000..d027396de4e --- /dev/null +++ b/modules/swagger-codegen/.gitignore @@ -0,0 +1 @@ +/.settings/ From 529a7abfce53a30a5d675981a3c71f8ab0fb44ff Mon Sep 17 00:00:00 2001 From: Johannes Fiala Date: Sun, 6 Dec 2015 10:40:30 +0100 Subject: [PATCH 125/211] Add missing template files #1294 --- .../src/main/resources/Javascript/enumClass.mustache | 7 +++++++ .../main/resources/Javascript/generatedAnnotation.mustache | 1 + 2 files changed, 8 insertions(+) create mode 100644 modules/swagger-codegen/src/main/resources/Javascript/enumClass.mustache create mode 100644 modules/swagger-codegen/src/main/resources/Javascript/generatedAnnotation.mustache diff --git a/modules/swagger-codegen/src/main/resources/Javascript/enumClass.mustache b/modules/swagger-codegen/src/main/resources/Javascript/enumClass.mustache new file mode 100644 index 00000000000..bbbd802800d --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/Javascript/enumClass.mustache @@ -0,0 +1,7 @@ +function {{datatypeWithEnum}}() { + var self = this; + +{{#allowableValues}}{{#enumVars}} self.{{name}} = "{{value}}"{{^-last}}, + {{/-last}}{{#-last}};{{/-last}}{{/enumVars}}{{/allowableValues}} + +} diff --git a/modules/swagger-codegen/src/main/resources/Javascript/generatedAnnotation.mustache b/modules/swagger-codegen/src/main/resources/Javascript/generatedAnnotation.mustache new file mode 100644 index 00000000000..49110fc1ad9 --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/Javascript/generatedAnnotation.mustache @@ -0,0 +1 @@ +@javax.annotation.Generated(value = "{{generatorClass}}", date = "{{generatedDate}}") \ No newline at end of file From b3588da6b75bb2e6f786d1ad014527ef3327b226 Mon Sep 17 00:00:00 2001 From: Johannes Fiala Date: Sun, 6 Dec 2015 11:02:05 +0100 Subject: [PATCH 126/211] add @const to enumeration values #1294 --- .../src/main/resources/Javascript/enumClass.mustache | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/modules/swagger-codegen/src/main/resources/Javascript/enumClass.mustache b/modules/swagger-codegen/src/main/resources/Javascript/enumClass.mustache index bbbd802800d..5b0f1b277d8 100644 --- a/modules/swagger-codegen/src/main/resources/Javascript/enumClass.mustache +++ b/modules/swagger-codegen/src/main/resources/Javascript/enumClass.mustache @@ -1,7 +1,11 @@ function {{datatypeWithEnum}}() { var self = this; -{{#allowableValues}}{{#enumVars}} self.{{name}} = "{{value}}"{{^-last}}, - {{/-last}}{{#-last}};{{/-last}}{{/enumVars}}{{/allowableValues}} +{{#allowableValues}}{{#enumVars}} + /** + * @const + */ + self.{{name}} = "{{value}}"{{^-last}}, + {{/-last}}{{#-last}};{{/-last}}{{/enumVars}}{{/allowableValues}} } From bb341832a578eb8a711adb764198325314a6d7af Mon Sep 17 00:00:00 2001 From: wing328 Date: Sun, 6 Dec 2015 19:00:52 +0800 Subject: [PATCH 127/211] add http info to php api methods --- .../src/main/resources/php/ApiClient.mustache | 4 +- .../src/main/resources/php/api.mustache | 30 ++- .../php/SwaggerClient-php/lib/Api/PetApi.php | 183 +++++++++++++++--- .../SwaggerClient-php/lib/Api/StoreApi.php | 97 ++++++++-- .../php/SwaggerClient-php/lib/Api/UserApi.php | 173 ++++++++++++++--- .../php/SwaggerClient-php/lib/ApiClient.php | 4 +- 6 files changed, 416 insertions(+), 75 deletions(-) diff --git a/modules/swagger-codegen/src/main/resources/php/ApiClient.mustache b/modules/swagger-codegen/src/main/resources/php/ApiClient.mustache index 11fe3827d48..35c065c81de 100644 --- a/modules/swagger-codegen/src/main/resources/php/ApiClient.mustache +++ b/modules/swagger-codegen/src/main/resources/php/ApiClient.mustache @@ -231,7 +231,7 @@ class ApiClient } else if ($response_info['http_code'] >= 200 && $response_info['http_code'] <= 299 ) { // return raw body if response is a file if ($responseType == '\SplFileObject') { - return array($http_body, $http_header); + return array($http_body, $response_info['http_code'], $http_header); } $data = json_decode($http_body); @@ -249,7 +249,7 @@ class ApiClient $response_info['http_code'], $http_header, $data ); } - return array($data, $http_header); + return array($data, $response_info['http_code'], $http_header); } /** diff --git a/modules/swagger-codegen/src/main/resources/php/api.mustache b/modules/swagger-codegen/src/main/resources/php/api.mustache index 53a81030813..2ba06331d50 100644 --- a/modules/swagger-codegen/src/main/resources/php/api.mustache +++ b/modules/swagger-codegen/src/main/resources/php/api.mustache @@ -92,7 +92,7 @@ use \{{invokerPackage}}\ObjectSerializer; {{#operation}} /** - * {{{nickname}}} + * {{{operationId}}} * * {{{summary}}} * @@ -100,12 +100,28 @@ use \{{invokerPackage}}\ObjectSerializer; {{/allParams}} * @return {{#returnType}}{{{returnType}}}{{/returnType}}{{^returnType}}void{{/returnType}} * @throws \{{invokerPackage}}\ApiException on non-2xx response */ - public function {{nickname}}({{#allParams}}${{paramName}}{{^required}}=null{{/required}}{{#hasMore}}, {{/hasMore}}{{/allParams}}) + public function {{operationId}} ({{#allParams}}${{paramName}}{{^required}}=null{{/required}}{{#hasMore}}, {{/hasMore}}{{/allParams}}) + { + list($response, $statusCode, $httpHeader) = $this->{{operationId}}WithHttpInfo ({{#allParams}}${{paramName}}{{#hasMore}}, {{/hasMore}}{{/allParams}}); + return $response; + } + + + /** + * {{{operationId}}} + * + * {{{summary}}} + * + {{#allParams}} * @param {{dataType}} ${{paramName}} {{description}} {{#required}}(required){{/required}}{{^required}}(optional){{/required}} + {{/allParams}} * @return {{#returnType}}{{{returnType}}}{{/returnType}}{{^returnType}}void{{/returnType}} + * @throws \{{invokerPackage}}\ApiException on non-2xx response + */ + public function {{operationId}}WithHttpInfo ({{#allParams}}${{paramName}}{{^required}}=null{{/required}}{{#hasMore}}, {{/hasMore}}{{/allParams}}) { {{#allParams}}{{#required}} // verify the required parameter '{{paramName}}' is set if (${{paramName}} === null) { - throw new \InvalidArgumentException('Missing the required parameter ${{paramName}} when calling {{nickname}}'); + throw new \InvalidArgumentException('Missing the required parameter ${{paramName}} when calling {{operationId}}'); }{{/required}}{{/allParams}} // parse inputs @@ -182,17 +198,17 @@ use \{{invokerPackage}}\ObjectSerializer; // make the API Call try { - list($response, $httpHeader) = $this->apiClient->callApi( + list($response, $statusCode, $httpHeader) = $this->apiClient->callApi( $resourcePath, $method, $queryParams, $httpBody, $headerParams{{#returnType}}, '{{returnType}}'{{/returnType}} ); {{#returnType}} if (!$response) { - return null; + return array(null, $statusCode, $httpHeader); } - return $this->apiClient->getSerializer()->deserialize($response, '{{returnType}}', $httpHeader); + return array($this->apiClient->getSerializer()->deserialize($response, '{{returnType}}', $httpHeader)); {{/returnType}} } catch (ApiException $e) { switch ($e->getCode()) { {{#responses}}{{#dataType}} @@ -205,7 +221,7 @@ use \{{invokerPackage}}\ObjectSerializer; throw $e; } {{#returnType}} - return null; + return array(null, $statusCode, $httpHeader); {{/returnType}} } {{/operation}} diff --git a/samples/client/petstore/php/SwaggerClient-php/lib/Api/PetApi.php b/samples/client/petstore/php/SwaggerClient-php/lib/Api/PetApi.php index bc03a7974d3..0e971841f50 100644 --- a/samples/client/petstore/php/SwaggerClient-php/lib/Api/PetApi.php +++ b/samples/client/petstore/php/SwaggerClient-php/lib/Api/PetApi.php @@ -100,7 +100,23 @@ class PetApi * @return void * @throws \Swagger\Client\ApiException on non-2xx response */ - public function updatePet($body=null) + public function updatePet ($body=null) + { + list($response, $statusCode, $httpHeader) = $this->updatePetWithHttpInfo ($body); + return $response; + } + + + /** + * updatePet + * + * Update an existing pet + * + * @param \Swagger\Client\Model\Pet $body Pet object that needs to be added to the store (optional) + * @return void + * @throws \Swagger\Client\ApiException on non-2xx response + */ + public function updatePetWithHttpInfo ($body=null) { @@ -143,7 +159,7 @@ class PetApi // make the API Call try { - list($response, $httpHeader) = $this->apiClient->callApi( + list($response, $statusCode, $httpHeader) = $this->apiClient->callApi( $resourcePath, $method, $queryParams, $httpBody, $headerParams @@ -167,7 +183,23 @@ class PetApi * @return void * @throws \Swagger\Client\ApiException on non-2xx response */ - public function addPet($body=null) + public function addPet ($body=null) + { + list($response, $statusCode, $httpHeader) = $this->addPetWithHttpInfo ($body); + return $response; + } + + + /** + * addPet + * + * Add a new pet to the store + * + * @param \Swagger\Client\Model\Pet $body Pet object that needs to be added to the store (optional) + * @return void + * @throws \Swagger\Client\ApiException on non-2xx response + */ + public function addPetWithHttpInfo ($body=null) { @@ -210,7 +242,7 @@ class PetApi // make the API Call try { - list($response, $httpHeader) = $this->apiClient->callApi( + list($response, $statusCode, $httpHeader) = $this->apiClient->callApi( $resourcePath, $method, $queryParams, $httpBody, $headerParams @@ -234,7 +266,23 @@ class PetApi * @return \Swagger\Client\Model\Pet[] * @throws \Swagger\Client\ApiException on non-2xx response */ - public function findPetsByStatus($status=null) + public function findPetsByStatus ($status=null) + { + list($response, $statusCode, $httpHeader) = $this->findPetsByStatusWithHttpInfo ($status); + return $response; + } + + + /** + * findPetsByStatus + * + * Finds Pets by status + * + * @param string[] $status Status values that need to be considered for filter (optional) + * @return \Swagger\Client\Model\Pet[] + * @throws \Swagger\Client\ApiException on non-2xx response + */ + public function findPetsByStatusWithHttpInfo ($status=null) { @@ -276,17 +324,17 @@ class PetApi // make the API Call try { - list($response, $httpHeader) = $this->apiClient->callApi( + list($response, $statusCode, $httpHeader) = $this->apiClient->callApi( $resourcePath, $method, $queryParams, $httpBody, $headerParams, '\Swagger\Client\Model\Pet[]' ); if (!$response) { - return null; + return array(null, $statusCode, $httpHeader); } - return $this->apiClient->getSerializer()->deserialize($response, '\Swagger\Client\Model\Pet[]', $httpHeader); + return array($this->apiClient->getSerializer()->deserialize($response, '\Swagger\Client\Model\Pet[]', $httpHeader)); } catch (ApiException $e) { switch ($e->getCode()) { @@ -299,7 +347,7 @@ class PetApi throw $e; } - return null; + return array(null, $statusCode, $httpHeader); } @@ -312,7 +360,23 @@ class PetApi * @return \Swagger\Client\Model\Pet[] * @throws \Swagger\Client\ApiException on non-2xx response */ - public function findPetsByTags($tags=null) + public function findPetsByTags ($tags=null) + { + list($response, $statusCode, $httpHeader) = $this->findPetsByTagsWithHttpInfo ($tags); + return $response; + } + + + /** + * findPetsByTags + * + * Finds Pets by tags + * + * @param string[] $tags Tags to filter by (optional) + * @return \Swagger\Client\Model\Pet[] + * @throws \Swagger\Client\ApiException on non-2xx response + */ + public function findPetsByTagsWithHttpInfo ($tags=null) { @@ -354,17 +418,17 @@ class PetApi // make the API Call try { - list($response, $httpHeader) = $this->apiClient->callApi( + list($response, $statusCode, $httpHeader) = $this->apiClient->callApi( $resourcePath, $method, $queryParams, $httpBody, $headerParams, '\Swagger\Client\Model\Pet[]' ); if (!$response) { - return null; + return array(null, $statusCode, $httpHeader); } - return $this->apiClient->getSerializer()->deserialize($response, '\Swagger\Client\Model\Pet[]', $httpHeader); + return array($this->apiClient->getSerializer()->deserialize($response, '\Swagger\Client\Model\Pet[]', $httpHeader)); } catch (ApiException $e) { switch ($e->getCode()) { @@ -377,7 +441,7 @@ class PetApi throw $e; } - return null; + return array(null, $statusCode, $httpHeader); } @@ -390,7 +454,23 @@ class PetApi * @return \Swagger\Client\Model\Pet * @throws \Swagger\Client\ApiException on non-2xx response */ - public function getPetById($pet_id) + public function getPetById ($pet_id) + { + list($response, $statusCode, $httpHeader) = $this->getPetByIdWithHttpInfo ($pet_id); + return $response; + } + + + /** + * getPetById + * + * Find pet by ID + * + * @param int $pet_id ID of pet that needs to be fetched (required) + * @return \Swagger\Client\Model\Pet + * @throws \Swagger\Client\ApiException on non-2xx response + */ + public function getPetByIdWithHttpInfo ($pet_id) { // verify the required parameter 'pet_id' is set @@ -442,17 +522,17 @@ class PetApi // make the API Call try { - list($response, $httpHeader) = $this->apiClient->callApi( + list($response, $statusCode, $httpHeader) = $this->apiClient->callApi( $resourcePath, $method, $queryParams, $httpBody, $headerParams, '\Swagger\Client\Model\Pet' ); if (!$response) { - return null; + return array(null, $statusCode, $httpHeader); } - return $this->apiClient->getSerializer()->deserialize($response, '\Swagger\Client\Model\Pet', $httpHeader); + return array($this->apiClient->getSerializer()->deserialize($response, '\Swagger\Client\Model\Pet', $httpHeader)); } catch (ApiException $e) { switch ($e->getCode()) { @@ -465,7 +545,7 @@ class PetApi throw $e; } - return null; + return array(null, $statusCode, $httpHeader); } @@ -480,7 +560,25 @@ class PetApi * @return void * @throws \Swagger\Client\ApiException on non-2xx response */ - public function updatePetWithForm($pet_id, $name=null, $status=null) + public function updatePetWithForm ($pet_id, $name=null, $status=null) + { + list($response, $statusCode, $httpHeader) = $this->updatePetWithFormWithHttpInfo ($pet_id, $name, $status); + return $response; + } + + + /** + * updatePetWithForm + * + * Updates a pet in the store with form data + * + * @param string $pet_id ID of pet that needs to be updated (required) + * @param string $name Updated name of the pet (optional) + * @param string $status Updated status of the pet (optional) + * @return void + * @throws \Swagger\Client\ApiException on non-2xx response + */ + public function updatePetWithFormWithHttpInfo ($pet_id, $name=null, $status=null) { // verify the required parameter 'pet_id' is set @@ -542,7 +640,7 @@ class PetApi // make the API Call try { - list($response, $httpHeader) = $this->apiClient->callApi( + list($response, $statusCode, $httpHeader) = $this->apiClient->callApi( $resourcePath, $method, $queryParams, $httpBody, $headerParams @@ -567,7 +665,24 @@ class PetApi * @return void * @throws \Swagger\Client\ApiException on non-2xx response */ - public function deletePet($pet_id, $api_key=null) + public function deletePet ($pet_id, $api_key=null) + { + list($response, $statusCode, $httpHeader) = $this->deletePetWithHttpInfo ($pet_id, $api_key); + return $response; + } + + + /** + * deletePet + * + * Deletes a pet + * + * @param int $pet_id Pet id to delete (required) + * @param string $api_key (optional) + * @return void + * @throws \Swagger\Client\ApiException on non-2xx response + */ + public function deletePetWithHttpInfo ($pet_id, $api_key=null) { // verify the required parameter 'pet_id' is set @@ -620,7 +735,7 @@ class PetApi // make the API Call try { - list($response, $httpHeader) = $this->apiClient->callApi( + list($response, $statusCode, $httpHeader) = $this->apiClient->callApi( $resourcePath, $method, $queryParams, $httpBody, $headerParams @@ -646,7 +761,25 @@ class PetApi * @return void * @throws \Swagger\Client\ApiException on non-2xx response */ - public function uploadFile($pet_id, $additional_metadata=null, $file=null) + public function uploadFile ($pet_id, $additional_metadata=null, $file=null) + { + list($response, $statusCode, $httpHeader) = $this->uploadFileWithHttpInfo ($pet_id, $additional_metadata, $file); + return $response; + } + + + /** + * uploadFile + * + * uploads an image + * + * @param int $pet_id ID of pet to update (required) + * @param string $additional_metadata Additional data to pass to server (optional) + * @param \SplFileObject $file file to upload (optional) + * @return void + * @throws \Swagger\Client\ApiException on non-2xx response + */ + public function uploadFileWithHttpInfo ($pet_id, $additional_metadata=null, $file=null) { // verify the required parameter 'pet_id' is set @@ -714,7 +847,7 @@ class PetApi // make the API Call try { - list($response, $httpHeader) = $this->apiClient->callApi( + list($response, $statusCode, $httpHeader) = $this->apiClient->callApi( $resourcePath, $method, $queryParams, $httpBody, $headerParams diff --git a/samples/client/petstore/php/SwaggerClient-php/lib/Api/StoreApi.php b/samples/client/petstore/php/SwaggerClient-php/lib/Api/StoreApi.php index d709330b056..d32b2ac783e 100644 --- a/samples/client/petstore/php/SwaggerClient-php/lib/Api/StoreApi.php +++ b/samples/client/petstore/php/SwaggerClient-php/lib/Api/StoreApi.php @@ -99,7 +99,22 @@ class StoreApi * @return map[string,int] * @throws \Swagger\Client\ApiException on non-2xx response */ - public function getInventory() + public function getInventory () + { + list($response, $statusCode, $httpHeader) = $this->getInventoryWithHttpInfo (); + return $response; + } + + + /** + * getInventory + * + * Returns pet inventories by status + * + * @return map[string,int] + * @throws \Swagger\Client\ApiException on non-2xx response + */ + public function getInventoryWithHttpInfo () { @@ -140,17 +155,17 @@ class StoreApi // make the API Call try { - list($response, $httpHeader) = $this->apiClient->callApi( + list($response, $statusCode, $httpHeader) = $this->apiClient->callApi( $resourcePath, $method, $queryParams, $httpBody, $headerParams, 'map[string,int]' ); if (!$response) { - return null; + return array(null, $statusCode, $httpHeader); } - return $this->apiClient->getSerializer()->deserialize($response, 'map[string,int]', $httpHeader); + return array($this->apiClient->getSerializer()->deserialize($response, 'map[string,int]', $httpHeader)); } catch (ApiException $e) { switch ($e->getCode()) { @@ -163,7 +178,7 @@ class StoreApi throw $e; } - return null; + return array(null, $statusCode, $httpHeader); } @@ -176,7 +191,23 @@ class StoreApi * @return \Swagger\Client\Model\Order * @throws \Swagger\Client\ApiException on non-2xx response */ - public function placeOrder($body=null) + public function placeOrder ($body=null) + { + list($response, $statusCode, $httpHeader) = $this->placeOrderWithHttpInfo ($body); + return $response; + } + + + /** + * placeOrder + * + * Place an order for a pet + * + * @param \Swagger\Client\Model\Order $body order placed for purchasing the pet (optional) + * @return \Swagger\Client\Model\Order + * @throws \Swagger\Client\ApiException on non-2xx response + */ + public function placeOrderWithHttpInfo ($body=null) { @@ -214,17 +245,17 @@ class StoreApi // make the API Call try { - list($response, $httpHeader) = $this->apiClient->callApi( + list($response, $statusCode, $httpHeader) = $this->apiClient->callApi( $resourcePath, $method, $queryParams, $httpBody, $headerParams, '\Swagger\Client\Model\Order' ); if (!$response) { - return null; + return array(null, $statusCode, $httpHeader); } - return $this->apiClient->getSerializer()->deserialize($response, '\Swagger\Client\Model\Order', $httpHeader); + return array($this->apiClient->getSerializer()->deserialize($response, '\Swagger\Client\Model\Order', $httpHeader)); } catch (ApiException $e) { switch ($e->getCode()) { @@ -237,7 +268,7 @@ class StoreApi throw $e; } - return null; + return array(null, $statusCode, $httpHeader); } @@ -250,7 +281,23 @@ class StoreApi * @return \Swagger\Client\Model\Order * @throws \Swagger\Client\ApiException on non-2xx response */ - public function getOrderById($order_id) + public function getOrderById ($order_id) + { + list($response, $statusCode, $httpHeader) = $this->getOrderByIdWithHttpInfo ($order_id); + return $response; + } + + + /** + * getOrderById + * + * Find purchase order by ID + * + * @param string $order_id ID of pet that needs to be fetched (required) + * @return \Swagger\Client\Model\Order + * @throws \Swagger\Client\ApiException on non-2xx response + */ + public function getOrderByIdWithHttpInfo ($order_id) { // verify the required parameter 'order_id' is set @@ -295,17 +342,17 @@ class StoreApi // make the API Call try { - list($response, $httpHeader) = $this->apiClient->callApi( + list($response, $statusCode, $httpHeader) = $this->apiClient->callApi( $resourcePath, $method, $queryParams, $httpBody, $headerParams, '\Swagger\Client\Model\Order' ); if (!$response) { - return null; + return array(null, $statusCode, $httpHeader); } - return $this->apiClient->getSerializer()->deserialize($response, '\Swagger\Client\Model\Order', $httpHeader); + return array($this->apiClient->getSerializer()->deserialize($response, '\Swagger\Client\Model\Order', $httpHeader)); } catch (ApiException $e) { switch ($e->getCode()) { @@ -318,7 +365,7 @@ class StoreApi throw $e; } - return null; + return array(null, $statusCode, $httpHeader); } @@ -331,7 +378,23 @@ class StoreApi * @return void * @throws \Swagger\Client\ApiException on non-2xx response */ - public function deleteOrder($order_id) + public function deleteOrder ($order_id) + { + list($response, $statusCode, $httpHeader) = $this->deleteOrderWithHttpInfo ($order_id); + return $response; + } + + + /** + * deleteOrder + * + * Delete purchase order by ID + * + * @param string $order_id ID of the order that needs to be deleted (required) + * @return void + * @throws \Swagger\Client\ApiException on non-2xx response + */ + public function deleteOrderWithHttpInfo ($order_id) { // verify the required parameter 'order_id' is set @@ -376,7 +439,7 @@ class StoreApi // make the API Call try { - list($response, $httpHeader) = $this->apiClient->callApi( + list($response, $statusCode, $httpHeader) = $this->apiClient->callApi( $resourcePath, $method, $queryParams, $httpBody, $headerParams diff --git a/samples/client/petstore/php/SwaggerClient-php/lib/Api/UserApi.php b/samples/client/petstore/php/SwaggerClient-php/lib/Api/UserApi.php index 8ce6301a51e..890b876a106 100644 --- a/samples/client/petstore/php/SwaggerClient-php/lib/Api/UserApi.php +++ b/samples/client/petstore/php/SwaggerClient-php/lib/Api/UserApi.php @@ -100,7 +100,23 @@ class UserApi * @return void * @throws \Swagger\Client\ApiException on non-2xx response */ - public function createUser($body=null) + public function createUser ($body=null) + { + list($response, $statusCode, $httpHeader) = $this->createUserWithHttpInfo ($body); + return $response; + } + + + /** + * createUser + * + * Create user + * + * @param \Swagger\Client\Model\User $body Created user object (optional) + * @return void + * @throws \Swagger\Client\ApiException on non-2xx response + */ + public function createUserWithHttpInfo ($body=null) { @@ -138,7 +154,7 @@ class UserApi // make the API Call try { - list($response, $httpHeader) = $this->apiClient->callApi( + list($response, $statusCode, $httpHeader) = $this->apiClient->callApi( $resourcePath, $method, $queryParams, $httpBody, $headerParams @@ -162,7 +178,23 @@ class UserApi * @return void * @throws \Swagger\Client\ApiException on non-2xx response */ - public function createUsersWithArrayInput($body=null) + public function createUsersWithArrayInput ($body=null) + { + list($response, $statusCode, $httpHeader) = $this->createUsersWithArrayInputWithHttpInfo ($body); + return $response; + } + + + /** + * createUsersWithArrayInput + * + * Creates list of users with given input array + * + * @param \Swagger\Client\Model\User[] $body List of user object (optional) + * @return void + * @throws \Swagger\Client\ApiException on non-2xx response + */ + public function createUsersWithArrayInputWithHttpInfo ($body=null) { @@ -200,7 +232,7 @@ class UserApi // make the API Call try { - list($response, $httpHeader) = $this->apiClient->callApi( + list($response, $statusCode, $httpHeader) = $this->apiClient->callApi( $resourcePath, $method, $queryParams, $httpBody, $headerParams @@ -224,7 +256,23 @@ class UserApi * @return void * @throws \Swagger\Client\ApiException on non-2xx response */ - public function createUsersWithListInput($body=null) + public function createUsersWithListInput ($body=null) + { + list($response, $statusCode, $httpHeader) = $this->createUsersWithListInputWithHttpInfo ($body); + return $response; + } + + + /** + * createUsersWithListInput + * + * Creates list of users with given input array + * + * @param \Swagger\Client\Model\User[] $body List of user object (optional) + * @return void + * @throws \Swagger\Client\ApiException on non-2xx response + */ + public function createUsersWithListInputWithHttpInfo ($body=null) { @@ -262,7 +310,7 @@ class UserApi // make the API Call try { - list($response, $httpHeader) = $this->apiClient->callApi( + list($response, $statusCode, $httpHeader) = $this->apiClient->callApi( $resourcePath, $method, $queryParams, $httpBody, $headerParams @@ -287,7 +335,24 @@ class UserApi * @return string * @throws \Swagger\Client\ApiException on non-2xx response */ - public function loginUser($username=null, $password=null) + public function loginUser ($username=null, $password=null) + { + list($response, $statusCode, $httpHeader) = $this->loginUserWithHttpInfo ($username, $password); + return $response; + } + + + /** + * loginUser + * + * Logs user into the system + * + * @param string $username The user name for login (optional) + * @param string $password The password for login in clear text (optional) + * @return string + * @throws \Swagger\Client\ApiException on non-2xx response + */ + public function loginUserWithHttpInfo ($username=null, $password=null) { @@ -327,17 +392,17 @@ class UserApi // make the API Call try { - list($response, $httpHeader) = $this->apiClient->callApi( + list($response, $statusCode, $httpHeader) = $this->apiClient->callApi( $resourcePath, $method, $queryParams, $httpBody, $headerParams, 'string' ); if (!$response) { - return null; + return array(null, $statusCode, $httpHeader); } - return $this->apiClient->getSerializer()->deserialize($response, 'string', $httpHeader); + return array($this->apiClient->getSerializer()->deserialize($response, 'string', $httpHeader)); } catch (ApiException $e) { switch ($e->getCode()) { @@ -350,7 +415,7 @@ class UserApi throw $e; } - return null; + return array(null, $statusCode, $httpHeader); } @@ -362,7 +427,22 @@ class UserApi * @return void * @throws \Swagger\Client\ApiException on non-2xx response */ - public function logoutUser() + public function logoutUser () + { + list($response, $statusCode, $httpHeader) = $this->logoutUserWithHttpInfo (); + return $response; + } + + + /** + * logoutUser + * + * Logs out current logged in user session + * + * @return void + * @throws \Swagger\Client\ApiException on non-2xx response + */ + public function logoutUserWithHttpInfo () { @@ -396,7 +476,7 @@ class UserApi // make the API Call try { - list($response, $httpHeader) = $this->apiClient->callApi( + list($response, $statusCode, $httpHeader) = $this->apiClient->callApi( $resourcePath, $method, $queryParams, $httpBody, $headerParams @@ -420,7 +500,23 @@ class UserApi * @return \Swagger\Client\Model\User * @throws \Swagger\Client\ApiException on non-2xx response */ - public function getUserByName($username) + public function getUserByName ($username) + { + list($response, $statusCode, $httpHeader) = $this->getUserByNameWithHttpInfo ($username); + return $response; + } + + + /** + * getUserByName + * + * Get user by user name + * + * @param string $username The name that needs to be fetched. Use user1 for testing. (required) + * @return \Swagger\Client\Model\User + * @throws \Swagger\Client\ApiException on non-2xx response + */ + public function getUserByNameWithHttpInfo ($username) { // verify the required parameter 'username' is set @@ -465,17 +561,17 @@ class UserApi // make the API Call try { - list($response, $httpHeader) = $this->apiClient->callApi( + list($response, $statusCode, $httpHeader) = $this->apiClient->callApi( $resourcePath, $method, $queryParams, $httpBody, $headerParams, '\Swagger\Client\Model\User' ); if (!$response) { - return null; + return array(null, $statusCode, $httpHeader); } - return $this->apiClient->getSerializer()->deserialize($response, '\Swagger\Client\Model\User', $httpHeader); + return array($this->apiClient->getSerializer()->deserialize($response, '\Swagger\Client\Model\User', $httpHeader)); } catch (ApiException $e) { switch ($e->getCode()) { @@ -488,7 +584,7 @@ class UserApi throw $e; } - return null; + return array(null, $statusCode, $httpHeader); } @@ -502,7 +598,24 @@ class UserApi * @return void * @throws \Swagger\Client\ApiException on non-2xx response */ - public function updateUser($username, $body=null) + public function updateUser ($username, $body=null) + { + list($response, $statusCode, $httpHeader) = $this->updateUserWithHttpInfo ($username, $body); + return $response; + } + + + /** + * updateUser + * + * Updated user + * + * @param string $username name that need to be deleted (required) + * @param \Swagger\Client\Model\User $body Updated user object (optional) + * @return void + * @throws \Swagger\Client\ApiException on non-2xx response + */ + public function updateUserWithHttpInfo ($username, $body=null) { // verify the required parameter 'username' is set @@ -551,7 +664,7 @@ class UserApi // make the API Call try { - list($response, $httpHeader) = $this->apiClient->callApi( + list($response, $statusCode, $httpHeader) = $this->apiClient->callApi( $resourcePath, $method, $queryParams, $httpBody, $headerParams @@ -575,7 +688,23 @@ class UserApi * @return void * @throws \Swagger\Client\ApiException on non-2xx response */ - public function deleteUser($username) + public function deleteUser ($username) + { + list($response, $statusCode, $httpHeader) = $this->deleteUserWithHttpInfo ($username); + return $response; + } + + + /** + * deleteUser + * + * Delete user + * + * @param string $username The name that needs to be deleted (required) + * @return void + * @throws \Swagger\Client\ApiException on non-2xx response + */ + public function deleteUserWithHttpInfo ($username) { // verify the required parameter 'username' is set @@ -620,7 +749,7 @@ class UserApi // make the API Call try { - list($response, $httpHeader) = $this->apiClient->callApi( + list($response, $statusCode, $httpHeader) = $this->apiClient->callApi( $resourcePath, $method, $queryParams, $httpBody, $headerParams diff --git a/samples/client/petstore/php/SwaggerClient-php/lib/ApiClient.php b/samples/client/petstore/php/SwaggerClient-php/lib/ApiClient.php index a0bb07273e4..b5b63793e85 100644 --- a/samples/client/petstore/php/SwaggerClient-php/lib/ApiClient.php +++ b/samples/client/petstore/php/SwaggerClient-php/lib/ApiClient.php @@ -231,7 +231,7 @@ class ApiClient } else if ($response_info['http_code'] >= 200 && $response_info['http_code'] <= 299 ) { // return raw body if response is a file if ($responseType == '\SplFileObject') { - return array($http_body, $http_header); + return array($http_body, $response_info['http_code'], $http_header); } $data = json_decode($http_body); @@ -249,7 +249,7 @@ class ApiClient $response_info['http_code'], $http_header, $data ); } - return array($data, $http_header); + return array($data, $response_info['http_code'], $http_header); } /** From d9e024a7bf359d864638e7562aa47755f80c372a Mon Sep 17 00:00:00 2001 From: Johannes Fiala Date: Sun, 6 Dec 2015 12:06:23 +0100 Subject: [PATCH 128/211] Cleanup mandatoryParam variable in mustache and Codegen, replaced using -last --- .../src/main/java/io/swagger/codegen/CodegenModel.java | 3 --- .../src/main/java/io/swagger/codegen/DefaultCodegen.java | 3 +-- .../src/main/resources/Javascript/model.mustache | 2 +- 3 files changed, 2 insertions(+), 6 deletions(-) diff --git a/modules/swagger-codegen/src/main/java/io/swagger/codegen/CodegenModel.java b/modules/swagger-codegen/src/main/java/io/swagger/codegen/CodegenModel.java index d9aea7da624..3e2ad6afb2c 100644 --- a/modules/swagger-codegen/src/main/java/io/swagger/codegen/CodegenModel.java +++ b/modules/swagger-codegen/src/main/java/io/swagger/codegen/CodegenModel.java @@ -17,9 +17,6 @@ public class CodegenModel { // list of all required parameters public Set mandatory = new HashSet(); - // TODO: temporary solution to get a delimited list of default constructor parameters, should be replaced if there is a better way of injecting the mandatory parameters into the mustache templates - public String mandatoryParams; - public Set imports = new HashSet(); public Boolean hasVars, emptyVars, hasMoreModels, hasEnums; public ExternalDocs externalDocs; diff --git a/modules/swagger-codegen/src/main/java/io/swagger/codegen/DefaultCodegen.java b/modules/swagger-codegen/src/main/java/io/swagger/codegen/DefaultCodegen.java index e1292cbac95..d0af0316811 100644 --- a/modules/swagger-codegen/src/main/java/io/swagger/codegen/DefaultCodegen.java +++ b/modules/swagger-codegen/src/main/java/io/swagger/codegen/DefaultCodegen.java @@ -1883,8 +1883,7 @@ public class DefaultCodegen { } m.mandatory = mandatory; - m.mandatoryParams = StringUtils.join(mandatory, ", "); - + } else { m.emptyVars = true; m.hasVars = false; diff --git a/modules/swagger-codegen/src/main/resources/Javascript/model.mustache b/modules/swagger-codegen/src/main/resources/Javascript/model.mustache index 792fde00b12..1c6ca9fe0cc 100644 --- a/modules/swagger-codegen/src/main/resources/Javascript/model.mustache +++ b/modules/swagger-codegen/src/main/resources/Javascript/model.mustache @@ -4,7 +4,7 @@ {{#description}}/** * {{description}} **/{{/description}} -function {{classname}}({{mandatoryParams}}) { {{#parent}}/* extends {{{parent}}}*/{{/parent}} +function {{classname}}({{#mandatory}}{{this}}{{^-last}}, {{/-last}}{{/mandatory}}) { {{#parent}}/* extends {{{parent}}}*/{{/parent}} var self = this; {{#vars}} /**{{#description}} From a7f754faad9170f8b61e4e46c65d89bf4622f50f Mon Sep 17 00:00:00 2001 From: Johannes Fiala Date: Sun, 6 Dec 2015 12:08:17 +0100 Subject: [PATCH 129/211] Cleanup unused code from Java template in Javascript --- .../languages/JavascriptClientCodegen.java | 136 +----------------- 1 file changed, 1 insertion(+), 135 deletions(-) diff --git a/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/JavascriptClientCodegen.java b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/JavascriptClientCodegen.java index 8526b9c48c5..fd268869317 100644 --- a/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/JavascriptClientCodegen.java +++ b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/JavascriptClientCodegen.java @@ -88,12 +88,6 @@ public class JavascriptClientCodegen extends DefaultCodegen implements CodegenCo cliOptions.add(new CliOption(CodegenConstants.SERIALIZABLE_MODEL, CodegenConstants.SERIALIZABLE_MODEL_DESC)); cliOptions.add(new CliOption("fullJavaUtil", "whether to use fully qualified name for classes under java.util (default to false)")); - /* - supportedLibraries.put("", "HTTP client: Jersey client 1.18. JSON processing: Jackson 2.4.2"); - supportedLibraries.put("jersey2", "HTTP client: Jersey client 2.6"); - supportedLibraries.put("okhttp-gson", "HTTP client: OkHttp 2.4.0. JSON processing: Gson 2.3.1"); - supportedLibraries.put("retrofit", "HTTP client: OkHttp 2.4.0. JSON processing: Gson 2.3.1 (Retrofit 1.9.0)"); - cliOptions.add(buildLibraryCliOption(supportedLibraries));*/ } @Override @@ -114,138 +108,10 @@ public class JavascriptClientCodegen extends DefaultCodegen implements CodegenCo @Override public void processOpts() { super.processOpts(); -/* - if (additionalProperties.containsKey(CodegenConstants.INVOKER_PACKAGE)) { - this.setInvokerPackage((String) additionalProperties.get(CodegenConstants.INVOKER_PACKAGE)); - } else { - //not set, use default to be passed to template - additionalProperties.put(CodegenConstants.INVOKER_PACKAGE, invokerPackage); - } - if (additionalProperties.containsKey(CodegenConstants.GROUP_ID)) { - this.setGroupId((String) additionalProperties.get(CodegenConstants.GROUP_ID)); - } else { - //not set, use to be passed to template - additionalProperties.put(CodegenConstants.GROUP_ID, groupId); - } - - if (additionalProperties.containsKey(CodegenConstants.ARTIFACT_ID)) { - this.setArtifactId((String) additionalProperties.get(CodegenConstants.ARTIFACT_ID)); - } else { - //not set, use to be passed to template - additionalProperties.put(CodegenConstants.ARTIFACT_ID, artifactId); - } - - if (additionalProperties.containsKey(CodegenConstants.ARTIFACT_VERSION)) { - this.setArtifactVersion((String) additionalProperties.get(CodegenConstants.ARTIFACT_VERSION)); - } else { - //not set, use to be passed to template - additionalProperties.put(CodegenConstants.ARTIFACT_VERSION, artifactVersion); - } - - if (additionalProperties.containsKey(CodegenConstants.SOURCE_FOLDER)) { - this.setSourceFolder((String) additionalProperties.get(CodegenConstants.SOURCE_FOLDER)); - } - - - if (additionalProperties.containsKey(CodegenConstants.LOCAL_VARIABLE_PREFIX)) { - this.setLocalVariablePrefix((String) additionalProperties.get(CodegenConstants.LOCAL_VARIABLE_PREFIX)); - } - - if (additionalProperties.containsKey(CodegenConstants.SERIALIZABLE_MODEL)) { - this.setSerializableModel(Boolean.valueOf((String)additionalProperties.get(CodegenConstants.SERIALIZABLE_MODEL).toString())); - } - - if (additionalProperties.containsKey(CodegenConstants.LIBRARY)) { - this.setLibrary((String) additionalProperties.get(CodegenConstants.LIBRARY)); - } - - // need to put back serializableModel (boolean) into additionalProperties as value in additionalProperties is string - additionalProperties.put(CodegenConstants.SERIALIZABLE_MODEL, serializableModel); - - if (additionalProperties.containsKey("fullJavaUtil")) { - fullJavaUtil = Boolean.valueOf(additionalProperties.get("fullJavaUtil").toString()); - } - if (fullJavaUtil) { - javaUtilPrefix = "java.util."; - } - additionalProperties.put("fullJavaUtil", fullJavaUtil); - additionalProperties.put("javaUtilPrefix", javaUtilPrefix); -*/ - //if (fullJavaUtil) { typeMapping.put("array", "Array"); - /*typeMapping.put("map", "java.util.Map"); - typeMapping.put("DateTime", "java.util.Date"); - typeMapping.remove("List"); - importMapping.remove("Date"); - importMapping.remove("Map"); - importMapping.remove("HashMap"); - importMapping.remove("Array"); - importMapping.remove("ArrayList"); - importMapping.remove("List"); - importMapping.remove("Set"); - importMapping.remove("DateTime"); - instantiationTypes.put("array", "java.util.ArrayList"); - instantiationTypes.put("map", "java.util.HashMap");*/ - //} - /* - this.sanitizeConfig(); - - final String invokerFolder = (sourceFolder + File.separator + invokerPackage).replace(".", File.separator); - supportingFiles.add(new SupportingFile("pom.mustache", "", "pom.xml")); - supportingFiles.add(new SupportingFile("build.gradle.mustache", "", "build.gradle")); - supportingFiles.add(new SupportingFile("settings.gradle.mustache", "", "settings.gradle")); - supportingFiles.add(new SupportingFile("gradle.properties.mustache", "", "gradle.properties")); - supportingFiles.add(new SupportingFile("ApiClient.mustache", invokerFolder, "ApiClient.java")); - supportingFiles.add(new SupportingFile("StringUtil.mustache", invokerFolder, "StringUtil.java")); - - final String authFolder = (sourceFolder + File.separator + invokerPackage + ".auth").replace(".", File.separator); - supportingFiles.add(new SupportingFile("auth/HttpBasicAuth.mustache", authFolder, "HttpBasicAuth.java")); - supportingFiles.add(new SupportingFile("auth/ApiKeyAuth.mustache", authFolder, "ApiKeyAuth.java")); - supportingFiles.add(new SupportingFile("auth/OAuth.mustache", authFolder, "OAuth.java")); - supportingFiles.add(new SupportingFile("auth/OAuthFlow.mustache", authFolder, "OAuthFlow.java")); - - if (!"retrofit".equals(getLibrary())) { - supportingFiles.add(new SupportingFile("apiException.mustache", invokerFolder, "ApiException.java")); - supportingFiles.add(new SupportingFile("Configuration.mustache", invokerFolder, "Configuration.java")); - supportingFiles.add(new SupportingFile("JSON.mustache", invokerFolder, "JSON.java")); - supportingFiles.add(new SupportingFile("Pair.mustache", invokerFolder, "Pair.java")); - supportingFiles.add(new SupportingFile("auth/Authentication.mustache", authFolder, "Authentication.java")); - } - - // library-specific files - if ("okhttp-gson".equals(getLibrary())) { - // the "okhttp-gson" library template requires "ApiCallback.mustache" for async call - supportingFiles.add(new SupportingFile("ApiCallback.mustache", invokerFolder, "ApiCallback.java")); - // "build.sbt" is for development with SBT - supportingFiles.add(new SupportingFile("build.sbt.mustache", "", "build.sbt")); - } else if ("retrofit".equals(getLibrary())) { - supportingFiles.add(new SupportingFile("auth/OAuthOkHttpClient.mustache", authFolder, "OAuthOkHttpClient.java")); - supportingFiles.add(new SupportingFile("CollectionFormats.mustache", invokerFolder, "CollectionFormats.java")); - } else { - supportingFiles.add(new SupportingFile("TypeRef.mustache", invokerFolder, "TypeRef.java")); - }*/ + } -/* - private void sanitizeConfig() { - // Sanitize any config options here. We also have to update the additionalProperties because - // the whole additionalProperties object is injected into the main object passed to the mustache layer - - this.setApiPackage(sanitizePackageName(apiPackage)); - if (additionalProperties.containsKey(CodegenConstants.API_PACKAGE)) { - this.additionalProperties.put(CodegenConstants.API_PACKAGE, apiPackage); - } - - this.setModelPackage(sanitizePackageName(modelPackage)); - if (additionalProperties.containsKey(CodegenConstants.MODEL_PACKAGE)) { - this.additionalProperties.put(CodegenConstants.MODEL_PACKAGE, modelPackage); - } - - this.setInvokerPackage(sanitizePackageName(invokerPackage)); - if (additionalProperties.containsKey(CodegenConstants.INVOKER_PACKAGE)) { - this.additionalProperties.put(CodegenConstants.INVOKER_PACKAGE, invokerPackage); - } - }*/ @Override public String escapeReservedWord(String name) { From b0e3be8fb371a21a0f2adcc6c5021fe1756b1c05 Mon Sep 17 00:00:00 2001 From: Johannes Fiala Date: Sun, 6 Dec 2015 13:45:08 +0100 Subject: [PATCH 130/211] add AMD support #1294 --- .../codegen/languages/JavascriptClientCodegen.java | 4 ++-- .../src/main/resources/Javascript/api.mustache | 10 +++++++++- .../src/main/resources/Javascript/enumClass.mustache | 10 +++++++++- .../src/main/resources/Javascript/model.mustache | 11 ++++++++++- 4 files changed, 30 insertions(+), 5 deletions(-) diff --git a/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/JavascriptClientCodegen.java b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/JavascriptClientCodegen.java index fd268869317..51ef135ae0d 100644 --- a/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/JavascriptClientCodegen.java +++ b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/JavascriptClientCodegen.java @@ -50,8 +50,8 @@ public class JavascriptClientCodegen extends DefaultCodegen implements CodegenCo modelTemplateFiles.put("model.mustache", ".js"); apiTemplateFiles.put("api.mustache", ".js"); templateDir = "Javascript"; - apiPackage = "api"; - modelPackage = "model"; + apiPackage = "scripts/rest/api"; + modelPackage = "scripts/rest/model"; reservedWords = new HashSet( Arrays.asList( diff --git a/modules/swagger-codegen/src/main/resources/Javascript/api.mustache b/modules/swagger-codegen/src/main/resources/Javascript/api.mustache index 6d4f4541649..a9af0d54c15 100644 --- a/modules/swagger-codegen/src/main/resources/Javascript/api.mustache +++ b/modules/swagger-codegen/src/main/resources/Javascript/api.mustache @@ -1,7 +1,15 @@ /* * {{>generatedAnnotation}} */ -function {{classname}}() { + +//export module +if ( typeof define === "function" && define.amd ) { + define(['jquery'], function($) { + return {{classname}}; + }); +} + +var {{classname}} = function {{classname}}() { var self = this; {{#operations}} {{#operation}} diff --git a/modules/swagger-codegen/src/main/resources/Javascript/enumClass.mustache b/modules/swagger-codegen/src/main/resources/Javascript/enumClass.mustache index 5b0f1b277d8..648708c2d7e 100644 --- a/modules/swagger-codegen/src/main/resources/Javascript/enumClass.mustache +++ b/modules/swagger-codegen/src/main/resources/Javascript/enumClass.mustache @@ -1,4 +1,12 @@ -function {{datatypeWithEnum}}() { + +//export module +if ( typeof define === "function" && define.amd ) { + define('{{datatypeWithEnum}}', ['jquery'], function($) { + return {{datatypeWithEnum}}; + }); +} + +var {{datatypeWithEnum}} = function {{datatypeWithEnum}}() { var self = this; {{#allowableValues}}{{#enumVars}} diff --git a/modules/swagger-codegen/src/main/resources/Javascript/model.mustache b/modules/swagger-codegen/src/main/resources/Javascript/model.mustache index 1c6ca9fe0cc..acf0bcffc19 100644 --- a/modules/swagger-codegen/src/main/resources/Javascript/model.mustache +++ b/modules/swagger-codegen/src/main/resources/Javascript/model.mustache @@ -1,10 +1,19 @@ {{#models}}{{#model}} {{#vars}}{{#isEnum}}{{>enumClass}}{{/isEnum}}{{#items.isEnum}}{{#items}} {{>enumClass}}{{/items}}*/{{/items.isEnum}}{{/vars}} + +//export module +if ( typeof define === "function" && define.amd ) { + define('{{classname}}', ['jquery'{{#vars}}{{^isPrimitiveType}}{{^-last}}, {{/-last}}'{{datatypeWithEnum}}'{{/isPrimitiveType}}{{/vars}}], + function(${{#vars}}{{^isPrimitiveType}}{{^-last}}, {{/-last}}{{datatypeWithEnum}}{{/isPrimitiveType}}{{/vars}}) { + return {{classname}}; + }); +} + {{#description}}/** * {{description}} **/{{/description}} -function {{classname}}({{#mandatory}}{{this}}{{^-last}}, {{/-last}}{{/mandatory}}) { {{#parent}}/* extends {{{parent}}}*/{{/parent}} +var {{classname}} = function {{classname}}({{#mandatory}}{{this}}{{^-last}}, {{/-last}}{{/mandatory}}) { {{#parent}}/* extends {{{parent}}}*/{{/parent}} var self = this; {{#vars}} /**{{#description}} From b282d4fbea9a1265aef7099104324ffb70e2b5b8 Mon Sep 17 00:00:00 2001 From: wing328 Date: Sun, 6 Dec 2015 23:58:25 +0800 Subject: [PATCH 131/211] add http_parse_headers, update test case --- .../src/main/resources/php/ApiClient.mustache | 50 ++++++++++++++++++- .../resources/php/ObjectSerializer.mustache | 2 +- .../src/main/resources/php/api.mustache | 7 ++- .../php/SwaggerClient-php/lib/Api/PetApi.php | 26 ++++------ .../SwaggerClient-php/lib/Api/StoreApi.php | 22 ++++---- .../php/SwaggerClient-php/lib/Api/UserApi.php | 20 +++----- .../php/SwaggerClient-php/lib/ApiClient.php | 50 ++++++++++++++++++- .../lib/ObjectSerializer.php | 2 +- .../SwaggerClient-php/tests/PetApiTest.php | 19 +++++++ 9 files changed, 146 insertions(+), 52 deletions(-) diff --git a/modules/swagger-codegen/src/main/resources/php/ApiClient.mustache b/modules/swagger-codegen/src/main/resources/php/ApiClient.mustache index 35c065c81de..86998fd16d0 100644 --- a/modules/swagger-codegen/src/main/resources/php/ApiClient.mustache +++ b/modules/swagger-codegen/src/main/resources/php/ApiClient.mustache @@ -216,7 +216,7 @@ class ApiClient // Make the request $response = curl_exec($curl); $http_header_size = curl_getinfo($curl, CURLINFO_HEADER_SIZE); - $http_header = substr($response, 0, $http_header_size); + $http_header = $this->http_parse_headers(substr($response, 0, $http_header_size)); $http_body = substr($response, $http_header_size); $response_info = curl_getinfo($curl); @@ -287,4 +287,52 @@ class ApiClient return implode(',', $content_type); } } + + /** + * Return an array of HTTP response headers + * + * @param string $raw_headers A string of raw HTTP response headers + * + * @return string[] Array of HTTP response heaers + */ + protected function http_parse_headers($raw_headers) + { + // ref/credit: http://php.net/manual/en/function.http-parse-headers.php#112986 + $headers = array(); + $key = ''; // [+] + + foreach(explode("\n", $raw_headers) as $i => $h) + { + $h = explode(':', $h, 2); + + if (isset($h[1])) + { + if (!isset($headers[$h[0]])) + $headers[$h[0]] = trim($h[1]); + elseif (is_array($headers[$h[0]])) + { + // $tmp = array_merge($headers[$h[0]], array(trim($h[1]))); // [-] + // $headers[$h[0]] = $tmp; // [-] + $headers[$h[0]] = array_merge($headers[$h[0]], array(trim($h[1]))); // [+] + } + else + { + // $tmp = array_merge(array($headers[$h[0]]), array(trim($h[1]))); // [-] + // $headers[$h[0]] = $tmp; // [-] + $headers[$h[0]] = array_merge(array($headers[$h[0]]), array(trim($h[1]))); // [+] + } + + $key = $h[0]; // [+] + } + else // [+] + { // [+] + if (substr($h[0], 0, 1) == "\t") // [+] + $headers[$key] .= "\r\n\t".trim($h[0]); // [+] + elseif (!$key) // [+] + $headers[0] = trim($h[0]);trim($h[0]); // [+] + } // [+] + } + + return $headers; + } } diff --git a/modules/swagger-codegen/src/main/resources/php/ObjectSerializer.mustache b/modules/swagger-codegen/src/main/resources/php/ObjectSerializer.mustache index 45b56aa9b97..54fb66a9543 100644 --- a/modules/swagger-codegen/src/main/resources/php/ObjectSerializer.mustache +++ b/modules/swagger-codegen/src/main/resources/php/ObjectSerializer.mustache @@ -198,7 +198,7 @@ class ObjectSerializer $deserialized = $data; } elseif ($class === '\SplFileObject') { // determine file name - if (preg_match('/Content-Disposition: inline; filename=[\'"]?([^\'"\s]+)[\'"]?$/i', $httpHeader, $match)) { + if (array_key_exists('Content-Disposition', $httpHeaders) && preg_match('/inline; filename=[\'"]?([^\'"\s]+)[\'"]?$/i', $httpHeader['Content-Disposition'], $match)) { $filename = Configuration::getDefaultConfiguration()->getTempFolderPath().$match[1]; } else { $filename = tempnam(Configuration::getDefaultConfiguration()->getTempFolderPath(), ''); diff --git a/modules/swagger-codegen/src/main/resources/php/api.mustache b/modules/swagger-codegen/src/main/resources/php/api.mustache index 2ba06331d50..7cd4e659b98 100644 --- a/modules/swagger-codegen/src/main/resources/php/api.mustache +++ b/modules/swagger-codegen/src/main/resources/php/api.mustache @@ -208,7 +208,9 @@ use \{{invokerPackage}}\ObjectSerializer; return array(null, $statusCode, $httpHeader); } - return array($this->apiClient->getSerializer()->deserialize($response, '{{returnType}}', $httpHeader)); + return array($this->apiClient->getSerializer()->deserialize($response, '{{returnType}}', $httpHeader), $statusCode, $httpHeader); + {{/returnType}}{{#returnType}} + return array(null, $statusCode, $httpHeader); {{/returnType}} } catch (ApiException $e) { switch ($e->getCode()) { {{#responses}}{{#dataType}} @@ -220,9 +222,6 @@ use \{{invokerPackage}}\ObjectSerializer; throw $e; } - {{#returnType}} - return array(null, $statusCode, $httpHeader); - {{/returnType}} } {{/operation}} } diff --git a/samples/client/petstore/php/SwaggerClient-php/lib/Api/PetApi.php b/samples/client/petstore/php/SwaggerClient-php/lib/Api/PetApi.php index 0e971841f50..44b35efe7ae 100644 --- a/samples/client/petstore/php/SwaggerClient-php/lib/Api/PetApi.php +++ b/samples/client/petstore/php/SwaggerClient-php/lib/Api/PetApi.php @@ -171,7 +171,6 @@ class PetApi throw $e; } - } /** @@ -254,7 +253,6 @@ class PetApi throw $e; } - } /** @@ -334,7 +332,9 @@ class PetApi return array(null, $statusCode, $httpHeader); } - return array($this->apiClient->getSerializer()->deserialize($response, '\Swagger\Client\Model\Pet[]', $httpHeader)); + return array($this->apiClient->getSerializer()->deserialize($response, '\Swagger\Client\Model\Pet[]', $httpHeader), $statusCode, $httpHeader); + + return array(null, $statusCode, $httpHeader); } catch (ApiException $e) { switch ($e->getCode()) { @@ -346,9 +346,6 @@ class PetApi throw $e; } - - return array(null, $statusCode, $httpHeader); - } /** @@ -428,7 +425,9 @@ class PetApi return array(null, $statusCode, $httpHeader); } - return array($this->apiClient->getSerializer()->deserialize($response, '\Swagger\Client\Model\Pet[]', $httpHeader)); + return array($this->apiClient->getSerializer()->deserialize($response, '\Swagger\Client\Model\Pet[]', $httpHeader), $statusCode, $httpHeader); + + return array(null, $statusCode, $httpHeader); } catch (ApiException $e) { switch ($e->getCode()) { @@ -440,9 +439,6 @@ class PetApi throw $e; } - - return array(null, $statusCode, $httpHeader); - } /** @@ -532,7 +528,9 @@ class PetApi return array(null, $statusCode, $httpHeader); } - return array($this->apiClient->getSerializer()->deserialize($response, '\Swagger\Client\Model\Pet', $httpHeader)); + return array($this->apiClient->getSerializer()->deserialize($response, '\Swagger\Client\Model\Pet', $httpHeader), $statusCode, $httpHeader); + + return array(null, $statusCode, $httpHeader); } catch (ApiException $e) { switch ($e->getCode()) { @@ -544,9 +542,6 @@ class PetApi throw $e; } - - return array(null, $statusCode, $httpHeader); - } /** @@ -652,7 +647,6 @@ class PetApi throw $e; } - } /** @@ -747,7 +741,6 @@ class PetApi throw $e; } - } /** @@ -859,7 +852,6 @@ class PetApi throw $e; } - } } diff --git a/samples/client/petstore/php/SwaggerClient-php/lib/Api/StoreApi.php b/samples/client/petstore/php/SwaggerClient-php/lib/Api/StoreApi.php index d32b2ac783e..26b25027a1b 100644 --- a/samples/client/petstore/php/SwaggerClient-php/lib/Api/StoreApi.php +++ b/samples/client/petstore/php/SwaggerClient-php/lib/Api/StoreApi.php @@ -165,7 +165,9 @@ class StoreApi return array(null, $statusCode, $httpHeader); } - return array($this->apiClient->getSerializer()->deserialize($response, 'map[string,int]', $httpHeader)); + return array($this->apiClient->getSerializer()->deserialize($response, 'map[string,int]', $httpHeader), $statusCode, $httpHeader); + + return array(null, $statusCode, $httpHeader); } catch (ApiException $e) { switch ($e->getCode()) { @@ -177,9 +179,6 @@ class StoreApi throw $e; } - - return array(null, $statusCode, $httpHeader); - } /** @@ -255,7 +254,9 @@ class StoreApi return array(null, $statusCode, $httpHeader); } - return array($this->apiClient->getSerializer()->deserialize($response, '\Swagger\Client\Model\Order', $httpHeader)); + return array($this->apiClient->getSerializer()->deserialize($response, '\Swagger\Client\Model\Order', $httpHeader), $statusCode, $httpHeader); + + return array(null, $statusCode, $httpHeader); } catch (ApiException $e) { switch ($e->getCode()) { @@ -267,9 +268,6 @@ class StoreApi throw $e; } - - return array(null, $statusCode, $httpHeader); - } /** @@ -352,7 +350,9 @@ class StoreApi return array(null, $statusCode, $httpHeader); } - return array($this->apiClient->getSerializer()->deserialize($response, '\Swagger\Client\Model\Order', $httpHeader)); + return array($this->apiClient->getSerializer()->deserialize($response, '\Swagger\Client\Model\Order', $httpHeader), $statusCode, $httpHeader); + + return array(null, $statusCode, $httpHeader); } catch (ApiException $e) { switch ($e->getCode()) { @@ -364,9 +364,6 @@ class StoreApi throw $e; } - - return array(null, $statusCode, $httpHeader); - } /** @@ -451,7 +448,6 @@ class StoreApi throw $e; } - } } diff --git a/samples/client/petstore/php/SwaggerClient-php/lib/Api/UserApi.php b/samples/client/petstore/php/SwaggerClient-php/lib/Api/UserApi.php index 890b876a106..9e2f3aa9eab 100644 --- a/samples/client/petstore/php/SwaggerClient-php/lib/Api/UserApi.php +++ b/samples/client/petstore/php/SwaggerClient-php/lib/Api/UserApi.php @@ -166,7 +166,6 @@ class UserApi throw $e; } - } /** @@ -244,7 +243,6 @@ class UserApi throw $e; } - } /** @@ -322,7 +320,6 @@ class UserApi throw $e; } - } /** @@ -402,7 +399,9 @@ class UserApi return array(null, $statusCode, $httpHeader); } - return array($this->apiClient->getSerializer()->deserialize($response, 'string', $httpHeader)); + return array($this->apiClient->getSerializer()->deserialize($response, 'string', $httpHeader), $statusCode, $httpHeader); + + return array(null, $statusCode, $httpHeader); } catch (ApiException $e) { switch ($e->getCode()) { @@ -414,9 +413,6 @@ class UserApi throw $e; } - - return array(null, $statusCode, $httpHeader); - } /** @@ -488,7 +484,6 @@ class UserApi throw $e; } - } /** @@ -571,7 +566,9 @@ class UserApi return array(null, $statusCode, $httpHeader); } - return array($this->apiClient->getSerializer()->deserialize($response, '\Swagger\Client\Model\User', $httpHeader)); + return array($this->apiClient->getSerializer()->deserialize($response, '\Swagger\Client\Model\User', $httpHeader), $statusCode, $httpHeader); + + return array(null, $statusCode, $httpHeader); } catch (ApiException $e) { switch ($e->getCode()) { @@ -583,9 +580,6 @@ class UserApi throw $e; } - - return array(null, $statusCode, $httpHeader); - } /** @@ -676,7 +670,6 @@ class UserApi throw $e; } - } /** @@ -761,7 +754,6 @@ class UserApi throw $e; } - } } diff --git a/samples/client/petstore/php/SwaggerClient-php/lib/ApiClient.php b/samples/client/petstore/php/SwaggerClient-php/lib/ApiClient.php index b5b63793e85..2f3aacd1ffd 100644 --- a/samples/client/petstore/php/SwaggerClient-php/lib/ApiClient.php +++ b/samples/client/petstore/php/SwaggerClient-php/lib/ApiClient.php @@ -216,7 +216,7 @@ class ApiClient // Make the request $response = curl_exec($curl); $http_header_size = curl_getinfo($curl, CURLINFO_HEADER_SIZE); - $http_header = substr($response, 0, $http_header_size); + $http_header = $this->http_parse_headers(substr($response, 0, $http_header_size)); $http_body = substr($response, $http_header_size); $response_info = curl_getinfo($curl); @@ -287,4 +287,52 @@ class ApiClient return implode(',', $content_type); } } + + /** + * Return an array of HTTP response headers + * + * @param string $raw_headers A string of raw HTTP response headers + * + * @return string[] Array of HTTP response heaers + */ + protected function http_parse_headers($raw_headers) + { + // ref/credit: http://php.net/manual/en/function.http-parse-headers.php#112986 + $headers = array(); + $key = ''; // [+] + + foreach(explode("\n", $raw_headers) as $i => $h) + { + $h = explode(':', $h, 2); + + if (isset($h[1])) + { + if (!isset($headers[$h[0]])) + $headers[$h[0]] = trim($h[1]); + elseif (is_array($headers[$h[0]])) + { + // $tmp = array_merge($headers[$h[0]], array(trim($h[1]))); // [-] + // $headers[$h[0]] = $tmp; // [-] + $headers[$h[0]] = array_merge($headers[$h[0]], array(trim($h[1]))); // [+] + } + else + { + // $tmp = array_merge(array($headers[$h[0]]), array(trim($h[1]))); // [-] + // $headers[$h[0]] = $tmp; // [-] + $headers[$h[0]] = array_merge(array($headers[$h[0]]), array(trim($h[1]))); // [+] + } + + $key = $h[0]; // [+] + } + else // [+] + { // [+] + if (substr($h[0], 0, 1) == "\t") // [+] + $headers[$key] .= "\r\n\t".trim($h[0]); // [+] + elseif (!$key) // [+] + $headers[0] = trim($h[0]);trim($h[0]); // [+] + } // [+] + } + + return $headers; + } } diff --git a/samples/client/petstore/php/SwaggerClient-php/lib/ObjectSerializer.php b/samples/client/petstore/php/SwaggerClient-php/lib/ObjectSerializer.php index 0d281b9d1fa..22d03030fb3 100644 --- a/samples/client/petstore/php/SwaggerClient-php/lib/ObjectSerializer.php +++ b/samples/client/petstore/php/SwaggerClient-php/lib/ObjectSerializer.php @@ -198,7 +198,7 @@ class ObjectSerializer $deserialized = $data; } elseif ($class === '\SplFileObject') { // determine file name - if (preg_match('/Content-Disposition: inline; filename=[\'"]?([^\'"\s]+)[\'"]?$/i', $httpHeader, $match)) { + if (array_key_exists('Content-Disposition', $httpHeaders) && preg_match('/inline; filename=[\'"]?([^\'"\s]+)[\'"]?$/i', $httpHeader['Content-Disposition'], $match)) { $filename = Configuration::getDefaultConfiguration()->getTempFolderPath().$match[1]; } else { $filename = tempnam(Configuration::getDefaultConfiguration()->getTempFolderPath(), ''); diff --git a/samples/client/petstore/php/SwaggerClient-php/tests/PetApiTest.php b/samples/client/petstore/php/SwaggerClient-php/tests/PetApiTest.php index 58d5cd661f4..c30c95eaa69 100644 --- a/samples/client/petstore/php/SwaggerClient-php/tests/PetApiTest.php +++ b/samples/client/petstore/php/SwaggerClient-php/tests/PetApiTest.php @@ -105,6 +105,25 @@ class PetApiTest extends \PHPUnit_Framework_TestCase $this->assertSame($response->getTags()[0]->getName(), 'test php tag'); } + // test getPetById with a Pet object (id 10005) + public function testGetPetByIdWithHttpInfo() + { + // initialize the API client without host + $pet_id = 10005; // ID of pet that needs to be fetched + $pet_api = new Swagger\Client\Api\PetAPI(); + $pet_api->getApiClient()->getConfig()->setApiKey('api_key', '111222333444555'); + // return Pet (model) + list($response, $status_code, $response_headers) = $pet_api->getPetByIdWithHttpInfo($pet_id); + $this->assertSame($response->getId(), $pet_id); + $this->assertSame($response->getName(), 'PHP Unit Test'); + $this->assertSame($response->getCategory()->getId(), $pet_id); + $this->assertSame($response->getCategory()->getName(), 'test php category'); + $this->assertSame($response->getTags()[0]->getId(), $pet_id); + $this->assertSame($response->getTags()[0]->getName(), 'test php tag'); + $this->assertSame($status_code, 200); + $this->assertSame($response_headers['Content-Type'], 'application/json'); + } + // test getPetByStatus and verify by the "id" of the response public function testFindPetByStatus() { From 11466570f752fe15e8e0d09d0f7cdd6a95e960f1 Mon Sep 17 00:00:00 2001 From: wing328 Date: Mon, 7 Dec 2015 00:30:17 +0800 Subject: [PATCH 132/211] php add test case for withinfo method returnig void --- .../src/main/resources/php/api.mustache | 6 ++-- .../php/SwaggerClient-php/lib/Api/PetApi.php | 32 +++++++++++-------- .../SwaggerClient-php/lib/Api/StoreApi.php | 16 ++++------ .../php/SwaggerClient-php/lib/Api/UserApi.php | 32 ++++++++++++------- .../SwaggerClient-php/tests/PetApiTest.php | 21 +++++++++++- 5 files changed, 67 insertions(+), 40 deletions(-) diff --git a/modules/swagger-codegen/src/main/resources/php/api.mustache b/modules/swagger-codegen/src/main/resources/php/api.mustache index 7cd4e659b98..0b28b2b4ca6 100644 --- a/modules/swagger-codegen/src/main/resources/php/api.mustache +++ b/modules/swagger-codegen/src/main/resources/php/api.mustache @@ -108,12 +108,12 @@ use \{{invokerPackage}}\ObjectSerializer; /** - * {{{operationId}}} + * {{{operationId}}}WithHttpInfo * * {{{summary}}} * {{#allParams}} * @param {{dataType}} ${{paramName}} {{description}} {{#required}}(required){{/required}}{{^required}}(optional){{/required}} - {{/allParams}} * @return {{#returnType}}{{{returnType}}}{{/returnType}}{{^returnType}}void{{/returnType}} + {{/allParams}} * @return Array of {{#returnType}}{{{returnType}}}{{/returnType}}{{^returnType}}null{{/returnType}}, HTTP status code, HTTP response headers (array of strings) * @throws \{{invokerPackage}}\ApiException on non-2xx response */ public function {{operationId}}WithHttpInfo ({{#allParams}}${{paramName}}{{^required}}=null{{/required}}{{#hasMore}}, {{/hasMore}}{{/allParams}}) @@ -209,7 +209,7 @@ use \{{invokerPackage}}\ObjectSerializer; } return array($this->apiClient->getSerializer()->deserialize($response, '{{returnType}}', $httpHeader), $statusCode, $httpHeader); - {{/returnType}}{{#returnType}} + {{/returnType}}{{^returnType}} return array(null, $statusCode, $httpHeader); {{/returnType}} } catch (ApiException $e) { diff --git a/samples/client/petstore/php/SwaggerClient-php/lib/Api/PetApi.php b/samples/client/petstore/php/SwaggerClient-php/lib/Api/PetApi.php index 44b35efe7ae..792053877a4 100644 --- a/samples/client/petstore/php/SwaggerClient-php/lib/Api/PetApi.php +++ b/samples/client/petstore/php/SwaggerClient-php/lib/Api/PetApi.php @@ -113,7 +113,7 @@ class PetApi * Update an existing pet * * @param \Swagger\Client\Model\Pet $body Pet object that needs to be added to the store (optional) - * @return void + * @return Array of null, HTTP status code, HTTP response headers (array of strings) * @throws \Swagger\Client\ApiException on non-2xx response */ public function updatePetWithHttpInfo ($body=null) @@ -165,6 +165,8 @@ class PetApi $headerParams ); + return array(null, $statusCode, $httpHeader); + } catch (ApiException $e) { switch ($e->getCode()) { } @@ -195,7 +197,7 @@ class PetApi * Add a new pet to the store * * @param \Swagger\Client\Model\Pet $body Pet object that needs to be added to the store (optional) - * @return void + * @return Array of null, HTTP status code, HTTP response headers (array of strings) * @throws \Swagger\Client\ApiException on non-2xx response */ public function addPetWithHttpInfo ($body=null) @@ -247,6 +249,8 @@ class PetApi $headerParams ); + return array(null, $statusCode, $httpHeader); + } catch (ApiException $e) { switch ($e->getCode()) { } @@ -277,7 +281,7 @@ class PetApi * Finds Pets by status * * @param string[] $status Status values that need to be considered for filter (optional) - * @return \Swagger\Client\Model\Pet[] + * @return Array of \Swagger\Client\Model\Pet[], HTTP status code, HTTP response headers (array of strings) * @throws \Swagger\Client\ApiException on non-2xx response */ public function findPetsByStatusWithHttpInfo ($status=null) @@ -334,8 +338,6 @@ class PetApi return array($this->apiClient->getSerializer()->deserialize($response, '\Swagger\Client\Model\Pet[]', $httpHeader), $statusCode, $httpHeader); - return array(null, $statusCode, $httpHeader); - } catch (ApiException $e) { switch ($e->getCode()) { case 200: @@ -370,7 +372,7 @@ class PetApi * Finds Pets by tags * * @param string[] $tags Tags to filter by (optional) - * @return \Swagger\Client\Model\Pet[] + * @return Array of \Swagger\Client\Model\Pet[], HTTP status code, HTTP response headers (array of strings) * @throws \Swagger\Client\ApiException on non-2xx response */ public function findPetsByTagsWithHttpInfo ($tags=null) @@ -427,8 +429,6 @@ class PetApi return array($this->apiClient->getSerializer()->deserialize($response, '\Swagger\Client\Model\Pet[]', $httpHeader), $statusCode, $httpHeader); - return array(null, $statusCode, $httpHeader); - } catch (ApiException $e) { switch ($e->getCode()) { case 200: @@ -463,7 +463,7 @@ class PetApi * Find pet by ID * * @param int $pet_id ID of pet that needs to be fetched (required) - * @return \Swagger\Client\Model\Pet + * @return Array of \Swagger\Client\Model\Pet, HTTP status code, HTTP response headers (array of strings) * @throws \Swagger\Client\ApiException on non-2xx response */ public function getPetByIdWithHttpInfo ($pet_id) @@ -530,8 +530,6 @@ class PetApi return array($this->apiClient->getSerializer()->deserialize($response, '\Swagger\Client\Model\Pet', $httpHeader), $statusCode, $httpHeader); - return array(null, $statusCode, $httpHeader); - } catch (ApiException $e) { switch ($e->getCode()) { case 200: @@ -570,7 +568,7 @@ class PetApi * @param string $pet_id ID of pet that needs to be updated (required) * @param string $name Updated name of the pet (optional) * @param string $status Updated status of the pet (optional) - * @return void + * @return Array of null, HTTP status code, HTTP response headers (array of strings) * @throws \Swagger\Client\ApiException on non-2xx response */ public function updatePetWithFormWithHttpInfo ($pet_id, $name=null, $status=null) @@ -641,6 +639,8 @@ class PetApi $headerParams ); + return array(null, $statusCode, $httpHeader); + } catch (ApiException $e) { switch ($e->getCode()) { } @@ -673,7 +673,7 @@ class PetApi * * @param int $pet_id Pet id to delete (required) * @param string $api_key (optional) - * @return void + * @return Array of null, HTTP status code, HTTP response headers (array of strings) * @throws \Swagger\Client\ApiException on non-2xx response */ public function deletePetWithHttpInfo ($pet_id, $api_key=null) @@ -735,6 +735,8 @@ class PetApi $headerParams ); + return array(null, $statusCode, $httpHeader); + } catch (ApiException $e) { switch ($e->getCode()) { } @@ -769,7 +771,7 @@ class PetApi * @param int $pet_id ID of pet to update (required) * @param string $additional_metadata Additional data to pass to server (optional) * @param \SplFileObject $file file to upload (optional) - * @return void + * @return Array of null, HTTP status code, HTTP response headers (array of strings) * @throws \Swagger\Client\ApiException on non-2xx response */ public function uploadFileWithHttpInfo ($pet_id, $additional_metadata=null, $file=null) @@ -846,6 +848,8 @@ class PetApi $headerParams ); + return array(null, $statusCode, $httpHeader); + } catch (ApiException $e) { switch ($e->getCode()) { } diff --git a/samples/client/petstore/php/SwaggerClient-php/lib/Api/StoreApi.php b/samples/client/petstore/php/SwaggerClient-php/lib/Api/StoreApi.php index 26b25027a1b..3d8d14139c0 100644 --- a/samples/client/petstore/php/SwaggerClient-php/lib/Api/StoreApi.php +++ b/samples/client/petstore/php/SwaggerClient-php/lib/Api/StoreApi.php @@ -111,7 +111,7 @@ class StoreApi * * Returns pet inventories by status * - * @return map[string,int] + * @return Array of map[string,int], HTTP status code, HTTP response headers (array of strings) * @throws \Swagger\Client\ApiException on non-2xx response */ public function getInventoryWithHttpInfo () @@ -167,8 +167,6 @@ class StoreApi return array($this->apiClient->getSerializer()->deserialize($response, 'map[string,int]', $httpHeader), $statusCode, $httpHeader); - return array(null, $statusCode, $httpHeader); - } catch (ApiException $e) { switch ($e->getCode()) { case 200: @@ -203,7 +201,7 @@ class StoreApi * Place an order for a pet * * @param \Swagger\Client\Model\Order $body order placed for purchasing the pet (optional) - * @return \Swagger\Client\Model\Order + * @return Array of \Swagger\Client\Model\Order, HTTP status code, HTTP response headers (array of strings) * @throws \Swagger\Client\ApiException on non-2xx response */ public function placeOrderWithHttpInfo ($body=null) @@ -256,8 +254,6 @@ class StoreApi return array($this->apiClient->getSerializer()->deserialize($response, '\Swagger\Client\Model\Order', $httpHeader), $statusCode, $httpHeader); - return array(null, $statusCode, $httpHeader); - } catch (ApiException $e) { switch ($e->getCode()) { case 200: @@ -292,7 +288,7 @@ class StoreApi * Find purchase order by ID * * @param string $order_id ID of pet that needs to be fetched (required) - * @return \Swagger\Client\Model\Order + * @return Array of \Swagger\Client\Model\Order, HTTP status code, HTTP response headers (array of strings) * @throws \Swagger\Client\ApiException on non-2xx response */ public function getOrderByIdWithHttpInfo ($order_id) @@ -352,8 +348,6 @@ class StoreApi return array($this->apiClient->getSerializer()->deserialize($response, '\Swagger\Client\Model\Order', $httpHeader), $statusCode, $httpHeader); - return array(null, $statusCode, $httpHeader); - } catch (ApiException $e) { switch ($e->getCode()) { case 200: @@ -388,7 +382,7 @@ class StoreApi * Delete purchase order by ID * * @param string $order_id ID of the order that needs to be deleted (required) - * @return void + * @return Array of null, HTTP status code, HTTP response headers (array of strings) * @throws \Swagger\Client\ApiException on non-2xx response */ public function deleteOrderWithHttpInfo ($order_id) @@ -442,6 +436,8 @@ class StoreApi $headerParams ); + return array(null, $statusCode, $httpHeader); + } catch (ApiException $e) { switch ($e->getCode()) { } diff --git a/samples/client/petstore/php/SwaggerClient-php/lib/Api/UserApi.php b/samples/client/petstore/php/SwaggerClient-php/lib/Api/UserApi.php index 9e2f3aa9eab..588f2b0a2e1 100644 --- a/samples/client/petstore/php/SwaggerClient-php/lib/Api/UserApi.php +++ b/samples/client/petstore/php/SwaggerClient-php/lib/Api/UserApi.php @@ -113,7 +113,7 @@ class UserApi * Create user * * @param \Swagger\Client\Model\User $body Created user object (optional) - * @return void + * @return Array of null, HTTP status code, HTTP response headers (array of strings) * @throws \Swagger\Client\ApiException on non-2xx response */ public function createUserWithHttpInfo ($body=null) @@ -160,6 +160,8 @@ class UserApi $headerParams ); + return array(null, $statusCode, $httpHeader); + } catch (ApiException $e) { switch ($e->getCode()) { } @@ -190,7 +192,7 @@ class UserApi * Creates list of users with given input array * * @param \Swagger\Client\Model\User[] $body List of user object (optional) - * @return void + * @return Array of null, HTTP status code, HTTP response headers (array of strings) * @throws \Swagger\Client\ApiException on non-2xx response */ public function createUsersWithArrayInputWithHttpInfo ($body=null) @@ -237,6 +239,8 @@ class UserApi $headerParams ); + return array(null, $statusCode, $httpHeader); + } catch (ApiException $e) { switch ($e->getCode()) { } @@ -267,7 +271,7 @@ class UserApi * Creates list of users with given input array * * @param \Swagger\Client\Model\User[] $body List of user object (optional) - * @return void + * @return Array of null, HTTP status code, HTTP response headers (array of strings) * @throws \Swagger\Client\ApiException on non-2xx response */ public function createUsersWithListInputWithHttpInfo ($body=null) @@ -314,6 +318,8 @@ class UserApi $headerParams ); + return array(null, $statusCode, $httpHeader); + } catch (ApiException $e) { switch ($e->getCode()) { } @@ -346,7 +352,7 @@ class UserApi * * @param string $username The user name for login (optional) * @param string $password The password for login in clear text (optional) - * @return string + * @return Array of string, HTTP status code, HTTP response headers (array of strings) * @throws \Swagger\Client\ApiException on non-2xx response */ public function loginUserWithHttpInfo ($username=null, $password=null) @@ -401,8 +407,6 @@ class UserApi return array($this->apiClient->getSerializer()->deserialize($response, 'string', $httpHeader), $statusCode, $httpHeader); - return array(null, $statusCode, $httpHeader); - } catch (ApiException $e) { switch ($e->getCode()) { case 200: @@ -435,7 +439,7 @@ class UserApi * * Logs out current logged in user session * - * @return void + * @return Array of null, HTTP status code, HTTP response headers (array of strings) * @throws \Swagger\Client\ApiException on non-2xx response */ public function logoutUserWithHttpInfo () @@ -478,6 +482,8 @@ class UserApi $headerParams ); + return array(null, $statusCode, $httpHeader); + } catch (ApiException $e) { switch ($e->getCode()) { } @@ -508,7 +514,7 @@ class UserApi * Get user by user name * * @param string $username The name that needs to be fetched. Use user1 for testing. (required) - * @return \Swagger\Client\Model\User + * @return Array of \Swagger\Client\Model\User, HTTP status code, HTTP response headers (array of strings) * @throws \Swagger\Client\ApiException on non-2xx response */ public function getUserByNameWithHttpInfo ($username) @@ -568,8 +574,6 @@ class UserApi return array($this->apiClient->getSerializer()->deserialize($response, '\Swagger\Client\Model\User', $httpHeader), $statusCode, $httpHeader); - return array(null, $statusCode, $httpHeader); - } catch (ApiException $e) { switch ($e->getCode()) { case 200: @@ -606,7 +610,7 @@ class UserApi * * @param string $username name that need to be deleted (required) * @param \Swagger\Client\Model\User $body Updated user object (optional) - * @return void + * @return Array of null, HTTP status code, HTTP response headers (array of strings) * @throws \Swagger\Client\ApiException on non-2xx response */ public function updateUserWithHttpInfo ($username, $body=null) @@ -664,6 +668,8 @@ class UserApi $headerParams ); + return array(null, $statusCode, $httpHeader); + } catch (ApiException $e) { switch ($e->getCode()) { } @@ -694,7 +700,7 @@ class UserApi * Delete user * * @param string $username The name that needs to be deleted (required) - * @return void + * @return Array of null, HTTP status code, HTTP response headers (array of strings) * @throws \Swagger\Client\ApiException on non-2xx response */ public function deleteUserWithHttpInfo ($username) @@ -748,6 +754,8 @@ class UserApi $headerParams ); + return array(null, $statusCode, $httpHeader); + } catch (ApiException $e) { switch ($e->getCode()) { } diff --git a/samples/client/petstore/php/SwaggerClient-php/tests/PetApiTest.php b/samples/client/petstore/php/SwaggerClient-php/tests/PetApiTest.php index c30c95eaa69..c81b07b38fd 100644 --- a/samples/client/petstore/php/SwaggerClient-php/tests/PetApiTest.php +++ b/samples/client/petstore/php/SwaggerClient-php/tests/PetApiTest.php @@ -168,7 +168,26 @@ class PetApiTest extends \PHPUnit_Framework_TestCase $this->assertSame($response->getName(), 'updatePet'); } - // test updatePet and verify by the "id" of the response + // test updatePetWithFormWithHttpInfo and verify by the "name" of the response + public function testUpdatePetWithFormWithHttpInfo() + { + // initialize the API client + $config = (new Swagger\Client\Configuration())->setHost('http://petstore.swagger.io/v2'); + $api_client = new Swagger\Client\ApiClient($config); + $pet_id = 10001; // ID of pet that needs to be fetched + $pet_api = new Swagger\Client\Api\PetAPI($api_client); + // update Pet (form) + list($update_response, $status_code, $http_headers) = $pet_api->updatePetWithFormWithHttpInfo($pet_id, 'update pet with form with http info'); + // return nothing (void) + $this->assertNull($update_response); + $this->assertSame($status_code, 200); + $this->assertSame($http_headers['Content-Type'], 'application/json'); + $response = $pet_api->getPetById($pet_id); + $this->assertSame($response->getId(), $pet_id); + $this->assertSame($response->getName(), 'update pet with form with http info'); + } + + // test updatePetWithForm and verify by the "name" and "status" of the response public function testUpdatePetWithForm() { // initialize the API client From 17b14fa281aa73677ef2dc632332f12b57fda651 Mon Sep 17 00:00:00 2001 From: wing328 Date: Mon, 7 Dec 2015 00:37:22 +0800 Subject: [PATCH 133/211] update php sample --- .../php/SwaggerClient-php/lib/Api/PetApi.php | 16 ++++++++-------- .../php/SwaggerClient-php/lib/Api/StoreApi.php | 8 ++++---- .../php/SwaggerClient-php/lib/Api/UserApi.php | 16 ++++++++-------- 3 files changed, 20 insertions(+), 20 deletions(-) diff --git a/samples/client/petstore/php/SwaggerClient-php/lib/Api/PetApi.php b/samples/client/petstore/php/SwaggerClient-php/lib/Api/PetApi.php index 792053877a4..c5ac2e17eb9 100644 --- a/samples/client/petstore/php/SwaggerClient-php/lib/Api/PetApi.php +++ b/samples/client/petstore/php/SwaggerClient-php/lib/Api/PetApi.php @@ -108,7 +108,7 @@ class PetApi /** - * updatePet + * updatePetWithHttpInfo * * Update an existing pet * @@ -192,7 +192,7 @@ class PetApi /** - * addPet + * addPetWithHttpInfo * * Add a new pet to the store * @@ -276,7 +276,7 @@ class PetApi /** - * findPetsByStatus + * findPetsByStatusWithHttpInfo * * Finds Pets by status * @@ -367,7 +367,7 @@ class PetApi /** - * findPetsByTags + * findPetsByTagsWithHttpInfo * * Finds Pets by tags * @@ -458,7 +458,7 @@ class PetApi /** - * getPetById + * getPetByIdWithHttpInfo * * Find pet by ID * @@ -561,7 +561,7 @@ class PetApi /** - * updatePetWithForm + * updatePetWithFormWithHttpInfo * * Updates a pet in the store with form data * @@ -667,7 +667,7 @@ class PetApi /** - * deletePet + * deletePetWithHttpInfo * * Deletes a pet * @@ -764,7 +764,7 @@ class PetApi /** - * uploadFile + * uploadFileWithHttpInfo * * uploads an image * diff --git a/samples/client/petstore/php/SwaggerClient-php/lib/Api/StoreApi.php b/samples/client/petstore/php/SwaggerClient-php/lib/Api/StoreApi.php index 3d8d14139c0..3deab979d41 100644 --- a/samples/client/petstore/php/SwaggerClient-php/lib/Api/StoreApi.php +++ b/samples/client/petstore/php/SwaggerClient-php/lib/Api/StoreApi.php @@ -107,7 +107,7 @@ class StoreApi /** - * getInventory + * getInventoryWithHttpInfo * * Returns pet inventories by status * @@ -196,7 +196,7 @@ class StoreApi /** - * placeOrder + * placeOrderWithHttpInfo * * Place an order for a pet * @@ -283,7 +283,7 @@ class StoreApi /** - * getOrderById + * getOrderByIdWithHttpInfo * * Find purchase order by ID * @@ -377,7 +377,7 @@ class StoreApi /** - * deleteOrder + * deleteOrderWithHttpInfo * * Delete purchase order by ID * diff --git a/samples/client/petstore/php/SwaggerClient-php/lib/Api/UserApi.php b/samples/client/petstore/php/SwaggerClient-php/lib/Api/UserApi.php index 588f2b0a2e1..98a26537f2a 100644 --- a/samples/client/petstore/php/SwaggerClient-php/lib/Api/UserApi.php +++ b/samples/client/petstore/php/SwaggerClient-php/lib/Api/UserApi.php @@ -108,7 +108,7 @@ class UserApi /** - * createUser + * createUserWithHttpInfo * * Create user * @@ -187,7 +187,7 @@ class UserApi /** - * createUsersWithArrayInput + * createUsersWithArrayInputWithHttpInfo * * Creates list of users with given input array * @@ -266,7 +266,7 @@ class UserApi /** - * createUsersWithListInput + * createUsersWithListInputWithHttpInfo * * Creates list of users with given input array * @@ -346,7 +346,7 @@ class UserApi /** - * loginUser + * loginUserWithHttpInfo * * Logs user into the system * @@ -435,7 +435,7 @@ class UserApi /** - * logoutUser + * logoutUserWithHttpInfo * * Logs out current logged in user session * @@ -509,7 +509,7 @@ class UserApi /** - * getUserByName + * getUserByNameWithHttpInfo * * Get user by user name * @@ -604,7 +604,7 @@ class UserApi /** - * updateUser + * updateUserWithHttpInfo * * Updated user * @@ -695,7 +695,7 @@ class UserApi /** - * deleteUser + * deleteUserWithHttpInfo * * Delete user * From 442f87c19a08b5c797ca60796d54fa3a2437fa18 Mon Sep 17 00:00:00 2001 From: wing328 Date: Mon, 7 Dec 2015 00:42:25 +0800 Subject: [PATCH 134/211] minor style change for php functions --- .../src/main/resources/php/api.mustache | 4 +-- .../php/SwaggerClient-php/lib/Api/PetApi.php | 32 +++++++++---------- .../SwaggerClient-php/lib/Api/StoreApi.php | 16 +++++----- .../php/SwaggerClient-php/lib/Api/UserApi.php | 32 +++++++++---------- 4 files changed, 42 insertions(+), 42 deletions(-) diff --git a/modules/swagger-codegen/src/main/resources/php/api.mustache b/modules/swagger-codegen/src/main/resources/php/api.mustache index 0b28b2b4ca6..53a476b4061 100644 --- a/modules/swagger-codegen/src/main/resources/php/api.mustache +++ b/modules/swagger-codegen/src/main/resources/php/api.mustache @@ -100,7 +100,7 @@ use \{{invokerPackage}}\ObjectSerializer; {{/allParams}} * @return {{#returnType}}{{{returnType}}}{{/returnType}}{{^returnType}}void{{/returnType}} * @throws \{{invokerPackage}}\ApiException on non-2xx response */ - public function {{operationId}} ({{#allParams}}${{paramName}}{{^required}}=null{{/required}}{{#hasMore}}, {{/hasMore}}{{/allParams}}) + public function {{operationId}}({{#allParams}}${{paramName}}{{^required}}=null{{/required}}{{#hasMore}}, {{/hasMore}}{{/allParams}}) { list($response, $statusCode, $httpHeader) = $this->{{operationId}}WithHttpInfo ({{#allParams}}${{paramName}}{{#hasMore}}, {{/hasMore}}{{/allParams}}); return $response; @@ -116,7 +116,7 @@ use \{{invokerPackage}}\ObjectSerializer; {{/allParams}} * @return Array of {{#returnType}}{{{returnType}}}{{/returnType}}{{^returnType}}null{{/returnType}}, HTTP status code, HTTP response headers (array of strings) * @throws \{{invokerPackage}}\ApiException on non-2xx response */ - public function {{operationId}}WithHttpInfo ({{#allParams}}${{paramName}}{{^required}}=null{{/required}}{{#hasMore}}, {{/hasMore}}{{/allParams}}) + public function {{operationId}}WithHttpInfo({{#allParams}}${{paramName}}{{^required}}=null{{/required}}{{#hasMore}}, {{/hasMore}}{{/allParams}}) { {{#allParams}}{{#required}} // verify the required parameter '{{paramName}}' is set diff --git a/samples/client/petstore/php/SwaggerClient-php/lib/Api/PetApi.php b/samples/client/petstore/php/SwaggerClient-php/lib/Api/PetApi.php index c5ac2e17eb9..ed73dd64dc8 100644 --- a/samples/client/petstore/php/SwaggerClient-php/lib/Api/PetApi.php +++ b/samples/client/petstore/php/SwaggerClient-php/lib/Api/PetApi.php @@ -100,7 +100,7 @@ class PetApi * @return void * @throws \Swagger\Client\ApiException on non-2xx response */ - public function updatePet ($body=null) + public function updatePet($body=null) { list($response, $statusCode, $httpHeader) = $this->updatePetWithHttpInfo ($body); return $response; @@ -116,7 +116,7 @@ class PetApi * @return Array of null, HTTP status code, HTTP response headers (array of strings) * @throws \Swagger\Client\ApiException on non-2xx response */ - public function updatePetWithHttpInfo ($body=null) + public function updatePetWithHttpInfo($body=null) { @@ -184,7 +184,7 @@ class PetApi * @return void * @throws \Swagger\Client\ApiException on non-2xx response */ - public function addPet ($body=null) + public function addPet($body=null) { list($response, $statusCode, $httpHeader) = $this->addPetWithHttpInfo ($body); return $response; @@ -200,7 +200,7 @@ class PetApi * @return Array of null, HTTP status code, HTTP response headers (array of strings) * @throws \Swagger\Client\ApiException on non-2xx response */ - public function addPetWithHttpInfo ($body=null) + public function addPetWithHttpInfo($body=null) { @@ -268,7 +268,7 @@ class PetApi * @return \Swagger\Client\Model\Pet[] * @throws \Swagger\Client\ApiException on non-2xx response */ - public function findPetsByStatus ($status=null) + public function findPetsByStatus($status=null) { list($response, $statusCode, $httpHeader) = $this->findPetsByStatusWithHttpInfo ($status); return $response; @@ -284,7 +284,7 @@ class PetApi * @return Array of \Swagger\Client\Model\Pet[], HTTP status code, HTTP response headers (array of strings) * @throws \Swagger\Client\ApiException on non-2xx response */ - public function findPetsByStatusWithHttpInfo ($status=null) + public function findPetsByStatusWithHttpInfo($status=null) { @@ -359,7 +359,7 @@ class PetApi * @return \Swagger\Client\Model\Pet[] * @throws \Swagger\Client\ApiException on non-2xx response */ - public function findPetsByTags ($tags=null) + public function findPetsByTags($tags=null) { list($response, $statusCode, $httpHeader) = $this->findPetsByTagsWithHttpInfo ($tags); return $response; @@ -375,7 +375,7 @@ class PetApi * @return Array of \Swagger\Client\Model\Pet[], HTTP status code, HTTP response headers (array of strings) * @throws \Swagger\Client\ApiException on non-2xx response */ - public function findPetsByTagsWithHttpInfo ($tags=null) + public function findPetsByTagsWithHttpInfo($tags=null) { @@ -450,7 +450,7 @@ class PetApi * @return \Swagger\Client\Model\Pet * @throws \Swagger\Client\ApiException on non-2xx response */ - public function getPetById ($pet_id) + public function getPetById($pet_id) { list($response, $statusCode, $httpHeader) = $this->getPetByIdWithHttpInfo ($pet_id); return $response; @@ -466,7 +466,7 @@ class PetApi * @return Array of \Swagger\Client\Model\Pet, HTTP status code, HTTP response headers (array of strings) * @throws \Swagger\Client\ApiException on non-2xx response */ - public function getPetByIdWithHttpInfo ($pet_id) + public function getPetByIdWithHttpInfo($pet_id) { // verify the required parameter 'pet_id' is set @@ -553,7 +553,7 @@ class PetApi * @return void * @throws \Swagger\Client\ApiException on non-2xx response */ - public function updatePetWithForm ($pet_id, $name=null, $status=null) + public function updatePetWithForm($pet_id, $name=null, $status=null) { list($response, $statusCode, $httpHeader) = $this->updatePetWithFormWithHttpInfo ($pet_id, $name, $status); return $response; @@ -571,7 +571,7 @@ class PetApi * @return Array of null, HTTP status code, HTTP response headers (array of strings) * @throws \Swagger\Client\ApiException on non-2xx response */ - public function updatePetWithFormWithHttpInfo ($pet_id, $name=null, $status=null) + public function updatePetWithFormWithHttpInfo($pet_id, $name=null, $status=null) { // verify the required parameter 'pet_id' is set @@ -659,7 +659,7 @@ class PetApi * @return void * @throws \Swagger\Client\ApiException on non-2xx response */ - public function deletePet ($pet_id, $api_key=null) + public function deletePet($pet_id, $api_key=null) { list($response, $statusCode, $httpHeader) = $this->deletePetWithHttpInfo ($pet_id, $api_key); return $response; @@ -676,7 +676,7 @@ class PetApi * @return Array of null, HTTP status code, HTTP response headers (array of strings) * @throws \Swagger\Client\ApiException on non-2xx response */ - public function deletePetWithHttpInfo ($pet_id, $api_key=null) + public function deletePetWithHttpInfo($pet_id, $api_key=null) { // verify the required parameter 'pet_id' is set @@ -756,7 +756,7 @@ class PetApi * @return void * @throws \Swagger\Client\ApiException on non-2xx response */ - public function uploadFile ($pet_id, $additional_metadata=null, $file=null) + public function uploadFile($pet_id, $additional_metadata=null, $file=null) { list($response, $statusCode, $httpHeader) = $this->uploadFileWithHttpInfo ($pet_id, $additional_metadata, $file); return $response; @@ -774,7 +774,7 @@ class PetApi * @return Array of null, HTTP status code, HTTP response headers (array of strings) * @throws \Swagger\Client\ApiException on non-2xx response */ - public function uploadFileWithHttpInfo ($pet_id, $additional_metadata=null, $file=null) + public function uploadFileWithHttpInfo($pet_id, $additional_metadata=null, $file=null) { // verify the required parameter 'pet_id' is set diff --git a/samples/client/petstore/php/SwaggerClient-php/lib/Api/StoreApi.php b/samples/client/petstore/php/SwaggerClient-php/lib/Api/StoreApi.php index 3deab979d41..34490783ffb 100644 --- a/samples/client/petstore/php/SwaggerClient-php/lib/Api/StoreApi.php +++ b/samples/client/petstore/php/SwaggerClient-php/lib/Api/StoreApi.php @@ -99,7 +99,7 @@ class StoreApi * @return map[string,int] * @throws \Swagger\Client\ApiException on non-2xx response */ - public function getInventory () + public function getInventory() { list($response, $statusCode, $httpHeader) = $this->getInventoryWithHttpInfo (); return $response; @@ -114,7 +114,7 @@ class StoreApi * @return Array of map[string,int], HTTP status code, HTTP response headers (array of strings) * @throws \Swagger\Client\ApiException on non-2xx response */ - public function getInventoryWithHttpInfo () + public function getInventoryWithHttpInfo() { @@ -188,7 +188,7 @@ class StoreApi * @return \Swagger\Client\Model\Order * @throws \Swagger\Client\ApiException on non-2xx response */ - public function placeOrder ($body=null) + public function placeOrder($body=null) { list($response, $statusCode, $httpHeader) = $this->placeOrderWithHttpInfo ($body); return $response; @@ -204,7 +204,7 @@ class StoreApi * @return Array of \Swagger\Client\Model\Order, HTTP status code, HTTP response headers (array of strings) * @throws \Swagger\Client\ApiException on non-2xx response */ - public function placeOrderWithHttpInfo ($body=null) + public function placeOrderWithHttpInfo($body=null) { @@ -275,7 +275,7 @@ class StoreApi * @return \Swagger\Client\Model\Order * @throws \Swagger\Client\ApiException on non-2xx response */ - public function getOrderById ($order_id) + public function getOrderById($order_id) { list($response, $statusCode, $httpHeader) = $this->getOrderByIdWithHttpInfo ($order_id); return $response; @@ -291,7 +291,7 @@ class StoreApi * @return Array of \Swagger\Client\Model\Order, HTTP status code, HTTP response headers (array of strings) * @throws \Swagger\Client\ApiException on non-2xx response */ - public function getOrderByIdWithHttpInfo ($order_id) + public function getOrderByIdWithHttpInfo($order_id) { // verify the required parameter 'order_id' is set @@ -369,7 +369,7 @@ class StoreApi * @return void * @throws \Swagger\Client\ApiException on non-2xx response */ - public function deleteOrder ($order_id) + public function deleteOrder($order_id) { list($response, $statusCode, $httpHeader) = $this->deleteOrderWithHttpInfo ($order_id); return $response; @@ -385,7 +385,7 @@ class StoreApi * @return Array of null, HTTP status code, HTTP response headers (array of strings) * @throws \Swagger\Client\ApiException on non-2xx response */ - public function deleteOrderWithHttpInfo ($order_id) + public function deleteOrderWithHttpInfo($order_id) { // verify the required parameter 'order_id' is set diff --git a/samples/client/petstore/php/SwaggerClient-php/lib/Api/UserApi.php b/samples/client/petstore/php/SwaggerClient-php/lib/Api/UserApi.php index 98a26537f2a..2a19c2f7798 100644 --- a/samples/client/petstore/php/SwaggerClient-php/lib/Api/UserApi.php +++ b/samples/client/petstore/php/SwaggerClient-php/lib/Api/UserApi.php @@ -100,7 +100,7 @@ class UserApi * @return void * @throws \Swagger\Client\ApiException on non-2xx response */ - public function createUser ($body=null) + public function createUser($body=null) { list($response, $statusCode, $httpHeader) = $this->createUserWithHttpInfo ($body); return $response; @@ -116,7 +116,7 @@ class UserApi * @return Array of null, HTTP status code, HTTP response headers (array of strings) * @throws \Swagger\Client\ApiException on non-2xx response */ - public function createUserWithHttpInfo ($body=null) + public function createUserWithHttpInfo($body=null) { @@ -179,7 +179,7 @@ class UserApi * @return void * @throws \Swagger\Client\ApiException on non-2xx response */ - public function createUsersWithArrayInput ($body=null) + public function createUsersWithArrayInput($body=null) { list($response, $statusCode, $httpHeader) = $this->createUsersWithArrayInputWithHttpInfo ($body); return $response; @@ -195,7 +195,7 @@ class UserApi * @return Array of null, HTTP status code, HTTP response headers (array of strings) * @throws \Swagger\Client\ApiException on non-2xx response */ - public function createUsersWithArrayInputWithHttpInfo ($body=null) + public function createUsersWithArrayInputWithHttpInfo($body=null) { @@ -258,7 +258,7 @@ class UserApi * @return void * @throws \Swagger\Client\ApiException on non-2xx response */ - public function createUsersWithListInput ($body=null) + public function createUsersWithListInput($body=null) { list($response, $statusCode, $httpHeader) = $this->createUsersWithListInputWithHttpInfo ($body); return $response; @@ -274,7 +274,7 @@ class UserApi * @return Array of null, HTTP status code, HTTP response headers (array of strings) * @throws \Swagger\Client\ApiException on non-2xx response */ - public function createUsersWithListInputWithHttpInfo ($body=null) + public function createUsersWithListInputWithHttpInfo($body=null) { @@ -338,7 +338,7 @@ class UserApi * @return string * @throws \Swagger\Client\ApiException on non-2xx response */ - public function loginUser ($username=null, $password=null) + public function loginUser($username=null, $password=null) { list($response, $statusCode, $httpHeader) = $this->loginUserWithHttpInfo ($username, $password); return $response; @@ -355,7 +355,7 @@ class UserApi * @return Array of string, HTTP status code, HTTP response headers (array of strings) * @throws \Swagger\Client\ApiException on non-2xx response */ - public function loginUserWithHttpInfo ($username=null, $password=null) + public function loginUserWithHttpInfo($username=null, $password=null) { @@ -427,7 +427,7 @@ class UserApi * @return void * @throws \Swagger\Client\ApiException on non-2xx response */ - public function logoutUser () + public function logoutUser() { list($response, $statusCode, $httpHeader) = $this->logoutUserWithHttpInfo (); return $response; @@ -442,7 +442,7 @@ class UserApi * @return Array of null, HTTP status code, HTTP response headers (array of strings) * @throws \Swagger\Client\ApiException on non-2xx response */ - public function logoutUserWithHttpInfo () + public function logoutUserWithHttpInfo() { @@ -501,7 +501,7 @@ class UserApi * @return \Swagger\Client\Model\User * @throws \Swagger\Client\ApiException on non-2xx response */ - public function getUserByName ($username) + public function getUserByName($username) { list($response, $statusCode, $httpHeader) = $this->getUserByNameWithHttpInfo ($username); return $response; @@ -517,7 +517,7 @@ class UserApi * @return Array of \Swagger\Client\Model\User, HTTP status code, HTTP response headers (array of strings) * @throws \Swagger\Client\ApiException on non-2xx response */ - public function getUserByNameWithHttpInfo ($username) + public function getUserByNameWithHttpInfo($username) { // verify the required parameter 'username' is set @@ -596,7 +596,7 @@ class UserApi * @return void * @throws \Swagger\Client\ApiException on non-2xx response */ - public function updateUser ($username, $body=null) + public function updateUser($username, $body=null) { list($response, $statusCode, $httpHeader) = $this->updateUserWithHttpInfo ($username, $body); return $response; @@ -613,7 +613,7 @@ class UserApi * @return Array of null, HTTP status code, HTTP response headers (array of strings) * @throws \Swagger\Client\ApiException on non-2xx response */ - public function updateUserWithHttpInfo ($username, $body=null) + public function updateUserWithHttpInfo($username, $body=null) { // verify the required parameter 'username' is set @@ -687,7 +687,7 @@ class UserApi * @return void * @throws \Swagger\Client\ApiException on non-2xx response */ - public function deleteUser ($username) + public function deleteUser($username) { list($response, $statusCode, $httpHeader) = $this->deleteUserWithHttpInfo ($username); return $response; @@ -703,7 +703,7 @@ class UserApi * @return Array of null, HTTP status code, HTTP response headers (array of strings) * @throws \Swagger\Client\ApiException on non-2xx response */ - public function deleteUserWithHttpInfo ($username) + public function deleteUserWithHttpInfo($username) { // verify the required parameter 'username' is set From 340e60002e023e9ade296b1015345cf6544d12da Mon Sep 17 00:00:00 2001 From: wing328 Date: Mon, 7 Dec 2015 00:52:30 +0800 Subject: [PATCH 135/211] more style change for php client --- .../src/main/resources/php/ApiClient.mustache | 20 +++--- .../resources/php/ObjectSerializer.mustache | 6 +- .../src/main/resources/php/api.mustache | 9 ++- .../php/SwaggerClient-php/lib/Api/PetApi.php | 68 ++++++++----------- .../SwaggerClient-php/lib/Api/StoreApi.php | 24 +++---- .../php/SwaggerClient-php/lib/Api/UserApi.php | 60 +++++++--------- .../php/SwaggerClient-php/lib/ApiClient.php | 20 +++--- .../lib/ObjectSerializer.php | 6 +- 8 files changed, 96 insertions(+), 117 deletions(-) diff --git a/modules/swagger-codegen/src/main/resources/php/ApiClient.mustache b/modules/swagger-codegen/src/main/resources/php/ApiClient.mustache index 86998fd16d0..be18e221972 100644 --- a/modules/swagger-codegen/src/main/resources/php/ApiClient.mustache +++ b/modules/swagger-codegen/src/main/resources/php/ApiClient.mustache @@ -131,7 +131,7 @@ class ApiClient * @throws \{{invokerPackage}}\ApiException on a non 2xx response * @return mixed */ - public function callApi($resourcePath, $method, $queryParams, $postData, $headerParams, $responseType=null) + public function callApi($resourcePath, $method, $queryParams, $postData, $headerParams, $responseType = null) { $headers = array(); @@ -149,7 +149,7 @@ class ApiClient // form data if ($postData and in_array('Content-Type: application/x-www-form-urlencoded', $headers)) { $postData = http_build_query($postData); - } else if ((is_object($postData) or is_array($postData)) and !in_array('Content-Type: multipart/form-data', $headers)) { // json model + } elseif ((is_object($postData) or is_array($postData)) and !in_array('Content-Type: multipart/form-data', $headers)) { // json model $postData = json_encode($this->serializer->sanitizeForSerialization($postData)); } @@ -160,7 +160,7 @@ class ApiClient if ($this->config->getCurlTimeout() != 0) { curl_setopt($curl, CURLOPT_TIMEOUT, $this->config->getCurlTimeout()); } - // return the result on success, rather than just TRUE + // return the result on success, rather than just true curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); curl_setopt($curl, CURLOPT_HTTPHEADER, $headers); @@ -178,21 +178,21 @@ class ApiClient if ($method == self::$POST) { curl_setopt($curl, CURLOPT_POST, true); curl_setopt($curl, CURLOPT_POSTFIELDS, $postData); - } else if ($method == self::$HEAD) { + } elseif ($method == self::$HEAD) { curl_setopt($curl, CURLOPT_NOBODY, true); - } else if ($method == self::$OPTIONS) { + } elseif ($method == self::$OPTIONS) { curl_setopt($curl, CURLOPT_CUSTOMREQUEST, "OPTIONS"); curl_setopt($curl, CURLOPT_POSTFIELDS, $postData); - } else if ($method == self::$PATCH) { + } elseif ($method == self::$PATCH) { curl_setopt($curl, CURLOPT_CUSTOMREQUEST, "PATCH"); curl_setopt($curl, CURLOPT_POSTFIELDS, $postData); - } else if ($method == self::$PUT) { + } elseif ($method == self::$PUT) { curl_setopt($curl, CURLOPT_CUSTOMREQUEST, "PUT"); curl_setopt($curl, CURLOPT_POSTFIELDS, $postData); - } else if ($method == self::$DELETE) { + } elseif ($method == self::$DELETE) { curl_setopt($curl, CURLOPT_CUSTOMREQUEST, "DELETE"); curl_setopt($curl, CURLOPT_POSTFIELDS, $postData); - } else if ($method != self::$GET) { + } elseif ($method != self::$GET) { throw new ApiException('Method ' . $method . ' is not recognized.'); } curl_setopt($curl, CURLOPT_URL, $url); @@ -228,7 +228,7 @@ class ApiClient // Handle the response if ($response_info['http_code'] == 0) { throw new ApiException("API call to $url timed out: ".serialize($response_info), 0, null, null); - } else if ($response_info['http_code'] >= 200 && $response_info['http_code'] <= 299 ) { + } elseif ($response_info['http_code'] >= 200 && $response_info['http_code'] <= 299 ) { // return raw body if response is a file if ($responseType == '\SplFileObject') { return array($http_body, $response_info['http_code'], $http_header); diff --git a/modules/swagger-codegen/src/main/resources/php/ObjectSerializer.mustache b/modules/swagger-codegen/src/main/resources/php/ObjectSerializer.mustache index 54fb66a9543..133c1b1f454 100644 --- a/modules/swagger-codegen/src/main/resources/php/ObjectSerializer.mustache +++ b/modules/swagger-codegen/src/main/resources/php/ObjectSerializer.mustache @@ -56,14 +56,14 @@ class ObjectSerializer { if (is_scalar($data) || null === $data) { $sanitized = $data; - } else if ($data instanceof \DateTime) { + } elseif ($data instanceof \DateTime) { $sanitized = $data->format(\DateTime::ISO8601); - } else if (is_array($data)) { + } elseif (is_array($data)) { foreach ($data as $property => $value) { $data[$property] = $this->sanitizeForSerialization($value); } $sanitized = $data; - } else if (is_object($data)) { + } elseif (is_object($data)) { $values = array(); foreach (array_keys($data::$swaggerTypes) as $property) { $getter = $data::$getters[$property]; diff --git a/modules/swagger-codegen/src/main/resources/php/api.mustache b/modules/swagger-codegen/src/main/resources/php/api.mustache index 53a476b4061..22ae27fc77d 100644 --- a/modules/swagger-codegen/src/main/resources/php/api.mustache +++ b/modules/swagger-codegen/src/main/resources/php/api.mustache @@ -100,7 +100,7 @@ use \{{invokerPackage}}\ObjectSerializer; {{/allParams}} * @return {{#returnType}}{{{returnType}}}{{/returnType}}{{^returnType}}void{{/returnType}} * @throws \{{invokerPackage}}\ApiException on non-2xx response */ - public function {{operationId}}({{#allParams}}${{paramName}}{{^required}}=null{{/required}}{{#hasMore}}, {{/hasMore}}{{/allParams}}) + public function {{operationId}}({{#allParams}}${{paramName}}{{^required}} = null{{/required}}{{#hasMore}}, {{/hasMore}}{{/allParams}}) { list($response, $statusCode, $httpHeader) = $this->{{operationId}}WithHttpInfo ({{#allParams}}${{paramName}}{{#hasMore}}, {{/hasMore}}{{/allParams}}); return $response; @@ -116,7 +116,7 @@ use \{{invokerPackage}}\ObjectSerializer; {{/allParams}} * @return Array of {{#returnType}}{{{returnType}}}{{/returnType}}{{^returnType}}null{{/returnType}}, HTTP status code, HTTP response headers (array of strings) * @throws \{{invokerPackage}}\ApiException on non-2xx response */ - public function {{operationId}}WithHttpInfo({{#allParams}}${{paramName}}{{^required}}=null{{/required}}{{#hasMore}}, {{/hasMore}}{{/allParams}}) + public function {{operationId}}WithHttpInfo({{#allParams}}${{paramName}}{{^required}} = null{{/required}}{{#hasMore}}, {{/hasMore}}{{/allParams}}) { {{#allParams}}{{#required}} // verify the required parameter '{{paramName}}' is set @@ -178,7 +178,7 @@ use \{{invokerPackage}}\ObjectSerializer; // for model (json/xml) if (isset($_tempBody)) { $httpBody = $_tempBody; // $_tempBody is the method argument, if present - } else if (count($formParams) > 0) { + } elseif (count($formParams) > 0) { $httpBody = $formParams; // for HTTP post (form) } {{#authMethods}}{{#isApiKey}} @@ -196,8 +196,7 @@ use \{{invokerPackage}}\ObjectSerializer; }{{/isOAuth}} {{/authMethods}} // make the API Call - try - { + try { list($response, $statusCode, $httpHeader) = $this->apiClient->callApi( $resourcePath, $method, $queryParams, $httpBody, diff --git a/samples/client/petstore/php/SwaggerClient-php/lib/Api/PetApi.php b/samples/client/petstore/php/SwaggerClient-php/lib/Api/PetApi.php index ed73dd64dc8..18aeba64072 100644 --- a/samples/client/petstore/php/SwaggerClient-php/lib/Api/PetApi.php +++ b/samples/client/petstore/php/SwaggerClient-php/lib/Api/PetApi.php @@ -100,7 +100,7 @@ class PetApi * @return void * @throws \Swagger\Client\ApiException on non-2xx response */ - public function updatePet($body=null) + public function updatePet($body = null) { list($response, $statusCode, $httpHeader) = $this->updatePetWithHttpInfo ($body); return $response; @@ -116,7 +116,7 @@ class PetApi * @return Array of null, HTTP status code, HTTP response headers (array of strings) * @throws \Swagger\Client\ApiException on non-2xx response */ - public function updatePetWithHttpInfo($body=null) + public function updatePetWithHttpInfo($body = null) { @@ -147,7 +147,7 @@ class PetApi // for model (json/xml) if (isset($_tempBody)) { $httpBody = $_tempBody; // $_tempBody is the method argument, if present - } else if (count($formParams) > 0) { + } elseif (count($formParams) > 0) { $httpBody = $formParams; // for HTTP post (form) } @@ -157,8 +157,7 @@ class PetApi } // make the API Call - try - { + try { list($response, $statusCode, $httpHeader) = $this->apiClient->callApi( $resourcePath, $method, $queryParams, $httpBody, @@ -184,7 +183,7 @@ class PetApi * @return void * @throws \Swagger\Client\ApiException on non-2xx response */ - public function addPet($body=null) + public function addPet($body = null) { list($response, $statusCode, $httpHeader) = $this->addPetWithHttpInfo ($body); return $response; @@ -200,7 +199,7 @@ class PetApi * @return Array of null, HTTP status code, HTTP response headers (array of strings) * @throws \Swagger\Client\ApiException on non-2xx response */ - public function addPetWithHttpInfo($body=null) + public function addPetWithHttpInfo($body = null) { @@ -231,7 +230,7 @@ class PetApi // for model (json/xml) if (isset($_tempBody)) { $httpBody = $_tempBody; // $_tempBody is the method argument, if present - } else if (count($formParams) > 0) { + } elseif (count($formParams) > 0) { $httpBody = $formParams; // for HTTP post (form) } @@ -241,8 +240,7 @@ class PetApi } // make the API Call - try - { + try { list($response, $statusCode, $httpHeader) = $this->apiClient->callApi( $resourcePath, $method, $queryParams, $httpBody, @@ -268,7 +266,7 @@ class PetApi * @return \Swagger\Client\Model\Pet[] * @throws \Swagger\Client\ApiException on non-2xx response */ - public function findPetsByStatus($status=null) + public function findPetsByStatus($status = null) { list($response, $statusCode, $httpHeader) = $this->findPetsByStatusWithHttpInfo ($status); return $response; @@ -284,7 +282,7 @@ class PetApi * @return Array of \Swagger\Client\Model\Pet[], HTTP status code, HTTP response headers (array of strings) * @throws \Swagger\Client\ApiException on non-2xx response */ - public function findPetsByStatusWithHttpInfo($status=null) + public function findPetsByStatusWithHttpInfo($status = null) { @@ -314,7 +312,7 @@ class PetApi // for model (json/xml) if (isset($_tempBody)) { $httpBody = $_tempBody; // $_tempBody is the method argument, if present - } else if (count($formParams) > 0) { + } elseif (count($formParams) > 0) { $httpBody = $formParams; // for HTTP post (form) } @@ -324,8 +322,7 @@ class PetApi } // make the API Call - try - { + try { list($response, $statusCode, $httpHeader) = $this->apiClient->callApi( $resourcePath, $method, $queryParams, $httpBody, @@ -359,7 +356,7 @@ class PetApi * @return \Swagger\Client\Model\Pet[] * @throws \Swagger\Client\ApiException on non-2xx response */ - public function findPetsByTags($tags=null) + public function findPetsByTags($tags = null) { list($response, $statusCode, $httpHeader) = $this->findPetsByTagsWithHttpInfo ($tags); return $response; @@ -375,7 +372,7 @@ class PetApi * @return Array of \Swagger\Client\Model\Pet[], HTTP status code, HTTP response headers (array of strings) * @throws \Swagger\Client\ApiException on non-2xx response */ - public function findPetsByTagsWithHttpInfo($tags=null) + public function findPetsByTagsWithHttpInfo($tags = null) { @@ -405,7 +402,7 @@ class PetApi // for model (json/xml) if (isset($_tempBody)) { $httpBody = $_tempBody; // $_tempBody is the method argument, if present - } else if (count($formParams) > 0) { + } elseif (count($formParams) > 0) { $httpBody = $formParams; // for HTTP post (form) } @@ -415,8 +412,7 @@ class PetApi } // make the API Call - try - { + try { list($response, $statusCode, $httpHeader) = $this->apiClient->callApi( $resourcePath, $method, $queryParams, $httpBody, @@ -504,7 +500,7 @@ class PetApi // for model (json/xml) if (isset($_tempBody)) { $httpBody = $_tempBody; // $_tempBody is the method argument, if present - } else if (count($formParams) > 0) { + } elseif (count($formParams) > 0) { $httpBody = $formParams; // for HTTP post (form) } @@ -516,8 +512,7 @@ class PetApi // make the API Call - try - { + try { list($response, $statusCode, $httpHeader) = $this->apiClient->callApi( $resourcePath, $method, $queryParams, $httpBody, @@ -553,7 +548,7 @@ class PetApi * @return void * @throws \Swagger\Client\ApiException on non-2xx response */ - public function updatePetWithForm($pet_id, $name=null, $status=null) + public function updatePetWithForm($pet_id, $name = null, $status = null) { list($response, $statusCode, $httpHeader) = $this->updatePetWithFormWithHttpInfo ($pet_id, $name, $status); return $response; @@ -571,7 +566,7 @@ class PetApi * @return Array of null, HTTP status code, HTTP response headers (array of strings) * @throws \Swagger\Client\ApiException on non-2xx response */ - public function updatePetWithFormWithHttpInfo($pet_id, $name=null, $status=null) + public function updatePetWithFormWithHttpInfo($pet_id, $name = null, $status = null) { // verify the required parameter 'pet_id' is set @@ -621,7 +616,7 @@ class PetApi // for model (json/xml) if (isset($_tempBody)) { $httpBody = $_tempBody; // $_tempBody is the method argument, if present - } else if (count($formParams) > 0) { + } elseif (count($formParams) > 0) { $httpBody = $formParams; // for HTTP post (form) } @@ -631,8 +626,7 @@ class PetApi } // make the API Call - try - { + try { list($response, $statusCode, $httpHeader) = $this->apiClient->callApi( $resourcePath, $method, $queryParams, $httpBody, @@ -659,7 +653,7 @@ class PetApi * @return void * @throws \Swagger\Client\ApiException on non-2xx response */ - public function deletePet($pet_id, $api_key=null) + public function deletePet($pet_id, $api_key = null) { list($response, $statusCode, $httpHeader) = $this->deletePetWithHttpInfo ($pet_id, $api_key); return $response; @@ -676,7 +670,7 @@ class PetApi * @return Array of null, HTTP status code, HTTP response headers (array of strings) * @throws \Swagger\Client\ApiException on non-2xx response */ - public function deletePetWithHttpInfo($pet_id, $api_key=null) + public function deletePetWithHttpInfo($pet_id, $api_key = null) { // verify the required parameter 'pet_id' is set @@ -717,7 +711,7 @@ class PetApi // for model (json/xml) if (isset($_tempBody)) { $httpBody = $_tempBody; // $_tempBody is the method argument, if present - } else if (count($formParams) > 0) { + } elseif (count($formParams) > 0) { $httpBody = $formParams; // for HTTP post (form) } @@ -727,8 +721,7 @@ class PetApi } // make the API Call - try - { + try { list($response, $statusCode, $httpHeader) = $this->apiClient->callApi( $resourcePath, $method, $queryParams, $httpBody, @@ -756,7 +749,7 @@ class PetApi * @return void * @throws \Swagger\Client\ApiException on non-2xx response */ - public function uploadFile($pet_id, $additional_metadata=null, $file=null) + public function uploadFile($pet_id, $additional_metadata = null, $file = null) { list($response, $statusCode, $httpHeader) = $this->uploadFileWithHttpInfo ($pet_id, $additional_metadata, $file); return $response; @@ -774,7 +767,7 @@ class PetApi * @return Array of null, HTTP status code, HTTP response headers (array of strings) * @throws \Swagger\Client\ApiException on non-2xx response */ - public function uploadFileWithHttpInfo($pet_id, $additional_metadata=null, $file=null) + public function uploadFileWithHttpInfo($pet_id, $additional_metadata = null, $file = null) { // verify the required parameter 'pet_id' is set @@ -830,7 +823,7 @@ class PetApi // for model (json/xml) if (isset($_tempBody)) { $httpBody = $_tempBody; // $_tempBody is the method argument, if present - } else if (count($formParams) > 0) { + } elseif (count($formParams) > 0) { $httpBody = $formParams; // for HTTP post (form) } @@ -840,8 +833,7 @@ class PetApi } // make the API Call - try - { + try { list($response, $statusCode, $httpHeader) = $this->apiClient->callApi( $resourcePath, $method, $queryParams, $httpBody, diff --git a/samples/client/petstore/php/SwaggerClient-php/lib/Api/StoreApi.php b/samples/client/petstore/php/SwaggerClient-php/lib/Api/StoreApi.php index 34490783ffb..4539aeeeab4 100644 --- a/samples/client/petstore/php/SwaggerClient-php/lib/Api/StoreApi.php +++ b/samples/client/petstore/php/SwaggerClient-php/lib/Api/StoreApi.php @@ -141,7 +141,7 @@ class StoreApi // for model (json/xml) if (isset($_tempBody)) { $httpBody = $_tempBody; // $_tempBody is the method argument, if present - } else if (count($formParams) > 0) { + } elseif (count($formParams) > 0) { $httpBody = $formParams; // for HTTP post (form) } @@ -153,8 +153,7 @@ class StoreApi // make the API Call - try - { + try { list($response, $statusCode, $httpHeader) = $this->apiClient->callApi( $resourcePath, $method, $queryParams, $httpBody, @@ -188,7 +187,7 @@ class StoreApi * @return \Swagger\Client\Model\Order * @throws \Swagger\Client\ApiException on non-2xx response */ - public function placeOrder($body=null) + public function placeOrder($body = null) { list($response, $statusCode, $httpHeader) = $this->placeOrderWithHttpInfo ($body); return $response; @@ -204,7 +203,7 @@ class StoreApi * @return Array of \Swagger\Client\Model\Order, HTTP status code, HTTP response headers (array of strings) * @throws \Swagger\Client\ApiException on non-2xx response */ - public function placeOrderWithHttpInfo($body=null) + public function placeOrderWithHttpInfo($body = null) { @@ -235,13 +234,12 @@ class StoreApi // for model (json/xml) if (isset($_tempBody)) { $httpBody = $_tempBody; // $_tempBody is the method argument, if present - } else if (count($formParams) > 0) { + } elseif (count($formParams) > 0) { $httpBody = $formParams; // for HTTP post (form) } // make the API Call - try - { + try { list($response, $statusCode, $httpHeader) = $this->apiClient->callApi( $resourcePath, $method, $queryParams, $httpBody, @@ -329,13 +327,12 @@ class StoreApi // for model (json/xml) if (isset($_tempBody)) { $httpBody = $_tempBody; // $_tempBody is the method argument, if present - } else if (count($formParams) > 0) { + } elseif (count($formParams) > 0) { $httpBody = $formParams; // for HTTP post (form) } // make the API Call - try - { + try { list($response, $statusCode, $httpHeader) = $this->apiClient->callApi( $resourcePath, $method, $queryParams, $httpBody, @@ -423,13 +420,12 @@ class StoreApi // for model (json/xml) if (isset($_tempBody)) { $httpBody = $_tempBody; // $_tempBody is the method argument, if present - } else if (count($formParams) > 0) { + } elseif (count($formParams) > 0) { $httpBody = $formParams; // for HTTP post (form) } // make the API Call - try - { + try { list($response, $statusCode, $httpHeader) = $this->apiClient->callApi( $resourcePath, $method, $queryParams, $httpBody, diff --git a/samples/client/petstore/php/SwaggerClient-php/lib/Api/UserApi.php b/samples/client/petstore/php/SwaggerClient-php/lib/Api/UserApi.php index 2a19c2f7798..f200ff51d2a 100644 --- a/samples/client/petstore/php/SwaggerClient-php/lib/Api/UserApi.php +++ b/samples/client/petstore/php/SwaggerClient-php/lib/Api/UserApi.php @@ -100,7 +100,7 @@ class UserApi * @return void * @throws \Swagger\Client\ApiException on non-2xx response */ - public function createUser($body=null) + public function createUser($body = null) { list($response, $statusCode, $httpHeader) = $this->createUserWithHttpInfo ($body); return $response; @@ -116,7 +116,7 @@ class UserApi * @return Array of null, HTTP status code, HTTP response headers (array of strings) * @throws \Swagger\Client\ApiException on non-2xx response */ - public function createUserWithHttpInfo($body=null) + public function createUserWithHttpInfo($body = null) { @@ -147,13 +147,12 @@ class UserApi // for model (json/xml) if (isset($_tempBody)) { $httpBody = $_tempBody; // $_tempBody is the method argument, if present - } else if (count($formParams) > 0) { + } elseif (count($formParams) > 0) { $httpBody = $formParams; // for HTTP post (form) } // make the API Call - try - { + try { list($response, $statusCode, $httpHeader) = $this->apiClient->callApi( $resourcePath, $method, $queryParams, $httpBody, @@ -179,7 +178,7 @@ class UserApi * @return void * @throws \Swagger\Client\ApiException on non-2xx response */ - public function createUsersWithArrayInput($body=null) + public function createUsersWithArrayInput($body = null) { list($response, $statusCode, $httpHeader) = $this->createUsersWithArrayInputWithHttpInfo ($body); return $response; @@ -195,7 +194,7 @@ class UserApi * @return Array of null, HTTP status code, HTTP response headers (array of strings) * @throws \Swagger\Client\ApiException on non-2xx response */ - public function createUsersWithArrayInputWithHttpInfo($body=null) + public function createUsersWithArrayInputWithHttpInfo($body = null) { @@ -226,13 +225,12 @@ class UserApi // for model (json/xml) if (isset($_tempBody)) { $httpBody = $_tempBody; // $_tempBody is the method argument, if present - } else if (count($formParams) > 0) { + } elseif (count($formParams) > 0) { $httpBody = $formParams; // for HTTP post (form) } // make the API Call - try - { + try { list($response, $statusCode, $httpHeader) = $this->apiClient->callApi( $resourcePath, $method, $queryParams, $httpBody, @@ -258,7 +256,7 @@ class UserApi * @return void * @throws \Swagger\Client\ApiException on non-2xx response */ - public function createUsersWithListInput($body=null) + public function createUsersWithListInput($body = null) { list($response, $statusCode, $httpHeader) = $this->createUsersWithListInputWithHttpInfo ($body); return $response; @@ -274,7 +272,7 @@ class UserApi * @return Array of null, HTTP status code, HTTP response headers (array of strings) * @throws \Swagger\Client\ApiException on non-2xx response */ - public function createUsersWithListInputWithHttpInfo($body=null) + public function createUsersWithListInputWithHttpInfo($body = null) { @@ -305,13 +303,12 @@ class UserApi // for model (json/xml) if (isset($_tempBody)) { $httpBody = $_tempBody; // $_tempBody is the method argument, if present - } else if (count($formParams) > 0) { + } elseif (count($formParams) > 0) { $httpBody = $formParams; // for HTTP post (form) } // make the API Call - try - { + try { list($response, $statusCode, $httpHeader) = $this->apiClient->callApi( $resourcePath, $method, $queryParams, $httpBody, @@ -338,7 +335,7 @@ class UserApi * @return string * @throws \Swagger\Client\ApiException on non-2xx response */ - public function loginUser($username=null, $password=null) + public function loginUser($username = null, $password = null) { list($response, $statusCode, $httpHeader) = $this->loginUserWithHttpInfo ($username, $password); return $response; @@ -355,7 +352,7 @@ class UserApi * @return Array of string, HTTP status code, HTTP response headers (array of strings) * @throws \Swagger\Client\ApiException on non-2xx response */ - public function loginUserWithHttpInfo($username=null, $password=null) + public function loginUserWithHttpInfo($username = null, $password = null) { @@ -388,13 +385,12 @@ class UserApi // for model (json/xml) if (isset($_tempBody)) { $httpBody = $_tempBody; // $_tempBody is the method argument, if present - } else if (count($formParams) > 0) { + } elseif (count($formParams) > 0) { $httpBody = $formParams; // for HTTP post (form) } // make the API Call - try - { + try { list($response, $statusCode, $httpHeader) = $this->apiClient->callApi( $resourcePath, $method, $queryParams, $httpBody, @@ -469,13 +465,12 @@ class UserApi // for model (json/xml) if (isset($_tempBody)) { $httpBody = $_tempBody; // $_tempBody is the method argument, if present - } else if (count($formParams) > 0) { + } elseif (count($formParams) > 0) { $httpBody = $formParams; // for HTTP post (form) } // make the API Call - try - { + try { list($response, $statusCode, $httpHeader) = $this->apiClient->callApi( $resourcePath, $method, $queryParams, $httpBody, @@ -555,13 +550,12 @@ class UserApi // for model (json/xml) if (isset($_tempBody)) { $httpBody = $_tempBody; // $_tempBody is the method argument, if present - } else if (count($formParams) > 0) { + } elseif (count($formParams) > 0) { $httpBody = $formParams; // for HTTP post (form) } // make the API Call - try - { + try { list($response, $statusCode, $httpHeader) = $this->apiClient->callApi( $resourcePath, $method, $queryParams, $httpBody, @@ -596,7 +590,7 @@ class UserApi * @return void * @throws \Swagger\Client\ApiException on non-2xx response */ - public function updateUser($username, $body=null) + public function updateUser($username, $body = null) { list($response, $statusCode, $httpHeader) = $this->updateUserWithHttpInfo ($username, $body); return $response; @@ -613,7 +607,7 @@ class UserApi * @return Array of null, HTTP status code, HTTP response headers (array of strings) * @throws \Swagger\Client\ApiException on non-2xx response */ - public function updateUserWithHttpInfo($username, $body=null) + public function updateUserWithHttpInfo($username, $body = null) { // verify the required parameter 'username' is set @@ -655,13 +649,12 @@ class UserApi // for model (json/xml) if (isset($_tempBody)) { $httpBody = $_tempBody; // $_tempBody is the method argument, if present - } else if (count($formParams) > 0) { + } elseif (count($formParams) > 0) { $httpBody = $formParams; // for HTTP post (form) } // make the API Call - try - { + try { list($response, $statusCode, $httpHeader) = $this->apiClient->callApi( $resourcePath, $method, $queryParams, $httpBody, @@ -741,13 +734,12 @@ class UserApi // for model (json/xml) if (isset($_tempBody)) { $httpBody = $_tempBody; // $_tempBody is the method argument, if present - } else if (count($formParams) > 0) { + } elseif (count($formParams) > 0) { $httpBody = $formParams; // for HTTP post (form) } // make the API Call - try - { + try { list($response, $statusCode, $httpHeader) = $this->apiClient->callApi( $resourcePath, $method, $queryParams, $httpBody, diff --git a/samples/client/petstore/php/SwaggerClient-php/lib/ApiClient.php b/samples/client/petstore/php/SwaggerClient-php/lib/ApiClient.php index 2f3aacd1ffd..8730a8c0601 100644 --- a/samples/client/petstore/php/SwaggerClient-php/lib/ApiClient.php +++ b/samples/client/petstore/php/SwaggerClient-php/lib/ApiClient.php @@ -131,7 +131,7 @@ class ApiClient * @throws \Swagger\Client\ApiException on a non 2xx response * @return mixed */ - public function callApi($resourcePath, $method, $queryParams, $postData, $headerParams, $responseType=null) + public function callApi($resourcePath, $method, $queryParams, $postData, $headerParams, $responseType = null) { $headers = array(); @@ -149,7 +149,7 @@ class ApiClient // form data if ($postData and in_array('Content-Type: application/x-www-form-urlencoded', $headers)) { $postData = http_build_query($postData); - } else if ((is_object($postData) or is_array($postData)) and !in_array('Content-Type: multipart/form-data', $headers)) { // json model + } elseif ((is_object($postData) or is_array($postData)) and !in_array('Content-Type: multipart/form-data', $headers)) { // json model $postData = json_encode($this->serializer->sanitizeForSerialization($postData)); } @@ -160,7 +160,7 @@ class ApiClient if ($this->config->getCurlTimeout() != 0) { curl_setopt($curl, CURLOPT_TIMEOUT, $this->config->getCurlTimeout()); } - // return the result on success, rather than just TRUE + // return the result on success, rather than just true curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); curl_setopt($curl, CURLOPT_HTTPHEADER, $headers); @@ -178,21 +178,21 @@ class ApiClient if ($method == self::$POST) { curl_setopt($curl, CURLOPT_POST, true); curl_setopt($curl, CURLOPT_POSTFIELDS, $postData); - } else if ($method == self::$HEAD) { + } elseif ($method == self::$HEAD) { curl_setopt($curl, CURLOPT_NOBODY, true); - } else if ($method == self::$OPTIONS) { + } elseif ($method == self::$OPTIONS) { curl_setopt($curl, CURLOPT_CUSTOMREQUEST, "OPTIONS"); curl_setopt($curl, CURLOPT_POSTFIELDS, $postData); - } else if ($method == self::$PATCH) { + } elseif ($method == self::$PATCH) { curl_setopt($curl, CURLOPT_CUSTOMREQUEST, "PATCH"); curl_setopt($curl, CURLOPT_POSTFIELDS, $postData); - } else if ($method == self::$PUT) { + } elseif ($method == self::$PUT) { curl_setopt($curl, CURLOPT_CUSTOMREQUEST, "PUT"); curl_setopt($curl, CURLOPT_POSTFIELDS, $postData); - } else if ($method == self::$DELETE) { + } elseif ($method == self::$DELETE) { curl_setopt($curl, CURLOPT_CUSTOMREQUEST, "DELETE"); curl_setopt($curl, CURLOPT_POSTFIELDS, $postData); - } else if ($method != self::$GET) { + } elseif ($method != self::$GET) { throw new ApiException('Method ' . $method . ' is not recognized.'); } curl_setopt($curl, CURLOPT_URL, $url); @@ -228,7 +228,7 @@ class ApiClient // Handle the response if ($response_info['http_code'] == 0) { throw new ApiException("API call to $url timed out: ".serialize($response_info), 0, null, null); - } else if ($response_info['http_code'] >= 200 && $response_info['http_code'] <= 299 ) { + } elseif ($response_info['http_code'] >= 200 && $response_info['http_code'] <= 299 ) { // return raw body if response is a file if ($responseType == '\SplFileObject') { return array($http_body, $response_info['http_code'], $http_header); diff --git a/samples/client/petstore/php/SwaggerClient-php/lib/ObjectSerializer.php b/samples/client/petstore/php/SwaggerClient-php/lib/ObjectSerializer.php index 22d03030fb3..cc023b61bd2 100644 --- a/samples/client/petstore/php/SwaggerClient-php/lib/ObjectSerializer.php +++ b/samples/client/petstore/php/SwaggerClient-php/lib/ObjectSerializer.php @@ -56,14 +56,14 @@ class ObjectSerializer { if (is_scalar($data) || null === $data) { $sanitized = $data; - } else if ($data instanceof \DateTime) { + } elseif ($data instanceof \DateTime) { $sanitized = $data->format(\DateTime::ISO8601); - } else if (is_array($data)) { + } elseif (is_array($data)) { foreach ($data as $property => $value) { $data[$property] = $this->sanitizeForSerialization($value); } $sanitized = $data; - } else if (is_object($data)) { + } elseif (is_object($data)) { $values = array(); foreach (array_keys($data::$swaggerTypes) as $property) { $getter = $data::$getters[$property]; From 7aab20485ac85494b885259812e63d927d4718aa Mon Sep 17 00:00:00 2001 From: wing328 Date: Mon, 7 Dec 2015 10:53:40 +0800 Subject: [PATCH 136/211] add bin and petstore samples for JS --- bin/javascript-petstore.sh | 31 + bin/windows/javascript-petstore.bat | 10 + .../javascript/src/scripts/rest/api/PetApi.js | 528 ++++++++++++++++++ .../src/scripts/rest/api/StoreApi.js | 304 ++++++++++ .../src/scripts/rest/api/UserApi.js | 485 ++++++++++++++++ .../src/scripts/rest/model/Category.js | 68 +++ .../src/scripts/rest/model/Order.js | 183 ++++++ .../javascript/src/scripts/rest/model/Pet.js | 185 ++++++ .../javascript/src/scripts/rest/model/Tag.js | 68 +++ .../javascript/src/scripts/rest/model/User.js | 197 +++++++ 10 files changed, 2059 insertions(+) create mode 100755 bin/javascript-petstore.sh create mode 100755 bin/windows/javascript-petstore.bat create mode 100644 samples/client/petstore/javascript/src/scripts/rest/api/PetApi.js create mode 100644 samples/client/petstore/javascript/src/scripts/rest/api/StoreApi.js create mode 100644 samples/client/petstore/javascript/src/scripts/rest/api/UserApi.js create mode 100644 samples/client/petstore/javascript/src/scripts/rest/model/Category.js create mode 100644 samples/client/petstore/javascript/src/scripts/rest/model/Order.js create mode 100644 samples/client/petstore/javascript/src/scripts/rest/model/Pet.js create mode 100644 samples/client/petstore/javascript/src/scripts/rest/model/Tag.js create mode 100644 samples/client/petstore/javascript/src/scripts/rest/model/User.js diff --git a/bin/javascript-petstore.sh b/bin/javascript-petstore.sh new file mode 100755 index 00000000000..9bf3ae70898 --- /dev/null +++ b/bin/javascript-petstore.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/javascript -i modules/swagger-codegen/src/test/resources/2_0/petstore.json -l javascript -o samples/client/petstore/javascript" + +java -DappName=PetstoreClient $JAVA_OPTS -jar $executable $ags diff --git a/bin/windows/javascript-petstore.bat b/bin/windows/javascript-petstore.bat new file mode 100755 index 00000000000..6ee220a7062 --- /dev/null +++ b/bin/windows/javascript-petstore.bat @@ -0,0 +1,10 @@ +set executable=.\modules\swagger-codegen-cli\target\swagger-codegen-cli.jar + +If Not Exist %executable% ( + mvn clean package +) + +set JAVA_OPTS=%JAVA_OPTS% -XX:MaxPermSize=256M -Xmx1024M -DloggerPath=conf/log4j.properties +set ags=generate -t modules\swagger-codegen\src\main\resources\javascript -i modules\swagger-codegen\src\test\resources\2_0\petstore.json -l javascript -o samples\client\petstore\javascript + +java %JAVA_OPTS% -jar %executable% %ags% diff --git a/samples/client/petstore/javascript/src/scripts/rest/api/PetApi.js b/samples/client/petstore/javascript/src/scripts/rest/api/PetApi.js new file mode 100644 index 00000000000..a693d83dbc2 --- /dev/null +++ b/samples/client/petstore/javascript/src/scripts/rest/api/PetApi.js @@ -0,0 +1,528 @@ +/* + * @javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavascriptClientCodegen", date = "2015-12-07T10:51:19.835+08:00") + */ + +//export module +if ( typeof define === "function" && define.amd ) { + define(['jquery'], function($) { + return PetApi; + }); +} + +var PetApi = function PetApi() { + var self = this; + + /** + * Update an existing pet + * + * @param {Pet} body Pet object that needs to be added to the store + * @param {function} callback the callback function + * @return void + */ + self.updatePet = function(body, callback) { + + var postBody = JSON.stringify(body); + var postBinaryBody = null; + + // create path and map variables + var basePath = 'http://petstore.swagger.io/v2'; + // if basePath ends with a /, remove it as path starts with a leading / + if (basePath.substring(basePath.length-1, basePath.length)=='/') { + basePath = basePath.substring(0, basePath.length-1); + } + + var path = basePath + replaceAll(replaceAll("/pet", "\\{format\\}","json")); + + var queryParams = {}; + var headerParams = {}; + var formParams = {}; + + + + + + path += createQueryString(queryParams); + + //if (console) { + //console.log('path: ' + path); + //console.log('queryParams: ' + queryParams); + //} + + + + + + apiClient.invokeAPI(path, "PUT", queryParams, postBody, postBinaryBody, headerParams, formParams, accept, contentType, authNames, null); + + + + + } + + /** + * Add a new pet to the store + * + * @param {Pet} body Pet object that needs to be added to the store + * @param {function} callback the callback function + * @return void + */ + self.addPet = function(body, callback) { + + var postBody = JSON.stringify(body); + var postBinaryBody = null; + + // create path and map variables + var basePath = 'http://petstore.swagger.io/v2'; + // if basePath ends with a /, remove it as path starts with a leading / + if (basePath.substring(basePath.length-1, basePath.length)=='/') { + basePath = basePath.substring(0, basePath.length-1); + } + + var path = basePath + replaceAll(replaceAll("/pet", "\\{format\\}","json")); + + var queryParams = {}; + var headerParams = {}; + var formParams = {}; + + + + + + path += createQueryString(queryParams); + + //if (console) { + //console.log('path: ' + path); + //console.log('queryParams: ' + queryParams); + //} + + + + + + apiClient.invokeAPI(path, "POST", queryParams, postBody, postBinaryBody, headerParams, formParams, accept, contentType, authNames, null); + + + + + } + + /** + * Finds Pets by status + * Multiple status values can be provided with comma seperated strings + * @param {Array} status Status values that need to be considered for filter + * @param {function} callback the callback function + * @return Array + */ + self.findPetsByStatus = function(status, callback) { + + var postBody = null; + var postBinaryBody = null; + + // create path and map variables + var basePath = 'http://petstore.swagger.io/v2'; + // if basePath ends with a /, remove it as path starts with a leading / + if (basePath.substring(basePath.length-1, basePath.length)=='/') { + basePath = basePath.substring(0, basePath.length-1); + } + + var path = basePath + replaceAll(replaceAll("/pet/findByStatus", "\\{format\\}","json")); + + var queryParams = {}; + var headerParams = {}; + var formParams = {}; + + + queryParams.status = status; + + + + + path += createQueryString(queryParams); + + //if (console) { + //console.log('path: ' + path); + //console.log('queryParams: ' + queryParams); + //} + + + + + + //TypeRef returnType = new TypeRef() {}; + //return apiClient.invokeAPI(path, "GET", queryParams, postBody, postBinaryBody, headerParams, formParams, accept, contentType, authNames, returnType); + + var options = {type: "GET", async: true, contentType: "application/json", dataType: "json", data: postBody}; + var request = $.ajax(path, options); + //request.fail(function(jqXHR, textStatus, errorThrown){ + // errorHandler(jqXHR, textStatus, errorThrown); + //}); + + + request.done(function(response, textStatus, jqXHR){ + /** + * @returns Array + */ + + var myResponse = new Array(); + myResponse.constructFromObject(response); + + callback(myResponse, textStatus, jqXHR); + }); + + + + + + } + + /** + * Finds Pets by tags + * Muliple tags can be provided with comma seperated strings. Use tag1, tag2, tag3 for testing. + * @param {Array} tags Tags to filter by + * @param {function} callback the callback function + * @return Array + */ + self.findPetsByTags = function(tags, callback) { + + var postBody = null; + var postBinaryBody = null; + + // create path and map variables + var basePath = 'http://petstore.swagger.io/v2'; + // if basePath ends with a /, remove it as path starts with a leading / + if (basePath.substring(basePath.length-1, basePath.length)=='/') { + basePath = basePath.substring(0, basePath.length-1); + } + + var path = basePath + replaceAll(replaceAll("/pet/findByTags", "\\{format\\}","json")); + + var queryParams = {}; + var headerParams = {}; + var formParams = {}; + + + queryParams.tags = tags; + + + + + path += createQueryString(queryParams); + + //if (console) { + //console.log('path: ' + path); + //console.log('queryParams: ' + queryParams); + //} + + + + + + //TypeRef returnType = new TypeRef() {}; + //return apiClient.invokeAPI(path, "GET", queryParams, postBody, postBinaryBody, headerParams, formParams, accept, contentType, authNames, returnType); + + var options = {type: "GET", async: true, contentType: "application/json", dataType: "json", data: postBody}; + var request = $.ajax(path, options); + //request.fail(function(jqXHR, textStatus, errorThrown){ + // errorHandler(jqXHR, textStatus, errorThrown); + //}); + + + request.done(function(response, textStatus, jqXHR){ + /** + * @returns Array + */ + + var myResponse = new Array(); + myResponse.constructFromObject(response); + + callback(myResponse, textStatus, jqXHR); + }); + + + + + + } + + /** + * Find pet by ID + * Returns a pet when ID < 10. ID > 10 or nonintegers will simulate API error conditions + * @param {Long} petId ID of pet that needs to be fetched + * @param {function} callback the callback function + * @return Pet + */ + self.getPetById = function(petId, callback) { + + var postBody = null; + var postBinaryBody = null; + + // verify the required parameter 'petId' is set + if (petId == null) { + //throw new ApiException(400, "Missing the required parameter 'petId' when calling getPetById"); + var errorRequiredMsg = "Missing the required parameter 'petId' when calling getPetById"; + throw errorRequiredMsg; + } + + // create path and map variables + var basePath = 'http://petstore.swagger.io/v2'; + // if basePath ends with a /, remove it as path starts with a leading / + if (basePath.substring(basePath.length-1, basePath.length)=='/') { + basePath = basePath.substring(0, basePath.length-1); + } + + var path = basePath + replaceAll(replaceAll("/pet/{petId}", "\\{format\\}","json") +, "\\{" + "petId" + "\\}", apiClient.escapeString(petId.toString())); + + var queryParams = {}; + var headerParams = {}; + var formParams = {}; + + + + + + path += createQueryString(queryParams); + + //if (console) { + //console.log('path: ' + path); + //console.log('queryParams: ' + queryParams); + //} + + + + + + //TypeRef returnType = new TypeRef() {}; + //return apiClient.invokeAPI(path, "GET", queryParams, postBody, postBinaryBody, headerParams, formParams, accept, contentType, authNames, returnType); + + var options = {type: "GET", async: true, contentType: "application/json", dataType: "json", data: postBody}; + var request = $.ajax(path, options); + //request.fail(function(jqXHR, textStatus, errorThrown){ + // errorHandler(jqXHR, textStatus, errorThrown); + //}); + + + request.done(function(response, textStatus, jqXHR){ + /** + * @returns Pet + */ + + var myResponse = new Pet(); + myResponse.constructFromObject(response); + + callback(myResponse, textStatus, jqXHR); + }); + + + + + + } + + /** + * Updates a pet in the store with form data + * + * @param {String} petId ID of pet that needs to be updated + * @param {String} name Updated name of the pet + * @param {String} status Updated status of the pet + * @param {function} callback the callback function + * @return void + */ + self.updatePetWithForm = function(petId, name, status, callback) { + + var postBody = null; + var postBinaryBody = null; + + // verify the required parameter 'petId' is set + if (petId == null) { + //throw new ApiException(400, "Missing the required parameter 'petId' when calling updatePetWithForm"); + var errorRequiredMsg = "Missing the required parameter 'petId' when calling updatePetWithForm"; + throw errorRequiredMsg; + } + + // create path and map variables + var basePath = 'http://petstore.swagger.io/v2'; + // if basePath ends with a /, remove it as path starts with a leading / + if (basePath.substring(basePath.length-1, basePath.length)=='/') { + basePath = basePath.substring(0, basePath.length-1); + } + + var path = basePath + replaceAll(replaceAll("/pet/{petId}", "\\{format\\}","json") +, "\\{" + "petId" + "\\}", apiClient.escapeString(petId.toString())); + + var queryParams = {}; + var headerParams = {}; + var formParams = {}; + + + + if (name != null) + formParams.put("name", name); + if (status != null) + formParams.put("status", status); + + + path += createQueryString(queryParams); + + //if (console) { + //console.log('path: ' + path); + //console.log('queryParams: ' + queryParams); + //} + + + + + + apiClient.invokeAPI(path, "POST", queryParams, postBody, postBinaryBody, headerParams, formParams, accept, contentType, authNames, null); + + + + + } + + /** + * Deletes a pet + * + * @param {Long} petId Pet id to delete + * @param {String} apiKey + * @param {function} callback the callback function + * @return void + */ + self.deletePet = function(petId, apiKey, callback) { + + var postBody = null; + var postBinaryBody = null; + + // verify the required parameter 'petId' is set + if (petId == null) { + //throw new ApiException(400, "Missing the required parameter 'petId' when calling deletePet"); + var errorRequiredMsg = "Missing the required parameter 'petId' when calling deletePet"; + throw errorRequiredMsg; + } + + // create path and map variables + var basePath = 'http://petstore.swagger.io/v2'; + // if basePath ends with a /, remove it as path starts with a leading / + if (basePath.substring(basePath.length-1, basePath.length)=='/') { + basePath = basePath.substring(0, basePath.length-1); + } + + var path = basePath + replaceAll(replaceAll("/pet/{petId}", "\\{format\\}","json") +, "\\{" + "petId" + "\\}", apiClient.escapeString(petId.toString())); + + var queryParams = {}; + var headerParams = {}; + var formParams = {}; + + + if (apiKey != null) + headerParams.put("api_key", apiClient.parameterToString(apiKey)); + + + + path += createQueryString(queryParams); + + //if (console) { + //console.log('path: ' + path); + //console.log('queryParams: ' + queryParams); + //} + + + + + + apiClient.invokeAPI(path, "DELETE", queryParams, postBody, postBinaryBody, headerParams, formParams, accept, contentType, authNames, null); + + + + + } + + /** + * uploads an image + * + * @param {Long} petId ID of pet to update + * @param {String} additionalMetadata Additional data to pass to server + * @param {File} file file to upload + * @param {function} callback the callback function + * @return void + */ + self.uploadFile = function(petId, additionalMetadata, file, callback) { + + var postBody = null; + var postBinaryBody = null; + + // verify the required parameter 'petId' is set + if (petId == null) { + //throw new ApiException(400, "Missing the required parameter 'petId' when calling uploadFile"); + var errorRequiredMsg = "Missing the required parameter 'petId' when calling uploadFile"; + throw errorRequiredMsg; + } + + // create path and map variables + var basePath = 'http://petstore.swagger.io/v2'; + // if basePath ends with a /, remove it as path starts with a leading / + if (basePath.substring(basePath.length-1, basePath.length)=='/') { + basePath = basePath.substring(0, basePath.length-1); + } + + var path = basePath + replaceAll(replaceAll("/pet/{petId}/uploadImage", "\\{format\\}","json") +, "\\{" + "petId" + "\\}", apiClient.escapeString(petId.toString())); + + var queryParams = {}; + var headerParams = {}; + var formParams = {}; + + + + if (additionalMetadata != null) + formParams.put("additionalMetadata", additionalMetadata); + if (file != null) + formParams.put("file", file); + + + path += createQueryString(queryParams); + + //if (console) { + //console.log('path: ' + path); + //console.log('queryParams: ' + queryParams); + //} + + + + + + apiClient.invokeAPI(path, "POST", queryParams, postBody, postBinaryBody, headerParams, formParams, accept, contentType, authNames, null); + + + + + } + + + + function replaceAll (haystack, needle, replace) { + var result= haystack; + if (needle !=null && replace!=null) { + result= haystack.replace(new RegExp(needle, 'g'), replace); + } + return result; + } + + function createQueryString (queryParams) { + var queryString =''; + var i = 0; + for (var queryParamName in queryParams) { + if (i==0) { + queryString += '?' ; + } else { + queryString += '&' ; + } + + queryString += queryParamName + '=' + encodeURIComponent(queryParams[queryParamName]); + i++; + } + + return queryString; + } +} diff --git a/samples/client/petstore/javascript/src/scripts/rest/api/StoreApi.js b/samples/client/petstore/javascript/src/scripts/rest/api/StoreApi.js new file mode 100644 index 00000000000..086ce8b4ae9 --- /dev/null +++ b/samples/client/petstore/javascript/src/scripts/rest/api/StoreApi.js @@ -0,0 +1,304 @@ +/* + * @javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavascriptClientCodegen", date = "2015-12-07T10:51:19.835+08:00") + */ + +//export module +if ( typeof define === "function" && define.amd ) { + define(['jquery'], function($) { + return StoreApi; + }); +} + +var StoreApi = function StoreApi() { + var self = this; + + /** + * Returns pet inventories by status + * Returns a map of status codes to quantities + * @param {function} callback the callback function + * @return Map + */ + self.getInventory = function(, callback) { + + var postBody = null; + var postBinaryBody = null; + + // create path and map variables + var basePath = 'http://petstore.swagger.io/v2'; + // if basePath ends with a /, remove it as path starts with a leading / + if (basePath.substring(basePath.length-1, basePath.length)=='/') { + basePath = basePath.substring(0, basePath.length-1); + } + + var path = basePath + replaceAll(replaceAll("/store/inventory", "\\{format\\}","json")); + + var queryParams = {}; + var headerParams = {}; + var formParams = {}; + + + + + + path += createQueryString(queryParams); + + //if (console) { + //console.log('path: ' + path); + //console.log('queryParams: ' + queryParams); + //} + + + + + + //TypeRef returnType = new TypeRef>() {}; + //return apiClient.invokeAPI(path, "GET", queryParams, postBody, postBinaryBody, headerParams, formParams, accept, contentType, authNames, returnType); + + var options = {type: "GET", async: true, contentType: "application/json", dataType: "json", data: postBody}; + var request = $.ajax(path, options); + //request.fail(function(jqXHR, textStatus, errorThrown){ + // errorHandler(jqXHR, textStatus, errorThrown); + //}); + + + request.done(function(response, textStatus, jqXHR){ + /** + * @returns Map + */ + + var myResponse = new Map(); + myResponse.constructFromObject(response); + + callback(myResponse, textStatus, jqXHR); + }); + + + + + + } + + /** + * Place an order for a pet + * + * @param {Order} body order placed for purchasing the pet + * @param {function} callback the callback function + * @return Order + */ + self.placeOrder = function(body, callback) { + + var postBody = JSON.stringify(body); + var postBinaryBody = null; + + // create path and map variables + var basePath = 'http://petstore.swagger.io/v2'; + // if basePath ends with a /, remove it as path starts with a leading / + if (basePath.substring(basePath.length-1, basePath.length)=='/') { + basePath = basePath.substring(0, basePath.length-1); + } + + var path = basePath + replaceAll(replaceAll("/store/order", "\\{format\\}","json")); + + var queryParams = {}; + var headerParams = {}; + var formParams = {}; + + + + + + path += createQueryString(queryParams); + + //if (console) { + //console.log('path: ' + path); + //console.log('queryParams: ' + queryParams); + //} + + + + + + //TypeRef returnType = new TypeRef() {}; + //return apiClient.invokeAPI(path, "POST", queryParams, postBody, postBinaryBody, headerParams, formParams, accept, contentType, authNames, returnType); + + var options = {type: "POST", async: true, contentType: "application/json", dataType: "json", data: postBody}; + var request = $.ajax(path, options); + //request.fail(function(jqXHR, textStatus, errorThrown){ + // errorHandler(jqXHR, textStatus, errorThrown); + //}); + + + request.done(function(response, textStatus, jqXHR){ + /** + * @returns Order + */ + + var myResponse = new Order(); + myResponse.constructFromObject(response); + + callback(myResponse, textStatus, jqXHR); + }); + + + + + + } + + /** + * Find purchase order by ID + * For valid response try integer IDs with value <= 5 or > 10. Other values will generated exceptions + * @param {String} orderId ID of pet that needs to be fetched + * @param {function} callback the callback function + * @return Order + */ + self.getOrderById = function(orderId, callback) { + + var postBody = null; + var postBinaryBody = null; + + // verify the required parameter 'orderId' is set + if (orderId == null) { + //throw new ApiException(400, "Missing the required parameter 'orderId' when calling getOrderById"); + var errorRequiredMsg = "Missing the required parameter 'orderId' when calling getOrderById"; + throw errorRequiredMsg; + } + + // create path and map variables + var basePath = 'http://petstore.swagger.io/v2'; + // if basePath ends with a /, remove it as path starts with a leading / + if (basePath.substring(basePath.length-1, basePath.length)=='/') { + basePath = basePath.substring(0, basePath.length-1); + } + + var path = basePath + replaceAll(replaceAll("/store/order/{orderId}", "\\{format\\}","json") +, "\\{" + "orderId" + "\\}", apiClient.escapeString(orderId.toString())); + + var queryParams = {}; + var headerParams = {}; + var formParams = {}; + + + + + + path += createQueryString(queryParams); + + //if (console) { + //console.log('path: ' + path); + //console.log('queryParams: ' + queryParams); + //} + + + + + + //TypeRef returnType = new TypeRef() {}; + //return apiClient.invokeAPI(path, "GET", queryParams, postBody, postBinaryBody, headerParams, formParams, accept, contentType, authNames, returnType); + + var options = {type: "GET", async: true, contentType: "application/json", dataType: "json", data: postBody}; + var request = $.ajax(path, options); + //request.fail(function(jqXHR, textStatus, errorThrown){ + // errorHandler(jqXHR, textStatus, errorThrown); + //}); + + + request.done(function(response, textStatus, jqXHR){ + /** + * @returns Order + */ + + var myResponse = new Order(); + myResponse.constructFromObject(response); + + callback(myResponse, textStatus, jqXHR); + }); + + + + + + } + + /** + * Delete purchase order by ID + * For valid response try integer IDs with value < 1000. Anything above 1000 or nonintegers will generate API errors + * @param {String} orderId ID of the order that needs to be deleted + * @param {function} callback the callback function + * @return void + */ + self.deleteOrder = function(orderId, callback) { + + var postBody = null; + var postBinaryBody = null; + + // verify the required parameter 'orderId' is set + if (orderId == null) { + //throw new ApiException(400, "Missing the required parameter 'orderId' when calling deleteOrder"); + var errorRequiredMsg = "Missing the required parameter 'orderId' when calling deleteOrder"; + throw errorRequiredMsg; + } + + // create path and map variables + var basePath = 'http://petstore.swagger.io/v2'; + // if basePath ends with a /, remove it as path starts with a leading / + if (basePath.substring(basePath.length-1, basePath.length)=='/') { + basePath = basePath.substring(0, basePath.length-1); + } + + var path = basePath + replaceAll(replaceAll("/store/order/{orderId}", "\\{format\\}","json") +, "\\{" + "orderId" + "\\}", apiClient.escapeString(orderId.toString())); + + var queryParams = {}; + var headerParams = {}; + var formParams = {}; + + + + + + path += createQueryString(queryParams); + + //if (console) { + //console.log('path: ' + path); + //console.log('queryParams: ' + queryParams); + //} + + + + + + apiClient.invokeAPI(path, "DELETE", queryParams, postBody, postBinaryBody, headerParams, formParams, accept, contentType, authNames, null); + + + + + } + + + + function replaceAll (haystack, needle, replace) { + var result= haystack; + if (needle !=null && replace!=null) { + result= haystack.replace(new RegExp(needle, 'g'), replace); + } + return result; + } + + function createQueryString (queryParams) { + var queryString =''; + var i = 0; + for (var queryParamName in queryParams) { + if (i==0) { + queryString += '?' ; + } else { + queryString += '&' ; + } + + queryString += queryParamName + '=' + encodeURIComponent(queryParams[queryParamName]); + i++; + } + + return queryString; + } +} diff --git a/samples/client/petstore/javascript/src/scripts/rest/api/UserApi.js b/samples/client/petstore/javascript/src/scripts/rest/api/UserApi.js new file mode 100644 index 00000000000..53cecbdf8f7 --- /dev/null +++ b/samples/client/petstore/javascript/src/scripts/rest/api/UserApi.js @@ -0,0 +1,485 @@ +/* + * @javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavascriptClientCodegen", date = "2015-12-07T10:51:19.835+08:00") + */ + +//export module +if ( typeof define === "function" && define.amd ) { + define(['jquery'], function($) { + return UserApi; + }); +} + +var UserApi = function UserApi() { + var self = this; + + /** + * Create user + * This can only be done by the logged in user. + * @param {User} body Created user object + * @param {function} callback the callback function + * @return void + */ + self.createUser = function(body, callback) { + + var postBody = JSON.stringify(body); + var postBinaryBody = null; + + // create path and map variables + var basePath = 'http://petstore.swagger.io/v2'; + // if basePath ends with a /, remove it as path starts with a leading / + if (basePath.substring(basePath.length-1, basePath.length)=='/') { + basePath = basePath.substring(0, basePath.length-1); + } + + var path = basePath + replaceAll(replaceAll("/user", "\\{format\\}","json")); + + var queryParams = {}; + var headerParams = {}; + var formParams = {}; + + + + + + path += createQueryString(queryParams); + + //if (console) { + //console.log('path: ' + path); + //console.log('queryParams: ' + queryParams); + //} + + + + + + apiClient.invokeAPI(path, "POST", queryParams, postBody, postBinaryBody, headerParams, formParams, accept, contentType, authNames, null); + + + + + } + + /** + * Creates list of users with given input array + * + * @param {Array} body List of user object + * @param {function} callback the callback function + * @return void + */ + self.createUsersWithArrayInput = function(body, callback) { + + var postBody = JSON.stringify(body); + var postBinaryBody = null; + + // create path and map variables + var basePath = 'http://petstore.swagger.io/v2'; + // if basePath ends with a /, remove it as path starts with a leading / + if (basePath.substring(basePath.length-1, basePath.length)=='/') { + basePath = basePath.substring(0, basePath.length-1); + } + + var path = basePath + replaceAll(replaceAll("/user/createWithArray", "\\{format\\}","json")); + + var queryParams = {}; + var headerParams = {}; + var formParams = {}; + + + + + + path += createQueryString(queryParams); + + //if (console) { + //console.log('path: ' + path); + //console.log('queryParams: ' + queryParams); + //} + + + + + + apiClient.invokeAPI(path, "POST", queryParams, postBody, postBinaryBody, headerParams, formParams, accept, contentType, authNames, null); + + + + + } + + /** + * Creates list of users with given input array + * + * @param {Array} body List of user object + * @param {function} callback the callback function + * @return void + */ + self.createUsersWithListInput = function(body, callback) { + + var postBody = JSON.stringify(body); + var postBinaryBody = null; + + // create path and map variables + var basePath = 'http://petstore.swagger.io/v2'; + // if basePath ends with a /, remove it as path starts with a leading / + if (basePath.substring(basePath.length-1, basePath.length)=='/') { + basePath = basePath.substring(0, basePath.length-1); + } + + var path = basePath + replaceAll(replaceAll("/user/createWithList", "\\{format\\}","json")); + + var queryParams = {}; + var headerParams = {}; + var formParams = {}; + + + + + + path += createQueryString(queryParams); + + //if (console) { + //console.log('path: ' + path); + //console.log('queryParams: ' + queryParams); + //} + + + + + + apiClient.invokeAPI(path, "POST", queryParams, postBody, postBinaryBody, headerParams, formParams, accept, contentType, authNames, null); + + + + + } + + /** + * Logs user into the system + * + * @param {String} username The user name for login + * @param {String} password The password for login in clear text + * @param {function} callback the callback function + * @return String + */ + self.loginUser = function(username, password, callback) { + + var postBody = null; + var postBinaryBody = null; + + // create path and map variables + var basePath = 'http://petstore.swagger.io/v2'; + // if basePath ends with a /, remove it as path starts with a leading / + if (basePath.substring(basePath.length-1, basePath.length)=='/') { + basePath = basePath.substring(0, basePath.length-1); + } + + var path = basePath + replaceAll(replaceAll("/user/login", "\\{format\\}","json")); + + var queryParams = {}; + var headerParams = {}; + var formParams = {}; + + + queryParams.username = username; + + queryParams.password = password; + + + + + path += createQueryString(queryParams); + + //if (console) { + //console.log('path: ' + path); + //console.log('queryParams: ' + queryParams); + //} + + + + + + //TypeRef returnType = new TypeRef() {}; + //return apiClient.invokeAPI(path, "GET", queryParams, postBody, postBinaryBody, headerParams, formParams, accept, contentType, authNames, returnType); + + var options = {type: "GET", async: true, contentType: "application/json", dataType: "json", data: postBody}; + var request = $.ajax(path, options); + //request.fail(function(jqXHR, textStatus, errorThrown){ + // errorHandler(jqXHR, textStatus, errorThrown); + //}); + + + request.done(function(response, textStatus, jqXHR){ + /** + * @returns String + */ + var myResponse = response; + + + callback(myResponse, textStatus, jqXHR); + }); + + + + + + } + + /** + * Logs out current logged in user session + * + * @param {function} callback the callback function + * @return void + */ + self.logoutUser = function(, callback) { + + var postBody = null; + var postBinaryBody = null; + + // create path and map variables + var basePath = 'http://petstore.swagger.io/v2'; + // if basePath ends with a /, remove it as path starts with a leading / + if (basePath.substring(basePath.length-1, basePath.length)=='/') { + basePath = basePath.substring(0, basePath.length-1); + } + + var path = basePath + replaceAll(replaceAll("/user/logout", "\\{format\\}","json")); + + var queryParams = {}; + var headerParams = {}; + var formParams = {}; + + + + + + path += createQueryString(queryParams); + + //if (console) { + //console.log('path: ' + path); + //console.log('queryParams: ' + queryParams); + //} + + + + + + apiClient.invokeAPI(path, "GET", queryParams, postBody, postBinaryBody, headerParams, formParams, accept, contentType, authNames, null); + + + + + } + + /** + * Get user by user name + * + * @param {String} username The name that needs to be fetched. Use user1 for testing. + * @param {function} callback the callback function + * @return User + */ + self.getUserByName = function(username, callback) { + + var postBody = null; + var postBinaryBody = null; + + // verify the required parameter 'username' is set + if (username == null) { + //throw new ApiException(400, "Missing the required parameter 'username' when calling getUserByName"); + var errorRequiredMsg = "Missing the required parameter 'username' when calling getUserByName"; + throw errorRequiredMsg; + } + + // create path and map variables + var basePath = 'http://petstore.swagger.io/v2'; + // if basePath ends with a /, remove it as path starts with a leading / + if (basePath.substring(basePath.length-1, basePath.length)=='/') { + basePath = basePath.substring(0, basePath.length-1); + } + + var path = basePath + replaceAll(replaceAll("/user/{username}", "\\{format\\}","json") +, "\\{" + "username" + "\\}", apiClient.escapeString(username.toString())); + + var queryParams = {}; + var headerParams = {}; + var formParams = {}; + + + + + + path += createQueryString(queryParams); + + //if (console) { + //console.log('path: ' + path); + //console.log('queryParams: ' + queryParams); + //} + + + + + + //TypeRef returnType = new TypeRef() {}; + //return apiClient.invokeAPI(path, "GET", queryParams, postBody, postBinaryBody, headerParams, formParams, accept, contentType, authNames, returnType); + + var options = {type: "GET", async: true, contentType: "application/json", dataType: "json", data: postBody}; + var request = $.ajax(path, options); + //request.fail(function(jqXHR, textStatus, errorThrown){ + // errorHandler(jqXHR, textStatus, errorThrown); + //}); + + + request.done(function(response, textStatus, jqXHR){ + /** + * @returns User + */ + + var myResponse = new User(); + myResponse.constructFromObject(response); + + callback(myResponse, textStatus, jqXHR); + }); + + + + + + } + + /** + * Updated user + * This can only be done by the logged in user. + * @param {String} username name that need to be deleted + * @param {User} body Updated user object + * @param {function} callback the callback function + * @return void + */ + self.updateUser = function(username, body, callback) { + + var postBody = JSON.stringify(body); + var postBinaryBody = null; + + // verify the required parameter 'username' is set + if (username == null) { + //throw new ApiException(400, "Missing the required parameter 'username' when calling updateUser"); + var errorRequiredMsg = "Missing the required parameter 'username' when calling updateUser"; + throw errorRequiredMsg; + } + + // create path and map variables + var basePath = 'http://petstore.swagger.io/v2'; + // if basePath ends with a /, remove it as path starts with a leading / + if (basePath.substring(basePath.length-1, basePath.length)=='/') { + basePath = basePath.substring(0, basePath.length-1); + } + + var path = basePath + replaceAll(replaceAll("/user/{username}", "\\{format\\}","json") +, "\\{" + "username" + "\\}", apiClient.escapeString(username.toString())); + + var queryParams = {}; + var headerParams = {}; + var formParams = {}; + + + + + + path += createQueryString(queryParams); + + //if (console) { + //console.log('path: ' + path); + //console.log('queryParams: ' + queryParams); + //} + + + + + + apiClient.invokeAPI(path, "PUT", queryParams, postBody, postBinaryBody, headerParams, formParams, accept, contentType, authNames, null); + + + + + } + + /** + * Delete user + * This can only be done by the logged in user. + * @param {String} username The name that needs to be deleted + * @param {function} callback the callback function + * @return void + */ + self.deleteUser = function(username, callback) { + + var postBody = null; + var postBinaryBody = null; + + // verify the required parameter 'username' is set + if (username == null) { + //throw new ApiException(400, "Missing the required parameter 'username' when calling deleteUser"); + var errorRequiredMsg = "Missing the required parameter 'username' when calling deleteUser"; + throw errorRequiredMsg; + } + + // create path and map variables + var basePath = 'http://petstore.swagger.io/v2'; + // if basePath ends with a /, remove it as path starts with a leading / + if (basePath.substring(basePath.length-1, basePath.length)=='/') { + basePath = basePath.substring(0, basePath.length-1); + } + + var path = basePath + replaceAll(replaceAll("/user/{username}", "\\{format\\}","json") +, "\\{" + "username" + "\\}", apiClient.escapeString(username.toString())); + + var queryParams = {}; + var headerParams = {}; + var formParams = {}; + + + + + + path += createQueryString(queryParams); + + //if (console) { + //console.log('path: ' + path); + //console.log('queryParams: ' + queryParams); + //} + + + + + + apiClient.invokeAPI(path, "DELETE", queryParams, postBody, postBinaryBody, headerParams, formParams, accept, contentType, authNames, null); + + + + + } + + + + function replaceAll (haystack, needle, replace) { + var result= haystack; + if (needle !=null && replace!=null) { + result= haystack.replace(new RegExp(needle, 'g'), replace); + } + return result; + } + + function createQueryString (queryParams) { + var queryString =''; + var i = 0; + for (var queryParamName in queryParams) { + if (i==0) { + queryString += '?' ; + } else { + queryString += '&' ; + } + + queryString += queryParamName + '=' + encodeURIComponent(queryParams[queryParamName]); + i++; + } + + return queryString; + } +} diff --git a/samples/client/petstore/javascript/src/scripts/rest/model/Category.js b/samples/client/petstore/javascript/src/scripts/rest/model/Category.js new file mode 100644 index 00000000000..aec80bf3635 --- /dev/null +++ b/samples/client/petstore/javascript/src/scripts/rest/model/Category.js @@ -0,0 +1,68 @@ + + + +//export module +if ( typeof define === "function" && define.amd ) { + define('Category', ['jquery'], + function($) { + return Category; + }); +} + + +var Category = function Category() { + var self = this; + + /** + * datatype: Long + **/ + self.id = null; + + /** + * datatype: String + **/ + self.name = null; + + + self.constructFromObject = function(data) { + + self.id = data.id; + + self.name = data.name; + + } + + + /** + * @return {Long} + **/ + self.getId = function() { + return self.id; + } + + /** + * @param {Long} id + **/ + self.setId = function (id) { + self.id = id; + } + + /** + * @return {String} + **/ + self.getName = function() { + return self.name; + } + + /** + * @param {String} name + **/ + self.setName = function (name) { + self.name = name; + } + + + self.toJson = function () { + return JSON.stringify(self); + } +} diff --git a/samples/client/petstore/javascript/src/scripts/rest/model/Order.js b/samples/client/petstore/javascript/src/scripts/rest/model/Order.js new file mode 100644 index 00000000000..73618cef888 --- /dev/null +++ b/samples/client/petstore/javascript/src/scripts/rest/model/Order.js @@ -0,0 +1,183 @@ + + +//export module +if ( typeof define === "function" && define.amd ) { + define('StatusEnum', ['jquery'], function($) { + return StatusEnum; + }); +} + +var StatusEnum = function StatusEnum() { + var self = this; + + + /** + * @const + */ + self.PLACED = "placed", + + /** + * @const + */ + self.APPROVED = "approved", + + /** + * @const + */ + self.DELIVERED = "delivered"; + +} + + +//export module +if ( typeof define === "function" && define.amd ) { + define('Order', ['jquery', 'Date'], + function($, Date) { + return Order; + }); +} + + +var Order = function Order() { + var self = this; + + /** + * datatype: Long + **/ + self.id = null; + + /** + * datatype: Long + **/ + self.petId = null; + + /** + * datatype: Integer + **/ + self.quantity = null; + + /** + * datatype: Date + **/ + self.shipDate = null; + + /** + * Order Status + * datatype: StatusEnum + **/ + self.status = null; + + /** + * datatype: Boolean + **/ + self.complete = null; + + + self.constructFromObject = function(data) { + + self.id = data.id; + + self.petId = data.petId; + + self.quantity = data.quantity; + + self.shipDate = data.shipDate; + + self.status = data.status; + + self.complete = data.complete; + + } + + + /** + * @return {Long} + **/ + self.getId = function() { + return self.id; + } + + /** + * @param {Long} id + **/ + self.setId = function (id) { + self.id = id; + } + + /** + * @return {Long} + **/ + self.getPetId = function() { + return self.petId; + } + + /** + * @param {Long} petId + **/ + self.setPetId = function (petId) { + self.petId = petId; + } + + /** + * @return {Integer} + **/ + self.getQuantity = function() { + return self.quantity; + } + + /** + * @param {Integer} quantity + **/ + self.setQuantity = function (quantity) { + self.quantity = quantity; + } + + /** + * @return {Date} + **/ + self.getShipDate = function() { + return self.shipDate; + } + + /** + * @param {Date} shipDate + **/ + self.setShipDate = function (shipDate) { + self.shipDate = shipDate; + } + + /** + * get Order Status + * @return {StatusEnum} + **/ + self.getStatus = function() { + return self.status; + } + + /** + * set Order Status + * @param {StatusEnum} status + **/ + self.setStatus = function (status) { + self.status = status; + } + + /** + * @return {Boolean} + **/ + self.getComplete = function() { + return self.complete; + } + + /** + * @param {Boolean} complete + **/ + self.setComplete = function (complete) { + self.complete = complete; + } + + + self.toJson = function () { + return JSON.stringify(self); + } +} diff --git a/samples/client/petstore/javascript/src/scripts/rest/model/Pet.js b/samples/client/petstore/javascript/src/scripts/rest/model/Pet.js new file mode 100644 index 00000000000..e3f3a747c84 --- /dev/null +++ b/samples/client/petstore/javascript/src/scripts/rest/model/Pet.js @@ -0,0 +1,185 @@ + + +//export module +if ( typeof define === "function" && define.amd ) { + define('StatusEnum', ['jquery'], function($) { + return StatusEnum; + }); +} + +var StatusEnum = function StatusEnum() { + var self = this; + + + /** + * @const + */ + self.AVAILABLE = "available", + + /** + * @const + */ + self.PENDING = "pending", + + /** + * @const + */ + self.SOLD = "sold"; + +} + + +//export module +if ( typeof define === "function" && define.amd ) { + define('Pet', ['jquery', 'Category', 'Array'], + function($, Category, Array) { + return Pet; + }); +} + + +var Pet = function Pet(name, photoUrls) { + var self = this; + + /** + * datatype: Long + **/ + self.id = null; + + /** + * datatype: Category + **/ + self.category = new Category(); + + /** + * datatype: String + * required + **/ + self.name = name; + + /** + * datatype: Array + * required + **/ + self.photoUrls = photoUrls; + + /** + * datatype: Array + **/ + self.tags = new Array(); + + /** + * pet status in the store + * datatype: StatusEnum + **/ + self.status = null; + + + self.constructFromObject = function(data) { + + self.id = data.id; + + self.category.constructFromObject(data.category); + + self.name = data.name; + + self.photoUrls = new Array(); + + self.tags = new Array(); + + self.status = data.status; + + } + + + /** + * @return {Long} + **/ + self.getId = function() { + return self.id; + } + + /** + * @param {Long} id + **/ + self.setId = function (id) { + self.id = id; + } + + /** + * @return {Category} + **/ + self.getCategory = function() { + return self.category; + } + + /** + * @param {Category} category + **/ + self.setCategory = function (category) { + self.category = category; + } + + /** + * @return {String} + **/ + self.getName = function() { + return self.name; + } + + /** + * @param {String} name + **/ + self.setName = function (name) { + self.name = name; + } + + /** + * @return {Array} + **/ + self.getPhotoUrls = function() { + return self.photoUrls; + } + + /** + * @param {Array} photoUrls + **/ + self.setPhotoUrls = function (photoUrls) { + self.photoUrls = photoUrls; + } + + /** + * @return {Array} + **/ + self.getTags = function() { + return self.tags; + } + + /** + * @param {Array} tags + **/ + self.setTags = function (tags) { + self.tags = tags; + } + + /** + * get pet status in the store + * @return {StatusEnum} + **/ + self.getStatus = function() { + return self.status; + } + + /** + * set pet status in the store + * @param {StatusEnum} status + **/ + self.setStatus = function (status) { + self.status = status; + } + + + self.toJson = function () { + return JSON.stringify(self); + } +} diff --git a/samples/client/petstore/javascript/src/scripts/rest/model/Tag.js b/samples/client/petstore/javascript/src/scripts/rest/model/Tag.js new file mode 100644 index 00000000000..07994ec3dc9 --- /dev/null +++ b/samples/client/petstore/javascript/src/scripts/rest/model/Tag.js @@ -0,0 +1,68 @@ + + + +//export module +if ( typeof define === "function" && define.amd ) { + define('Tag', ['jquery'], + function($) { + return Tag; + }); +} + + +var Tag = function Tag() { + var self = this; + + /** + * datatype: Long + **/ + self.id = null; + + /** + * datatype: String + **/ + self.name = null; + + + self.constructFromObject = function(data) { + + self.id = data.id; + + self.name = data.name; + + } + + + /** + * @return {Long} + **/ + self.getId = function() { + return self.id; + } + + /** + * @param {Long} id + **/ + self.setId = function (id) { + self.id = id; + } + + /** + * @return {String} + **/ + self.getName = function() { + return self.name; + } + + /** + * @param {String} name + **/ + self.setName = function (name) { + self.name = name; + } + + + self.toJson = function () { + return JSON.stringify(self); + } +} diff --git a/samples/client/petstore/javascript/src/scripts/rest/model/User.js b/samples/client/petstore/javascript/src/scripts/rest/model/User.js new file mode 100644 index 00000000000..19afab44ee6 --- /dev/null +++ b/samples/client/petstore/javascript/src/scripts/rest/model/User.js @@ -0,0 +1,197 @@ + + + +//export module +if ( typeof define === "function" && define.amd ) { + define('User', ['jquery'], + function($) { + return User; + }); +} + + +var User = function User() { + var self = this; + + /** + * datatype: Long + **/ + self.id = null; + + /** + * datatype: String + **/ + self.username = null; + + /** + * datatype: String + **/ + self.firstName = null; + + /** + * datatype: String + **/ + self.lastName = null; + + /** + * datatype: String + **/ + self.email = null; + + /** + * datatype: String + **/ + self.password = null; + + /** + * datatype: String + **/ + self.phone = null; + + /** + * User Status + * datatype: Integer + **/ + self.userStatus = null; + + + self.constructFromObject = function(data) { + + self.id = data.id; + + self.username = data.username; + + self.firstName = data.firstName; + + self.lastName = data.lastName; + + self.email = data.email; + + self.password = data.password; + + self.phone = data.phone; + + self.userStatus = data.userStatus; + + } + + + /** + * @return {Long} + **/ + self.getId = function() { + return self.id; + } + + /** + * @param {Long} id + **/ + self.setId = function (id) { + self.id = id; + } + + /** + * @return {String} + **/ + self.getUsername = function() { + return self.username; + } + + /** + * @param {String} username + **/ + self.setUsername = function (username) { + self.username = username; + } + + /** + * @return {String} + **/ + self.getFirstName = function() { + return self.firstName; + } + + /** + * @param {String} firstName + **/ + self.setFirstName = function (firstName) { + self.firstName = firstName; + } + + /** + * @return {String} + **/ + self.getLastName = function() { + return self.lastName; + } + + /** + * @param {String} lastName + **/ + self.setLastName = function (lastName) { + self.lastName = lastName; + } + + /** + * @return {String} + **/ + self.getEmail = function() { + return self.email; + } + + /** + * @param {String} email + **/ + self.setEmail = function (email) { + self.email = email; + } + + /** + * @return {String} + **/ + self.getPassword = function() { + return self.password; + } + + /** + * @param {String} password + **/ + self.setPassword = function (password) { + self.password = password; + } + + /** + * @return {String} + **/ + self.getPhone = function() { + return self.phone; + } + + /** + * @param {String} phone + **/ + self.setPhone = function (phone) { + self.phone = phone; + } + + /** + * get User Status + * @return {Integer} + **/ + self.getUserStatus = function() { + return self.userStatus; + } + + /** + * set User Status + * @param {Integer} userStatus + **/ + self.setUserStatus = function (userStatus) { + self.userStatus = userStatus; + } + + + self.toJson = function () { + return JSON.stringify(self); + } +} From b1bc75189aa37dc95b93f26f827be725a18246c0 Mon Sep 17 00:00:00 2001 From: xhh Date: Sat, 5 Dec 2015 20:34:50 +0800 Subject: [PATCH 137/211] Add WithHttpInfo API methods to Java okhttp-gson client to allow accessing response status code and headers and removed the methods of recording last response info from ApiClient. --- .../codegen/languages/JavaClientCodegen.java | 1 + .../libraries/okhttp-gson/ApiClient.mustache | 34 +---- .../okhttp-gson/ApiResponse.mustache | 32 +++++ .../Java/libraries/okhttp-gson/api.mustache | 14 +- .../java/io/swagger/client/ApiClient.java | 36 ++--- .../java/io/swagger/client/ApiResponse.java | 32 +++++ .../java/io/swagger/client/api/PetApi.java | 133 +++++++++++++++--- .../java/io/swagger/client/api/StoreApi.java | 59 ++++++-- .../java/io/swagger/client/api/UserApi.java | 130 ++++++++++++++--- .../io/swagger/petstore/test/PetApiTest.java | 21 ++- 10 files changed, 378 insertions(+), 114 deletions(-) create mode 100644 modules/swagger-codegen/src/main/resources/Java/libraries/okhttp-gson/ApiResponse.mustache create mode 100644 samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/ApiResponse.java 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 0aba8c2c9d1..67a746d4afb 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 @@ -232,6 +232,7 @@ public class JavaClientCodegen extends DefaultCodegen implements CodegenConfig { if ("okhttp-gson".equals(getLibrary())) { // the "okhttp-gson" library template requires "ApiCallback.mustache" for async call supportingFiles.add(new SupportingFile("ApiCallback.mustache", invokerFolder, "ApiCallback.java")); + supportingFiles.add(new SupportingFile("ApiResponse.mustache", invokerFolder, "ApiResponse.java")); supportingFiles.add(new SupportingFile("ProgressRequestBody.mustache", invokerFolder, "ProgressRequestBody.java")); supportingFiles.add(new SupportingFile("ProgressResponseBody.mustache", invokerFolder, "ProgressResponseBody.java")); // "build.sbt" is for development with SBT 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 cef9a843347..7b21d760f56 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 @@ -104,9 +104,6 @@ public class ApiClient { private Map authentications; - private int statusCode; - private Map> responseHeaders; - private DateFormat dateFormat; private DateFormat datetimeFormat; private boolean lenientDatetimeFormat; @@ -177,24 +174,6 @@ public class ApiClient { return this; } - /** - * Gets the status code of the previous request. - * NOTE: Status code of last async response is not recorded here, it is - * passed to the callback methods instead. - */ - public int getStatusCode() { - return statusCode; - } - - /** - * Gets the response headers of the previous request. - * NOTE: Headers of last async response is not recorded here, it is passed - * to callback methods instead. - */ - public Map> getResponseHeaders() { - return responseHeaders; - } - public boolean isVerifyingSsl() { return verifyingSsl; } @@ -731,7 +710,7 @@ public class ApiClient { /** * @see #execute(Call, Type) */ - public T execute(Call call) throws ApiException { + public ApiResponse execute(Call call) throws ApiException { return execute(call, null); } @@ -740,14 +719,15 @@ public class ApiClient { * * @param returnType The return type used to deserialize HTTP response body * @param The return type corresponding to (same with) returnType - * @return The Java object deserialized from response body. Returns null if returnType is null. + * @return ApiResponse object containing response status, headers and + * data, which is a Java object deserialized from response body and would be null + * when returnType is null. */ - public T execute(Call call, Type returnType) throws ApiException { + public ApiResponse execute(Call call, Type returnType) throws ApiException { try { Response response = call.execute(); - this.statusCode = response.code(); - this.responseHeaders = response.headers().toMultimap(); - return handleResponse(response, returnType); + T data = handleResponse(response, returnType); + return new ApiResponse(response.code(), response.headers().toMultimap(), data); } catch (IOException e) { throw new ApiException(e); } diff --git a/modules/swagger-codegen/src/main/resources/Java/libraries/okhttp-gson/ApiResponse.mustache b/modules/swagger-codegen/src/main/resources/Java/libraries/okhttp-gson/ApiResponse.mustache new file mode 100644 index 00000000000..945de39da70 --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/Java/libraries/okhttp-gson/ApiResponse.mustache @@ -0,0 +1,32 @@ +package {{invokerPackage}}; + +import java.util.List; +import java.util.Map; + +public class ApiResponse { + final private int statusCode; + final private Map> headers; + final private T data; + + public ApiResponse(int statusCode, Map> headers) { + this(statusCode, headers, null); + } + + public ApiResponse(int statusCode, Map> headers, T data) { + this.statusCode = statusCode; + this.headers = headers; + this.data = data; + } + + public int getStatusCode() { + return statusCode; + } + + public Map> getHeaders() { + return headers; + } + + public T getData() { + return data; + } +} diff --git a/modules/swagger-codegen/src/main/resources/Java/libraries/okhttp-gson/api.mustache b/modules/swagger-codegen/src/main/resources/Java/libraries/okhttp-gson/api.mustache index a1a4c9f8fb4..da145d08df2 100644 --- a/modules/swagger-codegen/src/main/resources/Java/libraries/okhttp-gson/api.mustache +++ b/modules/swagger-codegen/src/main/resources/Java/libraries/okhttp-gson/api.mustache @@ -3,6 +3,7 @@ package {{package}}; import {{invokerPackage}}.ApiCallback; import {{invokerPackage}}.ApiClient; import {{invokerPackage}}.ApiException; +import {{invokerPackage}}.ApiResponse; import {{invokerPackage}}.Configuration; import {{invokerPackage}}.Pair; import {{invokerPackage}}.ProgressRequestBody; @@ -106,9 +107,20 @@ public class {{classname}} { * @return {{{returnType}}}{{/returnType}} */ public {{#returnType}}{{{returnType}}} {{/returnType}}{{^returnType}}void {{/returnType}}{{operationId}}({{#allParams}}{{{dataType}}} {{paramName}}{{#hasMore}}, {{/hasMore}}{{/allParams}}) throws ApiException { + {{#returnType}}ApiResponse<{{{returnType}}}> {{localVariablePrefix}}resp = {{/returnType}}{{operationId}}WithHttpInfo({{#allParams}}{{paramName}}{{#hasMore}}, {{/hasMore}}{{/allParams}});{{#returnType}} + return {{localVariablePrefix}}resp.getData();{{/returnType}} + } + + /** + * {{summary}} + * {{notes}}{{#allParams}} + * @param {{paramName}} {{description}}{{/allParams}} + * @return ApiResponse<{{#returnType}}{{{returnType}}}{{/returnType}}{{^returnType}}Void{{/returnType}}> + */ + public ApiResponse<{{#returnType}}{{{returnType}}}{{/returnType}}{{^returnType}}Void{{/returnType}}> {{operationId}}WithHttpInfo({{#allParams}}{{{dataType}}} {{paramName}}{{#hasMore}}, {{/hasMore}}{{/allParams}}) throws ApiException { Call {{localVariablePrefix}}call = {{operationId}}Call({{#allParams}}{{paramName}}, {{/allParams}}null, null); {{#returnType}}Type {{localVariablePrefix}}returnType = new TypeToken<{{{returnType}}}>(){}.getType(); - return {{localVariablePrefix}}apiClient.execute({{localVariablePrefix}}call, {{localVariablePrefix}}returnType);{{/returnType}}{{^returnType}}{{localVariablePrefix}}apiClient.execute({{localVariablePrefix}}call);{{/returnType}} + return {{localVariablePrefix}}apiClient.execute({{localVariablePrefix}}call, {{localVariablePrefix}}returnType);{{/returnType}}{{^returnType}}return {{localVariablePrefix}}apiClient.execute({{localVariablePrefix}}call);{{/returnType}} } /** 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 8d38c18e907..8a75219bb53 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 @@ -104,9 +104,6 @@ public class ApiClient { private Map authentications; - private int statusCode; - private Map> responseHeaders; - private DateFormat dateFormat; private DateFormat datetimeFormat; private boolean lenientDatetimeFormat; @@ -143,8 +140,8 @@ public class ApiClient { // Setup authentications (key: authentication name, value: authentication). authentications = new HashMap(); - authentications.put("api_key", new ApiKeyAuth("header", "api_key")); authentications.put("petstore_auth", new OAuth()); + authentications.put("api_key", new ApiKeyAuth("header", "api_key")); // Prevent the authentications from being modified. authentications = Collections.unmodifiableMap(authentications); } @@ -176,24 +173,6 @@ public class ApiClient { return this; } - /** - * Gets the status code of the previous request. - * NOTE: Status code of last async response is not recorded here, it is - * passed to the callback methods instead. - */ - public int getStatusCode() { - return statusCode; - } - - /** - * Gets the response headers of the previous request. - * NOTE: Headers of last async response is not recorded here, it is passed - * to callback methods instead. - */ - public Map> getResponseHeaders() { - return responseHeaders; - } - public boolean isVerifyingSsl() { return verifyingSsl; } @@ -730,7 +709,7 @@ public class ApiClient { /** * @see #execute(Call, Type) */ - public T execute(Call call) throws ApiException { + public ApiResponse execute(Call call) throws ApiException { return execute(call, null); } @@ -739,14 +718,15 @@ public class ApiClient { * * @param returnType The return type used to deserialize HTTP response body * @param The return type corresponding to (same with) returnType - * @return The Java object deserialized from response body. Returns null if returnType is null. + * @return ApiResponse object containing response status, headers and + * data, which is a Java object deserialized from response body and would be null + * when returnType is null. */ - public T execute(Call call, Type returnType) throws ApiException { + public ApiResponse execute(Call call, Type returnType) throws ApiException { try { Response response = call.execute(); - this.statusCode = response.code(); - this.responseHeaders = response.headers().toMultimap(); - return handleResponse(response, returnType); + T data = handleResponse(response, returnType); + return new ApiResponse(response.code(), response.headers().toMultimap(), data); } catch (IOException e) { throw new ApiException(e); } diff --git a/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/ApiResponse.java b/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/ApiResponse.java new file mode 100644 index 00000000000..fbe22e077b8 --- /dev/null +++ b/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/ApiResponse.java @@ -0,0 +1,32 @@ +package io.swagger.client; + +import java.util.List; +import java.util.Map; + +public class ApiResponse { + final private int statusCode; + final private Map> headers; + final private T data; + + public ApiResponse(int statusCode, Map> headers) { + this(statusCode, headers, null); + } + + public ApiResponse(int statusCode, Map> headers, T data) { + this.statusCode = statusCode; + this.headers = headers; + this.data = data; + } + + public int getStatusCode() { + return statusCode; + } + + public Map> getHeaders() { + return headers; + } + + public T getData() { + return data; + } +} diff --git a/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/api/PetApi.java b/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/api/PetApi.java index cce05b29a3a..e880e3f9fbf 100644 --- a/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/api/PetApi.java +++ b/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/api/PetApi.java @@ -3,6 +3,7 @@ package io.swagger.client.api; import io.swagger.client.ApiCallback; import io.swagger.client.ApiClient; import io.swagger.client.ApiException; +import io.swagger.client.ApiResponse; import io.swagger.client.Configuration; import io.swagger.client.Pair; import io.swagger.client.ProgressRequestBody; @@ -90,8 +91,18 @@ public class PetApi { * @param body Pet object that needs to be added to the store */ public void updatePet(Pet body) throws ApiException { + updatePetWithHttpInfo(body); + } + + /** + * Update an existing pet + * + * @param body Pet object that needs to be added to the store + * @return ApiResponse + */ + public ApiResponse updatePetWithHttpInfo(Pet body) throws ApiException { Call call = updatePetCall(body, null, null); - apiClient.execute(call); + return apiClient.execute(call); } /** @@ -106,7 +117,7 @@ public class PetApi { ProgressResponseBody.ProgressListener progressListener = null; ProgressRequestBody.ProgressRequestListener progressRequestListener = null; - if(callback != null) { + if (callback != null) { progressListener = new ProgressResponseBody.ProgressListener() { @Override public void update(long bytesRead, long contentLength, boolean done) { @@ -175,8 +186,18 @@ public class PetApi { * @param body Pet object that needs to be added to the store */ public void addPet(Pet body) throws ApiException { + addPetWithHttpInfo(body); + } + + /** + * Add a new pet to the store + * + * @param body Pet object that needs to be added to the store + * @return ApiResponse + */ + public ApiResponse addPetWithHttpInfo(Pet body) throws ApiException { Call call = addPetCall(body, null, null); - apiClient.execute(call); + return apiClient.execute(call); } /** @@ -191,7 +212,7 @@ public class PetApi { ProgressResponseBody.ProgressListener progressListener = null; ProgressRequestBody.ProgressRequestListener progressRequestListener = null; - if(callback != null) { + if (callback != null) { progressListener = new ProgressResponseBody.ProgressListener() { @Override public void update(long bytesRead, long contentLength, boolean done) { @@ -263,6 +284,17 @@ public class PetApi { * @return List */ public List findPetsByStatus(List status) throws ApiException { + ApiResponse> resp = findPetsByStatusWithHttpInfo(status); + return resp.getData(); + } + + /** + * Finds Pets by status + * Multiple status values can be provided with comma seperated strings + * @param status Status values that need to be considered for filter + * @return ApiResponse> + */ + public ApiResponse> findPetsByStatusWithHttpInfo(List status) throws ApiException { Call call = findPetsByStatusCall(status, null, null); Type returnType = new TypeToken>(){}.getType(); return apiClient.execute(call, returnType); @@ -280,7 +312,7 @@ public class PetApi { ProgressResponseBody.ProgressListener progressListener = null; ProgressRequestBody.ProgressRequestListener progressRequestListener = null; - if(callback != null) { + if (callback != null) { progressListener = new ProgressResponseBody.ProgressListener() { @Override public void update(long bytesRead, long contentLength, boolean done) { @@ -353,6 +385,17 @@ public class PetApi { * @return List */ public List findPetsByTags(List tags) throws ApiException { + ApiResponse> resp = findPetsByTagsWithHttpInfo(tags); + return resp.getData(); + } + + /** + * Finds Pets by tags + * Muliple tags can be provided with comma seperated strings. Use tag1, tag2, tag3 for testing. + * @param tags Tags to filter by + * @return ApiResponse> + */ + public ApiResponse> findPetsByTagsWithHttpInfo(List tags) throws ApiException { Call call = findPetsByTagsCall(tags, null, null); Type returnType = new TypeToken>(){}.getType(); return apiClient.execute(call, returnType); @@ -370,7 +413,7 @@ public class PetApi { ProgressResponseBody.ProgressListener progressListener = null; ProgressRequestBody.ProgressRequestListener progressRequestListener = null; - if(callback != null) { + if (callback != null) { progressListener = new ProgressResponseBody.ProgressListener() { @Override public void update(long bytesRead, long contentLength, boolean done) { @@ -447,6 +490,17 @@ public class PetApi { * @return Pet */ public Pet getPetById(Long petId) throws ApiException { + ApiResponse resp = getPetByIdWithHttpInfo(petId); + return resp.getData(); + } + + /** + * Find pet by ID + * Returns a pet when ID < 10. ID > 10 or nonintegers will simulate API error conditions + * @param petId ID of pet that needs to be fetched + * @return ApiResponse + */ + public ApiResponse getPetByIdWithHttpInfo(Long petId) throws ApiException { Call call = getPetByIdCall(petId, null, null); Type returnType = new TypeToken(){}.getType(); return apiClient.execute(call, returnType); @@ -464,7 +518,7 @@ public class PetApi { ProgressResponseBody.ProgressListener progressListener = null; ProgressRequestBody.ProgressRequestListener progressRequestListener = null; - if(callback != null) { + if (callback != null) { progressListener = new ProgressResponseBody.ProgressListener() { @Override public void update(long bytesRead, long contentLength, boolean done) { @@ -487,7 +541,7 @@ public class PetApi { } /* Build call for updatePetWithForm */ - private Call updatePetWithFormCall(String petId,String name,String status, final ProgressResponseBody.ProgressListener progressListener, final ProgressRequestBody.ProgressRequestListener progressRequestListener) throws ApiException { + private Call updatePetWithFormCall(String petId, String name, String status, final ProgressResponseBody.ProgressListener progressListener, final ProgressRequestBody.ProgressRequestListener progressRequestListener) throws ApiException { Object postBody = null; // verify the required parameter 'petId' is set @@ -546,8 +600,20 @@ public class PetApi { * @param status Updated status of the pet */ public void updatePetWithForm(String petId, String name, String status) throws ApiException { - Call call = updatePetWithFormCall(petId,name,status, null, null); - apiClient.execute(call); + updatePetWithFormWithHttpInfo(petId, name, status); + } + + /** + * Updates a pet in the store with form data + * + * @param petId ID of pet that needs to be updated + * @param name Updated name of the pet + * @param status Updated status of the pet + * @return ApiResponse + */ + public ApiResponse updatePetWithFormWithHttpInfo(String petId, String name, String status) throws ApiException { + Call call = updatePetWithFormCall(petId, name, status, null, null); + return apiClient.execute(call); } /** @@ -564,7 +630,7 @@ public class PetApi { ProgressResponseBody.ProgressListener progressListener = null; ProgressRequestBody.ProgressRequestListener progressRequestListener = null; - if(callback != null) { + if (callback != null) { progressListener = new ProgressResponseBody.ProgressListener() { @Override public void update(long bytesRead, long contentLength, boolean done) { @@ -580,13 +646,13 @@ public class PetApi { }; } - Call call = updatePetWithFormCall(petId,name,status, progressListener, progressRequestListener); + Call call = updatePetWithFormCall(petId, name, status, progressListener, progressRequestListener); apiClient.executeAsync(call, callback); return call; } /* Build call for deletePet */ - private Call deletePetCall(Long petId,String apiKey, final ProgressResponseBody.ProgressListener progressListener, final ProgressRequestBody.ProgressRequestListener progressRequestListener) throws ApiException { + private Call deletePetCall(Long petId, String apiKey, final ProgressResponseBody.ProgressListener progressListener, final ProgressRequestBody.ProgressRequestListener progressRequestListener) throws ApiException { Object postBody = null; // verify the required parameter 'petId' is set @@ -642,8 +708,19 @@ public class PetApi { * @param apiKey */ public void deletePet(Long petId, String apiKey) throws ApiException { - Call call = deletePetCall(petId,apiKey, null, null); - apiClient.execute(call); + deletePetWithHttpInfo(petId, apiKey); + } + + /** + * Deletes a pet + * + * @param petId Pet id to delete + * @param apiKey + * @return ApiResponse + */ + public ApiResponse deletePetWithHttpInfo(Long petId, String apiKey) throws ApiException { + Call call = deletePetCall(petId, apiKey, null, null); + return apiClient.execute(call); } /** @@ -659,7 +736,7 @@ public class PetApi { ProgressResponseBody.ProgressListener progressListener = null; ProgressRequestBody.ProgressRequestListener progressRequestListener = null; - if(callback != null) { + if (callback != null) { progressListener = new ProgressResponseBody.ProgressListener() { @Override public void update(long bytesRead, long contentLength, boolean done) { @@ -675,13 +752,13 @@ public class PetApi { }; } - Call call = deletePetCall(petId,apiKey, progressListener, progressRequestListener); + Call call = deletePetCall(petId, apiKey, progressListener, progressRequestListener); apiClient.executeAsync(call, callback); return call; } /* Build call for uploadFile */ - private Call uploadFileCall(Long petId,String additionalMetadata,File file, final ProgressResponseBody.ProgressListener progressListener, final ProgressRequestBody.ProgressRequestListener progressRequestListener) throws ApiException { + private Call uploadFileCall(Long petId, String additionalMetadata, File file, final ProgressResponseBody.ProgressListener progressListener, final ProgressRequestBody.ProgressRequestListener progressRequestListener) throws ApiException { Object postBody = null; // verify the required parameter 'petId' is set @@ -740,8 +817,20 @@ public class PetApi { * @param file file to upload */ public void uploadFile(Long petId, String additionalMetadata, File file) throws ApiException { - Call call = uploadFileCall(petId,additionalMetadata,file, null, null); - apiClient.execute(call); + uploadFileWithHttpInfo(petId, additionalMetadata, file); + } + + /** + * uploads an image + * + * @param petId ID of pet to update + * @param additionalMetadata Additional data to pass to server + * @param file file to upload + * @return ApiResponse + */ + public ApiResponse uploadFileWithHttpInfo(Long petId, String additionalMetadata, File file) throws ApiException { + Call call = uploadFileCall(petId, additionalMetadata, file, null, null); + return apiClient.execute(call); } /** @@ -758,7 +847,7 @@ public class PetApi { ProgressResponseBody.ProgressListener progressListener = null; ProgressRequestBody.ProgressRequestListener progressRequestListener = null; - if(callback != null) { + if (callback != null) { progressListener = new ProgressResponseBody.ProgressListener() { @Override public void update(long bytesRead, long contentLength, boolean done) { @@ -774,7 +863,7 @@ public class PetApi { }; } - Call call = uploadFileCall(petId,additionalMetadata,file, progressListener, progressRequestListener); + Call call = uploadFileCall(petId, additionalMetadata, file, progressListener, progressRequestListener); apiClient.executeAsync(call, callback); return call; } diff --git a/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/api/StoreApi.java b/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/api/StoreApi.java index 551fe0fbfc2..3e06890a81c 100644 --- a/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/api/StoreApi.java +++ b/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/api/StoreApi.java @@ -3,6 +3,7 @@ package io.swagger.client.api; import io.swagger.client.ApiCallback; import io.swagger.client.ApiClient; import io.swagger.client.ApiException; +import io.swagger.client.ApiResponse; import io.swagger.client.Configuration; import io.swagger.client.Pair; import io.swagger.client.ProgressRequestBody; @@ -43,7 +44,7 @@ public class StoreApi { /* Build call for getInventory */ - private Call getInventoryCall( final ProgressResponseBody.ProgressListener progressListener, final ProgressRequestBody.ProgressRequestListener progressRequestListener) throws ApiException { + private Call getInventoryCall(final ProgressResponseBody.ProgressListener progressListener, final ProgressRequestBody.ProgressRequestListener progressRequestListener) throws ApiException { Object postBody = null; @@ -90,7 +91,17 @@ public class StoreApi { * @return Map */ public Map getInventory() throws ApiException { - Call call = getInventoryCall( null, null); + ApiResponse> resp = getInventoryWithHttpInfo(); + return resp.getData(); + } + + /** + * Returns pet inventories by status + * Returns a map of status codes to quantities + * @return ApiResponse> + */ + public ApiResponse> getInventoryWithHttpInfo() throws ApiException { + Call call = getInventoryCall(null, null); Type returnType = new TypeToken>(){}.getType(); return apiClient.execute(call, returnType); } @@ -106,7 +117,7 @@ public class StoreApi { ProgressResponseBody.ProgressListener progressListener = null; ProgressRequestBody.ProgressRequestListener progressRequestListener = null; - if(callback != null) { + if (callback != null) { progressListener = new ProgressResponseBody.ProgressListener() { @Override public void update(long bytesRead, long contentLength, boolean done) { @@ -122,7 +133,7 @@ public class StoreApi { }; } - Call call = getInventoryCall( progressListener, progressRequestListener); + Call call = getInventoryCall(progressListener, progressRequestListener); Type returnType = new TypeToken>(){}.getType(); apiClient.executeAsync(call, returnType, callback); return call; @@ -177,6 +188,17 @@ public class StoreApi { * @return Order */ public Order placeOrder(Order body) throws ApiException { + ApiResponse resp = placeOrderWithHttpInfo(body); + return resp.getData(); + } + + /** + * Place an order for a pet + * + * @param body order placed for purchasing the pet + * @return ApiResponse + */ + public ApiResponse placeOrderWithHttpInfo(Order body) throws ApiException { Call call = placeOrderCall(body, null, null); Type returnType = new TypeToken(){}.getType(); return apiClient.execute(call, returnType); @@ -194,7 +216,7 @@ public class StoreApi { ProgressResponseBody.ProgressListener progressListener = null; ProgressRequestBody.ProgressRequestListener progressRequestListener = null; - if(callback != null) { + if (callback != null) { progressListener = new ProgressResponseBody.ProgressListener() { @Override public void update(long bytesRead, long contentLength, boolean done) { @@ -271,6 +293,17 @@ public class StoreApi { * @return Order */ public Order getOrderById(String orderId) throws ApiException { + ApiResponse resp = getOrderByIdWithHttpInfo(orderId); + return resp.getData(); + } + + /** + * Find purchase order by ID + * For valid response try integer IDs with value <= 5 or > 10. Other values will generated exceptions + * @param orderId ID of pet that needs to be fetched + * @return ApiResponse + */ + public ApiResponse getOrderByIdWithHttpInfo(String orderId) throws ApiException { Call call = getOrderByIdCall(orderId, null, null); Type returnType = new TypeToken(){}.getType(); return apiClient.execute(call, returnType); @@ -288,7 +321,7 @@ public class StoreApi { ProgressResponseBody.ProgressListener progressListener = null; ProgressRequestBody.ProgressRequestListener progressRequestListener = null; - if(callback != null) { + if (callback != null) { progressListener = new ProgressResponseBody.ProgressListener() { @Override public void update(long bytesRead, long contentLength, boolean done) { @@ -364,8 +397,18 @@ public class StoreApi { * @param orderId ID of the order that needs to be deleted */ public void deleteOrder(String orderId) throws ApiException { + deleteOrderWithHttpInfo(orderId); + } + + /** + * Delete purchase order by ID + * For valid response try integer IDs with value < 1000. Anything above 1000 or nonintegers will generate API errors + * @param orderId ID of the order that needs to be deleted + * @return ApiResponse + */ + public ApiResponse deleteOrderWithHttpInfo(String orderId) throws ApiException { Call call = deleteOrderCall(orderId, null, null); - apiClient.execute(call); + return apiClient.execute(call); } /** @@ -380,7 +423,7 @@ public class StoreApi { ProgressResponseBody.ProgressListener progressListener = null; ProgressRequestBody.ProgressRequestListener progressRequestListener = null; - if(callback != null) { + if (callback != null) { progressListener = new ProgressResponseBody.ProgressListener() { @Override public void update(long bytesRead, long contentLength, boolean done) { diff --git a/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/api/UserApi.java b/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/api/UserApi.java index 57aebd4a4d1..ccb59552554 100644 --- a/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/api/UserApi.java +++ b/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/api/UserApi.java @@ -3,6 +3,7 @@ package io.swagger.client.api; import io.swagger.client.ApiCallback; import io.swagger.client.ApiClient; import io.swagger.client.ApiException; +import io.swagger.client.ApiResponse; import io.swagger.client.Configuration; import io.swagger.client.Pair; import io.swagger.client.ProgressRequestBody; @@ -90,8 +91,18 @@ public class UserApi { * @param body Created user object */ public void createUser(User body) throws ApiException { + createUserWithHttpInfo(body); + } + + /** + * Create user + * This can only be done by the logged in user. + * @param body Created user object + * @return ApiResponse + */ + public ApiResponse createUserWithHttpInfo(User body) throws ApiException { Call call = createUserCall(body, null, null); - apiClient.execute(call); + return apiClient.execute(call); } /** @@ -106,7 +117,7 @@ public class UserApi { ProgressResponseBody.ProgressListener progressListener = null; ProgressRequestBody.ProgressRequestListener progressRequestListener = null; - if(callback != null) { + if (callback != null) { progressListener = new ProgressResponseBody.ProgressListener() { @Override public void update(long bytesRead, long contentLength, boolean done) { @@ -175,8 +186,18 @@ public class UserApi { * @param body List of user object */ public void createUsersWithArrayInput(List body) throws ApiException { + createUsersWithArrayInputWithHttpInfo(body); + } + + /** + * Creates list of users with given input array + * + * @param body List of user object + * @return ApiResponse + */ + public ApiResponse createUsersWithArrayInputWithHttpInfo(List body) throws ApiException { Call call = createUsersWithArrayInputCall(body, null, null); - apiClient.execute(call); + return apiClient.execute(call); } /** @@ -191,7 +212,7 @@ public class UserApi { ProgressResponseBody.ProgressListener progressListener = null; ProgressRequestBody.ProgressRequestListener progressRequestListener = null; - if(callback != null) { + if (callback != null) { progressListener = new ProgressResponseBody.ProgressListener() { @Override public void update(long bytesRead, long contentLength, boolean done) { @@ -260,8 +281,18 @@ public class UserApi { * @param body List of user object */ public void createUsersWithListInput(List body) throws ApiException { + createUsersWithListInputWithHttpInfo(body); + } + + /** + * Creates list of users with given input array + * + * @param body List of user object + * @return ApiResponse + */ + public ApiResponse createUsersWithListInputWithHttpInfo(List body) throws ApiException { Call call = createUsersWithListInputCall(body, null, null); - apiClient.execute(call); + return apiClient.execute(call); } /** @@ -276,7 +307,7 @@ public class UserApi { ProgressResponseBody.ProgressListener progressListener = null; ProgressRequestBody.ProgressRequestListener progressRequestListener = null; - if(callback != null) { + if (callback != null) { progressListener = new ProgressResponseBody.ProgressListener() { @Override public void update(long bytesRead, long contentLength, boolean done) { @@ -298,7 +329,7 @@ public class UserApi { } /* Build call for loginUser */ - private Call loginUserCall(String username,String password, final ProgressResponseBody.ProgressListener progressListener, final ProgressRequestBody.ProgressRequestListener progressRequestListener) throws ApiException { + private Call loginUserCall(String username, String password, final ProgressResponseBody.ProgressListener progressListener, final ProgressRequestBody.ProgressRequestListener progressRequestListener) throws ApiException { Object postBody = null; @@ -351,7 +382,19 @@ public class UserApi { * @return String */ public String loginUser(String username, String password) throws ApiException { - Call call = loginUserCall(username,password, null, null); + ApiResponse resp = loginUserWithHttpInfo(username, password); + return resp.getData(); + } + + /** + * Logs user into the system + * + * @param username The user name for login + * @param password The password for login in clear text + * @return ApiResponse + */ + public ApiResponse loginUserWithHttpInfo(String username, String password) throws ApiException { + Call call = loginUserCall(username, password, null, null); Type returnType = new TypeToken(){}.getType(); return apiClient.execute(call, returnType); } @@ -369,7 +412,7 @@ public class UserApi { ProgressResponseBody.ProgressListener progressListener = null; ProgressRequestBody.ProgressRequestListener progressRequestListener = null; - if(callback != null) { + if (callback != null) { progressListener = new ProgressResponseBody.ProgressListener() { @Override public void update(long bytesRead, long contentLength, boolean done) { @@ -385,14 +428,14 @@ public class UserApi { }; } - Call call = loginUserCall(username,password, progressListener, progressRequestListener); + Call call = loginUserCall(username, password, progressListener, progressRequestListener); Type returnType = new TypeToken(){}.getType(); apiClient.executeAsync(call, returnType, callback); return call; } /* Build call for logoutUser */ - private Call logoutUserCall( final ProgressResponseBody.ProgressListener progressListener, final ProgressRequestBody.ProgressRequestListener progressRequestListener) throws ApiException { + private Call logoutUserCall(final ProgressResponseBody.ProgressListener progressListener, final ProgressRequestBody.ProgressRequestListener progressRequestListener) throws ApiException { Object postBody = null; @@ -438,8 +481,17 @@ public class UserApi { * */ public void logoutUser() throws ApiException { - Call call = logoutUserCall( null, null); - apiClient.execute(call); + logoutUserWithHttpInfo(); + } + + /** + * Logs out current logged in user session + * + * @return ApiResponse + */ + public ApiResponse logoutUserWithHttpInfo() throws ApiException { + Call call = logoutUserCall(null, null); + return apiClient.execute(call); } /** @@ -453,7 +505,7 @@ public class UserApi { ProgressResponseBody.ProgressListener progressListener = null; ProgressRequestBody.ProgressRequestListener progressRequestListener = null; - if(callback != null) { + if (callback != null) { progressListener = new ProgressResponseBody.ProgressListener() { @Override public void update(long bytesRead, long contentLength, boolean done) { @@ -469,7 +521,7 @@ public class UserApi { }; } - Call call = logoutUserCall( progressListener, progressRequestListener); + Call call = logoutUserCall(progressListener, progressRequestListener); apiClient.executeAsync(call, callback); return call; } @@ -529,6 +581,17 @@ public class UserApi { * @return User */ public User getUserByName(String username) throws ApiException { + ApiResponse resp = getUserByNameWithHttpInfo(username); + return resp.getData(); + } + + /** + * Get user by user name + * + * @param username The name that needs to be fetched. Use user1 for testing. + * @return ApiResponse + */ + public ApiResponse getUserByNameWithHttpInfo(String username) throws ApiException { Call call = getUserByNameCall(username, null, null); Type returnType = new TypeToken(){}.getType(); return apiClient.execute(call, returnType); @@ -546,7 +609,7 @@ public class UserApi { ProgressResponseBody.ProgressListener progressListener = null; ProgressRequestBody.ProgressRequestListener progressRequestListener = null; - if(callback != null) { + if (callback != null) { progressListener = new ProgressResponseBody.ProgressListener() { @Override public void update(long bytesRead, long contentLength, boolean done) { @@ -569,7 +632,7 @@ public class UserApi { } /* Build call for updateUser */ - private Call updateUserCall(String username,User body, final ProgressResponseBody.ProgressListener progressListener, final ProgressRequestBody.ProgressRequestListener progressRequestListener) throws ApiException { + private Call updateUserCall(String username, User body, final ProgressResponseBody.ProgressListener progressListener, final ProgressRequestBody.ProgressRequestListener progressRequestListener) throws ApiException { Object postBody = body; // verify the required parameter 'username' is set @@ -623,8 +686,19 @@ public class UserApi { * @param body Updated user object */ public void updateUser(String username, User body) throws ApiException { - Call call = updateUserCall(username,body, null, null); - apiClient.execute(call); + updateUserWithHttpInfo(username, body); + } + + /** + * Updated user + * This can only be done by the logged in user. + * @param username name that need to be deleted + * @param body Updated user object + * @return ApiResponse + */ + public ApiResponse updateUserWithHttpInfo(String username, User body) throws ApiException { + Call call = updateUserCall(username, body, null, null); + return apiClient.execute(call); } /** @@ -640,7 +714,7 @@ public class UserApi { ProgressResponseBody.ProgressListener progressListener = null; ProgressRequestBody.ProgressRequestListener progressRequestListener = null; - if(callback != null) { + if (callback != null) { progressListener = new ProgressResponseBody.ProgressListener() { @Override public void update(long bytesRead, long contentLength, boolean done) { @@ -656,7 +730,7 @@ public class UserApi { }; } - Call call = updateUserCall(username,body, progressListener, progressRequestListener); + Call call = updateUserCall(username, body, progressListener, progressRequestListener); apiClient.executeAsync(call, callback); return call; } @@ -715,8 +789,18 @@ public class UserApi { * @param username The name that needs to be deleted */ public void deleteUser(String username) throws ApiException { + deleteUserWithHttpInfo(username); + } + + /** + * Delete user + * This can only be done by the logged in user. + * @param username The name that needs to be deleted + * @return ApiResponse + */ + public ApiResponse deleteUserWithHttpInfo(String username) throws ApiException { Call call = deleteUserCall(username, null, null); - apiClient.execute(call); + return apiClient.execute(call); } /** @@ -731,7 +815,7 @@ public class UserApi { ProgressResponseBody.ProgressListener progressListener = null; ProgressRequestBody.ProgressRequestListener progressRequestListener = null; - if(callback != null) { + if (callback != null) { progressListener = new ProgressResponseBody.ProgressListener() { @Override public void update(long bytesRead, long contentLength, boolean done) { diff --git a/samples/client/petstore/java/okhttp-gson/src/test/java/io/swagger/petstore/test/PetApiTest.java b/samples/client/petstore/java/okhttp-gson/src/test/java/io/swagger/petstore/test/PetApiTest.java index b6d8286d7ef..56cc8073984 100644 --- a/samples/client/petstore/java/okhttp-gson/src/test/java/io/swagger/petstore/test/PetApiTest.java +++ b/samples/client/petstore/java/okhttp-gson/src/test/java/io/swagger/petstore/test/PetApiTest.java @@ -1,10 +1,6 @@ package io.swagger.petstore.test; -import io.swagger.client.ApiClient; -import io.swagger.client.ApiException; -import io.swagger.client.Configuration; - -import io.swagger.client.ApiCallback; +import io.swagger.client.*; import io.swagger.client.api.*; import io.swagger.client.auth.*; import io.swagger.client.model.*; @@ -71,6 +67,21 @@ public class PetApiTest { assertEquals(fetched.getCategory().getName(), pet.getCategory().getName()); } + @Test + public void testCreateAndGetPetWithHttpInfo() throws Exception { + Pet pet = createRandomPet(); + api.addPetWithHttpInfo(pet); + + ApiResponse resp = api.getPetByIdWithHttpInfo(pet.getId()); + assertEquals(200, resp.getStatusCode()); + assertEquals("application/json", resp.getHeaders().get("Content-Type").get(0)); + Pet fetched = resp.getData(); + assertNotNull(fetched); + assertEquals(pet.getId(), fetched.getId()); + assertNotNull(fetched.getCategory()); + assertEquals(fetched.getCategory().getName(), pet.getCategory().getName()); + } + @Test public void testCreateAndGetPetAsync() throws Exception { Pet pet = createRandomPet(); From b40ee50167241e4243c8ad8b708d562434d7810f Mon Sep 17 00:00:00 2001 From: wing328 Date: Mon, 7 Dec 2015 11:53:38 +0800 Subject: [PATCH 138/211] Add batch file for running on Windows, update JS client --- README.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/README.md b/README.md index ef321e4bb59..8bdb6be693e 100644 --- a/README.md +++ b/README.md @@ -117,6 +117,8 @@ You can build a client against the swagger sample [petstore](http://petstore.swa ./bin/java-petstore.sh ``` +(On Windows, run `./bin/windows/java-petstore.bat` instead) + This will run the generator with this command: ``` @@ -217,6 +219,7 @@ See our [javascript library](http://github.com/swagger-api/swagger-js)--it's com static code generation. There is a third-party component called [swagger-js-codegen](https://github.com/wcandillon/swagger-js-codegen) that can generate angularjs or nodejs source code from a swagger specification. +:exclamation: On Dec 7th 2015, a Javascript API client generator has been added by @jfiala. ### Generating a client from local files If you don't want to call your server, you can save the swagger spec files into a directory and pass an argument @@ -276,6 +279,7 @@ FlashClientCodegen.java FlaskConnexionCodegen.java JavaClientCodegen.java JavaInflectorServerCodegen.java +JavascriptClientCodegen.java JaxRSServerCodegen.java NodeJSServerCodegen.java ObjcClientCodegen.java @@ -288,6 +292,7 @@ ScalaClientCodegen.java ScalatraServerCodegen.java SilexServerCodegen.java SinatraServerCodegen.java +SlimFrameworkServerCodegen.java SpringMVCServerCodegen.java StaticDocCodegen.java StaticHtmlGenerator.java From 80ed75eef08e8a12d9db23f9543fc3fcdeac7558 Mon Sep 17 00:00:00 2001 From: xhh Date: Mon, 7 Dec 2015 12:23:50 +0800 Subject: [PATCH 139/211] Add more javadoc to Java okhttp-gson client --- .../libraries/okhttp-gson/ApiClient.mustache | 14 ++++++++++- .../okhttp-gson/ApiResponse.mustache | 14 +++++++++++ .../Java/libraries/okhttp-gson/api.mustache | 3 +++ .../java/io/swagger/client/ApiClient.java | 14 ++++++++++- .../java/io/swagger/client/ApiException.java | 2 +- .../java/io/swagger/client/ApiResponse.java | 14 +++++++++++ .../java/io/swagger/client/Configuration.java | 2 +- .../src/main/java/io/swagger/client/Pair.java | 2 +- .../java/io/swagger/client/StringUtil.java | 2 +- .../java/io/swagger/client/api/PetApi.java | 24 +++++++++++++++++++ .../java/io/swagger/client/api/StoreApi.java | 12 ++++++++++ .../java/io/swagger/client/api/UserApi.java | 24 +++++++++++++++++++ .../io/swagger/client/auth/ApiKeyAuth.java | 2 +- .../swagger/client/auth/Authentication.java | 2 +- .../java/io/swagger/client/auth/OAuth.java | 2 +- .../java/io/swagger/client/model/Pet.java | 2 +- 16 files changed, 125 insertions(+), 10 deletions(-) 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 7b21d760f56..e97e4c7f97d 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 @@ -597,6 +597,8 @@ public class ApiClient { * @param response HTTP response * @param returnType The type of the Java object * @return The deserialized Java object + * @throws ApiException If fail to deserialize response body, i.e. cannot read response body + * or the Content-Type of the response is not supported. */ public T deserialize(Response response, Type returnType) throws ApiException { if (response == null || returnType == null) @@ -645,6 +647,7 @@ public class ApiClient { * @param obj The Java object * @param contentType The request Content-Type * @return The serialized string + * @throws ApiException If fail to serialize the given object */ public String serialize(Object obj, String contentType) throws ApiException { if (contentType.startsWith("application/json")) { @@ -659,6 +662,7 @@ public class ApiClient { /** * Download file from the given response. + * @throws ApiException If fail to read file content from response and write to disk */ public File downloadFileFromResponse(Response response) throws ApiException { try { @@ -722,6 +726,7 @@ public class ApiClient { * @return ApiResponse object containing response status, headers and * data, which is a Java object deserialized from response body and would be null * when returnType is null. + * @throws ApiException If fail to execute the call */ public ApiResponse execute(Call call, Type returnType) throws ApiException { try { @@ -736,7 +741,7 @@ public class ApiClient { /** * #see executeAsync(Call, Type, ApiCallback) */ - public void executeAsync(Call call, ApiCallback callback) throws ApiException { + public void executeAsync(Call call, ApiCallback callback) { executeAsync(call, null, callback); } @@ -767,6 +772,12 @@ public class ApiClient { }); } + /** + * Handle the given response, return the deserialized object when the response is successful. + * + * @throws ApiException If the response has a unsuccessful status code or + * fail to deserialize the response body + */ public T handleResponse(Response response, Type returnType) throws ApiException { if (response.isSuccessful()) { if (returnType == null || response.code() == 204) { @@ -800,6 +811,7 @@ public class ApiClient { * @param formParams The form parameters * @param authNames The authentications to apply * @return The HTTP call + * @throws ApiException If fail to serialize the request body object */ public Call buildCall(String path, String method, List queryParams, Object body, Map headerParams, Map formParams, String[] authNames, ProgressRequestBody.ProgressRequestListener progressRequestListener) throws ApiException { updateParamsForAuth(authNames, queryParams, headerParams); diff --git a/modules/swagger-codegen/src/main/resources/Java/libraries/okhttp-gson/ApiResponse.mustache b/modules/swagger-codegen/src/main/resources/Java/libraries/okhttp-gson/ApiResponse.mustache index 945de39da70..452f4e1e982 100644 --- a/modules/swagger-codegen/src/main/resources/Java/libraries/okhttp-gson/ApiResponse.mustache +++ b/modules/swagger-codegen/src/main/resources/Java/libraries/okhttp-gson/ApiResponse.mustache @@ -3,15 +3,29 @@ package {{invokerPackage}}; import java.util.List; import java.util.Map; +/** + * API response returned by API call. + * + * @param T The type of data that is deserialized from response body + */ public class ApiResponse { final private int statusCode; final private Map> headers; final private T data; + /** + * @param statusCode The status code of HTTP response + * @param headers The headers of HTTP response + */ public ApiResponse(int statusCode, Map> headers) { this(statusCode, headers, null); } + /** + * @param statusCode The status code of HTTP response + * @param headers The headers of HTTP response + * @param data The object deserialized from response bod + */ public ApiResponse(int statusCode, Map> headers, T data) { this.statusCode = statusCode; this.headers = headers; diff --git a/modules/swagger-codegen/src/main/resources/Java/libraries/okhttp-gson/api.mustache b/modules/swagger-codegen/src/main/resources/Java/libraries/okhttp-gson/api.mustache index da145d08df2..e760f4a370e 100644 --- a/modules/swagger-codegen/src/main/resources/Java/libraries/okhttp-gson/api.mustache +++ b/modules/swagger-codegen/src/main/resources/Java/libraries/okhttp-gson/api.mustache @@ -105,6 +105,7 @@ public class {{classname}} { * {{notes}}{{#allParams}} * @param {{paramName}} {{description}}{{/allParams}}{{#returnType}} * @return {{{returnType}}}{{/returnType}} + * @throws ApiException If fail to call the API, e.g. server error or cannot deserialize the response body */ public {{#returnType}}{{{returnType}}} {{/returnType}}{{^returnType}}void {{/returnType}}{{operationId}}({{#allParams}}{{{dataType}}} {{paramName}}{{#hasMore}}, {{/hasMore}}{{/allParams}}) throws ApiException { {{#returnType}}ApiResponse<{{{returnType}}}> {{localVariablePrefix}}resp = {{/returnType}}{{operationId}}WithHttpInfo({{#allParams}}{{paramName}}{{#hasMore}}, {{/hasMore}}{{/allParams}});{{#returnType}} @@ -116,6 +117,7 @@ public class {{classname}} { * {{notes}}{{#allParams}} * @param {{paramName}} {{description}}{{/allParams}} * @return ApiResponse<{{#returnType}}{{{returnType}}}{{/returnType}}{{^returnType}}Void{{/returnType}}> + * @throws ApiException If fail to call the API, e.g. server error or cannot deserialize the response body */ public ApiResponse<{{#returnType}}{{{returnType}}}{{/returnType}}{{^returnType}}Void{{/returnType}}> {{operationId}}WithHttpInfo({{#allParams}}{{{dataType}}} {{paramName}}{{#hasMore}}, {{/hasMore}}{{/allParams}}) throws ApiException { Call {{localVariablePrefix}}call = {{operationId}}Call({{#allParams}}{{paramName}}, {{/allParams}}null, null); @@ -129,6 +131,7 @@ public class {{classname}} { * @param {{paramName}} {{description}}{{/allParams}} * @param callback The callback to be executed when the API call finishes * @return The request call + * @throws ApiException If fail to process the API call, e.g. serializing the request body object */ public Call {{operationId}}Async({{#allParams}}{{{dataType}}} {{paramName}}, {{/allParams}}final ApiCallback<{{#returnType}}{{{returnType}}}{{/returnType}}{{^returnType}}Void{{/returnType}}> {{localVariablePrefix}}callback) throws ApiException { 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 8a75219bb53..d4ee79cb3ad 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 @@ -596,6 +596,8 @@ public class ApiClient { * @param response HTTP response * @param returnType The type of the Java object * @return The deserialized Java object + * @throws ApiException If fail to deserialize response body, i.e. cannot read response body + * or the Content-Type of the response is not supported. */ public T deserialize(Response response, Type returnType) throws ApiException { if (response == null || returnType == null) @@ -644,6 +646,7 @@ public class ApiClient { * @param obj The Java object * @param contentType The request Content-Type * @return The serialized string + * @throws ApiException If fail to serialize the given object */ public String serialize(Object obj, String contentType) throws ApiException { if (contentType.startsWith("application/json")) { @@ -658,6 +661,7 @@ public class ApiClient { /** * Download file from the given response. + * @throws ApiException If fail to read file content from response and write to disk */ public File downloadFileFromResponse(Response response) throws ApiException { try { @@ -721,6 +725,7 @@ public class ApiClient { * @return ApiResponse object containing response status, headers and * data, which is a Java object deserialized from response body and would be null * when returnType is null. + * @throws ApiException If fail to execute the call */ public ApiResponse execute(Call call, Type returnType) throws ApiException { try { @@ -735,7 +740,7 @@ public class ApiClient { /** * #see executeAsync(Call, Type, ApiCallback) */ - public void executeAsync(Call call, ApiCallback callback) throws ApiException { + public void executeAsync(Call call, ApiCallback callback) { executeAsync(call, null, callback); } @@ -766,6 +771,12 @@ public class ApiClient { }); } + /** + * Handle the given response, return the deserialized object when the response is successful. + * + * @throws ApiException If the response has a unsuccessful status code or + * fail to deserialize the response body + */ public T handleResponse(Response response, Type returnType) throws ApiException { if (response.isSuccessful()) { if (returnType == null || response.code() == 204) { @@ -799,6 +810,7 @@ public class ApiClient { * @param formParams The form parameters * @param authNames The authentications to apply * @return The HTTP call + * @throws ApiException If fail to serialize the request body object */ public Call buildCall(String path, String method, List queryParams, Object body, Map headerParams, Map formParams, String[] authNames, ProgressRequestBody.ProgressRequestListener progressRequestListener) throws ApiException { updateParamsForAuth(authNames, queryParams, headerParams); diff --git a/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/ApiException.java b/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/ApiException.java index 46b52990f44..bf096d22a5c 100644 --- a/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/ApiException.java +++ b/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/ApiException.java @@ -3,7 +3,7 @@ package io.swagger.client; import java.util.Map; import java.util.List; -@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-11-29T00:18:08.052+08:00") +@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-12-07T12:21:33.403+08:00") public class ApiException extends Exception { private int code = 0; private Map> responseHeaders = null; diff --git a/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/ApiResponse.java b/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/ApiResponse.java index fbe22e077b8..0a33f09e64e 100644 --- a/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/ApiResponse.java +++ b/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/ApiResponse.java @@ -3,15 +3,29 @@ package io.swagger.client; import java.util.List; import java.util.Map; +/** + * API response returned by API call. + * + * @param T The type of data that is deserialized from response body + */ public class ApiResponse { final private int statusCode; final private Map> headers; final private T data; + /** + * @param statusCode The status code of HTTP response + * @param headers The headers of HTTP response + */ public ApiResponse(int statusCode, Map> headers) { this(statusCode, headers, null); } + /** + * @param statusCode The status code of HTTP response + * @param headers The headers of HTTP response + * @param data The object deserialized from response bod + */ public ApiResponse(int statusCode, Map> headers, T data) { this.statusCode = statusCode; this.headers = headers; diff --git a/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/Configuration.java b/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/Configuration.java index b99c939af83..e996b89ef77 100644 --- a/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/Configuration.java +++ b/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/Configuration.java @@ -1,6 +1,6 @@ package io.swagger.client; -@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-11-29T00:18:08.052+08:00") +@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-12-07T12:21:33.403+08:00") public class Configuration { private static ApiClient defaultApiClient = new ApiClient(); diff --git a/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/Pair.java b/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/Pair.java index 98f5f92e0a4..ef80752c495 100644 --- a/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/Pair.java +++ b/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/Pair.java @@ -1,6 +1,6 @@ package io.swagger.client; -@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-11-29T00:18:08.052+08:00") +@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-12-07T12:21:33.403+08:00") public class Pair { private String name = ""; private String value = ""; diff --git a/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/StringUtil.java b/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/StringUtil.java index 702b8cf350c..3a105a258e4 100644 --- a/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/StringUtil.java +++ b/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/StringUtil.java @@ -1,6 +1,6 @@ package io.swagger.client; -@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-11-29T00:18:08.052+08:00") +@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-12-07T12:21:33.403+08:00") public class StringUtil { /** * Check if the given array contains the given value (with case-insensitive comparison). diff --git a/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/api/PetApi.java b/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/api/PetApi.java index e880e3f9fbf..460cd0f4c4d 100644 --- a/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/api/PetApi.java +++ b/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/api/PetApi.java @@ -89,6 +89,7 @@ public class PetApi { * Update an existing pet * * @param body Pet object that needs to be added to the store + * @throws ApiException If fail to call the API, e.g. server error or cannot deserialize the response body */ public void updatePet(Pet body) throws ApiException { updatePetWithHttpInfo(body); @@ -99,6 +100,7 @@ public class PetApi { * * @param body Pet object that needs to be added to the store * @return ApiResponse + * @throws ApiException If fail to call the API, e.g. server error or cannot deserialize the response body */ public ApiResponse updatePetWithHttpInfo(Pet body) throws ApiException { Call call = updatePetCall(body, null, null); @@ -111,6 +113,7 @@ public class PetApi { * @param body Pet object that needs to be added to the store * @param callback The callback to be executed when the API call finishes * @return The request call + * @throws ApiException If fail to process the API call, e.g. serializing the request body object */ public Call updatePetAsync(Pet body, final ApiCallback callback) throws ApiException { @@ -184,6 +187,7 @@ public class PetApi { * Add a new pet to the store * * @param body Pet object that needs to be added to the store + * @throws ApiException If fail to call the API, e.g. server error or cannot deserialize the response body */ public void addPet(Pet body) throws ApiException { addPetWithHttpInfo(body); @@ -194,6 +198,7 @@ public class PetApi { * * @param body Pet object that needs to be added to the store * @return ApiResponse + * @throws ApiException If fail to call the API, e.g. server error or cannot deserialize the response body */ public ApiResponse addPetWithHttpInfo(Pet body) throws ApiException { Call call = addPetCall(body, null, null); @@ -206,6 +211,7 @@ public class PetApi { * @param body Pet object that needs to be added to the store * @param callback The callback to be executed when the API call finishes * @return The request call + * @throws ApiException If fail to process the API call, e.g. serializing the request body object */ public Call addPetAsync(Pet body, final ApiCallback callback) throws ApiException { @@ -282,6 +288,7 @@ public class PetApi { * Multiple status values can be provided with comma seperated strings * @param status Status values that need to be considered for filter * @return List + * @throws ApiException If fail to call the API, e.g. server error or cannot deserialize the response body */ public List findPetsByStatus(List status) throws ApiException { ApiResponse> resp = findPetsByStatusWithHttpInfo(status); @@ -293,6 +300,7 @@ public class PetApi { * Multiple status values can be provided with comma seperated strings * @param status Status values that need to be considered for filter * @return ApiResponse> + * @throws ApiException If fail to call the API, e.g. server error or cannot deserialize the response body */ public ApiResponse> findPetsByStatusWithHttpInfo(List status) throws ApiException { Call call = findPetsByStatusCall(status, null, null); @@ -306,6 +314,7 @@ public class PetApi { * @param status Status values that need to be considered for filter * @param callback The callback to be executed when the API call finishes * @return The request call + * @throws ApiException If fail to process the API call, e.g. serializing the request body object */ public Call findPetsByStatusAsync(List status, final ApiCallback> callback) throws ApiException { @@ -383,6 +392,7 @@ public class PetApi { * Muliple tags can be provided with comma seperated strings. Use tag1, tag2, tag3 for testing. * @param tags Tags to filter by * @return List + * @throws ApiException If fail to call the API, e.g. server error or cannot deserialize the response body */ public List findPetsByTags(List tags) throws ApiException { ApiResponse> resp = findPetsByTagsWithHttpInfo(tags); @@ -394,6 +404,7 @@ public class PetApi { * Muliple tags can be provided with comma seperated strings. Use tag1, tag2, tag3 for testing. * @param tags Tags to filter by * @return ApiResponse> + * @throws ApiException If fail to call the API, e.g. server error or cannot deserialize the response body */ public ApiResponse> findPetsByTagsWithHttpInfo(List tags) throws ApiException { Call call = findPetsByTagsCall(tags, null, null); @@ -407,6 +418,7 @@ public class PetApi { * @param tags Tags to filter by * @param callback The callback to be executed when the API call finishes * @return The request call + * @throws ApiException If fail to process the API call, e.g. serializing the request body object */ public Call findPetsByTagsAsync(List tags, final ApiCallback> callback) throws ApiException { @@ -488,6 +500,7 @@ public class PetApi { * Returns a pet when ID < 10. ID > 10 or nonintegers will simulate API error conditions * @param petId ID of pet that needs to be fetched * @return Pet + * @throws ApiException If fail to call the API, e.g. server error or cannot deserialize the response body */ public Pet getPetById(Long petId) throws ApiException { ApiResponse resp = getPetByIdWithHttpInfo(petId); @@ -499,6 +512,7 @@ public class PetApi { * Returns a pet when ID < 10. ID > 10 or nonintegers will simulate API error conditions * @param petId ID of pet that needs to be fetched * @return ApiResponse + * @throws ApiException If fail to call the API, e.g. server error or cannot deserialize the response body */ public ApiResponse getPetByIdWithHttpInfo(Long petId) throws ApiException { Call call = getPetByIdCall(petId, null, null); @@ -512,6 +526,7 @@ public class PetApi { * @param petId ID of pet that needs to be fetched * @param callback The callback to be executed when the API call finishes * @return The request call + * @throws ApiException If fail to process the API call, e.g. serializing the request body object */ public Call getPetByIdAsync(Long petId, final ApiCallback callback) throws ApiException { @@ -598,6 +613,7 @@ public class PetApi { * @param petId ID of pet that needs to be updated * @param name Updated name of the pet * @param status Updated status of the pet + * @throws ApiException If fail to call the API, e.g. server error or cannot deserialize the response body */ public void updatePetWithForm(String petId, String name, String status) throws ApiException { updatePetWithFormWithHttpInfo(petId, name, status); @@ -610,6 +626,7 @@ public class PetApi { * @param name Updated name of the pet * @param status Updated status of the pet * @return ApiResponse + * @throws ApiException If fail to call the API, e.g. server error or cannot deserialize the response body */ public ApiResponse updatePetWithFormWithHttpInfo(String petId, String name, String status) throws ApiException { Call call = updatePetWithFormCall(petId, name, status, null, null); @@ -624,6 +641,7 @@ public class PetApi { * @param status Updated status of the pet * @param callback The callback to be executed when the API call finishes * @return The request call + * @throws ApiException If fail to process the API call, e.g. serializing the request body object */ public Call updatePetWithFormAsync(String petId, String name, String status, final ApiCallback callback) throws ApiException { @@ -706,6 +724,7 @@ public class PetApi { * * @param petId Pet id to delete * @param apiKey + * @throws ApiException If fail to call the API, e.g. server error or cannot deserialize the response body */ public void deletePet(Long petId, String apiKey) throws ApiException { deletePetWithHttpInfo(petId, apiKey); @@ -717,6 +736,7 @@ public class PetApi { * @param petId Pet id to delete * @param apiKey * @return ApiResponse + * @throws ApiException If fail to call the API, e.g. server error or cannot deserialize the response body */ public ApiResponse deletePetWithHttpInfo(Long petId, String apiKey) throws ApiException { Call call = deletePetCall(petId, apiKey, null, null); @@ -730,6 +750,7 @@ public class PetApi { * @param apiKey * @param callback The callback to be executed when the API call finishes * @return The request call + * @throws ApiException If fail to process the API call, e.g. serializing the request body object */ public Call deletePetAsync(Long petId, String apiKey, final ApiCallback callback) throws ApiException { @@ -815,6 +836,7 @@ public class PetApi { * @param petId ID of pet to update * @param additionalMetadata Additional data to pass to server * @param file file to upload + * @throws ApiException If fail to call the API, e.g. server error or cannot deserialize the response body */ public void uploadFile(Long petId, String additionalMetadata, File file) throws ApiException { uploadFileWithHttpInfo(petId, additionalMetadata, file); @@ -827,6 +849,7 @@ public class PetApi { * @param additionalMetadata Additional data to pass to server * @param file file to upload * @return ApiResponse + * @throws ApiException If fail to call the API, e.g. server error or cannot deserialize the response body */ public ApiResponse uploadFileWithHttpInfo(Long petId, String additionalMetadata, File file) throws ApiException { Call call = uploadFileCall(petId, additionalMetadata, file, null, null); @@ -841,6 +864,7 @@ public class PetApi { * @param file file to upload * @param callback The callback to be executed when the API call finishes * @return The request call + * @throws ApiException If fail to process the API call, e.g. serializing the request body object */ public Call uploadFileAsync(Long petId, String additionalMetadata, File file, final ApiCallback callback) throws ApiException { diff --git a/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/api/StoreApi.java b/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/api/StoreApi.java index 3e06890a81c..5e6c7c48c6b 100644 --- a/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/api/StoreApi.java +++ b/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/api/StoreApi.java @@ -89,6 +89,7 @@ public class StoreApi { * Returns pet inventories by status * Returns a map of status codes to quantities * @return Map + * @throws ApiException If fail to call the API, e.g. server error or cannot deserialize the response body */ public Map getInventory() throws ApiException { ApiResponse> resp = getInventoryWithHttpInfo(); @@ -99,6 +100,7 @@ public class StoreApi { * Returns pet inventories by status * Returns a map of status codes to quantities * @return ApiResponse> + * @throws ApiException If fail to call the API, e.g. server error or cannot deserialize the response body */ public ApiResponse> getInventoryWithHttpInfo() throws ApiException { Call call = getInventoryCall(null, null); @@ -111,6 +113,7 @@ public class StoreApi { * Returns a map of status codes to quantities * @param callback The callback to be executed when the API call finishes * @return The request call + * @throws ApiException If fail to process the API call, e.g. serializing the request body object */ public Call getInventoryAsync(final ApiCallback> callback) throws ApiException { @@ -186,6 +189,7 @@ public class StoreApi { * * @param body order placed for purchasing the pet * @return Order + * @throws ApiException If fail to call the API, e.g. server error or cannot deserialize the response body */ public Order placeOrder(Order body) throws ApiException { ApiResponse resp = placeOrderWithHttpInfo(body); @@ -197,6 +201,7 @@ public class StoreApi { * * @param body order placed for purchasing the pet * @return ApiResponse + * @throws ApiException If fail to call the API, e.g. server error or cannot deserialize the response body */ public ApiResponse placeOrderWithHttpInfo(Order body) throws ApiException { Call call = placeOrderCall(body, null, null); @@ -210,6 +215,7 @@ public class StoreApi { * @param body order placed for purchasing the pet * @param callback The callback to be executed when the API call finishes * @return The request call + * @throws ApiException If fail to process the API call, e.g. serializing the request body object */ public Call placeOrderAsync(Order body, final ApiCallback callback) throws ApiException { @@ -291,6 +297,7 @@ public class StoreApi { * For valid response try integer IDs with value <= 5 or > 10. Other values will generated exceptions * @param orderId ID of pet that needs to be fetched * @return Order + * @throws ApiException If fail to call the API, e.g. server error or cannot deserialize the response body */ public Order getOrderById(String orderId) throws ApiException { ApiResponse resp = getOrderByIdWithHttpInfo(orderId); @@ -302,6 +309,7 @@ public class StoreApi { * For valid response try integer IDs with value <= 5 or > 10. Other values will generated exceptions * @param orderId ID of pet that needs to be fetched * @return ApiResponse + * @throws ApiException If fail to call the API, e.g. server error or cannot deserialize the response body */ public ApiResponse getOrderByIdWithHttpInfo(String orderId) throws ApiException { Call call = getOrderByIdCall(orderId, null, null); @@ -315,6 +323,7 @@ public class StoreApi { * @param orderId ID of pet that needs to be fetched * @param callback The callback to be executed when the API call finishes * @return The request call + * @throws ApiException If fail to process the API call, e.g. serializing the request body object */ public Call getOrderByIdAsync(String orderId, final ApiCallback callback) throws ApiException { @@ -395,6 +404,7 @@ public class StoreApi { * Delete purchase order by ID * For valid response try integer IDs with value < 1000. Anything above 1000 or nonintegers will generate API errors * @param orderId ID of the order that needs to be deleted + * @throws ApiException If fail to call the API, e.g. server error or cannot deserialize the response body */ public void deleteOrder(String orderId) throws ApiException { deleteOrderWithHttpInfo(orderId); @@ -405,6 +415,7 @@ public class StoreApi { * For valid response try integer IDs with value < 1000. Anything above 1000 or nonintegers will generate API errors * @param orderId ID of the order that needs to be deleted * @return ApiResponse + * @throws ApiException If fail to call the API, e.g. server error or cannot deserialize the response body */ public ApiResponse deleteOrderWithHttpInfo(String orderId) throws ApiException { Call call = deleteOrderCall(orderId, null, null); @@ -417,6 +428,7 @@ public class StoreApi { * @param orderId ID of the order that needs to be deleted * @param callback The callback to be executed when the API call finishes * @return The request call + * @throws ApiException If fail to process the API call, e.g. serializing the request body object */ public Call deleteOrderAsync(String orderId, final ApiCallback callback) throws ApiException { diff --git a/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/api/UserApi.java b/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/api/UserApi.java index ccb59552554..ab043bdbe3b 100644 --- a/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/api/UserApi.java +++ b/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/api/UserApi.java @@ -89,6 +89,7 @@ public class UserApi { * Create user * This can only be done by the logged in user. * @param body Created user object + * @throws ApiException If fail to call the API, e.g. server error or cannot deserialize the response body */ public void createUser(User body) throws ApiException { createUserWithHttpInfo(body); @@ -99,6 +100,7 @@ public class UserApi { * This can only be done by the logged in user. * @param body Created user object * @return ApiResponse + * @throws ApiException If fail to call the API, e.g. server error or cannot deserialize the response body */ public ApiResponse createUserWithHttpInfo(User body) throws ApiException { Call call = createUserCall(body, null, null); @@ -111,6 +113,7 @@ public class UserApi { * @param body Created user object * @param callback The callback to be executed when the API call finishes * @return The request call + * @throws ApiException If fail to process the API call, e.g. serializing the request body object */ public Call createUserAsync(User body, final ApiCallback callback) throws ApiException { @@ -184,6 +187,7 @@ public class UserApi { * Creates list of users with given input array * * @param body List of user object + * @throws ApiException If fail to call the API, e.g. server error or cannot deserialize the response body */ public void createUsersWithArrayInput(List body) throws ApiException { createUsersWithArrayInputWithHttpInfo(body); @@ -194,6 +198,7 @@ public class UserApi { * * @param body List of user object * @return ApiResponse + * @throws ApiException If fail to call the API, e.g. server error or cannot deserialize the response body */ public ApiResponse createUsersWithArrayInputWithHttpInfo(List body) throws ApiException { Call call = createUsersWithArrayInputCall(body, null, null); @@ -206,6 +211,7 @@ public class UserApi { * @param body List of user object * @param callback The callback to be executed when the API call finishes * @return The request call + * @throws ApiException If fail to process the API call, e.g. serializing the request body object */ public Call createUsersWithArrayInputAsync(List body, final ApiCallback callback) throws ApiException { @@ -279,6 +285,7 @@ public class UserApi { * Creates list of users with given input array * * @param body List of user object + * @throws ApiException If fail to call the API, e.g. server error or cannot deserialize the response body */ public void createUsersWithListInput(List body) throws ApiException { createUsersWithListInputWithHttpInfo(body); @@ -289,6 +296,7 @@ public class UserApi { * * @param body List of user object * @return ApiResponse + * @throws ApiException If fail to call the API, e.g. server error or cannot deserialize the response body */ public ApiResponse createUsersWithListInputWithHttpInfo(List body) throws ApiException { Call call = createUsersWithListInputCall(body, null, null); @@ -301,6 +309,7 @@ public class UserApi { * @param body List of user object * @param callback The callback to be executed when the API call finishes * @return The request call + * @throws ApiException If fail to process the API call, e.g. serializing the request body object */ public Call createUsersWithListInputAsync(List body, final ApiCallback callback) throws ApiException { @@ -380,6 +389,7 @@ public class UserApi { * @param username The user name for login * @param password The password for login in clear text * @return String + * @throws ApiException If fail to call the API, e.g. server error or cannot deserialize the response body */ public String loginUser(String username, String password) throws ApiException { ApiResponse resp = loginUserWithHttpInfo(username, password); @@ -392,6 +402,7 @@ public class UserApi { * @param username The user name for login * @param password The password for login in clear text * @return ApiResponse + * @throws ApiException If fail to call the API, e.g. server error or cannot deserialize the response body */ public ApiResponse loginUserWithHttpInfo(String username, String password) throws ApiException { Call call = loginUserCall(username, password, null, null); @@ -406,6 +417,7 @@ public class UserApi { * @param password The password for login in clear text * @param callback The callback to be executed when the API call finishes * @return The request call + * @throws ApiException If fail to process the API call, e.g. serializing the request body object */ public Call loginUserAsync(String username, String password, final ApiCallback callback) throws ApiException { @@ -479,6 +491,7 @@ public class UserApi { /** * Logs out current logged in user session * + * @throws ApiException If fail to call the API, e.g. server error or cannot deserialize the response body */ public void logoutUser() throws ApiException { logoutUserWithHttpInfo(); @@ -488,6 +501,7 @@ public class UserApi { * Logs out current logged in user session * * @return ApiResponse + * @throws ApiException If fail to call the API, e.g. server error or cannot deserialize the response body */ public ApiResponse logoutUserWithHttpInfo() throws ApiException { Call call = logoutUserCall(null, null); @@ -499,6 +513,7 @@ public class UserApi { * * @param callback The callback to be executed when the API call finishes * @return The request call + * @throws ApiException If fail to process the API call, e.g. serializing the request body object */ public Call logoutUserAsync(final ApiCallback callback) throws ApiException { @@ -579,6 +594,7 @@ public class UserApi { * * @param username The name that needs to be fetched. Use user1 for testing. * @return User + * @throws ApiException If fail to call the API, e.g. server error or cannot deserialize the response body */ public User getUserByName(String username) throws ApiException { ApiResponse resp = getUserByNameWithHttpInfo(username); @@ -590,6 +606,7 @@ public class UserApi { * * @param username The name that needs to be fetched. Use user1 for testing. * @return ApiResponse + * @throws ApiException If fail to call the API, e.g. server error or cannot deserialize the response body */ public ApiResponse getUserByNameWithHttpInfo(String username) throws ApiException { Call call = getUserByNameCall(username, null, null); @@ -603,6 +620,7 @@ public class UserApi { * @param username The name that needs to be fetched. Use user1 for testing. * @param callback The callback to be executed when the API call finishes * @return The request call + * @throws ApiException If fail to process the API call, e.g. serializing the request body object */ public Call getUserByNameAsync(String username, final ApiCallback callback) throws ApiException { @@ -684,6 +702,7 @@ public class UserApi { * This can only be done by the logged in user. * @param username name that need to be deleted * @param body Updated user object + * @throws ApiException If fail to call the API, e.g. server error or cannot deserialize the response body */ public void updateUser(String username, User body) throws ApiException { updateUserWithHttpInfo(username, body); @@ -695,6 +714,7 @@ public class UserApi { * @param username name that need to be deleted * @param body Updated user object * @return ApiResponse + * @throws ApiException If fail to call the API, e.g. server error or cannot deserialize the response body */ public ApiResponse updateUserWithHttpInfo(String username, User body) throws ApiException { Call call = updateUserCall(username, body, null, null); @@ -708,6 +728,7 @@ public class UserApi { * @param body Updated user object * @param callback The callback to be executed when the API call finishes * @return The request call + * @throws ApiException If fail to process the API call, e.g. serializing the request body object */ public Call updateUserAsync(String username, User body, final ApiCallback callback) throws ApiException { @@ -787,6 +808,7 @@ public class UserApi { * Delete user * This can only be done by the logged in user. * @param username The name that needs to be deleted + * @throws ApiException If fail to call the API, e.g. server error or cannot deserialize the response body */ public void deleteUser(String username) throws ApiException { deleteUserWithHttpInfo(username); @@ -797,6 +819,7 @@ public class UserApi { * This can only be done by the logged in user. * @param username The name that needs to be deleted * @return ApiResponse + * @throws ApiException If fail to call the API, e.g. server error or cannot deserialize the response body */ public ApiResponse deleteUserWithHttpInfo(String username) throws ApiException { Call call = deleteUserCall(username, null, null); @@ -809,6 +832,7 @@ public class UserApi { * @param username The name that needs to be deleted * @param callback The callback to be executed when the API call finishes * @return The request call + * @throws ApiException If fail to process the API call, e.g. serializing the request body object */ public Call deleteUserAsync(String username, final ApiCallback callback) throws ApiException { diff --git a/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/auth/ApiKeyAuth.java b/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/auth/ApiKeyAuth.java index 2110aff20d8..8439d297d45 100644 --- a/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/auth/ApiKeyAuth.java +++ b/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/auth/ApiKeyAuth.java @@ -5,7 +5,7 @@ import io.swagger.client.Pair; import java.util.Map; import java.util.List; -@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-11-29T00:18:08.052+08:00") +@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-12-07T12:21:33.403+08:00") public class ApiKeyAuth implements Authentication { private final String location; private final String paramName; diff --git a/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/auth/Authentication.java b/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/auth/Authentication.java index f00217c451e..6817892cce9 100644 --- a/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/auth/Authentication.java +++ b/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/auth/Authentication.java @@ -5,7 +5,7 @@ import io.swagger.client.Pair; import java.util.Map; import java.util.List; -@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-11-29T00:18:08.052+08:00") +@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-12-07T12:21:33.403+08:00") public interface Authentication { /** Apply authentication settings to header and query params. */ void applyToParams(List queryParams, Map headerParams); diff --git a/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/auth/OAuth.java b/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/auth/OAuth.java index b750aaa2360..d0b457bacd8 100644 --- a/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/auth/OAuth.java +++ b/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/auth/OAuth.java @@ -5,7 +5,7 @@ import io.swagger.client.Pair; import java.util.Map; import java.util.List; -@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-11-29T00:18:08.052+08:00") +@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-12-07T12:21:33.403+08:00") public class OAuth implements Authentication { private String accessToken; diff --git a/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/model/Pet.java b/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/model/Pet.java index bc3b80370b0..7e771866b39 100644 --- a/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/model/Pet.java +++ b/samples/client/petstore/java/okhttp-gson/src/main/java/io/swagger/client/model/Pet.java @@ -2,8 +2,8 @@ package io.swagger.client.model; import io.swagger.client.StringUtil; import io.swagger.client.model.Category; -import io.swagger.client.model.Tag; import java.util.*; +import io.swagger.client.model.Tag; import com.google.gson.annotations.SerializedName; From eb4acd097150e8ba991fc4116d7a6b5a86da6163 Mon Sep 17 00:00:00 2001 From: David Kiss Date: Mon, 7 Dec 2015 01:13:20 -0500 Subject: [PATCH 140/211] added unit tests to feign client --- config-feign.json | 1 + .../codegen/languages/JavaClientCodegen.java | 62 +++++- .../Java/libraries/feign/ApiClient.mustache | 2 +- .../libraries/feign/FormAwareEncoder.mustache | 159 ++++++++++++++ .../Java/libraries/feign/api.mustache | 6 +- samples/client/petstore/java/feign/README.md | 43 ++++ .../client/petstore/java/feign/build.gradle | 113 ++++++++++ .../petstore/java/feign/gradle.properties | 2 + samples/client/petstore/java/feign/pom.xml | 183 ++++++++++++++++ .../petstore/java/feign/settings.gradle | 1 + .../java/io/swagger/client/ApiClient.java | 86 ++++++++ .../io/swagger/client/FormAwareEncoder.java | 159 ++++++++++++++ .../java/io/swagger/client/StringUtil.java | 51 +++++ .../java/io/swagger/client/api/PetApi.java | 133 ++++++++++++ .../java/io/swagger/client/api/StoreApi.java | 73 +++++++ .../java/io/swagger/client/api/UserApi.java | 127 +++++++++++ .../io/swagger/client/model/ApiResponse.java | 92 ++++++++ .../io/swagger/client/model/Category.java | 77 +++++++ .../java/io/swagger/client/model/Order.java | 157 ++++++++++++++ .../java/io/swagger/client/model/Pet.java | 159 ++++++++++++++ .../java/io/swagger/client/model/Tag.java | 77 +++++++ .../java/io/swagger/client/model/User.java | 168 +++++++++++++++ .../io/swagger/client/StringUtilTest.java | 32 +++ .../io/swagger/petstore/test/PetApiTest.java | 199 ++++++++++++++++++ .../swagger/petstore/test/StoreApiTest.java | 70 ++++++ .../io/swagger/petstore/test/UserApiTest.java | 85 ++++++++ 26 files changed, 2313 insertions(+), 4 deletions(-) create mode 100644 config-feign.json create mode 100644 modules/swagger-codegen/src/main/resources/Java/libraries/feign/FormAwareEncoder.mustache create mode 100644 samples/client/petstore/java/feign/README.md create mode 100644 samples/client/petstore/java/feign/build.gradle create mode 100644 samples/client/petstore/java/feign/gradle.properties create mode 100644 samples/client/petstore/java/feign/pom.xml create mode 100644 samples/client/petstore/java/feign/settings.gradle create mode 100644 samples/client/petstore/java/feign/src/main/java/io/swagger/client/ApiClient.java create mode 100644 samples/client/petstore/java/feign/src/main/java/io/swagger/client/FormAwareEncoder.java create mode 100644 samples/client/petstore/java/feign/src/main/java/io/swagger/client/StringUtil.java create mode 100644 samples/client/petstore/java/feign/src/main/java/io/swagger/client/api/PetApi.java create mode 100644 samples/client/petstore/java/feign/src/main/java/io/swagger/client/api/StoreApi.java create mode 100644 samples/client/petstore/java/feign/src/main/java/io/swagger/client/api/UserApi.java create mode 100644 samples/client/petstore/java/feign/src/main/java/io/swagger/client/model/ApiResponse.java create mode 100644 samples/client/petstore/java/feign/src/main/java/io/swagger/client/model/Category.java create mode 100644 samples/client/petstore/java/feign/src/main/java/io/swagger/client/model/Order.java create mode 100644 samples/client/petstore/java/feign/src/main/java/io/swagger/client/model/Pet.java create mode 100644 samples/client/petstore/java/feign/src/main/java/io/swagger/client/model/Tag.java create mode 100644 samples/client/petstore/java/feign/src/main/java/io/swagger/client/model/User.java create mode 100644 samples/client/petstore/java/feign/src/test/java/io/swagger/client/StringUtilTest.java create mode 100644 samples/client/petstore/java/feign/src/test/java/io/swagger/petstore/test/PetApiTest.java create mode 100644 samples/client/petstore/java/feign/src/test/java/io/swagger/petstore/test/StoreApiTest.java create mode 100644 samples/client/petstore/java/feign/src/test/java/io/swagger/petstore/test/UserApiTest.java diff --git a/config-feign.json b/config-feign.json new file mode 100644 index 00000000000..3b8c48c3caa --- /dev/null +++ b/config-feign.json @@ -0,0 +1 @@ +{"library":"feign"} \ No newline at end of file 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 1c2ccf2d690..b12894a7300 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 @@ -11,6 +11,12 @@ import io.swagger.codegen.CodegenType; import io.swagger.codegen.DefaultCodegen; import io.swagger.codegen.SupportingFile; import io.swagger.models.Model; +import io.swagger.models.Operation; +import io.swagger.models.Path; +import io.swagger.models.Swagger; +import io.swagger.models.parameters.BodyParameter; +import io.swagger.models.parameters.FormParameter; +import io.swagger.models.parameters.Parameter; import io.swagger.models.properties.ArrayProperty; import io.swagger.models.properties.BooleanProperty; import io.swagger.models.properties.DoubleProperty; @@ -216,7 +222,9 @@ public class JavaClientCodegen extends DefaultCodegen implements CodegenConfig { supportingFiles.add(new SupportingFile("StringUtil.mustache", invokerFolder, "StringUtil.java")); final String authFolder = (sourceFolder + '/' + invokerPackage + ".auth").replace(".", "/"); - if (!"feign".equals(getLibrary())) { + if ("feign".equals(getLibrary())) { + supportingFiles.add(new SupportingFile("FormAwareEncoder.mustache", invokerFolder, "FormAwareEncoder.java")); + } else { supportingFiles.add(new SupportingFile("auth/HttpBasicAuth.mustache", authFolder, "HttpBasicAuth.java")); supportingFiles.add(new SupportingFile("auth/ApiKeyAuth.mustache", authFolder, "ApiKeyAuth.java")); supportingFiles.add(new SupportingFile("auth/OAuth.mustache", authFolder, "OAuth.java")); @@ -544,6 +552,58 @@ public class JavaClientCodegen extends DefaultCodegen implements CodegenConfig { return objs; } + public void preprocessSwagger(Swagger swagger) { + if (swagger != null && swagger.getPaths() != null) { + for (String pathname : swagger.getPaths().keySet()) { + Path path = swagger.getPath(pathname); + if (path.getOperations() != null) { + for (Operation operation : path.getOperations()) { + boolean hasFormParameters = false; + for (Parameter parameter : operation.getParameters()) { + parameter.getVendorExtensions().put("x-isBody", parameter instanceof BodyParameter); + if (parameter instanceof FormParameter) { + hasFormParameters = true; + } + } + + String defaultContentType = hasFormParameters ? "application/x-www-form-urlencoded" : "application/json"; + String contentType = operation.getConsumes() == null || operation.getConsumes().isEmpty() + ? defaultContentType : operation.getConsumes().get(0); + String accepts = getAccept(operation); + operation.setVendorExtension("x-contentType", contentType); + operation.setVendorExtension("x-accepts", accepts); + } + } + } + } + } + + private String getAccept(Operation operation) { + String accepts = null; + String defaultContentType = "application/json"; + if (operation.getProduces() != null && !operation.getProduces().isEmpty()) { + StringBuilder sb = new StringBuilder(); + for (String produces : operation.getProduces()) { + if (defaultContentType.equalsIgnoreCase(produces)) { + accepts = defaultContentType; + break; + } else { + if (sb.length() > 0) { + sb.append(","); + } + sb.append(produces); + } + } + if (accepts == null) { + accepts = sb.toString(); + } + } else { + accepts = defaultContentType; + } + + return accepts; + } + protected boolean needToImport(String type) { return super.needToImport(type) && type.indexOf(".") < 0; } diff --git a/modules/swagger-codegen/src/main/resources/Java/libraries/feign/ApiClient.mustache b/modules/swagger-codegen/src/main/resources/Java/libraries/feign/ApiClient.mustache index 7ce51e909eb..3f2bfcebd5b 100644 --- a/modules/swagger-codegen/src/main/resources/Java/libraries/feign/ApiClient.mustache +++ b/modules/swagger-codegen/src/main/resources/Java/libraries/feign/ApiClient.mustache @@ -46,7 +46,7 @@ public class ApiClient { */ public T buildClient(Class clientClass) { return Feign.builder() - .encoder(new JacksonEncoder(objectMapper)) + .encoder(new FormAwareEncoder(new JacksonEncoder(objectMapper))) .decoder(new JacksonDecoder(objectMapper)) // enable for basic auth: // .requestInterceptor(new feign.auth.BasicAuthRequestInterceptor(username, password)) diff --git a/modules/swagger-codegen/src/main/resources/Java/libraries/feign/FormAwareEncoder.mustache b/modules/swagger-codegen/src/main/resources/Java/libraries/feign/FormAwareEncoder.mustache new file mode 100644 index 00000000000..d0f026cced9 --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/Java/libraries/feign/FormAwareEncoder.mustache @@ -0,0 +1,159 @@ +package {{invokerPackage}}; + +import java.io.*; +import java.lang.reflect.Type; +import java.net.URLEncoder; +import java.net.URLConnection; +import java.util.*; + +import java.text.DateFormat; +import java.text.SimpleDateFormat; + +import feign.codec.Encoder; +import feign.RequestTemplate; + +{{>generatedAnnotation}} +public class FormAwareEncoder implements Encoder { + private static final String LINE_FEED = "\r\n"; + private static final String BOUNDARY = "----------------314159265358979323846"; + + private final Encoder delegate; + private DateFormat dateFormat; + + public FormAwareEncoder(Encoder delegate) { + this.delegate = delegate; + // Use RFC3339 format for date and datetime. + // See http://xml2rfc.ietf.org/public/rfc/html/rfc3339.html#anchor14 + this.dateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSXXX"); + + // Use UTC as the default time zone. + this.dateFormat.setTimeZone(TimeZone.getTimeZone("UTC")); + } + + public void encode(Object object, Type bodyType, RequestTemplate template) { + if (object instanceof Map) { + StringBuilder formParamBuilder = new StringBuilder(); + Map formParams = (Map) object; + boolean isMultiPart = isMultiPart(formParams); + for (Map.Entry param : formParams.entrySet()) { + String keyStr = param.getKey(); + if (param.getValue() instanceof File) { + addFilePart(formParamBuilder, keyStr, (File) param.getValue()); + } else { + String valueStr = parameterToString(param.getValue()); + if (isMultiPart) { + addMultiPartFormField(formParamBuilder, keyStr, valueStr); + } else { + addEncodedFormField(formParamBuilder, keyStr, valueStr); + } + } + } + + if (isMultiPart) { + formParamBuilder.append(LINE_FEED); + formParamBuilder.append("--").append(BOUNDARY).append("--").append(LINE_FEED); + } + + String contentType = isMultiPart ? "multipart/form-data; boundary=" + BOUNDARY : "application/x-www-form-urlencoded"; + template.header("Content-type"); + template.header("Content-type", contentType); + template.header("MIME-Version", "1.0"); + template.body(formParamBuilder.toString()); + } else { + delegate.encode(object, bodyType, template); + } + } + + /* + * Currently only supports text files + */ + private void addFilePart(StringBuilder formParamBuilder, String fieldName, File uploadFile) { + try { + String fileName = uploadFile.getName(); + formParamBuilder.append("--").append(BOUNDARY).append(LINE_FEED); + formParamBuilder.append( + "Content-Disposition: form-data; name=\"" + fieldName + + "\"; filename=\"" + fileName + "\"") + .append(LINE_FEED); + formParamBuilder.append( + "Content-Type: " + + URLConnection.guessContentTypeFromName(fileName)) + .append(LINE_FEED); + formParamBuilder.append(LINE_FEED); + + BufferedReader reader = new BufferedReader(new FileReader(uploadFile)); + String line = ""; + while ((line = reader.readLine()) != null) { + formParamBuilder.append(line).append(LINE_FEED); + } + + formParamBuilder.append(LINE_FEED); + } catch (IOException e) { + e.printStackTrace(); + } + } + + private void addEncodedFormField(StringBuilder formParamBuilder, String name, String value) { + if (formParamBuilder.length() > 0) { + formParamBuilder.append("&"); + } + + try { + formParamBuilder.append(URLEncoder.encode(name, "utf8")) + .append("=") + .append(URLEncoder.encode(value, "utf8")); + } catch (UnsupportedEncodingException e) { + // move on to next + } + } + + private void addMultiPartFormField(StringBuilder formParamBuilder, String name, String value) { + formParamBuilder.append("--").append(BOUNDARY).append(LINE_FEED); + formParamBuilder.append("Content-Disposition: form-data; name=\"" + name + "\"") + .append(LINE_FEED); + formParamBuilder.append("Content-Type: text/plain; charset=utf-8").append( + LINE_FEED); + formParamBuilder.append(LINE_FEED); + formParamBuilder.append(value).append(LINE_FEED); + } + + private boolean isMultiPart(Map formParams) { + boolean isMultiPart = false; + for (Map.Entry entry : formParams.entrySet()) { + if (entry.getValue() instanceof File) { + isMultiPart = true; + break; + } + } + return isMultiPart; + } + + /** + * Format the given parameter object into string. + */ + public String parameterToString(Object param) { + if (param == null) { + return ""; + } else if (param instanceof Date) { + return formatDate((Date) param); + } else if (param instanceof Collection) { + StringBuilder b = new StringBuilder(); + for(Object o : (Collection)param) { + if(b.length() > 0) { + b.append(","); + } + b.append(String.valueOf(o)); + } + return b.toString(); + } else { + return String.valueOf(param); + } + } + + /** + * Format the given Date object into string. + */ + public String formatDate(Date date) { + return dateFormat.format(date); + } +} diff --git a/modules/swagger-codegen/src/main/resources/Java/libraries/feign/api.mustache b/modules/swagger-codegen/src/main/resources/Java/libraries/feign/api.mustache index 772079eebdb..20106806102 100644 --- a/modules/swagger-codegen/src/main/resources/Java/libraries/feign/api.mustache +++ b/modules/swagger-codegen/src/main/resources/Java/libraries/feign/api.mustache @@ -25,10 +25,12 @@ public interface {{classname}} extends {{invokerPackage}}.ApiClient.Api { */ @RequestLine("{{httpMethod}} {{{path}}}{{#hasQueryParams}}?{{/hasQueryParams}}{{#queryParams}}{{paramName}}={{=<% %>=}}{<%paramName%>}<%={{ }}=%>{{#hasMore}}&{{/hasMore}}{{/queryParams}}") @Headers({ - {{#headerParams}}"{{paramName}}: {{=<% %>=}}{<%paramName%>}<%={{ }}=%>"{{#hasMore}}, + "Content-type: {{vendorExtensions.x-contentType}}", + "Accepts: {{vendorExtensions.x-accepts}}",{{#headerParams}} + "{{paramName}}: {{=<% %>=}}{<%paramName%>}<%={{ }}=%>"{{#hasMore}}, {{/hasMore}}{{/headerParams}} }) - {{#returnType}}{{{returnType}}} {{/returnType}}{{^returnType}}void {{/returnType}}{{nickname}} ({{#allParams}}@Param("{{paramName}}") {{{dataType}}} {{paramName}}{{#hasMore}}, {{/hasMore}}{{/allParams}}) throws ApiException; + {{#returnType}}{{{returnType}}} {{/returnType}}{{^returnType}}void {{/returnType}}{{nickname}}({{#allParams}}{{^vendorExtensions.x-isBody}}@Param("{{paramName}}") {{/vendorExtensions.x-isBody}}{{{dataType}}} {{paramName}}{{#hasMore}}, {{/hasMore}}{{/allParams}}) throws ApiException; {{/operation}} {{/operations}} } diff --git a/samples/client/petstore/java/feign/README.md b/samples/client/petstore/java/feign/README.md new file mode 100644 index 00000000000..8afc37518fc --- /dev/null +++ b/samples/client/petstore/java/feign/README.md @@ -0,0 +1,43 @@ +# swagger-java-client + +## Requirements + +Building the API client library requires [Maven](https://maven.apache.org/) to be installed. + +## Installation & Usage + +To install the API client library to your local Maven repository, simply execute: + +```shell +mvn install +``` + +To deploy it to a remote Maven repository instead, configure the settings of the repository and execute: + +```shell +mvn deploy +``` + +Refer to the [official documentation](https://maven.apache.org/plugins/maven-deploy-plugin/usage.html) for more information. + +After the client libarary is installed/deployed, you can use it in your Maven project by adding the following to your *pom.xml*: + +```xml + + io.swagger + swagger-java-client + 1.0.0 + compile + + +``` + +## Recommendation + +It's recommended to create an instance of `ApiClient` per thread in a multithreaded environment to avoid any potential issue. + +## Author + +apiteam@swagger.io + + diff --git a/samples/client/petstore/java/feign/build.gradle b/samples/client/petstore/java/feign/build.gradle new file mode 100644 index 00000000000..383e0a1dc95 --- /dev/null +++ b/samples/client/petstore/java/feign/build.gradle @@ -0,0 +1,113 @@ +group = 'io.swagger' +version = '1.0.0' + +buildscript { + repositories { + jcenter() + } + dependencies { + classpath 'com.android.tools.build:gradle:1.2.2' + classpath 'com.github.dcendents:android-maven-plugin:1.2' + } +} + +repositories { + jcenter() +} + + +if(hasProperty('target') && target == 'android') { + + apply plugin: 'com.android.library' + apply plugin: 'com.github.dcendents.android-maven' + + android { + compileSdkVersion 22 + buildToolsVersion '22.0.0' + defaultConfig { + minSdkVersion 14 + targetSdkVersion 22 + } + compileOptions { + sourceCompatibility JavaVersion.VERSION_1_7 + targetCompatibility JavaVersion.VERSION_1_7 + } + + // Rename the aar correctly + libraryVariants.all { variant -> + variant.outputs.each { output -> + def outputFile = output.outputFile + if (outputFile != null && outputFile.name.endsWith('.aar')) { + def fileName = "${project.name}-${variant.baseName}-${version}.aar" + output.outputFile = new File(outputFile.parent, fileName) + } + } + } + + dependencies { + provided 'javax.annotation:jsr250-api:1.0' + } + } + + afterEvaluate { + android.libraryVariants.all { variant -> + def task = project.tasks.create "jar${variant.name.capitalize()}", Jar + task.description = "Create jar artifact for ${variant.name}" + task.dependsOn variant.javaCompile + task.from variant.javaCompile.destinationDir + task.destinationDir = project.file("${project.buildDir}/outputs/jar") + task.archiveName = "${project.name}-${variant.baseName}-${version}.jar" + artifacts.add('archives', task); + } + } + + task sourcesJar(type: Jar) { + from android.sourceSets.main.java.srcDirs + classifier = 'sources' + } + + artifacts { + archives sourcesJar + } + +} else { + + apply plugin: 'java' + apply plugin: 'maven' + + sourceCompatibility = JavaVersion.VERSION_1_7 + targetCompatibility = JavaVersion.VERSION_1_7 + + install { + repositories.mavenInstaller { + pom.artifactId = 'swagger-java-client' + } + } + + task execute(type:JavaExec) { + main = System.getProperty('mainClass') + classpath = sourceSets.main.runtimeClasspath + } +} + +ext { + swagger_annotations_version = "1.5.0" + jackson_version = "2.6.3" + feign_version = "8.1.1" + jodatime_version = "2.5" + junit_version = "4.12" +} + +dependencies { + compile "io.swagger:swagger-annotations:$swagger_annotations_version" + compile "com.netflix.feign:feign-core:$feign_version" + compile "com.netflix.feign:feign-jackson:$feign_version" + compile "com.netflix.feign:feign-slf4j:$feign_version" + compile "com.fasterxml.jackson.core:jackson-core:$jackson_version" + compile "com.fasterxml.jackson.core:jackson-annotations:$jackson_version" + compile "com.fasterxml.jackson.core:jackson-databind:$jackson_version" + compile "com.fasterxml.jackson.datatype:jackson-datatype-joda:2.1.5" + compile "joda-time:joda-time:$jodatime_version" + compile "com.brsanthu:migbase64:2.2" + testCompile "junit:junit:$junit_version" +} diff --git a/samples/client/petstore/java/feign/gradle.properties b/samples/client/petstore/java/feign/gradle.properties new file mode 100644 index 00000000000..05644f0754a --- /dev/null +++ b/samples/client/petstore/java/feign/gradle.properties @@ -0,0 +1,2 @@ +# Uncomment to build for Android +#target = android \ No newline at end of file diff --git a/samples/client/petstore/java/feign/pom.xml b/samples/client/petstore/java/feign/pom.xml new file mode 100644 index 00000000000..967bdabcc6b --- /dev/null +++ b/samples/client/petstore/java/feign/pom.xml @@ -0,0 +1,183 @@ + + 4.0.0 + io.swagger + swagger-java-client + jar + swagger-java-client + 1.0.0 + + scm:git:git@github.com:swagger-api/swagger-mustache.git + scm:git:git@github.com:swagger-api/swagger-codegen.git + https://github.com/swagger-api/swagger-codegen + + + 2.2.0 + + + + + + org.apache.maven.plugins + maven-surefire-plugin + 2.12 + + + + loggerPath + conf/log4j.properties + + + -Xms512m -Xmx1500m + methods + pertest + + + + maven-dependency-plugin + + + package + + copy-dependencies + + + ${project.build.directory}/lib + + + + + + + + org.apache.maven.plugins + maven-jar-plugin + 2.2 + + + + jar + test-jar + + + + + + + + + org.codehaus.mojo + build-helper-maven-plugin + + + add_sources + generate-sources + + add-source + + + + src/main/java + + + + + add_test_sources + generate-test-sources + + add-test-source + + + + src/test/java + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + 2.3.2 + + 1.6 + 1.6 + + + + + + + io.swagger + swagger-annotations + ${swagger-annotations-version} + + + + + com.netflix.feign + feign-core + ${feign-version} + + + com.netflix.feign + feign-jackson + ${feign-version} + + + com.netflix.feign + feign-slf4j + ${feign-version} + + + + + com.fasterxml.jackson.core + jackson-core + ${jackson-version} + + + com.fasterxml.jackson.core + jackson-annotations + ${jackson-version} + + + com.fasterxml.jackson.core + jackson-databind + ${jackson-version} + + + com.fasterxml.jackson.datatype + jackson-datatype-joda + 2.1.5 + + + joda-time + joda-time + ${jodatime-version} + + + + + com.brsanthu + migbase64 + 2.2 + + + + + junit + junit + ${junit-version} + test + + + + 1.5.0 + 8.1.1 + 2.6.3 + 2.5 + 4.12 + 1.0.0 + + diff --git a/samples/client/petstore/java/feign/settings.gradle b/samples/client/petstore/java/feign/settings.gradle new file mode 100644 index 00000000000..55640f75122 --- /dev/null +++ b/samples/client/petstore/java/feign/settings.gradle @@ -0,0 +1 @@ +rootProject.name = "swagger-java-client" \ No newline at end of file diff --git a/samples/client/petstore/java/feign/src/main/java/io/swagger/client/ApiClient.java b/samples/client/petstore/java/feign/src/main/java/io/swagger/client/ApiClient.java new file mode 100644 index 00000000000..e486c713a92 --- /dev/null +++ b/samples/client/petstore/java/feign/src/main/java/io/swagger/client/ApiClient.java @@ -0,0 +1,86 @@ +package io.swagger.client; + +import com.fasterxml.jackson.databind.DeserializationFeature; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.SerializationFeature; +import feign.Feign; +import feign.jackson.JacksonDecoder; +import feign.jackson.JacksonEncoder; +import feign.slf4j.Slf4jLogger; + +@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-12-07T01:11:21.159-05:00") +public class ApiClient { + public interface Api {} + + private ObjectMapper objectMapper; + private String basePath = "http://petstore.swagger.io/v2"; + + public ApiClient() { + objectMapper = createObjectMapper(); + } + + public String getBasePath() { + return basePath; + } + + public ApiClient setBasePath(String basePath) { + this.basePath = basePath; + return this; + } + + private ObjectMapper createObjectMapper() { + ObjectMapper objectMapper = new ObjectMapper(); + objectMapper.enable(SerializationFeature.WRITE_ENUMS_USING_TO_STRING); + objectMapper.enable(DeserializationFeature.READ_ENUMS_USING_TO_STRING); + return objectMapper; + } + + /** + * Creates a feign client for given API interface. + * + * Usage: + * ApiClient apiClient = new ApiClient(); + * apiClient.setBasePath("http://localhost:8080"); + * XYZApi api = apiClient.buildClient(XYZApi.class); + * XYZResponse response = api.someMethod(...); + */ + public T buildClient(Class clientClass) { + return Feign.builder() + .encoder(new FormAwareEncoder(new JacksonEncoder(objectMapper))) + .decoder(new JacksonDecoder(objectMapper)) +// enable for basic auth: +// .requestInterceptor(new feign.auth.BasicAuthRequestInterceptor(username, password)) + .logger(new Slf4jLogger()) + .target(clientClass, basePath); + } + + /** + * Select the Accept header's value from the given accepts array: + * if JSON exists in the given array, use it; + * otherwise use all of them (joining into a string) + * + * @param accepts The accepts array to select from + * @return The Accept header to use. If the given array is empty, + * null will be returned (not to set the Accept header explicitly). + */ + public String selectHeaderAccept(String[] accepts) { + if (accepts.length == 0) return null; + if (StringUtil.containsIgnoreCase(accepts, "application/json")) return "application/json"; + return StringUtil.join(accepts, ","); + } + + /** + * Select the Content-Type header's value from the given array: + * if JSON exists in the given array, use it; + * otherwise use the first one of the array. + * + * @param contentTypes The Content-Type array to select from + * @return The Content-Type header to use. If the given array is empty, + * JSON will be used. + */ + public String selectHeaderContentType(String[] contentTypes) { + if (contentTypes.length == 0) return "application/json"; + if (StringUtil.containsIgnoreCase(contentTypes, "application/json")) return "application/json"; + return contentTypes[0]; + } +} diff --git a/samples/client/petstore/java/feign/src/main/java/io/swagger/client/FormAwareEncoder.java b/samples/client/petstore/java/feign/src/main/java/io/swagger/client/FormAwareEncoder.java new file mode 100644 index 00000000000..3ec3c6b9274 --- /dev/null +++ b/samples/client/petstore/java/feign/src/main/java/io/swagger/client/FormAwareEncoder.java @@ -0,0 +1,159 @@ +package io.swagger.client; + +import java.io.*; +import java.lang.reflect.Type; +import java.net.URLEncoder; +import java.net.URLConnection; +import java.util.*; + +import java.text.DateFormat; +import java.text.SimpleDateFormat; + +import feign.codec.Encoder; +import feign.RequestTemplate; + +@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-12-07T01:11:21.159-05:00") +public class FormAwareEncoder implements Encoder { + private static final String LINE_FEED = "\r\n"; + private static final String BOUNDARY = "----------------314159265358979323846"; + + private final Encoder delegate; + private DateFormat dateFormat; + + public FormAwareEncoder(Encoder delegate) { + this.delegate = delegate; + // Use RFC3339 format for date and datetime. + // See http://xml2rfc.ietf.org/public/rfc/html/rfc3339.html#anchor14 + this.dateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSXXX"); + + // Use UTC as the default time zone. + this.dateFormat.setTimeZone(TimeZone.getTimeZone("UTC")); + } + + public void encode(Object object, Type bodyType, RequestTemplate template) { + if (object instanceof Map) { + StringBuilder formParamBuilder = new StringBuilder(); + Map formParams = (Map) object; + boolean isMultiPart = isMultiPart(formParams); + for (Map.Entry param : formParams.entrySet()) { + String keyStr = param.getKey(); + if (param.getValue() instanceof File) { + addFilePart(formParamBuilder, keyStr, (File) param.getValue()); + } else { + String valueStr = parameterToString(param.getValue()); + if (isMultiPart) { + addMultiPartFormField(formParamBuilder, keyStr, valueStr); + } else { + addEncodedFormField(formParamBuilder, keyStr, valueStr); + } + } + } + + if (isMultiPart) { + formParamBuilder.append(LINE_FEED); + formParamBuilder.append("--").append(BOUNDARY).append("--").append(LINE_FEED); + } + + String contentType = isMultiPart ? "multipart/form-data; boundary=" + BOUNDARY : "application/x-www-form-urlencoded"; + template.header("Content-type"); + template.header("Content-type", contentType); + template.header("MIME-Version", "1.0"); + template.body(formParamBuilder.toString()); + } else { + delegate.encode(object, bodyType, template); + } + } + + /* + * Currently only supports text files + */ + private void addFilePart(StringBuilder formParamBuilder, String fieldName, File uploadFile) { + try { + String fileName = uploadFile.getName(); + formParamBuilder.append("--").append(BOUNDARY).append(LINE_FEED); + formParamBuilder.append( + "Content-Disposition: form-data; name=\"" + fieldName + + "\"; filename=\"" + fileName + "\"") + .append(LINE_FEED); + formParamBuilder.append( + "Content-Type: " + + URLConnection.guessContentTypeFromName(fileName)) + .append(LINE_FEED); + formParamBuilder.append(LINE_FEED); + + BufferedReader reader = new BufferedReader(new FileReader(uploadFile)); + String line = ""; + while ((line = reader.readLine()) != null) { + formParamBuilder.append(line).append(LINE_FEED); + } + + formParamBuilder.append(LINE_FEED); + } catch (IOException e) { + e.printStackTrace(); + } + } + + private void addEncodedFormField(StringBuilder formParamBuilder, String name, String value) { + if (formParamBuilder.length() > 0) { + formParamBuilder.append("&"); + } + + try { + formParamBuilder.append(URLEncoder.encode(name, "utf8")) + .append("=") + .append(URLEncoder.encode(value, "utf8")); + } catch (UnsupportedEncodingException e) { + // move on to next + } + } + + private void addMultiPartFormField(StringBuilder formParamBuilder, String name, String value) { + formParamBuilder.append("--").append(BOUNDARY).append(LINE_FEED); + formParamBuilder.append("Content-Disposition: form-data; name=\"" + name + "\"") + .append(LINE_FEED); + formParamBuilder.append("Content-Type: text/plain; charset=utf-8").append( + LINE_FEED); + formParamBuilder.append(LINE_FEED); + formParamBuilder.append(value).append(LINE_FEED); + } + + private boolean isMultiPart(Map formParams) { + boolean isMultiPart = false; + for (Map.Entry entry : formParams.entrySet()) { + if (entry.getValue() instanceof File) { + isMultiPart = true; + break; + } + } + return isMultiPart; + } + + /** + * Format the given parameter object into string. + */ + public String parameterToString(Object param) { + if (param == null) { + return ""; + } else if (param instanceof Date) { + return formatDate((Date) param); + } else if (param instanceof Collection) { + StringBuilder b = new StringBuilder(); + for(Object o : (Collection)param) { + if(b.length() > 0) { + b.append(","); + } + b.append(String.valueOf(o)); + } + return b.toString(); + } else { + return String.valueOf(param); + } + } + + /** + * Format the given Date object into string. + */ + public String formatDate(Date date) { + return dateFormat.format(date); + } +} diff --git a/samples/client/petstore/java/feign/src/main/java/io/swagger/client/StringUtil.java b/samples/client/petstore/java/feign/src/main/java/io/swagger/client/StringUtil.java new file mode 100644 index 00000000000..b0704ea88ca --- /dev/null +++ b/samples/client/petstore/java/feign/src/main/java/io/swagger/client/StringUtil.java @@ -0,0 +1,51 @@ +package io.swagger.client; + +@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-12-07T01:11:21.159-05:00") +public class StringUtil { + /** + * Check if the given array contains the given value (with case-insensitive comparison). + * + * @param array The array + * @param value The value to search + * @return true if the array contains the value + */ + public static boolean containsIgnoreCase(String[] array, String value) { + for (String str : array) { + if (value == null && str == null) return true; + if (value != null && value.equalsIgnoreCase(str)) return true; + } + return false; + } + + /** + * Join an array of strings with the given separator. + *

+ * Note: This might be replaced by utility method from commons-lang or guava someday + * if one of those libraries is added as dependency. + *

+ * + * @param array The array of strings + * @param separator The separator + * @return the resulting string + */ + public static String join(String[] array, String separator) { + int len = array.length; + if (len == 0) return ""; + + StringBuilder out = new StringBuilder(); + out.append(array[0]); + for (int i = 1; i < len; i++) { + out.append(separator).append(array[i]); + } + return out.toString(); + } + + /** + * Convert the given object to string with each line indented by 4 spaces + * (except the first line). + */ + public static String toIndentedString(Object o) { + if (o == null) return "null"; + return o.toString().replace("\n", "\n "); + } +} diff --git a/samples/client/petstore/java/feign/src/main/java/io/swagger/client/api/PetApi.java b/samples/client/petstore/java/feign/src/main/java/io/swagger/client/api/PetApi.java new file mode 100644 index 00000000000..e4fe4e4e2bf --- /dev/null +++ b/samples/client/petstore/java/feign/src/main/java/io/swagger/client/api/PetApi.java @@ -0,0 +1,133 @@ +package io.swagger.client.api; + +import io.swagger.client.ApiException; +import io.swagger.client.ApiClient; +import io.swagger.client.Configuration; +import io.swagger.client.Pair; +import io.swagger.client.TypeRef; + +import io.swagger.client.model.Pet; +import java.io.File; +import io.swagger.client.model.ApiResponse; + + +import java.util.*; + +import feign.*; + +@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-12-07T01:11:21.159-05:00") +public interface PetApi extends io.swagger.client.ApiClient.Api { + + + /** + * Update an existing pet + * + * @param body Pet object that needs to be added to the store + * @return void + */ + @RequestLine("PUT /pet") + @Headers({ + "Content-type: application/json", + "Accepts: application/json", + }) + void updatePet(Pet body) throws ApiException; + + /** + * Add a new pet to the store + * + * @param body Pet object that needs to be added to the store + * @return void + */ + @RequestLine("POST /pet") + @Headers({ + "Content-type: application/json", + "Accepts: application/json", + }) + void addPet(Pet body) throws ApiException; + + /** + * Finds Pets by status + * Multiple status values can be provided with comma seperated strings + * @param status Status values that need to be considered for filter + * @return List + */ + @RequestLine("GET /pet/findByStatus?status={status}") + @Headers({ + "Content-type: application/json", + "Accepts: application/json", + }) + List findPetsByStatus(@Param("status") List status) throws ApiException; + + /** + * Finds Pets by tags + * Muliple tags can be provided with comma seperated strings. Use tag1, tag2, tag3 for testing. + * @param tags Tags to filter by + * @return List + */ + @RequestLine("GET /pet/findByTags?tags={tags}") + @Headers({ + "Content-type: application/json", + "Accepts: application/json", + }) + List findPetsByTags(@Param("tags") List tags) throws ApiException; + + /** + * Find pet by ID + * Returns a single pet + * @param petId ID of pet to return + * @return Pet + */ + @RequestLine("GET /pet/{petId}") + @Headers({ + "Content-type: application/json", + "Accepts: application/json", + }) + Pet getPetById(@Param("petId") Long petId) throws ApiException; + + /** + * Updates a pet in the store with form data + * + * @param petId ID of pet that needs to be updated + * @param name Updated name of the pet + * @param status Updated status of the pet + * @return void + */ + @RequestLine("POST /pet/{petId}") + @Headers({ + "Content-type: application/x-www-form-urlencoded", + "Accepts: application/json", + }) + void updatePetWithForm(@Param("petId") Long petId, @Param("name") String name, @Param("status") String status) throws ApiException; + + /** + * Deletes a pet + * + * @param petId Pet id to delete + * @param apiKey + * @return void + */ + @RequestLine("DELETE /pet/{petId}") + @Headers({ + "Content-type: application/json", + "Accepts: application/json", + "apiKey: {apiKey}" + }) + void deletePet(@Param("petId") Long petId, @Param("apiKey") String apiKey) throws ApiException; + + /** + * uploads an image + * + * @param petId ID of pet to update + * @param additionalMetadata Additional data to pass to server + * @param file file to upload + * @return ApiResponse + */ + @RequestLine("POST /pet/{petId}/uploadImage") + @Headers({ + "Content-type: multipart/form-data", + "Accepts: application/json", + }) + ApiResponse uploadFile(@Param("petId") Long petId, @Param("additionalMetadata") String additionalMetadata, @Param("file") File file) throws ApiException; + + +} diff --git a/samples/client/petstore/java/feign/src/main/java/io/swagger/client/api/StoreApi.java b/samples/client/petstore/java/feign/src/main/java/io/swagger/client/api/StoreApi.java new file mode 100644 index 00000000000..87321de5df7 --- /dev/null +++ b/samples/client/petstore/java/feign/src/main/java/io/swagger/client/api/StoreApi.java @@ -0,0 +1,73 @@ +package io.swagger.client.api; + +import io.swagger.client.ApiException; +import io.swagger.client.ApiClient; +import io.swagger.client.Configuration; +import io.swagger.client.Pair; +import io.swagger.client.TypeRef; + +import java.util.Map; +import io.swagger.client.model.Order; + + +import java.util.*; + +import feign.*; + +@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-12-07T01:11:21.159-05:00") +public interface StoreApi extends io.swagger.client.ApiClient.Api { + + + /** + * Returns pet inventories by status + * Returns a map of status codes to quantities + * @return Map + */ + @RequestLine("GET /store/inventory") + @Headers({ + "Content-type: application/json", + "Accepts: application/json", + }) + Map getInventory() throws ApiException; + + /** + * Place an order for a pet + * + * @param body order placed for purchasing the pet + * @return Order + */ + @RequestLine("POST /store/order") + @Headers({ + "Content-type: application/json", + "Accepts: application/json", + }) + Order placeOrder(Order body) throws ApiException; + + /** + * Find purchase order by ID + * For valid response try integer IDs with value <= 5 or > 10. Other values will generated exceptions + * @param orderId ID of pet that needs to be fetched + * @return Order + */ + @RequestLine("GET /store/order/{orderId}") + @Headers({ + "Content-type: application/json", + "Accepts: application/json", + }) + Order getOrderById(@Param("orderId") Long orderId) throws ApiException; + + /** + * Delete purchase order by ID + * For valid response try integer IDs with value < 1000. Anything above 1000 or nonintegers will generate API errors + * @param orderId ID of the order that needs to be deleted + * @return void + */ + @RequestLine("DELETE /store/order/{orderId}") + @Headers({ + "Content-type: application/json", + "Accepts: application/json", + }) + void deleteOrder(@Param("orderId") String orderId) throws ApiException; + + +} diff --git a/samples/client/petstore/java/feign/src/main/java/io/swagger/client/api/UserApi.java b/samples/client/petstore/java/feign/src/main/java/io/swagger/client/api/UserApi.java new file mode 100644 index 00000000000..070ca861818 --- /dev/null +++ b/samples/client/petstore/java/feign/src/main/java/io/swagger/client/api/UserApi.java @@ -0,0 +1,127 @@ +package io.swagger.client.api; + +import io.swagger.client.ApiException; +import io.swagger.client.ApiClient; +import io.swagger.client.Configuration; +import io.swagger.client.Pair; +import io.swagger.client.TypeRef; + +import io.swagger.client.model.User; +import java.util.*; + + +import java.util.*; + +import feign.*; + +@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-12-07T01:11:21.159-05:00") +public interface UserApi extends io.swagger.client.ApiClient.Api { + + + /** + * Create user + * This can only be done by the logged in user. + * @param body Created user object + * @return void + */ + @RequestLine("POST /user") + @Headers({ + "Content-type: application/json", + "Accepts: application/json", + }) + void createUser(User body) throws ApiException; + + /** + * Creates list of users with given input array + * + * @param body List of user object + * @return void + */ + @RequestLine("POST /user/createWithArray") + @Headers({ + "Content-type: application/json", + "Accepts: application/json", + }) + void createUsersWithArrayInput(List body) throws ApiException; + + /** + * Creates list of users with given input array + * + * @param body List of user object + * @return void + */ + @RequestLine("POST /user/createWithList") + @Headers({ + "Content-type: application/json", + "Accepts: application/json", + }) + void createUsersWithListInput(List body) throws ApiException; + + /** + * Logs user into the system + * + * @param username The user name for login + * @param password The password for login in clear text + * @return String + */ + @RequestLine("GET /user/login?username={username}&password={password}") + @Headers({ + "Content-type: application/json", + "Accepts: application/json", + }) + String loginUser(@Param("username") String username, @Param("password") String password) throws ApiException; + + /** + * Logs out current logged in user session + * + * @return void + */ + @RequestLine("GET /user/logout") + @Headers({ + "Content-type: application/json", + "Accepts: application/json", + }) + void logoutUser() throws ApiException; + + /** + * Get user by user name + * + * @param username The name that needs to be fetched. Use user1 for testing. + * @return User + */ + @RequestLine("GET /user/{username}") + @Headers({ + "Content-type: application/json", + "Accepts: application/json", + }) + User getUserByName(@Param("username") String username) throws ApiException; + + /** + * Updated user + * This can only be done by the logged in user. + * @param username name that need to be deleted + * @param body Updated user object + * @return void + */ + @RequestLine("PUT /user/{username}") + @Headers({ + "Content-type: application/json", + "Accepts: application/json", + }) + void updateUser(@Param("username") String username, User body) throws ApiException; + + /** + * Delete user + * This can only be done by the logged in user. + * @param username The name that needs to be deleted + * @return void + */ + @RequestLine("DELETE /user/{username}") + @Headers({ + "Content-type: application/json", + "Accepts: application/json", + }) + void deleteUser(@Param("username") String username) throws ApiException; + + +} diff --git a/samples/client/petstore/java/feign/src/main/java/io/swagger/client/model/ApiResponse.java b/samples/client/petstore/java/feign/src/main/java/io/swagger/client/model/ApiResponse.java new file mode 100644 index 00000000000..f06d10acff2 --- /dev/null +++ b/samples/client/petstore/java/feign/src/main/java/io/swagger/client/model/ApiResponse.java @@ -0,0 +1,92 @@ +package io.swagger.client.model; + +import io.swagger.client.StringUtil; + + + +import java.util.Objects; + +import io.swagger.annotations.*; +import com.fasterxml.jackson.annotation.JsonProperty; + + + +@ApiModel(description = "") +@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-12-07T01:11:21.159-05:00") +public class ApiResponse { + + private Integer code = null; + private String type = null; + private String message = null; + + + /** + **/ + @ApiModelProperty(value = "") + @JsonProperty("code") + public Integer getCode() { + return code; + } + public void setCode(Integer code) { + this.code = code; + } + + + /** + **/ + @ApiModelProperty(value = "") + @JsonProperty("type") + public String getType() { + return type; + } + public void setType(String type) { + this.type = type; + } + + + /** + **/ + @ApiModelProperty(value = "") + @JsonProperty("message") + public String getMessage() { + return message; + } + public void setMessage(String message) { + this.message = message; + } + + + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + ApiResponse apiResponse = (ApiResponse) o; + return Objects.equals(code, apiResponse.code) && + Objects.equals(type, apiResponse.type) && + Objects.equals(message, apiResponse.message); + } + + @Override + public int hashCode() { + return Objects.hash(code, type, message); + } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append("class ApiResponse {\n"); + + sb.append(" code: ").append(StringUtil.toIndentedString(code)).append("\n"); + sb.append(" type: ").append(StringUtil.toIndentedString(type)).append("\n"); + sb.append(" message: ").append(StringUtil.toIndentedString(message)).append("\n"); + sb.append("}"); + return sb.toString(); + } +} + + diff --git a/samples/client/petstore/java/feign/src/main/java/io/swagger/client/model/Category.java b/samples/client/petstore/java/feign/src/main/java/io/swagger/client/model/Category.java new file mode 100644 index 00000000000..8edf7db0051 --- /dev/null +++ b/samples/client/petstore/java/feign/src/main/java/io/swagger/client/model/Category.java @@ -0,0 +1,77 @@ +package io.swagger.client.model; + +import io.swagger.client.StringUtil; + + + +import java.util.Objects; + +import io.swagger.annotations.*; +import com.fasterxml.jackson.annotation.JsonProperty; + + + +@ApiModel(description = "") +@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-12-07T01:11:21.159-05:00") +public class Category { + + private Long id = null; + private String name = null; + + + /** + **/ + @ApiModelProperty(value = "") + @JsonProperty("id") + public Long getId() { + return id; + } + public void setId(Long id) { + this.id = id; + } + + + /** + **/ + @ApiModelProperty(value = "") + @JsonProperty("name") + public String getName() { + return name; + } + public void setName(String name) { + this.name = name; + } + + + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + Category category = (Category) o; + return Objects.equals(id, category.id) && + Objects.equals(name, category.name); + } + + @Override + public int hashCode() { + return Objects.hash(id, name); + } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append("class Category {\n"); + + sb.append(" id: ").append(StringUtil.toIndentedString(id)).append("\n"); + sb.append(" name: ").append(StringUtil.toIndentedString(name)).append("\n"); + sb.append("}"); + return sb.toString(); + } +} + + diff --git a/samples/client/petstore/java/feign/src/main/java/io/swagger/client/model/Order.java b/samples/client/petstore/java/feign/src/main/java/io/swagger/client/model/Order.java new file mode 100644 index 00000000000..a057e4899f0 --- /dev/null +++ b/samples/client/petstore/java/feign/src/main/java/io/swagger/client/model/Order.java @@ -0,0 +1,157 @@ +package io.swagger.client.model; + +import io.swagger.client.StringUtil; +import java.util.Date; + + + +import java.util.Objects; + +import io.swagger.annotations.*; +import com.fasterxml.jackson.annotation.JsonProperty; + + + +@ApiModel(description = "") +@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-12-07T01:11:21.159-05:00") +public class Order { + + private Long id = null; + private Long petId = null; + private Integer quantity = null; + private Date shipDate = null; + +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 = false; + + + /** + **/ + @ApiModelProperty(value = "") + @JsonProperty("id") + public Long getId() { + return id; + } + public void setId(Long id) { + this.id = id; + } + + + /** + **/ + @ApiModelProperty(value = "") + @JsonProperty("petId") + public Long getPetId() { + return petId; + } + public void setPetId(Long petId) { + this.petId = petId; + } + + + /** + **/ + @ApiModelProperty(value = "") + @JsonProperty("quantity") + public Integer getQuantity() { + return quantity; + } + public void setQuantity(Integer quantity) { + this.quantity = quantity; + } + + + /** + **/ + @ApiModelProperty(value = "") + @JsonProperty("shipDate") + public Date getShipDate() { + return shipDate; + } + public void setShipDate(Date shipDate) { + this.shipDate = shipDate; + } + + + /** + * Order Status + **/ + @ApiModelProperty(value = "Order Status") + @JsonProperty("status") + public StatusEnum getStatus() { + return status; + } + public void setStatus(StatusEnum status) { + this.status = status; + } + + + /** + **/ + @ApiModelProperty(value = "") + @JsonProperty("complete") + public Boolean getComplete() { + return complete; + } + public void setComplete(Boolean complete) { + this.complete = complete; + } + + + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + Order order = (Order) o; + return Objects.equals(id, order.id) && + Objects.equals(petId, order.petId) && + Objects.equals(quantity, order.quantity) && + Objects.equals(shipDate, order.shipDate) && + Objects.equals(status, order.status) && + Objects.equals(complete, order.complete); + } + + @Override + public int hashCode() { + return Objects.hash(id, petId, quantity, shipDate, status, complete); + } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append("class Order {\n"); + + sb.append(" id: ").append(StringUtil.toIndentedString(id)).append("\n"); + sb.append(" petId: ").append(StringUtil.toIndentedString(petId)).append("\n"); + sb.append(" quantity: ").append(StringUtil.toIndentedString(quantity)).append("\n"); + sb.append(" shipDate: ").append(StringUtil.toIndentedString(shipDate)).append("\n"); + sb.append(" status: ").append(StringUtil.toIndentedString(status)).append("\n"); + sb.append(" complete: ").append(StringUtil.toIndentedString(complete)).append("\n"); + sb.append("}"); + return sb.toString(); + } +} + + diff --git a/samples/client/petstore/java/feign/src/main/java/io/swagger/client/model/Pet.java b/samples/client/petstore/java/feign/src/main/java/io/swagger/client/model/Pet.java new file mode 100644 index 00000000000..a844cfa8a83 --- /dev/null +++ b/samples/client/petstore/java/feign/src/main/java/io/swagger/client/model/Pet.java @@ -0,0 +1,159 @@ +package io.swagger.client.model; + +import io.swagger.client.StringUtil; +import io.swagger.client.model.Category; +import java.util.*; +import io.swagger.client.model.Tag; + + + +import java.util.Objects; + +import io.swagger.annotations.*; +import com.fasterxml.jackson.annotation.JsonProperty; + + + +@ApiModel(description = "") +@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-12-07T01:11:21.159-05: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("available"), + PENDING("pending"), + SOLD("sold"); + + private String value; + + StatusEnum(String value) { + this.value = value; + } + + @Override + public String toString() { + return value; + } +} + + private StatusEnum status = null; + + + /** + **/ + @ApiModelProperty(value = "") + @JsonProperty("id") + public Long getId() { + return id; + } + public void setId(Long id) { + this.id = id; + } + + + /** + **/ + @ApiModelProperty(value = "") + @JsonProperty("category") + public Category getCategory() { + return category; + } + public void setCategory(Category category) { + this.category = category; + } + + + /** + **/ + @ApiModelProperty(required = true, value = "") + @JsonProperty("name") + public String getName() { + return name; + } + public void setName(String name) { + this.name = name; + } + + + /** + **/ + @ApiModelProperty(required = true, value = "") + @JsonProperty("photoUrls") + public List getPhotoUrls() { + return photoUrls; + } + public void setPhotoUrls(List photoUrls) { + this.photoUrls = photoUrls; + } + + + /** + **/ + @ApiModelProperty(value = "") + @JsonProperty("tags") + public List getTags() { + return tags; + } + public void setTags(List tags) { + this.tags = tags; + } + + + /** + * pet status in the store + **/ + @ApiModelProperty(value = "pet status in the store") + @JsonProperty("status") + public StatusEnum getStatus() { + return status; + } + public void setStatus(StatusEnum status) { + this.status = status; + } + + + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + Pet pet = (Pet) o; + return Objects.equals(id, pet.id) && + Objects.equals(category, pet.category) && + Objects.equals(name, pet.name) && + Objects.equals(photoUrls, pet.photoUrls) && + Objects.equals(tags, pet.tags) && + Objects.equals(status, pet.status); + } + + @Override + public int hashCode() { + return Objects.hash(id, category, name, photoUrls, tags, status); + } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append("class Pet {\n"); + + sb.append(" id: ").append(StringUtil.toIndentedString(id)).append("\n"); + sb.append(" category: ").append(StringUtil.toIndentedString(category)).append("\n"); + sb.append(" name: ").append(StringUtil.toIndentedString(name)).append("\n"); + sb.append(" photoUrls: ").append(StringUtil.toIndentedString(photoUrls)).append("\n"); + sb.append(" tags: ").append(StringUtil.toIndentedString(tags)).append("\n"); + sb.append(" status: ").append(StringUtil.toIndentedString(status)).append("\n"); + sb.append("}"); + return sb.toString(); + } +} + + diff --git a/samples/client/petstore/java/feign/src/main/java/io/swagger/client/model/Tag.java b/samples/client/petstore/java/feign/src/main/java/io/swagger/client/model/Tag.java new file mode 100644 index 00000000000..7995cbcaa9c --- /dev/null +++ b/samples/client/petstore/java/feign/src/main/java/io/swagger/client/model/Tag.java @@ -0,0 +1,77 @@ +package io.swagger.client.model; + +import io.swagger.client.StringUtil; + + + +import java.util.Objects; + +import io.swagger.annotations.*; +import com.fasterxml.jackson.annotation.JsonProperty; + + + +@ApiModel(description = "") +@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-12-07T01:11:21.159-05:00") +public class Tag { + + private Long id = null; + private String name = null; + + + /** + **/ + @ApiModelProperty(value = "") + @JsonProperty("id") + public Long getId() { + return id; + } + public void setId(Long id) { + this.id = id; + } + + + /** + **/ + @ApiModelProperty(value = "") + @JsonProperty("name") + public String getName() { + return name; + } + public void setName(String name) { + this.name = name; + } + + + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + Tag tag = (Tag) o; + return Objects.equals(id, tag.id) && + Objects.equals(name, tag.name); + } + + @Override + public int hashCode() { + return Objects.hash(id, name); + } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append("class Tag {\n"); + + sb.append(" id: ").append(StringUtil.toIndentedString(id)).append("\n"); + sb.append(" name: ").append(StringUtil.toIndentedString(name)).append("\n"); + sb.append("}"); + return sb.toString(); + } +} + + diff --git a/samples/client/petstore/java/feign/src/main/java/io/swagger/client/model/User.java b/samples/client/petstore/java/feign/src/main/java/io/swagger/client/model/User.java new file mode 100644 index 00000000000..d0d004b8c11 --- /dev/null +++ b/samples/client/petstore/java/feign/src/main/java/io/swagger/client/model/User.java @@ -0,0 +1,168 @@ +package io.swagger.client.model; + +import io.swagger.client.StringUtil; + + + +import java.util.Objects; + +import io.swagger.annotations.*; +import com.fasterxml.jackson.annotation.JsonProperty; + + + +@ApiModel(description = "") +@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-12-07T01:11:21.159-05:00") +public class User { + + private Long id = null; + private String username = null; + private String firstName = null; + private String lastName = null; + private String email = null; + private String password = null; + private String phone = null; + private Integer userStatus = null; + + + /** + **/ + @ApiModelProperty(value = "") + @JsonProperty("id") + public Long getId() { + return id; + } + public void setId(Long id) { + this.id = id; + } + + + /** + **/ + @ApiModelProperty(value = "") + @JsonProperty("username") + public String getUsername() { + return username; + } + public void setUsername(String username) { + this.username = username; + } + + + /** + **/ + @ApiModelProperty(value = "") + @JsonProperty("firstName") + public String getFirstName() { + return firstName; + } + public void setFirstName(String firstName) { + this.firstName = firstName; + } + + + /** + **/ + @ApiModelProperty(value = "") + @JsonProperty("lastName") + public String getLastName() { + return lastName; + } + public void setLastName(String lastName) { + this.lastName = lastName; + } + + + /** + **/ + @ApiModelProperty(value = "") + @JsonProperty("email") + public String getEmail() { + return email; + } + public void setEmail(String email) { + this.email = email; + } + + + /** + **/ + @ApiModelProperty(value = "") + @JsonProperty("password") + public String getPassword() { + return password; + } + public void setPassword(String password) { + this.password = password; + } + + + /** + **/ + @ApiModelProperty(value = "") + @JsonProperty("phone") + public String getPhone() { + return phone; + } + public void setPhone(String phone) { + this.phone = phone; + } + + + /** + * User Status + **/ + @ApiModelProperty(value = "User Status") + @JsonProperty("userStatus") + public Integer getUserStatus() { + return userStatus; + } + public void setUserStatus(Integer userStatus) { + this.userStatus = userStatus; + } + + + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + User user = (User) o; + return Objects.equals(id, user.id) && + Objects.equals(username, user.username) && + Objects.equals(firstName, user.firstName) && + Objects.equals(lastName, user.lastName) && + Objects.equals(email, user.email) && + Objects.equals(password, user.password) && + Objects.equals(phone, user.phone) && + Objects.equals(userStatus, user.userStatus); + } + + @Override + public int hashCode() { + return Objects.hash(id, username, firstName, lastName, email, password, phone, userStatus); + } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append("class User {\n"); + + sb.append(" id: ").append(StringUtil.toIndentedString(id)).append("\n"); + sb.append(" username: ").append(StringUtil.toIndentedString(username)).append("\n"); + sb.append(" firstName: ").append(StringUtil.toIndentedString(firstName)).append("\n"); + sb.append(" lastName: ").append(StringUtil.toIndentedString(lastName)).append("\n"); + sb.append(" email: ").append(StringUtil.toIndentedString(email)).append("\n"); + sb.append(" password: ").append(StringUtil.toIndentedString(password)).append("\n"); + sb.append(" phone: ").append(StringUtil.toIndentedString(phone)).append("\n"); + sb.append(" userStatus: ").append(StringUtil.toIndentedString(userStatus)).append("\n"); + sb.append("}"); + return sb.toString(); + } +} + + diff --git a/samples/client/petstore/java/feign/src/test/java/io/swagger/client/StringUtilTest.java b/samples/client/petstore/java/feign/src/test/java/io/swagger/client/StringUtilTest.java new file mode 100644 index 00000000000..c93908b8482 --- /dev/null +++ b/samples/client/petstore/java/feign/src/test/java/io/swagger/client/StringUtilTest.java @@ -0,0 +1,32 @@ +package io.swagger.client; + +import org.junit.*; +import static org.junit.Assert.*; + +public class StringUtilTest { + @Test + public void testContainsIgnoreCase() { + assertTrue(StringUtil.containsIgnoreCase(new String[]{"abc"}, "abc")); + assertTrue(StringUtil.containsIgnoreCase(new String[]{"abc"}, "ABC")); + assertTrue(StringUtil.containsIgnoreCase(new String[]{"ABC"}, "abc")); + assertTrue(StringUtil.containsIgnoreCase(new String[]{null, "abc"}, "ABC")); + assertTrue(StringUtil.containsIgnoreCase(new String[]{null, "abc"}, null)); + + assertFalse(StringUtil.containsIgnoreCase(new String[]{"abc"}, "def")); + assertFalse(StringUtil.containsIgnoreCase(new String[]{}, "ABC")); + assertFalse(StringUtil.containsIgnoreCase(new String[]{}, null)); + } + + @Test + public void testJoin() { + String[] array = {"aa", "bb", "cc"}; + assertEquals("aa,bb,cc", StringUtil.join(array, ",")); + assertEquals("aa, bb, cc", StringUtil.join(array, ", ")); + assertEquals("aabbcc", StringUtil.join(array, "")); + assertEquals("aa bb cc", StringUtil.join(array, " ")); + assertEquals("aa\nbb\ncc", StringUtil.join(array, "\n")); + + assertEquals("", StringUtil.join(new String[]{}, ",")); + assertEquals("abc", StringUtil.join(new String[]{"abc"}, ",")); + } +} \ No newline at end of file diff --git a/samples/client/petstore/java/feign/src/test/java/io/swagger/petstore/test/PetApiTest.java b/samples/client/petstore/java/feign/src/test/java/io/swagger/petstore/test/PetApiTest.java new file mode 100644 index 00000000000..402d60b37c2 --- /dev/null +++ b/samples/client/petstore/java/feign/src/test/java/io/swagger/petstore/test/PetApiTest.java @@ -0,0 +1,199 @@ +package io.swagger.petstore.test; + +import io.swagger.client.ApiClient; + +import io.swagger.client.api.*; +import io.swagger.client.model.*; + +import java.io.BufferedWriter; +import java.io.File; +import java.io.FileWriter; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +import org.junit.*; +import static org.junit.Assert.*; + +public class PetApiTest { + ApiClient apiClient; + PetApi api; + + @Before + public void setup() { + apiClient = new ApiClient(); + api = apiClient.buildClient(PetApi.class); + } + + @Test + public void testApiClient() { + // the default api client is used + assertEquals("http://petstore.swagger.io/v2", apiClient.getBasePath()); + + ApiClient newClient = new ApiClient(); + newClient.setBasePath("http://example.com"); + + assertEquals("http://example.com", newClient.getBasePath()); + } + + @Test + public void testCreateAndGetPet() throws Exception { + Pet pet = createRandomPet(); + api.addPet(pet); + + Pet fetched = api.getPetById(pet.getId()); + assertNotNull(fetched); + assertEquals(pet.getId(), fetched.getId()); + assertNotNull(fetched.getCategory()); + assertEquals(fetched.getCategory().getName(), pet.getCategory().getName()); + } + + @Test + public void testUpdatePet() throws Exception { + Pet pet = createRandomPet(); + pet.setName("programmer"); + + api.updatePet(pet); + + Pet fetched = api.getPetById(pet.getId()); + assertNotNull(fetched); + assertEquals(pet.getId(), fetched.getId()); + assertNotNull(fetched.getCategory()); + assertEquals(fetched.getCategory().getName(), pet.getCategory().getName()); + } + + @Test + public void testFindPetsByStatus() throws Exception { + Pet pet = createRandomPet(); + pet.setName("programmer"); + pet.setStatus(Pet.StatusEnum.AVAILABLE); + + api.updatePet(pet); + + List pets = api.findPetsByStatus(Arrays.asList(new String[]{"available"})); + assertNotNull(pets); + + boolean found = false; + for (Pet fetched : pets) { + if (fetched.getId().equals(pet.getId())) { + found = true; + break; + } + } + + assertTrue(found); + } + + @Test + public void testFindPetsByTags() throws Exception { + Pet pet = createRandomPet(); + pet.setName("monster"); + pet.setStatus(Pet.StatusEnum.AVAILABLE); + + List tags = new ArrayList(); + Tag tag1 = new Tag(); + tag1.setName("friendly"); + tags.add(tag1); + pet.setTags(tags); + + api.updatePet(pet); + + List pets = api.findPetsByTags(Arrays.asList(new String[]{"friendly"})); + assertNotNull(pets); + + boolean found = false; + for (Pet fetched : pets) { + if (fetched.getId().equals(pet.getId())) { + found = true; + break; + } + } + assertTrue(found); + } + + @Test + public void testUpdatePetWithForm() throws Exception { + Pet pet = createRandomPet(); + pet.setName("frank"); + api.addPet(pet); + + Pet fetched = api.getPetById(pet.getId()); + + api.updatePetWithForm(fetched.getId(), "furt", null); + Pet updated = api.getPetById(fetched.getId()); + + assertEquals(updated.getName(), "furt"); + } + + @Test + public void testDeletePet() throws Exception { + Pet pet = createRandomPet(); + api.addPet(pet); + + Pet fetched = api.getPetById(pet.getId()); + api.deletePet(fetched.getId(), null); + + try { + fetched = api.getPetById(fetched.getId()); + fail("expected an error"); + } catch (Exception e) { +// assertEquals(404, e.getCode()); + } + } + + @Test + public void testUploadFile() throws Exception { + Pet pet = createRandomPet(); + api.addPet(pet); + + File file = new File("hello.txt"); + BufferedWriter writer = new BufferedWriter(new FileWriter(file)); + writer.write("Hello world!"); + writer.close(); + + api.uploadFile(pet.getId(), "a test file", new File(file.getAbsolutePath())); + } + + @Test + public void testEqualsAndHashCode() { + Pet pet1 = new Pet(); + Pet pet2 = new Pet(); + assertTrue(pet1.equals(pet2)); + assertTrue(pet2.equals(pet1)); + assertTrue(pet1.hashCode() == pet2.hashCode()); + assertTrue(pet1.equals(pet1)); + assertTrue(pet1.hashCode() == pet1.hashCode()); + + pet2.setName("really-happy"); + pet2.setPhotoUrls(Arrays.asList(new String[]{"http://foo.bar.com/1", "http://foo.bar.com/2"})); + assertFalse(pet1.equals(pet2)); + assertFalse(pet2.equals(pet1)); + assertFalse(pet1.hashCode() == (pet2.hashCode())); + assertTrue(pet2.equals(pet2)); + assertTrue(pet2.hashCode() == pet2.hashCode()); + + pet1.setName("really-happy"); + pet1.setPhotoUrls(Arrays.asList(new String[]{"http://foo.bar.com/1", "http://foo.bar.com/2"})); + assertTrue(pet1.equals(pet2)); + assertTrue(pet2.equals(pet1)); + assertTrue(pet1.hashCode() == pet2.hashCode()); + assertTrue(pet1.equals(pet1)); + assertTrue(pet1.hashCode() == pet1.hashCode()); + } + + private Pet createRandomPet() { + Pet pet = new Pet(); + pet.setId(System.currentTimeMillis()); + pet.setName("gorilla"); + + Category category = new Category(); + category.setName("really-happy"); + + pet.setCategory(category); + pet.setStatus(Pet.StatusEnum.AVAILABLE); + List photos = Arrays.asList(new String[]{"http://foo.bar.com/1", "http://foo.bar.com/2"}); + pet.setPhotoUrls(photos); + + return pet; + } +} \ No newline at end of file diff --git a/samples/client/petstore/java/feign/src/test/java/io/swagger/petstore/test/StoreApiTest.java b/samples/client/petstore/java/feign/src/test/java/io/swagger/petstore/test/StoreApiTest.java new file mode 100644 index 00000000000..060e73e5efd --- /dev/null +++ b/samples/client/petstore/java/feign/src/test/java/io/swagger/petstore/test/StoreApiTest.java @@ -0,0 +1,70 @@ +package io.swagger.petstore.test; + +import io.swagger.client.ApiException; + +import io.swagger.client.*; +import io.swagger.client.api.*; +import io.swagger.client.model.*; + +import java.util.Map; + +import org.junit.*; +import static org.junit.Assert.*; + +public class StoreApiTest { + ApiClient apiClient; + StoreApi api; + + @Before + public void setup() { + apiClient = new ApiClient(); + api = apiClient.buildClient(StoreApi.class); + } + + @Test + public void testGetInventory() throws Exception { + Map inventory = api.getInventory(); + assertTrue(inventory.keySet().size() > 0); + } + + @Test + public void testPlaceOrder() throws Exception { + Order order = createOrder(); + api.placeOrder(order); + + Order fetched = api.getOrderById(order.getId()); + assertEquals(order.getId(), fetched.getId()); + assertEquals(order.getPetId(), fetched.getPetId()); + assertEquals(order.getQuantity(), fetched.getQuantity()); + } + + @Test + public void testDeleteOrder() throws Exception { + Order order = createOrder(); + api.placeOrder(order); + + Order fetched = api.getOrderById(order.getId()); + assertEquals(fetched.getId(), order.getId()); + + api.deleteOrder(String.valueOf(order.getId())); + + try { + api.getOrderById(order.getId()); + // fail("expected an error"); + } catch (ApiException e) { + // ok + } + } + + private Order createOrder() { + Order order = new Order(); + order.setId(new Long(System.currentTimeMillis())); + order.setPetId(new Long(200)); + order.setQuantity(new Integer(13)); + order.setShipDate(new java.util.Date()); + order.setStatus(Order.StatusEnum.PLACED); + order.setComplete(true); + + return order; + } +} \ No newline at end of file diff --git a/samples/client/petstore/java/feign/src/test/java/io/swagger/petstore/test/UserApiTest.java b/samples/client/petstore/java/feign/src/test/java/io/swagger/petstore/test/UserApiTest.java new file mode 100644 index 00000000000..dc2d3ac17ca --- /dev/null +++ b/samples/client/petstore/java/feign/src/test/java/io/swagger/petstore/test/UserApiTest.java @@ -0,0 +1,85 @@ +package io.swagger.petstore.test; + +import io.swagger.client.ApiClient; +import io.swagger.client.api.*; +import io.swagger.client.model.*; + +import java.util.Arrays; + +import org.junit.*; +import static org.junit.Assert.*; + +public class UserApiTest { + ApiClient apiClient; + UserApi api; + + @Before + public void setup() { + apiClient = new ApiClient(); + api = apiClient.buildClient(UserApi.class); + } + + @Test + public void testCreateUser() throws Exception { + User user = createUser(); + + api.createUser(user); + + User fetched = api.getUserByName(user.getUsername()); + assertEquals(user.getId(), fetched.getId()); + } + + @Test + public void testCreateUsersWithArray() throws Exception { + User user1 = createUser(); + user1.setUsername("abc123"); + User user2 = createUser(); + user2.setUsername("123abc"); + + api.createUsersWithArrayInput(Arrays.asList(new User[]{user1, user2})); + + User fetched = api.getUserByName(user1.getUsername()); + assertEquals(user1.getId(), fetched.getId()); + } + + @Test + public void testCreateUsersWithList() throws Exception { + User user1 = createUser(); + user1.setUsername("abc123"); + User user2 = createUser(); + user2.setUsername("123abc"); + + api.createUsersWithListInput(Arrays.asList(new User[]{user1, user2})); + + User fetched = api.getUserByName(user1.getUsername()); + assertEquals(user1.getId(), fetched.getId()); + } + + @Test + public void testLoginUser() throws Exception { + User user = createUser(); + api.createUser(user); + + String token = api.loginUser(user.getUsername(), user.getPassword()); + assertTrue(token.startsWith("logged in user session:")); + } + + @Test + public void logoutUser() throws Exception { + api.logoutUser(); + } + + private User createUser() { + User user = new User(); + user.setId(System.currentTimeMillis()); + user.setUsername("fred" + user.getId()); + user.setFirstName("Fred"); + user.setLastName("Meyer"); + user.setEmail("fred@fredmeyer.com"); + user.setPassword("xxXXxx"); + user.setPhone("408-867-5309"); + user.setUserStatus(123); + + return user; + } +} \ No newline at end of file From 66112d9eb5bc228cc53bce0958570d6a64ad70cc Mon Sep 17 00:00:00 2001 From: xhh Date: Mon, 7 Dec 2015 15:48:59 +0800 Subject: [PATCH 141/211] Added with-http-info API methods to Ruby client to allow accessing response status code and headers, and removed the methods of recording last response info from ApiClient. --- .../src/main/resources/ruby/api.mustache | 30 ++-- .../main/resources/ruby/api_client.mustache | 13 +- .../petstore/ruby/lib/petstore/api/pet_api.rb | 133 ++++++++++++++---- .../ruby/lib/petstore/api/store_api.rb | 63 +++++++-- .../ruby/lib/petstore/api/user_api.rb | 129 +++++++++++++---- .../petstore/ruby/lib/petstore/api_client.rb | 13 +- samples/client/petstore/ruby/spec/pet_spec.rb | 11 ++ 7 files changed, 302 insertions(+), 90 deletions(-) diff --git a/modules/swagger-codegen/src/main/resources/ruby/api.mustache b/modules/swagger-codegen/src/main/resources/ruby/api.mustache index b8e2e0da4c8..999aa4a9776 100644 --- a/modules/swagger-codegen/src/main/resources/ruby/api.mustache +++ b/modules/swagger-codegen/src/main/resources/ruby/api.mustache @@ -17,6 +17,17 @@ module {{moduleName}} {{#allParams}}{{^required}} # @option opts [{{{dataType}}}] :{{paramName}} {{description}} {{/required}}{{/allParams}} # @return [{{#returnType}}{{{returnType}}}{{/returnType}}{{^returnType}}nil{{/returnType}}] def {{operationId}}({{#allParams}}{{#required}}{{paramName}}, {{/required}}{{/allParams}}opts = {}) + {{#returnType}}status_code, headers, data = {{/returnType}}{{operationId}}_with_http_info({{#allParams}}{{#required}}{{paramName}}, {{/required}}{{/allParams}}opts) + {{#returnType}}return data{{/returnType}}{{^returnType}}return nil{{/returnType}} + end + + # {{summary}} + # {{notes}} +{{#allParams}}{{#required}} # @param {{paramName}} {{description}} +{{/required}}{{/allParams}} # @param [Hash] opts the optional parameters +{{#allParams}}{{^required}} # @option opts [{{{dataType}}}] :{{paramName}} {{description}} +{{/required}}{{/allParams}} # @return [Array] response status code, response headers and {{#returnType}}{{{returnType}}} data{{/returnType}}{{^returnType}}nil{{/returnType}} + def {{operationId}}_with_http_info({{#allParams}}{{#required}}{{paramName}}, {{/required}}{{/allParams}}opts = {}) if Configuration.debugging Configuration.logger.debug "Calling API: {{classname}}#{{operationId}} ..." end @@ -63,26 +74,17 @@ module {{moduleName}} {{/bodyParam}} auth_names = [{{#authMethods}}'{{name}}'{{#hasMore}}, {{/hasMore}}{{/authMethods}}] - {{#returnType}}result = @api_client.call_api(:{{httpMethod}}, path, + status_code, headers, data = @api_client.call_api(:{{httpMethod}}, path, :header_params => header_params, :query_params => query_params, :form_params => form_params, :body => post_body, - :auth_names => auth_names, - :return_type => '{{{returnType}}}') + :auth_names => auth_names{{#returnType}}, + :return_type => '{{{returnType}}}'{{/returnType}}) if Configuration.debugging - Configuration.logger.debug "API called: {{classname}}#{{operationId}}. Result: #{result.inspect}" + Configuration.logger.debug "API called: {{classname}}#{{operationId}}\nStatus code: #{status_code}\nHeaders: #{headers}\nData: #{data.inspect}" end - return result{{/returnType}}{{^returnType}}@api_client.call_api(:{{httpMethod}}, path, - :header_params => header_params, - :query_params => query_params, - :form_params => form_params, - :body => post_body, - :auth_names => auth_names) - if Configuration.debugging - Configuration.logger.debug "API called: {{classname}}#{{operationId}}" - end - return nil{{/returnType}} + return status_code, headers, data end {{/operation}} end diff --git a/modules/swagger-codegen/src/main/resources/ruby/api_client.mustache b/modules/swagger-codegen/src/main/resources/ruby/api_client.mustache index 4ef665bddf2..b5b67aa21eb 100644 --- a/modules/swagger-codegen/src/main/resources/ruby/api_client.mustache +++ b/modules/swagger-codegen/src/main/resources/ruby/api_client.mustache @@ -15,9 +15,6 @@ module {{moduleName}} # @return [Hash] attr_accessor :default_headers - # Stores the HTTP response from the last API call using this API client. - attr_accessor :last_response - def initialize(host = nil) @host = host || Configuration.base_url @format = 'json' @@ -28,13 +25,12 @@ module {{moduleName}} } end + # Call an API with given options and an array of 3 elements: + # response status code, response headers and the data deserialized from response body (could be nil). def call_api(http_method, path, opts = {}) request = build_request(http_method, path, opts) response = request.run - # record as last response - @last_response = response - if Configuration.debugging Configuration.logger.debug "HTTP response body ~BEGIN~\n#{response.body}\n~END~\n" end @@ -47,10 +43,11 @@ module {{moduleName}} end if opts[:return_type] - deserialize(response, opts[:return_type]) + data = deserialize(response, opts[:return_type]) else - nil + data = nil end + return response.code, response.headers, data end def build_request(http_method, path, opts = {}) diff --git a/samples/client/petstore/ruby/lib/petstore/api/pet_api.rb b/samples/client/petstore/ruby/lib/petstore/api/pet_api.rb index 887f86dd45c..9e3dcd1dea3 100644 --- a/samples/client/petstore/ruby/lib/petstore/api/pet_api.rb +++ b/samples/client/petstore/ruby/lib/petstore/api/pet_api.rb @@ -14,6 +14,16 @@ module Petstore # @option opts [Pet] :body Pet object that needs to be added to the store # @return [nil] def update_pet(opts = {}) + update_pet_with_http_info(opts) + return nil + end + + # Update an existing pet + # + # @param [Hash] opts the optional parameters + # @option opts [Pet] :body Pet object that needs to be added to the store + # @return [Array] response status code, response headers and nil + def update_pet_with_http_info(opts = {}) if Configuration.debugging Configuration.logger.debug "Calling API: PetApi#update_pet ..." end @@ -43,16 +53,16 @@ module Petstore auth_names = ['petstore_auth'] - @api_client.call_api(:PUT, path, + status_code, headers, data = @api_client.call_api(:PUT, path, :header_params => header_params, :query_params => query_params, :form_params => form_params, :body => post_body, :auth_names => auth_names) if Configuration.debugging - Configuration.logger.debug "API called: PetApi#update_pet" + Configuration.logger.debug "API called: PetApi#update_pet\nStatus code: #{status_code}\nHeaders: #{headers}\nData: #{data.inspect}" end - return nil + return status_code, headers, data end # Add a new pet to the store @@ -61,6 +71,16 @@ module Petstore # @option opts [Pet] :body Pet object that needs to be added to the store # @return [nil] def add_pet(opts = {}) + add_pet_with_http_info(opts) + return nil + end + + # Add a new pet to the store + # + # @param [Hash] opts the optional parameters + # @option opts [Pet] :body Pet object that needs to be added to the store + # @return [Array] response status code, response headers and nil + def add_pet_with_http_info(opts = {}) if Configuration.debugging Configuration.logger.debug "Calling API: PetApi#add_pet ..." end @@ -90,16 +110,16 @@ module Petstore auth_names = ['petstore_auth'] - @api_client.call_api(:POST, path, + status_code, headers, data = @api_client.call_api(:POST, path, :header_params => header_params, :query_params => query_params, :form_params => form_params, :body => post_body, :auth_names => auth_names) if Configuration.debugging - Configuration.logger.debug "API called: PetApi#add_pet" + Configuration.logger.debug "API called: PetApi#add_pet\nStatus code: #{status_code}\nHeaders: #{headers}\nData: #{data.inspect}" end - return nil + return status_code, headers, data end # Finds Pets by status @@ -108,6 +128,16 @@ module Petstore # @option opts [Array] :status Status values that need to be considered for filter # @return [Array] def find_pets_by_status(opts = {}) + status_code, headers, data = find_pets_by_status_with_http_info(opts) + return data + end + + # Finds Pets by status + # Multiple status values can be provided with comma seperated strings + # @param [Hash] opts the optional parameters + # @option opts [Array] :status Status values that need to be considered for filter + # @return [Array>] response status code, response headers and Array data + def find_pets_by_status_with_http_info(opts = {}) if Configuration.debugging Configuration.logger.debug "Calling API: PetApi#find_pets_by_status ..." end @@ -138,7 +168,7 @@ module Petstore auth_names = ['petstore_auth'] - result = @api_client.call_api(:GET, path, + status_code, headers, data = @api_client.call_api(:GET, path, :header_params => header_params, :query_params => query_params, :form_params => form_params, @@ -146,9 +176,9 @@ module Petstore :auth_names => auth_names, :return_type => 'Array') if Configuration.debugging - Configuration.logger.debug "API called: PetApi#find_pets_by_status. Result: #{result.inspect}" + Configuration.logger.debug "API called: PetApi#find_pets_by_status\nStatus code: #{status_code}\nHeaders: #{headers}\nData: #{data.inspect}" end - return result + return status_code, headers, data end # Finds Pets by tags @@ -157,6 +187,16 @@ module Petstore # @option opts [Array] :tags Tags to filter by # @return [Array] def find_pets_by_tags(opts = {}) + status_code, headers, data = find_pets_by_tags_with_http_info(opts) + return data + end + + # Finds Pets by tags + # Muliple tags can be provided with comma seperated strings. Use tag1, tag2, tag3 for testing. + # @param [Hash] opts the optional parameters + # @option opts [Array] :tags Tags to filter by + # @return [Array>] response status code, response headers and Array data + def find_pets_by_tags_with_http_info(opts = {}) if Configuration.debugging Configuration.logger.debug "Calling API: PetApi#find_pets_by_tags ..." end @@ -187,7 +227,7 @@ module Petstore auth_names = ['petstore_auth'] - result = @api_client.call_api(:GET, path, + status_code, headers, data = @api_client.call_api(:GET, path, :header_params => header_params, :query_params => query_params, :form_params => form_params, @@ -195,9 +235,9 @@ module Petstore :auth_names => auth_names, :return_type => 'Array') if Configuration.debugging - Configuration.logger.debug "API called: PetApi#find_pets_by_tags. Result: #{result.inspect}" + Configuration.logger.debug "API called: PetApi#find_pets_by_tags\nStatus code: #{status_code}\nHeaders: #{headers}\nData: #{data.inspect}" end - return result + return status_code, headers, data end # Find pet by ID @@ -206,6 +246,16 @@ module Petstore # @param [Hash] opts the optional parameters # @return [Pet] def get_pet_by_id(pet_id, opts = {}) + status_code, headers, data = get_pet_by_id_with_http_info(pet_id, opts) + return data + end + + # Find pet by ID + # Returns a pet when ID < 10. ID > 10 or nonintegers will simulate API error conditions + # @param pet_id ID of pet that needs to be fetched + # @param [Hash] opts the optional parameters + # @return [Array] response status code, response headers and Pet data + def get_pet_by_id_with_http_info(pet_id, opts = {}) if Configuration.debugging Configuration.logger.debug "Calling API: PetApi#get_pet_by_id ..." end @@ -238,7 +288,7 @@ module Petstore auth_names = ['api_key'] - result = @api_client.call_api(:GET, path, + status_code, headers, data = @api_client.call_api(:GET, path, :header_params => header_params, :query_params => query_params, :form_params => form_params, @@ -246,9 +296,9 @@ module Petstore :auth_names => auth_names, :return_type => 'Pet') if Configuration.debugging - Configuration.logger.debug "API called: PetApi#get_pet_by_id. Result: #{result.inspect}" + Configuration.logger.debug "API called: PetApi#get_pet_by_id\nStatus code: #{status_code}\nHeaders: #{headers}\nData: #{data.inspect}" end - return result + return status_code, headers, data end # Updates a pet in the store with form data @@ -259,6 +309,18 @@ module Petstore # @option opts [String] :status Updated status of the pet # @return [nil] def update_pet_with_form(pet_id, opts = {}) + update_pet_with_form_with_http_info(pet_id, opts) + return nil + end + + # Updates a pet in the store with form data + # + # @param pet_id ID of pet that needs to be updated + # @param [Hash] opts the optional parameters + # @option opts [String] :name Updated name of the pet + # @option opts [String] :status Updated status of the pet + # @return [Array] response status code, response headers and nil + def update_pet_with_form_with_http_info(pet_id, opts = {}) if Configuration.debugging Configuration.logger.debug "Calling API: PetApi#update_pet_with_form ..." end @@ -293,16 +355,16 @@ module Petstore auth_names = ['petstore_auth'] - @api_client.call_api(:POST, path, + status_code, headers, data = @api_client.call_api(:POST, path, :header_params => header_params, :query_params => query_params, :form_params => form_params, :body => post_body, :auth_names => auth_names) if Configuration.debugging - Configuration.logger.debug "API called: PetApi#update_pet_with_form" + Configuration.logger.debug "API called: PetApi#update_pet_with_form\nStatus code: #{status_code}\nHeaders: #{headers}\nData: #{data.inspect}" end - return nil + return status_code, headers, data end # Deletes a pet @@ -312,6 +374,17 @@ module Petstore # @option opts [String] :api_key # @return [nil] def delete_pet(pet_id, opts = {}) + delete_pet_with_http_info(pet_id, opts) + return nil + end + + # Deletes a pet + # + # @param pet_id Pet id to delete + # @param [Hash] opts the optional parameters + # @option opts [String] :api_key + # @return [Array] response status code, response headers and nil + def delete_pet_with_http_info(pet_id, opts = {}) if Configuration.debugging Configuration.logger.debug "Calling API: PetApi#delete_pet ..." end @@ -345,16 +418,16 @@ module Petstore auth_names = ['petstore_auth'] - @api_client.call_api(:DELETE, path, + status_code, headers, data = @api_client.call_api(:DELETE, path, :header_params => header_params, :query_params => query_params, :form_params => form_params, :body => post_body, :auth_names => auth_names) if Configuration.debugging - Configuration.logger.debug "API called: PetApi#delete_pet" + Configuration.logger.debug "API called: PetApi#delete_pet\nStatus code: #{status_code}\nHeaders: #{headers}\nData: #{data.inspect}" end - return nil + return status_code, headers, data end # uploads an image @@ -365,6 +438,18 @@ module Petstore # @option opts [File] :file file to upload # @return [nil] def upload_file(pet_id, opts = {}) + upload_file_with_http_info(pet_id, opts) + return nil + end + + # uploads an image + # + # @param pet_id ID of pet to update + # @param [Hash] opts the optional parameters + # @option opts [String] :additional_metadata Additional data to pass to server + # @option opts [File] :file file to upload + # @return [Array] response status code, response headers and nil + def upload_file_with_http_info(pet_id, opts = {}) if Configuration.debugging Configuration.logger.debug "Calling API: PetApi#upload_file ..." end @@ -399,16 +484,16 @@ module Petstore auth_names = ['petstore_auth'] - @api_client.call_api(:POST, path, + status_code, headers, data = @api_client.call_api(:POST, path, :header_params => header_params, :query_params => query_params, :form_params => form_params, :body => post_body, :auth_names => auth_names) if Configuration.debugging - Configuration.logger.debug "API called: PetApi#upload_file" + Configuration.logger.debug "API called: PetApi#upload_file\nStatus code: #{status_code}\nHeaders: #{headers}\nData: #{data.inspect}" end - return nil + return status_code, headers, data end end end diff --git a/samples/client/petstore/ruby/lib/petstore/api/store_api.rb b/samples/client/petstore/ruby/lib/petstore/api/store_api.rb index 235ff1c4106..d899d893465 100644 --- a/samples/client/petstore/ruby/lib/petstore/api/store_api.rb +++ b/samples/client/petstore/ruby/lib/petstore/api/store_api.rb @@ -13,6 +13,15 @@ module Petstore # @param [Hash] opts the optional parameters # @return [Hash] def get_inventory(opts = {}) + status_code, headers, data = get_inventory_with_http_info(opts) + return data + end + + # Returns pet inventories by status + # Returns a map of status codes to quantities + # @param [Hash] opts the optional parameters + # @return [Array>] response status code, response headers and Hash data + def get_inventory_with_http_info(opts = {}) if Configuration.debugging Configuration.logger.debug "Calling API: StoreApi#get_inventory ..." end @@ -42,7 +51,7 @@ module Petstore auth_names = ['api_key'] - result = @api_client.call_api(:GET, path, + status_code, headers, data = @api_client.call_api(:GET, path, :header_params => header_params, :query_params => query_params, :form_params => form_params, @@ -50,9 +59,9 @@ module Petstore :auth_names => auth_names, :return_type => 'Hash') if Configuration.debugging - Configuration.logger.debug "API called: StoreApi#get_inventory. Result: #{result.inspect}" + Configuration.logger.debug "API called: StoreApi#get_inventory\nStatus code: #{status_code}\nHeaders: #{headers}\nData: #{data.inspect}" end - return result + return status_code, headers, data end # Place an order for a pet @@ -61,6 +70,16 @@ module Petstore # @option opts [Order] :body order placed for purchasing the pet # @return [Order] def place_order(opts = {}) + status_code, headers, data = place_order_with_http_info(opts) + return data + end + + # Place an order for a pet + # + # @param [Hash] opts the optional parameters + # @option opts [Order] :body order placed for purchasing the pet + # @return [Array] response status code, response headers and Order data + def place_order_with_http_info(opts = {}) if Configuration.debugging Configuration.logger.debug "Calling API: StoreApi#place_order ..." end @@ -90,7 +109,7 @@ module Petstore auth_names = [] - result = @api_client.call_api(:POST, path, + status_code, headers, data = @api_client.call_api(:POST, path, :header_params => header_params, :query_params => query_params, :form_params => form_params, @@ -98,9 +117,9 @@ module Petstore :auth_names => auth_names, :return_type => 'Order') if Configuration.debugging - Configuration.logger.debug "API called: StoreApi#place_order. Result: #{result.inspect}" + Configuration.logger.debug "API called: StoreApi#place_order\nStatus code: #{status_code}\nHeaders: #{headers}\nData: #{data.inspect}" end - return result + return status_code, headers, data end # Find purchase order by ID @@ -109,6 +128,16 @@ module Petstore # @param [Hash] opts the optional parameters # @return [Order] def get_order_by_id(order_id, opts = {}) + status_code, headers, data = get_order_by_id_with_http_info(order_id, opts) + return data + end + + # Find purchase order by ID + # For valid response try integer IDs with value <= 5 or > 10. Other values will generated exceptions + # @param order_id ID of pet that needs to be fetched + # @param [Hash] opts the optional parameters + # @return [Array] response status code, response headers and Order data + def get_order_by_id_with_http_info(order_id, opts = {}) if Configuration.debugging Configuration.logger.debug "Calling API: StoreApi#get_order_by_id ..." end @@ -141,7 +170,7 @@ module Petstore auth_names = [] - result = @api_client.call_api(:GET, path, + status_code, headers, data = @api_client.call_api(:GET, path, :header_params => header_params, :query_params => query_params, :form_params => form_params, @@ -149,9 +178,9 @@ module Petstore :auth_names => auth_names, :return_type => 'Order') if Configuration.debugging - Configuration.logger.debug "API called: StoreApi#get_order_by_id. Result: #{result.inspect}" + Configuration.logger.debug "API called: StoreApi#get_order_by_id\nStatus code: #{status_code}\nHeaders: #{headers}\nData: #{data.inspect}" end - return result + return status_code, headers, data end # Delete purchase order by ID @@ -160,6 +189,16 @@ module Petstore # @param [Hash] opts the optional parameters # @return [nil] def delete_order(order_id, opts = {}) + delete_order_with_http_info(order_id, opts) + return nil + end + + # Delete purchase order by ID + # For valid response try integer IDs with value < 1000. Anything above 1000 or nonintegers will generate API errors + # @param order_id ID of the order that needs to be deleted + # @param [Hash] opts the optional parameters + # @return [Array] response status code, response headers and nil + def delete_order_with_http_info(order_id, opts = {}) if Configuration.debugging Configuration.logger.debug "Calling API: StoreApi#delete_order ..." end @@ -192,16 +231,16 @@ module Petstore auth_names = [] - @api_client.call_api(:DELETE, path, + status_code, headers, data = @api_client.call_api(:DELETE, path, :header_params => header_params, :query_params => query_params, :form_params => form_params, :body => post_body, :auth_names => auth_names) if Configuration.debugging - Configuration.logger.debug "API called: StoreApi#delete_order" + Configuration.logger.debug "API called: StoreApi#delete_order\nStatus code: #{status_code}\nHeaders: #{headers}\nData: #{data.inspect}" end - return nil + return status_code, headers, data end end end diff --git a/samples/client/petstore/ruby/lib/petstore/api/user_api.rb b/samples/client/petstore/ruby/lib/petstore/api/user_api.rb index 7f546330f3a..ed32cc37bad 100644 --- a/samples/client/petstore/ruby/lib/petstore/api/user_api.rb +++ b/samples/client/petstore/ruby/lib/petstore/api/user_api.rb @@ -14,6 +14,16 @@ module Petstore # @option opts [User] :body Created user object # @return [nil] def create_user(opts = {}) + create_user_with_http_info(opts) + return nil + end + + # Create user + # This can only be done by the logged in user. + # @param [Hash] opts the optional parameters + # @option opts [User] :body Created user object + # @return [Array] response status code, response headers and nil + def create_user_with_http_info(opts = {}) if Configuration.debugging Configuration.logger.debug "Calling API: UserApi#create_user ..." end @@ -43,16 +53,16 @@ module Petstore auth_names = [] - @api_client.call_api(:POST, path, + status_code, headers, data = @api_client.call_api(:POST, path, :header_params => header_params, :query_params => query_params, :form_params => form_params, :body => post_body, :auth_names => auth_names) if Configuration.debugging - Configuration.logger.debug "API called: UserApi#create_user" + Configuration.logger.debug "API called: UserApi#create_user\nStatus code: #{status_code}\nHeaders: #{headers}\nData: #{data.inspect}" end - return nil + return status_code, headers, data end # Creates list of users with given input array @@ -61,6 +71,16 @@ module Petstore # @option opts [Array] :body List of user object # @return [nil] def create_users_with_array_input(opts = {}) + create_users_with_array_input_with_http_info(opts) + return nil + end + + # Creates list of users with given input array + # + # @param [Hash] opts the optional parameters + # @option opts [Array] :body List of user object + # @return [Array] response status code, response headers and nil + def create_users_with_array_input_with_http_info(opts = {}) if Configuration.debugging Configuration.logger.debug "Calling API: UserApi#create_users_with_array_input ..." end @@ -90,16 +110,16 @@ module Petstore auth_names = [] - @api_client.call_api(:POST, path, + status_code, headers, data = @api_client.call_api(:POST, path, :header_params => header_params, :query_params => query_params, :form_params => form_params, :body => post_body, :auth_names => auth_names) if Configuration.debugging - Configuration.logger.debug "API called: UserApi#create_users_with_array_input" + Configuration.logger.debug "API called: UserApi#create_users_with_array_input\nStatus code: #{status_code}\nHeaders: #{headers}\nData: #{data.inspect}" end - return nil + return status_code, headers, data end # Creates list of users with given input array @@ -108,6 +128,16 @@ module Petstore # @option opts [Array] :body List of user object # @return [nil] def create_users_with_list_input(opts = {}) + create_users_with_list_input_with_http_info(opts) + return nil + end + + # Creates list of users with given input array + # + # @param [Hash] opts the optional parameters + # @option opts [Array] :body List of user object + # @return [Array] response status code, response headers and nil + def create_users_with_list_input_with_http_info(opts = {}) if Configuration.debugging Configuration.logger.debug "Calling API: UserApi#create_users_with_list_input ..." end @@ -137,16 +167,16 @@ module Petstore auth_names = [] - @api_client.call_api(:POST, path, + status_code, headers, data = @api_client.call_api(:POST, path, :header_params => header_params, :query_params => query_params, :form_params => form_params, :body => post_body, :auth_names => auth_names) if Configuration.debugging - Configuration.logger.debug "API called: UserApi#create_users_with_list_input" + Configuration.logger.debug "API called: UserApi#create_users_with_list_input\nStatus code: #{status_code}\nHeaders: #{headers}\nData: #{data.inspect}" end - return nil + return status_code, headers, data end # Logs user into the system @@ -156,6 +186,17 @@ module Petstore # @option opts [String] :password The password for login in clear text # @return [String] def login_user(opts = {}) + status_code, headers, data = login_user_with_http_info(opts) + return data + end + + # Logs user into the system + # + # @param [Hash] opts the optional parameters + # @option opts [String] :username The user name for login + # @option opts [String] :password The password for login in clear text + # @return [Array] response status code, response headers and String data + def login_user_with_http_info(opts = {}) if Configuration.debugging Configuration.logger.debug "Calling API: UserApi#login_user ..." end @@ -187,7 +228,7 @@ module Petstore auth_names = [] - result = @api_client.call_api(:GET, path, + status_code, headers, data = @api_client.call_api(:GET, path, :header_params => header_params, :query_params => query_params, :form_params => form_params, @@ -195,9 +236,9 @@ module Petstore :auth_names => auth_names, :return_type => 'String') if Configuration.debugging - Configuration.logger.debug "API called: UserApi#login_user. Result: #{result.inspect}" + Configuration.logger.debug "API called: UserApi#login_user\nStatus code: #{status_code}\nHeaders: #{headers}\nData: #{data.inspect}" end - return result + return status_code, headers, data end # Logs out current logged in user session @@ -205,6 +246,15 @@ module Petstore # @param [Hash] opts the optional parameters # @return [nil] def logout_user(opts = {}) + logout_user_with_http_info(opts) + return nil + end + + # Logs out current logged in user session + # + # @param [Hash] opts the optional parameters + # @return [Array] response status code, response headers and nil + def logout_user_with_http_info(opts = {}) if Configuration.debugging Configuration.logger.debug "Calling API: UserApi#logout_user ..." end @@ -234,16 +284,16 @@ module Petstore auth_names = [] - @api_client.call_api(:GET, path, + status_code, headers, data = @api_client.call_api(:GET, path, :header_params => header_params, :query_params => query_params, :form_params => form_params, :body => post_body, :auth_names => auth_names) if Configuration.debugging - Configuration.logger.debug "API called: UserApi#logout_user" + Configuration.logger.debug "API called: UserApi#logout_user\nStatus code: #{status_code}\nHeaders: #{headers}\nData: #{data.inspect}" end - return nil + return status_code, headers, data end # Get user by user name @@ -252,6 +302,16 @@ module Petstore # @param [Hash] opts the optional parameters # @return [User] def get_user_by_name(username, opts = {}) + status_code, headers, data = get_user_by_name_with_http_info(username, opts) + return data + end + + # Get user by user name + # + # @param username The name that needs to be fetched. Use user1 for testing. + # @param [Hash] opts the optional parameters + # @return [Array] response status code, response headers and User data + def get_user_by_name_with_http_info(username, opts = {}) if Configuration.debugging Configuration.logger.debug "Calling API: UserApi#get_user_by_name ..." end @@ -284,7 +344,7 @@ module Petstore auth_names = [] - result = @api_client.call_api(:GET, path, + status_code, headers, data = @api_client.call_api(:GET, path, :header_params => header_params, :query_params => query_params, :form_params => form_params, @@ -292,9 +352,9 @@ module Petstore :auth_names => auth_names, :return_type => 'User') if Configuration.debugging - Configuration.logger.debug "API called: UserApi#get_user_by_name. Result: #{result.inspect}" + Configuration.logger.debug "API called: UserApi#get_user_by_name\nStatus code: #{status_code}\nHeaders: #{headers}\nData: #{data.inspect}" end - return result + return status_code, headers, data end # Updated user @@ -304,6 +364,17 @@ module Petstore # @option opts [User] :body Updated user object # @return [nil] def update_user(username, opts = {}) + update_user_with_http_info(username, opts) + return nil + end + + # Updated user + # This can only be done by the logged in user. + # @param username name that need to be deleted + # @param [Hash] opts the optional parameters + # @option opts [User] :body Updated user object + # @return [Array] response status code, response headers and nil + def update_user_with_http_info(username, opts = {}) if Configuration.debugging Configuration.logger.debug "Calling API: UserApi#update_user ..." end @@ -336,16 +407,16 @@ module Petstore auth_names = [] - @api_client.call_api(:PUT, path, + status_code, headers, data = @api_client.call_api(:PUT, path, :header_params => header_params, :query_params => query_params, :form_params => form_params, :body => post_body, :auth_names => auth_names) if Configuration.debugging - Configuration.logger.debug "API called: UserApi#update_user" + Configuration.logger.debug "API called: UserApi#update_user\nStatus code: #{status_code}\nHeaders: #{headers}\nData: #{data.inspect}" end - return nil + return status_code, headers, data end # Delete user @@ -354,6 +425,16 @@ module Petstore # @param [Hash] opts the optional parameters # @return [nil] def delete_user(username, opts = {}) + delete_user_with_http_info(username, opts) + return nil + end + + # Delete user + # This can only be done by the logged in user. + # @param username The name that needs to be deleted + # @param [Hash] opts the optional parameters + # @return [Array] response status code, response headers and nil + def delete_user_with_http_info(username, opts = {}) if Configuration.debugging Configuration.logger.debug "Calling API: UserApi#delete_user ..." end @@ -386,16 +467,16 @@ module Petstore auth_names = [] - @api_client.call_api(:DELETE, path, + status_code, headers, data = @api_client.call_api(:DELETE, path, :header_params => header_params, :query_params => query_params, :form_params => form_params, :body => post_body, :auth_names => auth_names) if Configuration.debugging - Configuration.logger.debug "API called: UserApi#delete_user" + Configuration.logger.debug "API called: UserApi#delete_user\nStatus code: #{status_code}\nHeaders: #{headers}\nData: #{data.inspect}" end - return nil + return status_code, headers, data end end end diff --git a/samples/client/petstore/ruby/lib/petstore/api_client.rb b/samples/client/petstore/ruby/lib/petstore/api_client.rb index 92a61bac4a6..9dfe51ba147 100644 --- a/samples/client/petstore/ruby/lib/petstore/api_client.rb +++ b/samples/client/petstore/ruby/lib/petstore/api_client.rb @@ -15,9 +15,6 @@ module Petstore # @return [Hash] attr_accessor :default_headers - # Stores the HTTP response from the last API call using this API client. - attr_accessor :last_response - def initialize(host = nil) @host = host || Configuration.base_url @format = 'json' @@ -28,13 +25,12 @@ module Petstore } end + # Call an API with given options and an array of 3 elements: + # response status code, response headers and the data deserialized from response body (could be nil). def call_api(http_method, path, opts = {}) request = build_request(http_method, path, opts) response = request.run - # record as last response - @last_response = response - if Configuration.debugging Configuration.logger.debug "HTTP response body ~BEGIN~\n#{response.body}\n~END~\n" end @@ -47,10 +43,11 @@ module Petstore end if opts[:return_type] - deserialize(response, opts[:return_type]) + data = deserialize(response, opts[:return_type]) else - nil + data = nil end + return response.code, response.headers, data end def build_request(http_method, path, opts = {}) diff --git a/samples/client/petstore/ruby/spec/pet_spec.rb b/samples/client/petstore/ruby/spec/pet_spec.rb index 612fc536147..4c6e9180a8a 100644 --- a/samples/client/petstore/ruby/spec/pet_spec.rb +++ b/samples/client/petstore/ruby/spec/pet_spec.rb @@ -50,6 +50,17 @@ describe "Pet" do pet.category.name.should == "category test" end + it "should fetch a pet object with http info" do + status_code, headers, pet = @pet_api.get_pet_by_id_with_http_info(10002) + status_code.should == 200 + headers['Content-Type'].should == 'application/json' + pet.should be_a(Petstore::Pet) + pet.id.should == 10002 + pet.name.should == "RUBY UNIT TESTING" + pet.tags[0].name.should == "tag test" + pet.category.name.should == "category test" + end + it "should not find a pet that does not exist" do begin @pet_api.get_pet_by_id(-10002) From 07de03c09bdebc7abcc3b7383087015810479ccc Mon Sep 17 00:00:00 2001 From: xhh Date: Mon, 7 Dec 2015 16:10:24 +0800 Subject: [PATCH 142/211] Return data before response status code and headers --- .../src/main/resources/ruby/api.mustache | 10 +-- .../main/resources/ruby/api_client.mustache | 8 ++- .../petstore/ruby/lib/petstore/api/pet_api.rb | 70 +++++++++---------- .../ruby/lib/petstore/api/store_api.rb | 38 +++++----- .../ruby/lib/petstore/api/user_api.rb | 68 +++++++++--------- .../petstore/ruby/lib/petstore/api_client.rb | 8 ++- samples/client/petstore/ruby/spec/pet_spec.rb | 2 +- 7 files changed, 104 insertions(+), 100 deletions(-) diff --git a/modules/swagger-codegen/src/main/resources/ruby/api.mustache b/modules/swagger-codegen/src/main/resources/ruby/api.mustache index 999aa4a9776..65e00081686 100644 --- a/modules/swagger-codegen/src/main/resources/ruby/api.mustache +++ b/modules/swagger-codegen/src/main/resources/ruby/api.mustache @@ -17,7 +17,7 @@ module {{moduleName}} {{#allParams}}{{^required}} # @option opts [{{{dataType}}}] :{{paramName}} {{description}} {{/required}}{{/allParams}} # @return [{{#returnType}}{{{returnType}}}{{/returnType}}{{^returnType}}nil{{/returnType}}] def {{operationId}}({{#allParams}}{{#required}}{{paramName}}, {{/required}}{{/allParams}}opts = {}) - {{#returnType}}status_code, headers, data = {{/returnType}}{{operationId}}_with_http_info({{#allParams}}{{#required}}{{paramName}}, {{/required}}{{/allParams}}opts) + {{#returnType}}data, status_code, headers = {{/returnType}}{{operationId}}_with_http_info({{#allParams}}{{#required}}{{paramName}}, {{/required}}{{/allParams}}opts) {{#returnType}}return data{{/returnType}}{{^returnType}}return nil{{/returnType}} end @@ -26,7 +26,7 @@ module {{moduleName}} {{#allParams}}{{#required}} # @param {{paramName}} {{description}} {{/required}}{{/allParams}} # @param [Hash] opts the optional parameters {{#allParams}}{{^required}} # @option opts [{{{dataType}}}] :{{paramName}} {{description}} -{{/required}}{{/allParams}} # @return [Array] response status code, response headers and {{#returnType}}{{{returnType}}} data{{/returnType}}{{^returnType}}nil{{/returnType}} +{{/required}}{{/allParams}} # @return [Array<({{#returnType}}{{{returnType}}}{{/returnType}}{{^returnType}}nil{{/returnType}}, Fixnum, Hash)>] {{#returnType}}{{{returnType}}} data{{/returnType}}{{^returnType}}nil{{/returnType}}, response status code and response headers def {{operationId}}_with_http_info({{#allParams}}{{#required}}{{paramName}}, {{/required}}{{/allParams}}opts = {}) if Configuration.debugging Configuration.logger.debug "Calling API: {{classname}}#{{operationId}} ..." @@ -74,7 +74,7 @@ module {{moduleName}} {{/bodyParam}} auth_names = [{{#authMethods}}'{{name}}'{{#hasMore}}, {{/hasMore}}{{/authMethods}}] - status_code, headers, data = @api_client.call_api(:{{httpMethod}}, path, + data, status_code, headers = @api_client.call_api(:{{httpMethod}}, path, :header_params => header_params, :query_params => query_params, :form_params => form_params, @@ -82,9 +82,9 @@ module {{moduleName}} :auth_names => auth_names{{#returnType}}, :return_type => '{{{returnType}}}'{{/returnType}}) if Configuration.debugging - Configuration.logger.debug "API called: {{classname}}#{{operationId}}\nStatus code: #{status_code}\nHeaders: #{headers}\nData: #{data.inspect}" + Configuration.logger.debug "API called: {{classname}}#{{operationId}}\nData: #{data.inspect}\nStatus code: #{status_code}\nHeaders: #{headers}" end - return status_code, headers, data + return data, status_code, headers end {{/operation}} end diff --git a/modules/swagger-codegen/src/main/resources/ruby/api_client.mustache b/modules/swagger-codegen/src/main/resources/ruby/api_client.mustache index b5b67aa21eb..3873d476577 100644 --- a/modules/swagger-codegen/src/main/resources/ruby/api_client.mustache +++ b/modules/swagger-codegen/src/main/resources/ruby/api_client.mustache @@ -25,8 +25,10 @@ module {{moduleName}} } end - # Call an API with given options and an array of 3 elements: - # response status code, response headers and the data deserialized from response body (could be nil). + # Call an API with given options. + # + # @return [Array<(Object, Fixnum, Hash)>] an array of 3 elements: + # the data deserialized from response body (could be nil), response status code and response headers. def call_api(http_method, path, opts = {}) request = build_request(http_method, path, opts) response = request.run @@ -47,7 +49,7 @@ module {{moduleName}} else data = nil end - return response.code, response.headers, data + return data, response.code, response.headers end def build_request(http_method, path, opts = {}) diff --git a/samples/client/petstore/ruby/lib/petstore/api/pet_api.rb b/samples/client/petstore/ruby/lib/petstore/api/pet_api.rb index 9e3dcd1dea3..acbd564db53 100644 --- a/samples/client/petstore/ruby/lib/petstore/api/pet_api.rb +++ b/samples/client/petstore/ruby/lib/petstore/api/pet_api.rb @@ -22,7 +22,7 @@ module Petstore # # @param [Hash] opts the optional parameters # @option opts [Pet] :body Pet object that needs to be added to the store - # @return [Array] response status code, response headers and nil + # @return [Array<(nil, Fixnum, Hash)>] nil, response status code and response headers def update_pet_with_http_info(opts = {}) if Configuration.debugging Configuration.logger.debug "Calling API: PetApi#update_pet ..." @@ -53,16 +53,16 @@ module Petstore auth_names = ['petstore_auth'] - status_code, headers, data = @api_client.call_api(:PUT, path, + data, status_code, headers = @api_client.call_api(:PUT, path, :header_params => header_params, :query_params => query_params, :form_params => form_params, :body => post_body, :auth_names => auth_names) if Configuration.debugging - Configuration.logger.debug "API called: PetApi#update_pet\nStatus code: #{status_code}\nHeaders: #{headers}\nData: #{data.inspect}" + Configuration.logger.debug "API called: PetApi#update_pet\nData: #{data.inspect}\nStatus code: #{status_code}\nHeaders: #{headers}" end - return status_code, headers, data + return data, status_code, headers end # Add a new pet to the store @@ -79,7 +79,7 @@ module Petstore # # @param [Hash] opts the optional parameters # @option opts [Pet] :body Pet object that needs to be added to the store - # @return [Array] response status code, response headers and nil + # @return [Array<(nil, Fixnum, Hash)>] nil, response status code and response headers def add_pet_with_http_info(opts = {}) if Configuration.debugging Configuration.logger.debug "Calling API: PetApi#add_pet ..." @@ -110,16 +110,16 @@ module Petstore auth_names = ['petstore_auth'] - status_code, headers, data = @api_client.call_api(:POST, path, + data, status_code, headers = @api_client.call_api(:POST, path, :header_params => header_params, :query_params => query_params, :form_params => form_params, :body => post_body, :auth_names => auth_names) if Configuration.debugging - Configuration.logger.debug "API called: PetApi#add_pet\nStatus code: #{status_code}\nHeaders: #{headers}\nData: #{data.inspect}" + Configuration.logger.debug "API called: PetApi#add_pet\nData: #{data.inspect}\nStatus code: #{status_code}\nHeaders: #{headers}" end - return status_code, headers, data + return data, status_code, headers end # Finds Pets by status @@ -128,7 +128,7 @@ module Petstore # @option opts [Array] :status Status values that need to be considered for filter # @return [Array] def find_pets_by_status(opts = {}) - status_code, headers, data = find_pets_by_status_with_http_info(opts) + data, status_code, headers = find_pets_by_status_with_http_info(opts) return data end @@ -136,7 +136,7 @@ module Petstore # Multiple status values can be provided with comma seperated strings # @param [Hash] opts the optional parameters # @option opts [Array] :status Status values that need to be considered for filter - # @return [Array>] response status code, response headers and Array data + # @return [Array<(Array, Fixnum, Hash)>] Array data, response status code and response headers def find_pets_by_status_with_http_info(opts = {}) if Configuration.debugging Configuration.logger.debug "Calling API: PetApi#find_pets_by_status ..." @@ -168,7 +168,7 @@ module Petstore auth_names = ['petstore_auth'] - status_code, headers, data = @api_client.call_api(:GET, path, + data, status_code, headers = @api_client.call_api(:GET, path, :header_params => header_params, :query_params => query_params, :form_params => form_params, @@ -176,9 +176,9 @@ module Petstore :auth_names => auth_names, :return_type => 'Array') if Configuration.debugging - Configuration.logger.debug "API called: PetApi#find_pets_by_status\nStatus code: #{status_code}\nHeaders: #{headers}\nData: #{data.inspect}" + Configuration.logger.debug "API called: PetApi#find_pets_by_status\nData: #{data.inspect}\nStatus code: #{status_code}\nHeaders: #{headers}" end - return status_code, headers, data + return data, status_code, headers end # Finds Pets by tags @@ -187,7 +187,7 @@ module Petstore # @option opts [Array] :tags Tags to filter by # @return [Array] def find_pets_by_tags(opts = {}) - status_code, headers, data = find_pets_by_tags_with_http_info(opts) + data, status_code, headers = find_pets_by_tags_with_http_info(opts) return data end @@ -195,7 +195,7 @@ module Petstore # Muliple tags can be provided with comma seperated strings. Use tag1, tag2, tag3 for testing. # @param [Hash] opts the optional parameters # @option opts [Array] :tags Tags to filter by - # @return [Array>] response status code, response headers and Array data + # @return [Array<(Array, Fixnum, Hash)>] Array data, response status code and response headers def find_pets_by_tags_with_http_info(opts = {}) if Configuration.debugging Configuration.logger.debug "Calling API: PetApi#find_pets_by_tags ..." @@ -227,7 +227,7 @@ module Petstore auth_names = ['petstore_auth'] - status_code, headers, data = @api_client.call_api(:GET, path, + data, status_code, headers = @api_client.call_api(:GET, path, :header_params => header_params, :query_params => query_params, :form_params => form_params, @@ -235,9 +235,9 @@ module Petstore :auth_names => auth_names, :return_type => 'Array') if Configuration.debugging - Configuration.logger.debug "API called: PetApi#find_pets_by_tags\nStatus code: #{status_code}\nHeaders: #{headers}\nData: #{data.inspect}" + Configuration.logger.debug "API called: PetApi#find_pets_by_tags\nData: #{data.inspect}\nStatus code: #{status_code}\nHeaders: #{headers}" end - return status_code, headers, data + return data, status_code, headers end # Find pet by ID @@ -246,7 +246,7 @@ module Petstore # @param [Hash] opts the optional parameters # @return [Pet] def get_pet_by_id(pet_id, opts = {}) - status_code, headers, data = get_pet_by_id_with_http_info(pet_id, opts) + data, status_code, headers = get_pet_by_id_with_http_info(pet_id, opts) return data end @@ -254,7 +254,7 @@ module Petstore # Returns a pet when ID < 10. ID > 10 or nonintegers will simulate API error conditions # @param pet_id ID of pet that needs to be fetched # @param [Hash] opts the optional parameters - # @return [Array] response status code, response headers and Pet data + # @return [Array<(Pet, Fixnum, Hash)>] Pet data, response status code and response headers def get_pet_by_id_with_http_info(pet_id, opts = {}) if Configuration.debugging Configuration.logger.debug "Calling API: PetApi#get_pet_by_id ..." @@ -288,7 +288,7 @@ module Petstore auth_names = ['api_key'] - status_code, headers, data = @api_client.call_api(:GET, path, + data, status_code, headers = @api_client.call_api(:GET, path, :header_params => header_params, :query_params => query_params, :form_params => form_params, @@ -296,9 +296,9 @@ module Petstore :auth_names => auth_names, :return_type => 'Pet') if Configuration.debugging - Configuration.logger.debug "API called: PetApi#get_pet_by_id\nStatus code: #{status_code}\nHeaders: #{headers}\nData: #{data.inspect}" + Configuration.logger.debug "API called: PetApi#get_pet_by_id\nData: #{data.inspect}\nStatus code: #{status_code}\nHeaders: #{headers}" end - return status_code, headers, data + return data, status_code, headers end # Updates a pet in the store with form data @@ -319,7 +319,7 @@ module Petstore # @param [Hash] opts the optional parameters # @option opts [String] :name Updated name of the pet # @option opts [String] :status Updated status of the pet - # @return [Array] response status code, response headers and nil + # @return [Array<(nil, Fixnum, Hash)>] nil, response status code and response headers def update_pet_with_form_with_http_info(pet_id, opts = {}) if Configuration.debugging Configuration.logger.debug "Calling API: PetApi#update_pet_with_form ..." @@ -355,16 +355,16 @@ module Petstore auth_names = ['petstore_auth'] - status_code, headers, data = @api_client.call_api(:POST, path, + data, status_code, headers = @api_client.call_api(:POST, path, :header_params => header_params, :query_params => query_params, :form_params => form_params, :body => post_body, :auth_names => auth_names) if Configuration.debugging - Configuration.logger.debug "API called: PetApi#update_pet_with_form\nStatus code: #{status_code}\nHeaders: #{headers}\nData: #{data.inspect}" + Configuration.logger.debug "API called: PetApi#update_pet_with_form\nData: #{data.inspect}\nStatus code: #{status_code}\nHeaders: #{headers}" end - return status_code, headers, data + return data, status_code, headers end # Deletes a pet @@ -383,7 +383,7 @@ module Petstore # @param pet_id Pet id to delete # @param [Hash] opts the optional parameters # @option opts [String] :api_key - # @return [Array] response status code, response headers and nil + # @return [Array<(nil, Fixnum, Hash)>] nil, response status code and response headers def delete_pet_with_http_info(pet_id, opts = {}) if Configuration.debugging Configuration.logger.debug "Calling API: PetApi#delete_pet ..." @@ -418,16 +418,16 @@ module Petstore auth_names = ['petstore_auth'] - status_code, headers, data = @api_client.call_api(:DELETE, path, + data, status_code, headers = @api_client.call_api(:DELETE, path, :header_params => header_params, :query_params => query_params, :form_params => form_params, :body => post_body, :auth_names => auth_names) if Configuration.debugging - Configuration.logger.debug "API called: PetApi#delete_pet\nStatus code: #{status_code}\nHeaders: #{headers}\nData: #{data.inspect}" + Configuration.logger.debug "API called: PetApi#delete_pet\nData: #{data.inspect}\nStatus code: #{status_code}\nHeaders: #{headers}" end - return status_code, headers, data + return data, status_code, headers end # uploads an image @@ -448,7 +448,7 @@ module Petstore # @param [Hash] opts the optional parameters # @option opts [String] :additional_metadata Additional data to pass to server # @option opts [File] :file file to upload - # @return [Array] response status code, response headers and nil + # @return [Array<(nil, Fixnum, Hash)>] nil, response status code and response headers def upload_file_with_http_info(pet_id, opts = {}) if Configuration.debugging Configuration.logger.debug "Calling API: PetApi#upload_file ..." @@ -484,16 +484,16 @@ module Petstore auth_names = ['petstore_auth'] - status_code, headers, data = @api_client.call_api(:POST, path, + data, status_code, headers = @api_client.call_api(:POST, path, :header_params => header_params, :query_params => query_params, :form_params => form_params, :body => post_body, :auth_names => auth_names) if Configuration.debugging - Configuration.logger.debug "API called: PetApi#upload_file\nStatus code: #{status_code}\nHeaders: #{headers}\nData: #{data.inspect}" + Configuration.logger.debug "API called: PetApi#upload_file\nData: #{data.inspect}\nStatus code: #{status_code}\nHeaders: #{headers}" end - return status_code, headers, data + return data, status_code, headers end end end diff --git a/samples/client/petstore/ruby/lib/petstore/api/store_api.rb b/samples/client/petstore/ruby/lib/petstore/api/store_api.rb index d899d893465..548973eefd3 100644 --- a/samples/client/petstore/ruby/lib/petstore/api/store_api.rb +++ b/samples/client/petstore/ruby/lib/petstore/api/store_api.rb @@ -13,14 +13,14 @@ module Petstore # @param [Hash] opts the optional parameters # @return [Hash] def get_inventory(opts = {}) - status_code, headers, data = get_inventory_with_http_info(opts) + data, status_code, headers = get_inventory_with_http_info(opts) return data end # Returns pet inventories by status # Returns a map of status codes to quantities # @param [Hash] opts the optional parameters - # @return [Array>] response status code, response headers and Hash data + # @return [Array<(Hash, Fixnum, Hash)>] Hash data, response status code and response headers def get_inventory_with_http_info(opts = {}) if Configuration.debugging Configuration.logger.debug "Calling API: StoreApi#get_inventory ..." @@ -51,7 +51,7 @@ module Petstore auth_names = ['api_key'] - status_code, headers, data = @api_client.call_api(:GET, path, + data, status_code, headers = @api_client.call_api(:GET, path, :header_params => header_params, :query_params => query_params, :form_params => form_params, @@ -59,9 +59,9 @@ module Petstore :auth_names => auth_names, :return_type => 'Hash') if Configuration.debugging - Configuration.logger.debug "API called: StoreApi#get_inventory\nStatus code: #{status_code}\nHeaders: #{headers}\nData: #{data.inspect}" + Configuration.logger.debug "API called: StoreApi#get_inventory\nData: #{data.inspect}\nStatus code: #{status_code}\nHeaders: #{headers}" end - return status_code, headers, data + return data, status_code, headers end # Place an order for a pet @@ -70,7 +70,7 @@ module Petstore # @option opts [Order] :body order placed for purchasing the pet # @return [Order] def place_order(opts = {}) - status_code, headers, data = place_order_with_http_info(opts) + data, status_code, headers = place_order_with_http_info(opts) return data end @@ -78,7 +78,7 @@ module Petstore # # @param [Hash] opts the optional parameters # @option opts [Order] :body order placed for purchasing the pet - # @return [Array] response status code, response headers and Order data + # @return [Array<(Order, Fixnum, Hash)>] Order data, response status code and response headers def place_order_with_http_info(opts = {}) if Configuration.debugging Configuration.logger.debug "Calling API: StoreApi#place_order ..." @@ -109,7 +109,7 @@ module Petstore auth_names = [] - status_code, headers, data = @api_client.call_api(:POST, path, + data, status_code, headers = @api_client.call_api(:POST, path, :header_params => header_params, :query_params => query_params, :form_params => form_params, @@ -117,9 +117,9 @@ module Petstore :auth_names => auth_names, :return_type => 'Order') if Configuration.debugging - Configuration.logger.debug "API called: StoreApi#place_order\nStatus code: #{status_code}\nHeaders: #{headers}\nData: #{data.inspect}" + Configuration.logger.debug "API called: StoreApi#place_order\nData: #{data.inspect}\nStatus code: #{status_code}\nHeaders: #{headers}" end - return status_code, headers, data + return data, status_code, headers end # Find purchase order by ID @@ -128,7 +128,7 @@ module Petstore # @param [Hash] opts the optional parameters # @return [Order] def get_order_by_id(order_id, opts = {}) - status_code, headers, data = get_order_by_id_with_http_info(order_id, opts) + data, status_code, headers = get_order_by_id_with_http_info(order_id, opts) return data end @@ -136,7 +136,7 @@ module Petstore # For valid response try integer IDs with value <= 5 or > 10. Other values will generated exceptions # @param order_id ID of pet that needs to be fetched # @param [Hash] opts the optional parameters - # @return [Array] response status code, response headers and Order data + # @return [Array<(Order, Fixnum, Hash)>] Order data, response status code and response headers def get_order_by_id_with_http_info(order_id, opts = {}) if Configuration.debugging Configuration.logger.debug "Calling API: StoreApi#get_order_by_id ..." @@ -170,7 +170,7 @@ module Petstore auth_names = [] - status_code, headers, data = @api_client.call_api(:GET, path, + data, status_code, headers = @api_client.call_api(:GET, path, :header_params => header_params, :query_params => query_params, :form_params => form_params, @@ -178,9 +178,9 @@ module Petstore :auth_names => auth_names, :return_type => 'Order') if Configuration.debugging - Configuration.logger.debug "API called: StoreApi#get_order_by_id\nStatus code: #{status_code}\nHeaders: #{headers}\nData: #{data.inspect}" + Configuration.logger.debug "API called: StoreApi#get_order_by_id\nData: #{data.inspect}\nStatus code: #{status_code}\nHeaders: #{headers}" end - return status_code, headers, data + return data, status_code, headers end # Delete purchase order by ID @@ -197,7 +197,7 @@ module Petstore # For valid response try integer IDs with value < 1000. Anything above 1000 or nonintegers will generate API errors # @param order_id ID of the order that needs to be deleted # @param [Hash] opts the optional parameters - # @return [Array] response status code, response headers and nil + # @return [Array<(nil, Fixnum, Hash)>] nil, response status code and response headers def delete_order_with_http_info(order_id, opts = {}) if Configuration.debugging Configuration.logger.debug "Calling API: StoreApi#delete_order ..." @@ -231,16 +231,16 @@ module Petstore auth_names = [] - status_code, headers, data = @api_client.call_api(:DELETE, path, + data, status_code, headers = @api_client.call_api(:DELETE, path, :header_params => header_params, :query_params => query_params, :form_params => form_params, :body => post_body, :auth_names => auth_names) if Configuration.debugging - Configuration.logger.debug "API called: StoreApi#delete_order\nStatus code: #{status_code}\nHeaders: #{headers}\nData: #{data.inspect}" + Configuration.logger.debug "API called: StoreApi#delete_order\nData: #{data.inspect}\nStatus code: #{status_code}\nHeaders: #{headers}" end - return status_code, headers, data + return data, status_code, headers end end end diff --git a/samples/client/petstore/ruby/lib/petstore/api/user_api.rb b/samples/client/petstore/ruby/lib/petstore/api/user_api.rb index ed32cc37bad..35623175f35 100644 --- a/samples/client/petstore/ruby/lib/petstore/api/user_api.rb +++ b/samples/client/petstore/ruby/lib/petstore/api/user_api.rb @@ -22,7 +22,7 @@ module Petstore # This can only be done by the logged in user. # @param [Hash] opts the optional parameters # @option opts [User] :body Created user object - # @return [Array] response status code, response headers and nil + # @return [Array<(nil, Fixnum, Hash)>] nil, response status code and response headers def create_user_with_http_info(opts = {}) if Configuration.debugging Configuration.logger.debug "Calling API: UserApi#create_user ..." @@ -53,16 +53,16 @@ module Petstore auth_names = [] - status_code, headers, data = @api_client.call_api(:POST, path, + data, status_code, headers = @api_client.call_api(:POST, path, :header_params => header_params, :query_params => query_params, :form_params => form_params, :body => post_body, :auth_names => auth_names) if Configuration.debugging - Configuration.logger.debug "API called: UserApi#create_user\nStatus code: #{status_code}\nHeaders: #{headers}\nData: #{data.inspect}" + Configuration.logger.debug "API called: UserApi#create_user\nData: #{data.inspect}\nStatus code: #{status_code}\nHeaders: #{headers}" end - return status_code, headers, data + return data, status_code, headers end # Creates list of users with given input array @@ -79,7 +79,7 @@ module Petstore # # @param [Hash] opts the optional parameters # @option opts [Array] :body List of user object - # @return [Array] response status code, response headers and nil + # @return [Array<(nil, Fixnum, Hash)>] nil, response status code and response headers def create_users_with_array_input_with_http_info(opts = {}) if Configuration.debugging Configuration.logger.debug "Calling API: UserApi#create_users_with_array_input ..." @@ -110,16 +110,16 @@ module Petstore auth_names = [] - status_code, headers, data = @api_client.call_api(:POST, path, + data, status_code, headers = @api_client.call_api(:POST, path, :header_params => header_params, :query_params => query_params, :form_params => form_params, :body => post_body, :auth_names => auth_names) if Configuration.debugging - Configuration.logger.debug "API called: UserApi#create_users_with_array_input\nStatus code: #{status_code}\nHeaders: #{headers}\nData: #{data.inspect}" + Configuration.logger.debug "API called: UserApi#create_users_with_array_input\nData: #{data.inspect}\nStatus code: #{status_code}\nHeaders: #{headers}" end - return status_code, headers, data + return data, status_code, headers end # Creates list of users with given input array @@ -136,7 +136,7 @@ module Petstore # # @param [Hash] opts the optional parameters # @option opts [Array] :body List of user object - # @return [Array] response status code, response headers and nil + # @return [Array<(nil, Fixnum, Hash)>] nil, response status code and response headers def create_users_with_list_input_with_http_info(opts = {}) if Configuration.debugging Configuration.logger.debug "Calling API: UserApi#create_users_with_list_input ..." @@ -167,16 +167,16 @@ module Petstore auth_names = [] - status_code, headers, data = @api_client.call_api(:POST, path, + data, status_code, headers = @api_client.call_api(:POST, path, :header_params => header_params, :query_params => query_params, :form_params => form_params, :body => post_body, :auth_names => auth_names) if Configuration.debugging - Configuration.logger.debug "API called: UserApi#create_users_with_list_input\nStatus code: #{status_code}\nHeaders: #{headers}\nData: #{data.inspect}" + Configuration.logger.debug "API called: UserApi#create_users_with_list_input\nData: #{data.inspect}\nStatus code: #{status_code}\nHeaders: #{headers}" end - return status_code, headers, data + return data, status_code, headers end # Logs user into the system @@ -186,7 +186,7 @@ module Petstore # @option opts [String] :password The password for login in clear text # @return [String] def login_user(opts = {}) - status_code, headers, data = login_user_with_http_info(opts) + data, status_code, headers = login_user_with_http_info(opts) return data end @@ -195,7 +195,7 @@ module Petstore # @param [Hash] opts the optional parameters # @option opts [String] :username The user name for login # @option opts [String] :password The password for login in clear text - # @return [Array] response status code, response headers and String data + # @return [Array<(String, Fixnum, Hash)>] String data, response status code and response headers def login_user_with_http_info(opts = {}) if Configuration.debugging Configuration.logger.debug "Calling API: UserApi#login_user ..." @@ -228,7 +228,7 @@ module Petstore auth_names = [] - status_code, headers, data = @api_client.call_api(:GET, path, + data, status_code, headers = @api_client.call_api(:GET, path, :header_params => header_params, :query_params => query_params, :form_params => form_params, @@ -236,9 +236,9 @@ module Petstore :auth_names => auth_names, :return_type => 'String') if Configuration.debugging - Configuration.logger.debug "API called: UserApi#login_user\nStatus code: #{status_code}\nHeaders: #{headers}\nData: #{data.inspect}" + Configuration.logger.debug "API called: UserApi#login_user\nData: #{data.inspect}\nStatus code: #{status_code}\nHeaders: #{headers}" end - return status_code, headers, data + return data, status_code, headers end # Logs out current logged in user session @@ -253,7 +253,7 @@ module Petstore # Logs out current logged in user session # # @param [Hash] opts the optional parameters - # @return [Array] response status code, response headers and nil + # @return [Array<(nil, Fixnum, Hash)>] nil, response status code and response headers def logout_user_with_http_info(opts = {}) if Configuration.debugging Configuration.logger.debug "Calling API: UserApi#logout_user ..." @@ -284,16 +284,16 @@ module Petstore auth_names = [] - status_code, headers, data = @api_client.call_api(:GET, path, + data, status_code, headers = @api_client.call_api(:GET, path, :header_params => header_params, :query_params => query_params, :form_params => form_params, :body => post_body, :auth_names => auth_names) if Configuration.debugging - Configuration.logger.debug "API called: UserApi#logout_user\nStatus code: #{status_code}\nHeaders: #{headers}\nData: #{data.inspect}" + Configuration.logger.debug "API called: UserApi#logout_user\nData: #{data.inspect}\nStatus code: #{status_code}\nHeaders: #{headers}" end - return status_code, headers, data + return data, status_code, headers end # Get user by user name @@ -302,7 +302,7 @@ module Petstore # @param [Hash] opts the optional parameters # @return [User] def get_user_by_name(username, opts = {}) - status_code, headers, data = get_user_by_name_with_http_info(username, opts) + data, status_code, headers = get_user_by_name_with_http_info(username, opts) return data end @@ -310,7 +310,7 @@ module Petstore # # @param username The name that needs to be fetched. Use user1 for testing. # @param [Hash] opts the optional parameters - # @return [Array] response status code, response headers and User data + # @return [Array<(User, Fixnum, Hash)>] User data, response status code and response headers def get_user_by_name_with_http_info(username, opts = {}) if Configuration.debugging Configuration.logger.debug "Calling API: UserApi#get_user_by_name ..." @@ -344,7 +344,7 @@ module Petstore auth_names = [] - status_code, headers, data = @api_client.call_api(:GET, path, + data, status_code, headers = @api_client.call_api(:GET, path, :header_params => header_params, :query_params => query_params, :form_params => form_params, @@ -352,9 +352,9 @@ module Petstore :auth_names => auth_names, :return_type => 'User') if Configuration.debugging - Configuration.logger.debug "API called: UserApi#get_user_by_name\nStatus code: #{status_code}\nHeaders: #{headers}\nData: #{data.inspect}" + Configuration.logger.debug "API called: UserApi#get_user_by_name\nData: #{data.inspect}\nStatus code: #{status_code}\nHeaders: #{headers}" end - return status_code, headers, data + return data, status_code, headers end # Updated user @@ -373,7 +373,7 @@ module Petstore # @param username name that need to be deleted # @param [Hash] opts the optional parameters # @option opts [User] :body Updated user object - # @return [Array] response status code, response headers and nil + # @return [Array<(nil, Fixnum, Hash)>] nil, response status code and response headers def update_user_with_http_info(username, opts = {}) if Configuration.debugging Configuration.logger.debug "Calling API: UserApi#update_user ..." @@ -407,16 +407,16 @@ module Petstore auth_names = [] - status_code, headers, data = @api_client.call_api(:PUT, path, + data, status_code, headers = @api_client.call_api(:PUT, path, :header_params => header_params, :query_params => query_params, :form_params => form_params, :body => post_body, :auth_names => auth_names) if Configuration.debugging - Configuration.logger.debug "API called: UserApi#update_user\nStatus code: #{status_code}\nHeaders: #{headers}\nData: #{data.inspect}" + Configuration.logger.debug "API called: UserApi#update_user\nData: #{data.inspect}\nStatus code: #{status_code}\nHeaders: #{headers}" end - return status_code, headers, data + return data, status_code, headers end # Delete user @@ -433,7 +433,7 @@ module Petstore # This can only be done by the logged in user. # @param username The name that needs to be deleted # @param [Hash] opts the optional parameters - # @return [Array] response status code, response headers and nil + # @return [Array<(nil, Fixnum, Hash)>] nil, response status code and response headers def delete_user_with_http_info(username, opts = {}) if Configuration.debugging Configuration.logger.debug "Calling API: UserApi#delete_user ..." @@ -467,16 +467,16 @@ module Petstore auth_names = [] - status_code, headers, data = @api_client.call_api(:DELETE, path, + data, status_code, headers = @api_client.call_api(:DELETE, path, :header_params => header_params, :query_params => query_params, :form_params => form_params, :body => post_body, :auth_names => auth_names) if Configuration.debugging - Configuration.logger.debug "API called: UserApi#delete_user\nStatus code: #{status_code}\nHeaders: #{headers}\nData: #{data.inspect}" + Configuration.logger.debug "API called: UserApi#delete_user\nData: #{data.inspect}\nStatus code: #{status_code}\nHeaders: #{headers}" end - return status_code, headers, data + return data, status_code, headers end end end diff --git a/samples/client/petstore/ruby/lib/petstore/api_client.rb b/samples/client/petstore/ruby/lib/petstore/api_client.rb index 9dfe51ba147..412fb7946ad 100644 --- a/samples/client/petstore/ruby/lib/petstore/api_client.rb +++ b/samples/client/petstore/ruby/lib/petstore/api_client.rb @@ -25,8 +25,10 @@ module Petstore } end - # Call an API with given options and an array of 3 elements: - # response status code, response headers and the data deserialized from response body (could be nil). + # Call an API with given options. + # + # @return [Array<(Object, Fixnum, Hash)>] an array of 3 elements: + # the data deserialized from response body (could be nil), response status code and response headers. def call_api(http_method, path, opts = {}) request = build_request(http_method, path, opts) response = request.run @@ -47,7 +49,7 @@ module Petstore else data = nil end - return response.code, response.headers, data + return data, response.code, response.headers end def build_request(http_method, path, opts = {}) diff --git a/samples/client/petstore/ruby/spec/pet_spec.rb b/samples/client/petstore/ruby/spec/pet_spec.rb index 4c6e9180a8a..9426d2024b9 100644 --- a/samples/client/petstore/ruby/spec/pet_spec.rb +++ b/samples/client/petstore/ruby/spec/pet_spec.rb @@ -51,7 +51,7 @@ describe "Pet" do end it "should fetch a pet object with http info" do - status_code, headers, pet = @pet_api.get_pet_by_id_with_http_info(10002) + pet, status_code, headers = @pet_api.get_pet_by_id_with_http_info(10002) status_code.should == 200 headers['Content-Type'].should == 'application/json' pet.should be_a(Petstore::Pet) From 105e3e3327c96d4ed0429c0f25da14327ba5a1f3 Mon Sep 17 00:00:00 2001 From: wing328 Date: Mon, 7 Dec 2015 16:36:32 +0800 Subject: [PATCH 143/211] Create CONTRIBUTING.md --- CONTRIBUTING.md | 60 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 60 insertions(+) create mode 100644 CONTRIBUTING.md diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 00000000000..ae5b1fbbfbf --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,60 @@ +## Before submitting an issue + + - Before submitting an issue, search the [open issue](https://github.com/swagger-api/swagger-codegen/issues) and [closed issue](https://github.com/swagger-api/swagger-codegen/issues?q=is%3Aissue+is%3Aclosed) to ensure no one else has reported something similar before. + - The issue should contain details on how to repeat the issue, e.g. + - the Swagger spec for reproducing the issue (:bulb: use [Gist](https://gist.github.com) to share). If the Swagger spec cannot be shared publicly, it will be hard for the community to help + - version of Swagger Codegen + - language (`-l` in the command line, e.g. java, csharp, php) + - You can also make a suggestion or ask a question by opening an "issue" + +## Before submitting a PR + + - Search the [open issue](https://github.com/swagger-api/swagger-codegen/issues) to ensure no one else has reported something similar and no one is actively working on similar proposed change. + - If no one has suggested something similar, open an ["issue"](https://github.com/swagger-api/swagger-codegen/issues) with your suggestion to gather feedback from the community. + +## How to contribute + +### Code generators + +All the code generators can be found in [modules/swagger-codegen/src/main/java/io/swagger/codegen/languages](https://github.com/swagger-api/swagger-codegen/tree/master/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages) + +### Templates + +All the templates ([mustache](https://mustache.github.io/)) can be found in [modules/swagger-codegen/src/main/resources](https://github.com/swagger-api/swagger-codegen/tree/master/modules/swagger-codegen/src/main/resources). + +For a list of variables available in the template, please refer to this [page](https://github.com/swagger-api/swagger-codegen/wiki/Mustache-Template-Variables) + + +### Style guide +Code change should conform to the programming style guide of the respective langauages: +- C#: https://msdn.microsoft.com/en-us/library/vstudio/ff926074.aspx +- Java: https://google.github.io/styleguide/javaguide.html +- ObjC: https://github.com/NYTimes/objective-c-style-guide +- PHP: https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-2-coding-style-guide.md +- Python: https://www.python.org/dev/peps/pep-0008/ +- Ruby: https://github.com/bbatsov/ruby-style-guide +- TypeScript: https://github.com/Microsoft/TypeScript/wiki/Coding-guidelines + + +For other languages, feel free to suggest. + +You may find the current code base not 100% conform to the coding style and we welcome contributions to fix those. + +### Testing + +To add test cases (optional) covering the change in the code generator, please refer to [modules/swagger-codegen/src/test/java/io/swagger/codegen](https://github.com/swagger-api/swagger-codegen/tree/master/modules/swagger-codegen/src/test/java/io/swagger/codegen) + +To test the templates, please perform the following: +- Update the [Petstore](http://petstore.swagger.io/) sample by running the shell script under `bin` folder. For example, run `./bin/ruby-petstore.sh` to update the Ruby PetStore API client under [`samples/client/petstore/ruby`](https://github.com/swagger-api/swagger-codegen/tree/master/samples/client/petstore/ruby) (For Windows, the batch files can be found under `bin\windows` folder) +- Run the tests in the sample folder, e.g. in `samples/client/petstore/ruby`, run `mvn integration-test -rf :RubyPetstoreClientTests`. (some languages may not contain unit testing for Petstore and we're looking for contribution from the community to implement those tests) +- Finally, git commit the updated samples files: `git commit -a` + (`git add -A` if added files with new test cases) + +To start the CI tests, you can run `mvn verify -Psamples` (assuming you've all the required tools installed to run tests for different languages) or you can leverage http://travis-ci.org to run the CI tests by adding your own Swagger-Codegen repository. + +### Tips +- Smaller changes are easier to review +- [Optional] For bug fixes, provide a Swagger spec to repeat the issue so that the reviewer can use it to confirm the fix +- Add test case(s) to cover the change +- Document the fix in the code to make the code more readable +- Make sure test cases passed after the change (one way is to leverage https://travis-ci.org/ to run the CI tests) From b4c6fc20cb800cc63d557b9b8e2c0a5023f54652 Mon Sep 17 00:00:00 2001 From: wing328 Date: Mon, 7 Dec 2015 16:38:07 +0800 Subject: [PATCH 144/211] Update CONTRIBUTING.md --- CONTRIBUTING.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index ae5b1fbbfbf..4bef580bb26 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -1,3 +1,5 @@ +# Guidelines For Contributing + ## Before submitting an issue - Before submitting an issue, search the [open issue](https://github.com/swagger-api/swagger-codegen/issues) and [closed issue](https://github.com/swagger-api/swagger-codegen/issues?q=is%3Aissue+is%3Aclosed) to ensure no one else has reported something similar before. From 9ed5b863c4224b5d0f9cff529345043d11397138 Mon Sep 17 00:00:00 2001 From: wing328 Date: Mon, 7 Dec 2015 16:58:51 +0800 Subject: [PATCH 145/211] Update README.md --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 8bdb6be693e..e810a0fafc8 100644 --- a/README.md +++ b/README.md @@ -3,6 +3,8 @@ [![Build Status](https://travis-ci.org/swagger-api/swagger-codegen.png)](https://travis-ci.org/swagger-api/swagger-codegen) [![Maven Central](https://maven-badges.herokuapp.com/maven-central/io.swagger/swagger-codegen-project/badge.svg?style=plastic)](https://maven-badges.herokuapp.com/maven-central/io.swagger/swagger-codegen-project) +:star::star::star: If you would like to contribute, please refer to [guidelines](https://github.com/swagger-api/swagger-codegen/blob/master/CONTRIBUTING.md) and a list of [open tasks](https://github.com/swagger-api/swagger-codegen/issues?q=is%3Aopen+is%3Aissue+label%3A%22Need+community+contribution%22).:star::star::star: + ## Overview This is the swagger codegen project, which allows generation of client libraries automatically from a Swagger-compliant server. From 17230785083fcfd8e8bef3f23f460beeeddfd7eb Mon Sep 17 00:00:00 2001 From: David Kiss Date: Mon, 7 Dec 2015 22:34:38 -0500 Subject: [PATCH 146/211] added support in feign for binary uploads --- .../libraries/feign/FormAwareEncoder.mustache | 172 ++++++++++------- .../Java/libraries/feign/api.mustache | 8 +- samples/client/petstore/java/feign/README.md | 4 +- samples/client/petstore/java/feign/pom.xml | 4 +- .../petstore/java/feign/settings.gradle | 2 +- .../java/io/swagger/client/ApiClient.java | 2 +- .../io/swagger/client/FormAwareEncoder.java | 174 +++++++++++------- .../java/io/swagger/client/StringUtil.java | 2 +- .../java/io/swagger/client/api/PetApi.java | 26 ++- .../java/io/swagger/client/api/StoreApi.java | 16 +- .../java/io/swagger/client/api/UserApi.java | 24 +-- .../io/swagger/client/model/ApiResponse.java | 2 +- .../io/swagger/client/model/Category.java | 2 +- .../java/io/swagger/client/model/Order.java | 2 +- .../java/io/swagger/client/model/Pet.java | 2 +- .../java/io/swagger/client/model/Tag.java | 2 +- .../java/io/swagger/client/model/User.java | 2 +- .../swagger/petstore/test/StoreApiTest.java | 10 +- 18 files changed, 256 insertions(+), 200 deletions(-) diff --git a/modules/swagger-codegen/src/main/resources/Java/libraries/feign/FormAwareEncoder.mustache b/modules/swagger-codegen/src/main/resources/Java/libraries/feign/FormAwareEncoder.mustache index d0f026cced9..822aad582d4 100644 --- a/modules/swagger-codegen/src/main/resources/Java/libraries/feign/FormAwareEncoder.mustache +++ b/modules/swagger-codegen/src/main/resources/Java/libraries/feign/FormAwareEncoder.mustache @@ -4,21 +4,31 @@ import java.io.*; import java.lang.reflect.Type; import java.net.URLEncoder; import java.net.URLConnection; +import java.nio.charset.Charset; import java.util.*; import java.text.DateFormat; import java.text.SimpleDateFormat; +import feign.codec.EncodeException; import feign.codec.Encoder; import feign.RequestTemplate; {{>generatedAnnotation}} public class FormAwareEncoder implements Encoder { + public static final String UTF_8 = "utf-8"; private static final String LINE_FEED = "\r\n"; + private static final String TWO_DASH = "--"; private static final String BOUNDARY = "----------------314159265358979323846"; + private byte[] lineFeedBytes; + private byte[] boundaryBytes; + private byte[] twoDashBytes; + private byte[] atBytes; + private byte[] eqBytes; + private final Encoder delegate; - private DateFormat dateFormat; + private final DateFormat dateFormat; public FormAwareEncoder(Encoder delegate) { this.delegate = delegate; @@ -28,93 +38,121 @@ public class FormAwareEncoder implements Encoder { // Use UTC as the default time zone. this.dateFormat.setTimeZone(TimeZone.getTimeZone("UTC")); + try { + this.lineFeedBytes = LINE_FEED.getBytes(UTF_8); + this.boundaryBytes = BOUNDARY.getBytes(UTF_8); + this.twoDashBytes = TWO_DASH.getBytes(UTF_8); + this.atBytes = "&".getBytes(UTF_8); + this.eqBytes = "=".getBytes(UTF_8); + } catch (UnsupportedEncodingException e) { + e.printStackTrace(); + } } - public void encode(Object object, Type bodyType, RequestTemplate template) { + public void encode(Object object, Type bodyType, RequestTemplate template) throws EncodeException { if (object instanceof Map) { - StringBuilder formParamBuilder = new StringBuilder(); - Map formParams = (Map) object; - boolean isMultiPart = isMultiPart(formParams); - for (Map.Entry param : formParams.entrySet()) { - String keyStr = param.getKey(); - if (param.getValue() instanceof File) { - addFilePart(formParamBuilder, keyStr, (File) param.getValue()); - } else { - String valueStr = parameterToString(param.getValue()); - if (isMultiPart) { - addMultiPartFormField(formParamBuilder, keyStr, valueStr); - } else { - addEncodedFormField(formParamBuilder, keyStr, valueStr); - } - } + try { + encodeFormParams(template, (Map) object); + } catch (IOException e) { + throw new EncodeException("Failed to create request", e); } - - if (isMultiPart) { - formParamBuilder.append(LINE_FEED); - formParamBuilder.append("--").append(BOUNDARY).append("--").append(LINE_FEED); - } - - String contentType = isMultiPart ? "multipart/form-data; boundary=" + BOUNDARY : "application/x-www-form-urlencoded"; - template.header("Content-type"); - template.header("Content-type", contentType); - template.header("MIME-Version", "1.0"); - template.body(formParamBuilder.toString()); } else { delegate.encode(object, bodyType, template); } } + private void encodeFormParams(RequestTemplate template, Map formParams) throws IOException { + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + + boolean isMultiPart = isMultiPart(formParams); + boolean isFirstField = true; + for (Map.Entry param : formParams.entrySet()) { + String keyStr = param.getKey(); + if (param.getValue() instanceof File) { + addFilePart(baos, keyStr, (File) param.getValue()); + } else { + String valueStr = parameterToString(param.getValue()); + if (isMultiPart) { + addMultiPartFormField(baos, keyStr, valueStr); + } else { + addEncodedFormField(baos, keyStr, valueStr, isFirstField); + isFirstField = false; + } + } + } + + if (isMultiPart) { + baos.write(lineFeedBytes); + baos.write(twoDashBytes); + baos.write(boundaryBytes); + baos.write(twoDashBytes); + baos.write(lineFeedBytes); + } + + String contentType = isMultiPart ? "multipart/form-data; boundary=" + BOUNDARY : "application/x-www-form-urlencoded"; + template.header("Content-type"); + template.header("Content-type", contentType); + template.header("MIME-Version", "1.0"); + template.body(baos.toByteArray(), Charset.forName(UTF_8)); + } + /* * Currently only supports text files */ - private void addFilePart(StringBuilder formParamBuilder, String fieldName, File uploadFile) { - try { - String fileName = uploadFile.getName(); - formParamBuilder.append("--").append(BOUNDARY).append(LINE_FEED); - formParamBuilder.append( - "Content-Disposition: form-data; name=\"" + fieldName - + "\"; filename=\"" + fileName + "\"") - .append(LINE_FEED); - formParamBuilder.append( - "Content-Type: " - + URLConnection.guessContentTypeFromName(fileName)) - .append(LINE_FEED); - formParamBuilder.append(LINE_FEED); + private void addFilePart(ByteArrayOutputStream baos, String fieldName, File uploadFile) throws IOException { + String fileName = uploadFile.getName(); + baos.write(twoDashBytes); + baos.write(boundaryBytes); + baos.write(lineFeedBytes); - BufferedReader reader = new BufferedReader(new FileReader(uploadFile)); - String line = ""; - while ((line = reader.readLine()) != null) { - formParamBuilder.append(line).append(LINE_FEED); - } + String contentDisposition = "Content-Disposition: form-data; name=\"" + fieldName + + "\"; filename=\"" + fileName + "\""; + baos.write(contentDisposition.getBytes(UTF_8)); + baos.write(lineFeedBytes); + String contentType = "Content-Type: " + URLConnection.guessContentTypeFromName(fileName); + baos.write(contentType.getBytes(UTF_8)); + baos.write(lineFeedBytes); + baos.write(lineFeedBytes); - formParamBuilder.append(LINE_FEED); - } catch (IOException e) { - e.printStackTrace(); + BufferedReader reader = new BufferedReader(new FileReader(uploadFile)); + InputStream input = new FileInputStream(uploadFile); + byte[] bytes = new byte[4096]; + int len = bytes.length; + while ((len = input.read(bytes)) != -1) { + baos.write(bytes, 0, len); + baos.write(lineFeedBytes); } + + baos.write(lineFeedBytes); } - private void addEncodedFormField(StringBuilder formParamBuilder, String name, String value) { - if (formParamBuilder.length() > 0) { - formParamBuilder.append("&"); + private void addEncodedFormField(ByteArrayOutputStream baos, String name, String value, boolean isFirstField) throws IOException { + if (!isFirstField) { + baos.write(atBytes); } - try { - formParamBuilder.append(URLEncoder.encode(name, "utf8")) - .append("=") - .append(URLEncoder.encode(value, "utf8")); - } catch (UnsupportedEncodingException e) { - // move on to next - } + String encodedName = URLEncoder.encode(name, UTF_8); + String encodedValue = URLEncoder.encode(value, UTF_8); + baos.write(encodedName.getBytes(UTF_8)); + baos.write("=".getBytes(UTF_8)); + baos.write(encodedValue.getBytes(UTF_8)); } - private void addMultiPartFormField(StringBuilder formParamBuilder, String name, String value) { - formParamBuilder.append("--").append(BOUNDARY).append(LINE_FEED); - formParamBuilder.append("Content-Disposition: form-data; name=\"" + name + "\"") - .append(LINE_FEED); - formParamBuilder.append("Content-Type: text/plain; charset=utf-8").append( - LINE_FEED); - formParamBuilder.append(LINE_FEED); - formParamBuilder.append(value).append(LINE_FEED); + private void addMultiPartFormField(ByteArrayOutputStream baos, String name, String value) throws IOException { + baos.write(twoDashBytes); + baos.write(boundaryBytes); + baos.write(lineFeedBytes); + + String contentDisposition = "Content-Disposition: form-data; name=\"" + name + "\""; + String contentType = "Content-Type: text/plain; charset=utf-8"; + + baos.write(contentDisposition.getBytes(UTF_8)); + baos.write(lineFeedBytes); + baos.write(contentType.getBytes(UTF_8)); + baos.write(lineFeedBytes); + baos.write(lineFeedBytes); + baos.write(value.getBytes(UTF_8)); + baos.write(lineFeedBytes); } private boolean isMultiPart(Map formParams) { diff --git a/modules/swagger-codegen/src/main/resources/Java/libraries/feign/api.mustache b/modules/swagger-codegen/src/main/resources/Java/libraries/feign/api.mustache index 20106806102..30c8a793914 100644 --- a/modules/swagger-codegen/src/main/resources/Java/libraries/feign/api.mustache +++ b/modules/swagger-codegen/src/main/resources/Java/libraries/feign/api.mustache @@ -1,10 +1,6 @@ package {{package}}; -import {{invokerPackage}}.ApiException; import {{invokerPackage}}.ApiClient; -import {{invokerPackage}}.Configuration; -import {{invokerPackage}}.Pair; -import {{invokerPackage}}.TypeRef; {{#imports}}import {{import}}; {{/imports}} @@ -14,7 +10,7 @@ import {{invokerPackage}}.TypeRef; import feign.*; {{>generatedAnnotation}} -public interface {{classname}} extends {{invokerPackage}}.ApiClient.Api { +public interface {{classname}} extends ApiClient.Api { {{#operations}}{{#operation}} /** @@ -30,7 +26,7 @@ public interface {{classname}} extends {{invokerPackage}}.ApiClient.Api { "{{paramName}}: {{=<% %>=}}{<%paramName%>}<%={{ }}=%>"{{#hasMore}}, {{/hasMore}}{{/headerParams}} }) - {{#returnType}}{{{returnType}}} {{/returnType}}{{^returnType}}void {{/returnType}}{{nickname}}({{#allParams}}{{^vendorExtensions.x-isBody}}@Param("{{paramName}}") {{/vendorExtensions.x-isBody}}{{{dataType}}} {{paramName}}{{#hasMore}}, {{/hasMore}}{{/allParams}}) throws ApiException; + {{#returnType}}{{{returnType}}} {{/returnType}}{{^returnType}}void {{/returnType}}{{nickname}}({{#allParams}}{{^vendorExtensions.x-isBody}}@Param("{{paramName}}") {{/vendorExtensions.x-isBody}}{{{dataType}}} {{paramName}}{{#hasMore}}, {{/hasMore}}{{/allParams}}); {{/operation}} {{/operations}} } diff --git a/samples/client/petstore/java/feign/README.md b/samples/client/petstore/java/feign/README.md index 3ca7abfb557..8afc37518fc 100644 --- a/samples/client/petstore/java/feign/README.md +++ b/samples/client/petstore/java/feign/README.md @@ -1,4 +1,4 @@ -# swagger-petstore-feign +# swagger-java-client ## Requirements @@ -25,7 +25,7 @@ After the client libarary is installed/deployed, you can use it in your Maven pr ```xml io.swagger - swagger-petstore-feign + swagger-java-client 1.0.0 compile diff --git a/samples/client/petstore/java/feign/pom.xml b/samples/client/petstore/java/feign/pom.xml index 5f7e9551862..967bdabcc6b 100644 --- a/samples/client/petstore/java/feign/pom.xml +++ b/samples/client/petstore/java/feign/pom.xml @@ -2,9 +2,9 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> 4.0.0 io.swagger - swagger-petstore-feign + swagger-java-client jar - swagger-petstore-feign + swagger-java-client 1.0.0 scm:git:git@github.com:swagger-api/swagger-mustache.git diff --git a/samples/client/petstore/java/feign/settings.gradle b/samples/client/petstore/java/feign/settings.gradle index a25109c126e..55640f75122 100644 --- a/samples/client/petstore/java/feign/settings.gradle +++ b/samples/client/petstore/java/feign/settings.gradle @@ -1 +1 @@ -rootProject.name = "swagger-petstore-feign" \ No newline at end of file +rootProject.name = "swagger-java-client" \ No newline at end of file diff --git a/samples/client/petstore/java/feign/src/main/java/io/swagger/client/ApiClient.java b/samples/client/petstore/java/feign/src/main/java/io/swagger/client/ApiClient.java index e486c713a92..001d05f49f0 100644 --- a/samples/client/petstore/java/feign/src/main/java/io/swagger/client/ApiClient.java +++ b/samples/client/petstore/java/feign/src/main/java/io/swagger/client/ApiClient.java @@ -8,7 +8,7 @@ import feign.jackson.JacksonDecoder; import feign.jackson.JacksonEncoder; import feign.slf4j.Slf4jLogger; -@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-12-07T01:11:21.159-05:00") +@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-12-07T22:27:06.680-05:00") public class ApiClient { public interface Api {} diff --git a/samples/client/petstore/java/feign/src/main/java/io/swagger/client/FormAwareEncoder.java b/samples/client/petstore/java/feign/src/main/java/io/swagger/client/FormAwareEncoder.java index 3ec3c6b9274..3f0230a406a 100644 --- a/samples/client/petstore/java/feign/src/main/java/io/swagger/client/FormAwareEncoder.java +++ b/samples/client/petstore/java/feign/src/main/java/io/swagger/client/FormAwareEncoder.java @@ -4,21 +4,31 @@ import java.io.*; import java.lang.reflect.Type; import java.net.URLEncoder; import java.net.URLConnection; +import java.nio.charset.Charset; import java.util.*; import java.text.DateFormat; import java.text.SimpleDateFormat; +import feign.codec.EncodeException; import feign.codec.Encoder; import feign.RequestTemplate; -@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-12-07T01:11:21.159-05:00") +@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-12-07T22:27:06.680-05:00") public class FormAwareEncoder implements Encoder { + public static final String UTF_8 = "utf-8"; private static final String LINE_FEED = "\r\n"; + private static final String TWO_DASH = "--"; private static final String BOUNDARY = "----------------314159265358979323846"; + private byte[] lineFeedBytes; + private byte[] boundaryBytes; + private byte[] twoDashBytes; + private byte[] atBytes; + private byte[] eqBytes; + private final Encoder delegate; - private DateFormat dateFormat; + private final DateFormat dateFormat; public FormAwareEncoder(Encoder delegate) { this.delegate = delegate; @@ -28,93 +38,121 @@ public class FormAwareEncoder implements Encoder { // Use UTC as the default time zone. this.dateFormat.setTimeZone(TimeZone.getTimeZone("UTC")); + try { + this.lineFeedBytes = LINE_FEED.getBytes(UTF_8); + this.boundaryBytes = BOUNDARY.getBytes(UTF_8); + this.twoDashBytes = TWO_DASH.getBytes(UTF_8); + this.atBytes = "&".getBytes(UTF_8); + this.eqBytes = "=".getBytes(UTF_8); + } catch (UnsupportedEncodingException e) { + e.printStackTrace(); + } } - public void encode(Object object, Type bodyType, RequestTemplate template) { + public void encode(Object object, Type bodyType, RequestTemplate template) throws EncodeException { if (object instanceof Map) { - StringBuilder formParamBuilder = new StringBuilder(); - Map formParams = (Map) object; - boolean isMultiPart = isMultiPart(formParams); - for (Map.Entry param : formParams.entrySet()) { - String keyStr = param.getKey(); - if (param.getValue() instanceof File) { - addFilePart(formParamBuilder, keyStr, (File) param.getValue()); - } else { - String valueStr = parameterToString(param.getValue()); - if (isMultiPart) { - addMultiPartFormField(formParamBuilder, keyStr, valueStr); - } else { - addEncodedFormField(formParamBuilder, keyStr, valueStr); - } - } + try { + encodeFormParams(template, (Map) object); + } catch (IOException e) { + throw new EncodeException("Failed to create request", e); } - - if (isMultiPart) { - formParamBuilder.append(LINE_FEED); - formParamBuilder.append("--").append(BOUNDARY).append("--").append(LINE_FEED); - } - - String contentType = isMultiPart ? "multipart/form-data; boundary=" + BOUNDARY : "application/x-www-form-urlencoded"; - template.header("Content-type"); - template.header("Content-type", contentType); - template.header("MIME-Version", "1.0"); - template.body(formParamBuilder.toString()); } else { delegate.encode(object, bodyType, template); } } + private void encodeFormParams(RequestTemplate template, Map formParams) throws IOException { + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + + boolean isMultiPart = isMultiPart(formParams); + boolean isFirstField = true; + for (Map.Entry param : formParams.entrySet()) { + String keyStr = param.getKey(); + if (param.getValue() instanceof File) { + addFilePart(baos, keyStr, (File) param.getValue()); + } else { + String valueStr = parameterToString(param.getValue()); + if (isMultiPart) { + addMultiPartFormField(baos, keyStr, valueStr); + } else { + addEncodedFormField(baos, keyStr, valueStr, isFirstField); + isFirstField = false; + } + } + } + + if (isMultiPart) { + baos.write(lineFeedBytes); + baos.write(twoDashBytes); + baos.write(boundaryBytes); + baos.write(twoDashBytes); + baos.write(lineFeedBytes); + } + + String contentType = isMultiPart ? "multipart/form-data; boundary=" + BOUNDARY : "application/x-www-form-urlencoded"; + template.header("Content-type"); + template.header("Content-type", contentType); + template.header("MIME-Version", "1.0"); + template.body(baos.toByteArray(), Charset.forName(UTF_8)); + } + /* * Currently only supports text files */ - private void addFilePart(StringBuilder formParamBuilder, String fieldName, File uploadFile) { - try { - String fileName = uploadFile.getName(); - formParamBuilder.append("--").append(BOUNDARY).append(LINE_FEED); - formParamBuilder.append( - "Content-Disposition: form-data; name=\"" + fieldName - + "\"; filename=\"" + fileName + "\"") - .append(LINE_FEED); - formParamBuilder.append( - "Content-Type: " - + URLConnection.guessContentTypeFromName(fileName)) - .append(LINE_FEED); - formParamBuilder.append(LINE_FEED); + private void addFilePart(ByteArrayOutputStream baos, String fieldName, File uploadFile) throws IOException { + String fileName = uploadFile.getName(); + baos.write(twoDashBytes); + baos.write(boundaryBytes); + baos.write(lineFeedBytes); - BufferedReader reader = new BufferedReader(new FileReader(uploadFile)); - String line = ""; - while ((line = reader.readLine()) != null) { - formParamBuilder.append(line).append(LINE_FEED); - } + String contentDisposition = "Content-Disposition: form-data; name=\"" + fieldName + + "\"; filename=\"" + fileName + "\""; + baos.write(contentDisposition.getBytes(UTF_8)); + baos.write(lineFeedBytes); + String contentType = "Content-Type: " + URLConnection.guessContentTypeFromName(fileName); + baos.write(contentType.getBytes(UTF_8)); + baos.write(lineFeedBytes); + baos.write(lineFeedBytes); - formParamBuilder.append(LINE_FEED); - } catch (IOException e) { - e.printStackTrace(); + BufferedReader reader = new BufferedReader(new FileReader(uploadFile)); + InputStream input = new FileInputStream(uploadFile); + byte[] bytes = new byte[4096]; + int len = bytes.length; + while ((len = input.read(bytes)) != -1) { + baos.write(bytes, 0, len); + baos.write(lineFeedBytes); } + + baos.write(lineFeedBytes); } - private void addEncodedFormField(StringBuilder formParamBuilder, String name, String value) { - if (formParamBuilder.length() > 0) { - formParamBuilder.append("&"); + private void addEncodedFormField(ByteArrayOutputStream baos, String name, String value, boolean isFirstField) throws IOException { + if (!isFirstField) { + baos.write(atBytes); } - try { - formParamBuilder.append(URLEncoder.encode(name, "utf8")) - .append("=") - .append(URLEncoder.encode(value, "utf8")); - } catch (UnsupportedEncodingException e) { - // move on to next - } + String encodedName = URLEncoder.encode(name, UTF_8); + String encodedValue = URLEncoder.encode(value, UTF_8); + baos.write(encodedName.getBytes(UTF_8)); + baos.write("=".getBytes(UTF_8)); + baos.write(encodedValue.getBytes(UTF_8)); } - private void addMultiPartFormField(StringBuilder formParamBuilder, String name, String value) { - formParamBuilder.append("--").append(BOUNDARY).append(LINE_FEED); - formParamBuilder.append("Content-Disposition: form-data; name=\"" + name + "\"") - .append(LINE_FEED); - formParamBuilder.append("Content-Type: text/plain; charset=utf-8").append( - LINE_FEED); - formParamBuilder.append(LINE_FEED); - formParamBuilder.append(value).append(LINE_FEED); + private void addMultiPartFormField(ByteArrayOutputStream baos, String name, String value) throws IOException { + baos.write(twoDashBytes); + baos.write(boundaryBytes); + baos.write(lineFeedBytes); + + String contentDisposition = "Content-Disposition: form-data; name=\"" + name + "\""; + String contentType = "Content-Type: text/plain; charset=utf-8"; + + baos.write(contentDisposition.getBytes(UTF_8)); + baos.write(lineFeedBytes); + baos.write(contentType.getBytes(UTF_8)); + baos.write(lineFeedBytes); + baos.write(lineFeedBytes); + baos.write(value.getBytes(UTF_8)); + baos.write(lineFeedBytes); } private boolean isMultiPart(Map formParams) { diff --git a/samples/client/petstore/java/feign/src/main/java/io/swagger/client/StringUtil.java b/samples/client/petstore/java/feign/src/main/java/io/swagger/client/StringUtil.java index 82b8d8afa0b..db6460490fa 100644 --- a/samples/client/petstore/java/feign/src/main/java/io/swagger/client/StringUtil.java +++ b/samples/client/petstore/java/feign/src/main/java/io/swagger/client/StringUtil.java @@ -1,6 +1,6 @@ package io.swagger.client; -@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-12-01T16:10:23.565+08:00") +@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-12-07T22:27:06.680-05:00") public class StringUtil { /** * Check if the given array contains the given value (with case-insensitive comparison). diff --git a/samples/client/petstore/java/feign/src/main/java/io/swagger/client/api/PetApi.java b/samples/client/petstore/java/feign/src/main/java/io/swagger/client/api/PetApi.java index e2e7e6ce742..caa70b4260a 100644 --- a/samples/client/petstore/java/feign/src/main/java/io/swagger/client/api/PetApi.java +++ b/samples/client/petstore/java/feign/src/main/java/io/swagger/client/api/PetApi.java @@ -1,20 +1,18 @@ package io.swagger.client.api; -import io.swagger.client.ApiException; import io.swagger.client.ApiClient; -import io.swagger.client.Configuration; -import io.swagger.client.Pair; -import io.swagger.client.TypeRef; import io.swagger.client.model.Pet; import java.io.File; import io.swagger.client.model.ApiResponse; + import java.util.*; + import feign.*; -@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-12-07T01:11:21.159-05:00") -public interface PetApi extends io.swagger.client.ApiClient.Api { +@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-12-07T22:27:06.680-05:00") +public interface PetApi extends ApiClient.Api { /** @@ -28,7 +26,7 @@ public interface PetApi extends io.swagger.client.ApiClient.Api { "Content-type: application/json", "Accepts: application/json", }) - void updatePet(Pet body) throws ApiException; + void updatePet(Pet body); /** * Add a new pet to the store @@ -41,7 +39,7 @@ public interface PetApi extends io.swagger.client.ApiClient.Api { "Content-type: application/json", "Accepts: application/json", }) - void addPet(Pet body) throws ApiException; + void addPet(Pet body); /** * Finds Pets by status @@ -54,7 +52,7 @@ public interface PetApi extends io.swagger.client.ApiClient.Api { "Content-type: application/json", "Accepts: application/json", }) - List findPetsByStatus(@Param("status") List status) throws ApiException; + List findPetsByStatus(@Param("status") List status); /** * Finds Pets by tags @@ -67,7 +65,7 @@ public interface PetApi extends io.swagger.client.ApiClient.Api { "Content-type: application/json", "Accepts: application/json", }) - List findPetsByTags(@Param("tags") List tags) throws ApiException; + List findPetsByTags(@Param("tags") List tags); /** * Find pet by ID @@ -80,7 +78,7 @@ public interface PetApi extends io.swagger.client.ApiClient.Api { "Content-type: application/json", "Accepts: application/json", }) - Pet getPetById(@Param("petId") Long petId) throws ApiException; + Pet getPetById(@Param("petId") Long petId); /** * Updates a pet in the store with form data @@ -95,7 +93,7 @@ public interface PetApi extends io.swagger.client.ApiClient.Api { "Content-type: application/x-www-form-urlencoded", "Accepts: application/json", }) - void updatePetWithForm(@Param("petId") Long petId, @Param("name") String name, @Param("status") String status) throws ApiException; + void updatePetWithForm(@Param("petId") Long petId, @Param("name") String name, @Param("status") String status); /** * Deletes a pet @@ -110,7 +108,7 @@ public interface PetApi extends io.swagger.client.ApiClient.Api { "Accepts: application/json", "apiKey: {apiKey}" }) - void deletePet(@Param("petId") Long petId, @Param("apiKey") String apiKey) throws ApiException; + void deletePet(@Param("petId") Long petId, @Param("apiKey") String apiKey); /** * uploads an image @@ -125,7 +123,7 @@ public interface PetApi extends io.swagger.client.ApiClient.Api { "Content-type: multipart/form-data", "Accepts: application/json", }) - ApiResponse uploadFile(@Param("petId") Long petId, @Param("additionalMetadata") String additionalMetadata, @Param("file") File file) throws ApiException; + ApiResponse uploadFile(@Param("petId") Long petId, @Param("additionalMetadata") String additionalMetadata, @Param("file") File file); } diff --git a/samples/client/petstore/java/feign/src/main/java/io/swagger/client/api/StoreApi.java b/samples/client/petstore/java/feign/src/main/java/io/swagger/client/api/StoreApi.java index 87321de5df7..a022f684a4e 100644 --- a/samples/client/petstore/java/feign/src/main/java/io/swagger/client/api/StoreApi.java +++ b/samples/client/petstore/java/feign/src/main/java/io/swagger/client/api/StoreApi.java @@ -1,10 +1,6 @@ package io.swagger.client.api; -import io.swagger.client.ApiException; import io.swagger.client.ApiClient; -import io.swagger.client.Configuration; -import io.swagger.client.Pair; -import io.swagger.client.TypeRef; import java.util.Map; import io.swagger.client.model.Order; @@ -14,8 +10,8 @@ import java.util.*; import feign.*; -@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-12-07T01:11:21.159-05:00") -public interface StoreApi extends io.swagger.client.ApiClient.Api { +@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-12-07T22:27:06.680-05:00") +public interface StoreApi extends ApiClient.Api { /** @@ -28,7 +24,7 @@ public interface StoreApi extends io.swagger.client.ApiClient.Api { "Content-type: application/json", "Accepts: application/json", }) - Map getInventory() throws ApiException; + Map getInventory(); /** * Place an order for a pet @@ -41,7 +37,7 @@ public interface StoreApi extends io.swagger.client.ApiClient.Api { "Content-type: application/json", "Accepts: application/json", }) - Order placeOrder(Order body) throws ApiException; + Order placeOrder(Order body); /** * Find purchase order by ID @@ -54,7 +50,7 @@ public interface StoreApi extends io.swagger.client.ApiClient.Api { "Content-type: application/json", "Accepts: application/json", }) - Order getOrderById(@Param("orderId") Long orderId) throws ApiException; + Order getOrderById(@Param("orderId") Long orderId); /** * Delete purchase order by ID @@ -67,7 +63,7 @@ public interface StoreApi extends io.swagger.client.ApiClient.Api { "Content-type: application/json", "Accepts: application/json", }) - void deleteOrder(@Param("orderId") String orderId) throws ApiException; + void deleteOrder(@Param("orderId") String orderId); } diff --git a/samples/client/petstore/java/feign/src/main/java/io/swagger/client/api/UserApi.java b/samples/client/petstore/java/feign/src/main/java/io/swagger/client/api/UserApi.java index 070ca861818..b2bac15d873 100644 --- a/samples/client/petstore/java/feign/src/main/java/io/swagger/client/api/UserApi.java +++ b/samples/client/petstore/java/feign/src/main/java/io/swagger/client/api/UserApi.java @@ -1,10 +1,6 @@ package io.swagger.client.api; -import io.swagger.client.ApiException; import io.swagger.client.ApiClient; -import io.swagger.client.Configuration; -import io.swagger.client.Pair; -import io.swagger.client.TypeRef; import io.swagger.client.model.User; import java.util.*; @@ -14,8 +10,8 @@ import java.util.*; import feign.*; -@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-12-07T01:11:21.159-05:00") -public interface UserApi extends io.swagger.client.ApiClient.Api { +@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-12-07T22:27:06.680-05:00") +public interface UserApi extends ApiClient.Api { /** @@ -29,7 +25,7 @@ public interface UserApi extends io.swagger.client.ApiClient.Api { "Content-type: application/json", "Accepts: application/json", }) - void createUser(User body) throws ApiException; + void createUser(User body); /** * Creates list of users with given input array @@ -42,7 +38,7 @@ public interface UserApi extends io.swagger.client.ApiClient.Api { "Content-type: application/json", "Accepts: application/json", }) - void createUsersWithArrayInput(List body) throws ApiException; + void createUsersWithArrayInput(List body); /** * Creates list of users with given input array @@ -55,7 +51,7 @@ public interface UserApi extends io.swagger.client.ApiClient.Api { "Content-type: application/json", "Accepts: application/json", }) - void createUsersWithListInput(List body) throws ApiException; + void createUsersWithListInput(List body); /** * Logs user into the system @@ -69,7 +65,7 @@ public interface UserApi extends io.swagger.client.ApiClient.Api { "Content-type: application/json", "Accepts: application/json", }) - String loginUser(@Param("username") String username, @Param("password") String password) throws ApiException; + String loginUser(@Param("username") String username, @Param("password") String password); /** * Logs out current logged in user session @@ -81,7 +77,7 @@ public interface UserApi extends io.swagger.client.ApiClient.Api { "Content-type: application/json", "Accepts: application/json", }) - void logoutUser() throws ApiException; + void logoutUser(); /** * Get user by user name @@ -94,7 +90,7 @@ public interface UserApi extends io.swagger.client.ApiClient.Api { "Content-type: application/json", "Accepts: application/json", }) - User getUserByName(@Param("username") String username) throws ApiException; + User getUserByName(@Param("username") String username); /** * Updated user @@ -108,7 +104,7 @@ public interface UserApi extends io.swagger.client.ApiClient.Api { "Content-type: application/json", "Accepts: application/json", }) - void updateUser(@Param("username") String username, User body) throws ApiException; + void updateUser(@Param("username") String username, User body); /** * Delete user @@ -121,7 +117,7 @@ public interface UserApi extends io.swagger.client.ApiClient.Api { "Content-type: application/json", "Accepts: application/json", }) - void deleteUser(@Param("username") String username) throws ApiException; + void deleteUser(@Param("username") String username); } diff --git a/samples/client/petstore/java/feign/src/main/java/io/swagger/client/model/ApiResponse.java b/samples/client/petstore/java/feign/src/main/java/io/swagger/client/model/ApiResponse.java index f06d10acff2..4843a51e988 100644 --- a/samples/client/petstore/java/feign/src/main/java/io/swagger/client/model/ApiResponse.java +++ b/samples/client/petstore/java/feign/src/main/java/io/swagger/client/model/ApiResponse.java @@ -12,7 +12,7 @@ import com.fasterxml.jackson.annotation.JsonProperty; @ApiModel(description = "") -@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-12-07T01:11:21.159-05:00") +@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-12-07T22:27:06.680-05:00") public class ApiResponse { private Integer code = null; diff --git a/samples/client/petstore/java/feign/src/main/java/io/swagger/client/model/Category.java b/samples/client/petstore/java/feign/src/main/java/io/swagger/client/model/Category.java index 8edf7db0051..a414345dd63 100644 --- a/samples/client/petstore/java/feign/src/main/java/io/swagger/client/model/Category.java +++ b/samples/client/petstore/java/feign/src/main/java/io/swagger/client/model/Category.java @@ -12,7 +12,7 @@ import com.fasterxml.jackson.annotation.JsonProperty; @ApiModel(description = "") -@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-12-07T01:11:21.159-05:00") +@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-12-07T22:27:06.680-05:00") public class Category { private Long id = null; diff --git a/samples/client/petstore/java/feign/src/main/java/io/swagger/client/model/Order.java b/samples/client/petstore/java/feign/src/main/java/io/swagger/client/model/Order.java index a057e4899f0..4f045ca0410 100644 --- a/samples/client/petstore/java/feign/src/main/java/io/swagger/client/model/Order.java +++ b/samples/client/petstore/java/feign/src/main/java/io/swagger/client/model/Order.java @@ -13,7 +13,7 @@ import com.fasterxml.jackson.annotation.JsonProperty; @ApiModel(description = "") -@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-12-07T01:11:21.159-05:00") +@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-12-07T22:27:06.680-05:00") public class Order { private Long id = null; diff --git a/samples/client/petstore/java/feign/src/main/java/io/swagger/client/model/Pet.java b/samples/client/petstore/java/feign/src/main/java/io/swagger/client/model/Pet.java index a844cfa8a83..4029fc4362e 100644 --- a/samples/client/petstore/java/feign/src/main/java/io/swagger/client/model/Pet.java +++ b/samples/client/petstore/java/feign/src/main/java/io/swagger/client/model/Pet.java @@ -15,7 +15,7 @@ import com.fasterxml.jackson.annotation.JsonProperty; @ApiModel(description = "") -@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-12-07T01:11:21.159-05:00") +@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-12-07T22:27:06.680-05:00") public class Pet { private Long id = null; diff --git a/samples/client/petstore/java/feign/src/main/java/io/swagger/client/model/Tag.java b/samples/client/petstore/java/feign/src/main/java/io/swagger/client/model/Tag.java index 7995cbcaa9c..2c3b0132bc6 100644 --- a/samples/client/petstore/java/feign/src/main/java/io/swagger/client/model/Tag.java +++ b/samples/client/petstore/java/feign/src/main/java/io/swagger/client/model/Tag.java @@ -12,7 +12,7 @@ import com.fasterxml.jackson.annotation.JsonProperty; @ApiModel(description = "") -@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-12-07T01:11:21.159-05:00") +@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-12-07T22:27:06.680-05:00") public class Tag { private Long id = null; diff --git a/samples/client/petstore/java/feign/src/main/java/io/swagger/client/model/User.java b/samples/client/petstore/java/feign/src/main/java/io/swagger/client/model/User.java index d0d004b8c11..a8e902dd21f 100644 --- a/samples/client/petstore/java/feign/src/main/java/io/swagger/client/model/User.java +++ b/samples/client/petstore/java/feign/src/main/java/io/swagger/client/model/User.java @@ -12,7 +12,7 @@ import com.fasterxml.jackson.annotation.JsonProperty; @ApiModel(description = "") -@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-12-07T01:11:21.159-05:00") +@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-12-07T22:27:06.680-05:00") public class User { private Long id = null; diff --git a/samples/client/petstore/java/feign/src/test/java/io/swagger/petstore/test/StoreApiTest.java b/samples/client/petstore/java/feign/src/test/java/io/swagger/petstore/test/StoreApiTest.java index 060e73e5efd..b91c391e991 100644 --- a/samples/client/petstore/java/feign/src/test/java/io/swagger/petstore/test/StoreApiTest.java +++ b/samples/client/petstore/java/feign/src/test/java/io/swagger/petstore/test/StoreApiTest.java @@ -1,7 +1,5 @@ package io.swagger.petstore.test; -import io.swagger.client.ApiException; - import io.swagger.client.*; import io.swagger.client.api.*; import io.swagger.client.model.*; @@ -48,12 +46,8 @@ public class StoreApiTest { api.deleteOrder(String.valueOf(order.getId())); - try { - api.getOrderById(order.getId()); - // fail("expected an error"); - } catch (ApiException e) { - // ok - } + api.getOrderById(order.getId()); +// fail("expected an error"); } private Order createOrder() { From 0cef7116e8ceb5aa4863b528bb1473a60294d07d Mon Sep 17 00:00:00 2001 From: Lars Mikkelsen Date: Mon, 7 Dec 2015 16:38:37 -0500 Subject: [PATCH 147/211] Replace #import with #include in the Qt5 generator The SWGHelpers.cpp file uses non-standard #import statements. This causes the following error when built using Visual Studio 2013: SWGHelpers.cpp(4): fatal error C1083: Cannot open type library file: 'c:\qt\qt5.5.1\5.5\msvc2013_64\include\qtcore\qdebug': Error loading type library/DLL. --- .../resources/qt5cpp/helpers-body.mustache | 6 ++-- .../petstore/qt5cpp/client/SWGHelpers.cpp | 32 +++++++++++++++++-- .../client/petstore/qt5cpp/client/SWGPet.h | 6 ++-- 3 files changed, 35 insertions(+), 9 deletions(-) diff --git a/modules/swagger-codegen/src/main/resources/qt5cpp/helpers-body.mustache b/modules/swagger-codegen/src/main/resources/qt5cpp/helpers-body.mustache index 7bd9b3f46cc..6b439996724 100644 --- a/modules/swagger-codegen/src/main/resources/qt5cpp/helpers-body.mustache +++ b/modules/swagger-codegen/src/main/resources/qt5cpp/helpers-body.mustache @@ -1,9 +1,9 @@ #include "SWGHelpers.h" #include "SWGModelFactory.h" #include "SWGObject.h" -#import -#import -#import +#include +#include +#include namespace Swagger { diff --git a/samples/client/petstore/qt5cpp/client/SWGHelpers.cpp b/samples/client/petstore/qt5cpp/client/SWGHelpers.cpp index 7f4d748c2dc..6b439996724 100644 --- a/samples/client/petstore/qt5cpp/client/SWGHelpers.cpp +++ b/samples/client/petstore/qt5cpp/client/SWGHelpers.cpp @@ -1,9 +1,9 @@ #include "SWGHelpers.h" #include "SWGModelFactory.h" #include "SWGObject.h" -#import -#import -#import +#include +#include +#include namespace Swagger { @@ -25,6 +25,14 @@ setValue(void* value, QJsonValue obj, QString type, QString complexType) { qint64 *val = static_cast(value); *val = obj.toVariant().toLongLong(); } + else if(QStringLiteral("float").compare(type) == 0) { + float *val = static_cast(value); + *val = obj.toDouble(); + } + else if(QStringLiteral("double").compare(type) == 0) { + double *val = static_cast(value); + *val = obj.toDouble(); + } else if (QStringLiteral("QString").compare(type) == 0) { QString **val = static_cast(value); @@ -86,6 +94,16 @@ setValue(void* value, QJsonValue obj, QString type, QString complexType) { setValue(&val, jval, QStringLiteral("bool"), QStringLiteral("")); output->append((void*)&val); } + else if(QStringLiteral("float").compare(complexType) == 0) { + float val; + setValue(&val, jval, QStringLiteral("float"), QStringLiteral("")); + output->append((void*)&val); + } + else if(QStringLiteral("double").compare(complexType) == 0) { + double val; + setValue(&val, jval, QStringLiteral("double"), QStringLiteral("")); + output->append((void*)&val); + } } } QList **val = static_cast**>(value); @@ -131,6 +149,14 @@ toJsonValue(QString name, void* value, QJsonObject* output, QString type) { bool* str = static_cast(value); output->insert(name, QJsonValue(*str)); } + else if(QStringLiteral("float").compare(type) == 0) { + float* str = static_cast(value); + output->insert(name, QJsonValue((double)*str)); + } + else if(QStringLiteral("double").compare(type) == 0) { + double* str = static_cast(value); + output->insert(name, QJsonValue(*str)); + } } void diff --git a/samples/client/petstore/qt5cpp/client/SWGPet.h b/samples/client/petstore/qt5cpp/client/SWGPet.h index e9cb4d08233..3f9320f1507 100644 --- a/samples/client/petstore/qt5cpp/client/SWGPet.h +++ b/samples/client/petstore/qt5cpp/client/SWGPet.h @@ -10,10 +10,10 @@ #include -#include "SWGTag.h" -#include -#include "SWGCategory.h" #include +#include "SWGCategory.h" +#include +#include "SWGTag.h" #include "SWGObject.h" From f9f0992cc8bdf0817f7e1f5b3a7659111e2da034 Mon Sep 17 00:00:00 2001 From: wing328 Date: Tue, 8 Dec 2015 15:09:30 +0800 Subject: [PATCH 148/211] add default member's value for C# models --- .../languages/CSharpClientCodegen.java | 51 ++++++++++++++++-- .../src/main/resources/csharp/model.mustache | 9 ++++ .../main/csharp/IO/Swagger/Model/Category.cs | 8 +++ .../src/main/csharp/IO/Swagger/Model/Order.cs | 8 +++ .../src/main/csharp/IO/Swagger/Model/Pet.cs | 8 +++ .../src/main/csharp/IO/Swagger/Model/Tag.cs | 8 +++ .../src/main/csharp/IO/Swagger/Model/User.cs | 8 +++ .../SwaggerClientTest.userprefs | 25 ++------- .../bin/Debug/SwaggerClientTest.dll | Bin 98816 -> 98816 bytes .../bin/Debug/SwaggerClientTest.dll.mdb | Bin 29704 -> 29758 bytes .../obj/Debug/SwaggerClientTest.dll | Bin 98816 -> 98816 bytes .../obj/Debug/SwaggerClientTest.dll.mdb | Bin 29704 -> 29758 bytes 12 files changed, 100 insertions(+), 25 deletions(-) diff --git a/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/CSharpClientCodegen.java b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/CSharpClientCodegen.java index be8b4b74781..f69ddd16d35 100644 --- a/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/CSharpClientCodegen.java +++ b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/CSharpClientCodegen.java @@ -7,9 +7,7 @@ import io.swagger.codegen.DefaultCodegen; import io.swagger.codegen.SupportingFile; import io.swagger.codegen.CodegenProperty; import io.swagger.codegen.CodegenModel; -import io.swagger.models.properties.ArrayProperty; -import io.swagger.models.properties.MapProperty; -import io.swagger.models.properties.Property; +import io.swagger.models.properties.*; import io.swagger.codegen.CliOption; import java.io.File; @@ -300,4 +298,51 @@ public class CSharpClientCodegen extends DefaultCodegen implements CodegenConfig } return objs; } + + /** + * Return the default value of the property + * + * @param p Swagger property object + * @return string presentation of the default value of the property + */ + @Override + public String toDefaultValue(Property p) { + if (p instanceof StringProperty) { + StringProperty dp = (StringProperty) p; + if (dp.getDefault() != null) { + return "\"" + dp.getDefault().toString() + "\""; + } + } else if (p instanceof BooleanProperty) { + BooleanProperty dp = (BooleanProperty) p; + if (dp.getDefault() != null) { + return dp.getDefault().toString(); + } + } else if (p instanceof DateProperty) { + // TODO + } else if (p instanceof DateTimeProperty) { + // TODO + } else if (p instanceof DoubleProperty) { + DoubleProperty dp = (DoubleProperty) p; + if (dp.getDefault() != null) { + return dp.getDefault().toString(); + } + } else if (p instanceof FloatProperty) { + FloatProperty dp = (FloatProperty) p; + if (dp.getDefault() != null) { + return dp.getDefault().toString(); + } + } else if (p instanceof IntegerProperty) { + IntegerProperty dp = (IntegerProperty) p; + if (dp.getDefault() != null) { + return dp.getDefault().toString(); + } + } else if (p instanceof LongProperty) { + LongProperty dp = (LongProperty) p; + if (dp.getDefault() != null) { + return dp.getDefault().toString(); + } + } + + return null; + } } diff --git a/modules/swagger-codegen/src/main/resources/csharp/model.mustache b/modules/swagger-codegen/src/main/resources/csharp/model.mustache index 7b7f1a6aea0..faff8d20329 100644 --- a/modules/swagger-codegen/src/main/resources/csharp/model.mustache +++ b/modules/swagger-codegen/src/main/resources/csharp/model.mustache @@ -18,6 +18,15 @@ namespace {{packageName}}.Model [DataContract] public class {{classname}} : IEquatable<{{classname}}>{{#parent}}, {{{parent}}}{{/parent}} { + /// + /// Initializes a new instance of the class. + /// + public {{classname}}() + { + {{#vars}}{{#defaultValue}}this.{{name}} = {{{defaultValue}}}; + {{/defaultValue}}{{/vars}} + } + {{#vars}} /// /// {{^description}}Gets or Sets {{{name}}}{{/description}}{{#description}}{{{description}}}{{/description}} diff --git a/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Model/Category.cs b/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Model/Category.cs index 7d3f0936dce..d9cb6b21005 100644 --- a/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Model/Category.cs +++ b/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Model/Category.cs @@ -16,6 +16,14 @@ namespace IO.Swagger.Model [DataContract] public class Category : IEquatable { + /// + /// Initializes a new instance of the class. + /// + public Category() + { + + } + /// /// Gets or Sets Id diff --git a/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Model/Order.cs b/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Model/Order.cs index 1f786769d55..2191707bd09 100644 --- a/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Model/Order.cs +++ b/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Model/Order.cs @@ -16,6 +16,14 @@ namespace IO.Swagger.Model [DataContract] public class Order : IEquatable { + /// + /// Initializes a new instance of the class. + /// + public Order() + { + + } + /// /// Gets or Sets Id diff --git a/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Model/Pet.cs b/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Model/Pet.cs index d85d8a8be7e..10c44fb46a7 100644 --- a/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Model/Pet.cs +++ b/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Model/Pet.cs @@ -16,6 +16,14 @@ namespace IO.Swagger.Model [DataContract] public class Pet : IEquatable { + /// + /// Initializes a new instance of the class. + /// + public Pet() + { + + } + /// /// Gets or Sets Id diff --git a/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Model/Tag.cs b/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Model/Tag.cs index 8b2cbe08474..93210505bf0 100644 --- a/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Model/Tag.cs +++ b/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Model/Tag.cs @@ -16,6 +16,14 @@ namespace IO.Swagger.Model [DataContract] public class Tag : IEquatable { + /// + /// Initializes a new instance of the class. + /// + public Tag() + { + + } + /// /// Gets or Sets Id diff --git a/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Model/User.cs b/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Model/User.cs index d2c1e3a46eb..1fbd17da993 100644 --- a/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Model/User.cs +++ b/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Model/User.cs @@ -16,6 +16,14 @@ namespace IO.Swagger.Model [DataContract] public class User : IEquatable { + /// + /// Initializes a new instance of the class. + /// + public User() + { + + } + /// /// Gets or Sets Id diff --git a/samples/client/petstore/csharp/SwaggerClientTest/SwaggerClientTest.userprefs b/samples/client/petstore/csharp/SwaggerClientTest/SwaggerClientTest.userprefs index da9e64e0c90..ab3a8ae3ac4 100644 --- a/samples/client/petstore/csharp/SwaggerClientTest/SwaggerClientTest.userprefs +++ b/samples/client/petstore/csharp/SwaggerClientTest/SwaggerClientTest.userprefs @@ -1,30 +1,11 @@  - + - - - - + + - - - - - - - - - - - - - - - - - diff --git a/samples/client/petstore/csharp/SwaggerClientTest/bin/Debug/SwaggerClientTest.dll b/samples/client/petstore/csharp/SwaggerClientTest/bin/Debug/SwaggerClientTest.dll index eb5aee17989464d74610896186219a19d741f7c1..a438e10395475b6b219e30bbe99b06cf8364659c 100755 GIT binary patch delta 1585 zcmY+@S!|3^6bJD8AJh7jhf1rhM5Ht6e611@vAk5Zma3{6HLaG>P$Fn7p$~%iN+)AU z6NyZaP$m-9hbl>hs$eQ()K=6s7$qXMG~%hTChk4=5S_Q*{O@wkz4xp0#n<`b&n4Q1 zh}S{{JA}aD;TER0xow*ohdFIo5F$Zj3nALNPE558`S(woaq?T-zyU_{9{Ya-j4&JlQyT(g>Wo;c=Bc>tYsvddSwNWaW6cMlNH6j-Qor$nZ z=^ST)l+Pn_@tE`;fs|awbOf)dRU+bON>frE23a9mH0_eTTI6Av78R2RlckEu!vt1T z7MhPD)?1n7!^7%xZE?)N2G)01z0_7#yxHKGiG!>p^SIQpkR{~LZ={>n;o<9f;H1@mwHFi-520jr;tBCbzgwA>q-%!x-UQuNp;`pn1gp=ovH2%VUGy4 zzn{7ykB=nXeF^$*QrXmf35+f!-F*qhkyQ7W zoC^@Xr8CvN8;5U8S=_xFK}GJ~jSiOT-itW71+;;%B%tbR;v8CD$&ZykQ-K_o%L4E zTY?@|pPaV@F;>61#jzCqthmg2DbcN(knc}@zg`sIr=IB8yjVlh$L2)?Ngdl0=Q6|| z>WS(OtMIdj=FtPLLgFL6N^)kks6vc2l4LyAnS(UyiPmI`Soc)3jMVTm-h1vL>f8PDzaQt^ z`)*U%*%Ws6q&ZUNXN2hdLkJxI(8k(6zvJr;W2s{qgjlqq@7m969VrVEeW}09C%*~P zx{oEj6?UF}XKdov)%o`5MIpb4amKUM{Rw7SXFV&W=2(p%)QXL8UeY5kcP06efKGv+v3gKtXc@DWZqlWd&(=64%a#}6!Eofz>Tc@O=1GbP~#K^X4 zMG<;A{K%@8>SwL7y4{~*lC{P9T`ED+-TN>fVojmg;Z^CRwV(9Y~OLF{P-!N~=&Y zr8q*;#gw9xq>33aze3$LHPY69VgNUY`YHmL(xO)pz*CkgCV&^LmpQef46eUuLt~LF zrVQDvs64fDe9Vf;Q!7Ui>#WQw5Y)1bK^a!y0EgFQxD!WNQ!?9$7FMQwT$PBia^!}U z=wZ#udAl&inv?T(AY$W~q6S{QuPZtwPa_H^)|mYLY&-DuhYu*e1+9 zh>xq0`qYB>?;n~+&o>C;rd}l@Hzb0HvzCxVTxV`l#)MYBO>CUhEF*<)Y3(OPr?d`} z9Z zvPpF_3tKF91ks{p98Hd;??sICozaqcA!9FkI2%pAo}CrK7>6e^T}wiUb690Gzqb!h q`nvvIelV?K`>GAIDD?hRpH+QledPOdiE<3&IMs$ioICXmLeAHu^^0o& diff --git a/samples/client/petstore/csharp/SwaggerClientTest/bin/Debug/SwaggerClientTest.dll.mdb b/samples/client/petstore/csharp/SwaggerClientTest/bin/Debug/SwaggerClientTest.dll.mdb index 073b96f23b3261d5b6d69bd35e415e63676664f6..79928c469eefc5b9dd5855b9f9a878e943a46164 100644 GIT binary patch delta 7928 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 PBHRjYF-?EK|JwfpnUu=q delta 7755 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 U=kae~3Hcd61&>eHMh0H}AE2MMWB>pF diff --git a/samples/client/petstore/csharp/SwaggerClientTest/obj/Debug/SwaggerClientTest.dll b/samples/client/petstore/csharp/SwaggerClientTest/obj/Debug/SwaggerClientTest.dll index eb5aee17989464d74610896186219a19d741f7c1..a438e10395475b6b219e30bbe99b06cf8364659c 100755 GIT binary patch delta 1585 zcmY+@S!|3^6bJD8AJh7jhf1rhM5Ht6e611@vAk5Zma3{6HLaG>P$Fn7p$~%iN+)AU z6NyZaP$m-9hbl>hs$eQ()K=6s7$qXMG~%hTChk4=5S_Q*{O@wkz4xp0#n<`b&n4Q1 zh}S{{JA}aD;TER0xow*ohdFIo5F$Zj3nALNPE558`S(woaq?T-zyU_{9{Ya-j4&JlQyT(g>Wo;c=Bc>tYsvddSwNWaW6cMlNH6j-Qor$nZ z=^ST)l+Pn_@tE`;fs|awbOf)dRU+bON>frE23a9mH0_eTTI6Av78R2RlckEu!vt1T z7MhPD)?1n7!^7%xZE?)N2G)01z0_7#yxHKGiG!>p^SIQpkR{~LZ={>n;o<9f;H1@mwHFi-520jr;tBCbzgwA>q-%!x-UQuNp;`pn1gp=ovH2%VUGy4 zzn{7ykB=nXeF^$*QrXmf35+f!-F*qhkyQ7W zoC^@Xr8CvN8;5U8S=_xFK}GJ~jSiOT-itW71+;;%B%tbR;v8CD$&ZykQ-K_o%L4E zTY?@|pPaV@F;>61#jzCqthmg2DbcN(knc}@zg`sIr=IB8yjVlh$L2)?Ngdl0=Q6|| z>WS(OtMIdj=FtPLLgFL6N^)kks6vc2l4LyAnS(UyiPmI`Soc)3jMVTm-h1vL>f8PDzaQt^ z`)*U%*%Ws6q&ZUNXN2hdLkJxI(8k(6zvJr;W2s{qgjlqq@7m969VrVEeW}09C%*~P zx{oEj6?UF}XKdov)%o`5MIpb4amKUM{Rw7SXFV&W=2(p%)QXL8UeY5kcP06efKGv+v3gKtXc@DWZqlWd&(=64%a#}6!Eofz>Tc@O=1GbP~#K^X4 zMG<;A{K%@8>SwL7y4{~*lC{P9T`ED+-TN>fVojmg;Z^CRwV(9Y~OLF{P-!N~=&Y zr8q*;#gw9xq>33aze3$LHPY69VgNUY`YHmL(xO)pz*CkgCV&^LmpQef46eUuLt~LF zrVQDvs64fDe9Vf;Q!7Ui>#WQw5Y)1bK^a!y0EgFQxD!WNQ!?9$7FMQwT$PBia^!}U z=wZ#udAl&inv?T(AY$W~q6S{QuPZtwPa_H^)|mYLY&-DuhYu*e1+9 zh>xq0`qYB>?;n~+&o>C;rd}l@Hzb0HvzCxVTxV`l#)MYBO>CUhEF*<)Y3(OPr?d`} z9Z zvPpF_3tKF91ks{p98Hd;??sICozaqcA!9FkI2%pAo}CrK7>6e^T}wiUb690Gzqb!h q`nvvIelV?K`>GAIDD?hRpH+QledPOdiE<3&IMs$ioICXmLeAHu^^0o& diff --git a/samples/client/petstore/csharp/SwaggerClientTest/obj/Debug/SwaggerClientTest.dll.mdb b/samples/client/petstore/csharp/SwaggerClientTest/obj/Debug/SwaggerClientTest.dll.mdb index 073b96f23b3261d5b6d69bd35e415e63676664f6..79928c469eefc5b9dd5855b9f9a878e943a46164 100644 GIT binary patch delta 7928 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 PBHRjYF-?EK|JwfpnUu=q delta 7755 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 U=kae~3Hcd61&>eHMh0H}AE2MMWB>pF From 4b656c516f40ab86274d8e7f9305e5f5b358475d Mon Sep 17 00:00:00 2001 From: wing328 Date: Tue, 8 Dec 2015 15:59:46 +0800 Subject: [PATCH 149/211] add default value to php model --- .../codegen/languages/PhpClientCodegen.java | 56 ++++++++++++++++--- .../src/main/resources/php/model.mustache | 2 +- .../io/swagger/codegen/php/PhpModelTest.java | 8 +-- 3 files changed, 53 insertions(+), 13 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 56df40219f5..c712374f424 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 @@ -6,10 +6,7 @@ import io.swagger.codegen.CodegenConstants; import io.swagger.codegen.CodegenType; import io.swagger.codegen.DefaultCodegen; import io.swagger.codegen.SupportingFile; -import io.swagger.models.properties.ArrayProperty; -import io.swagger.models.properties.MapProperty; -import io.swagger.models.properties.Property; -import io.swagger.models.properties.RefProperty; +import io.swagger.models.properties.*; import java.io.File; import java.util.Arrays; @@ -276,10 +273,6 @@ public class PhpClientCodegen extends DefaultCodegen implements CodegenConfig { return toModelName(type); } - public String toDefaultValue(Property p) { - return "null"; - } - public void setInvokerPackage(String invokerPackage) { this.invokerPackage = invokerPackage; } @@ -377,4 +370,51 @@ public class PhpClientCodegen extends DefaultCodegen implements CodegenConfig { return camelize(sanitizeName(operationId), true); } + /** + * Return the default value of the property + * + * @param p Swagger property object + * @return string presentation of the default value of the property + */ + @Override + public String toDefaultValue(Property p) { + if (p instanceof StringProperty) { + StringProperty dp = (StringProperty) p; + if (dp.getDefault() != null) { + return "'" + dp.getDefault().toString() + "'"; + } + } else if (p instanceof BooleanProperty) { + BooleanProperty dp = (BooleanProperty) p; + if (dp.getDefault() != null) { + return dp.getDefault().toString(); + } + } else if (p instanceof DateProperty) { + // TODO + } else if (p instanceof DateTimeProperty) { + // TODO + } else if (p instanceof DoubleProperty) { + DoubleProperty dp = (DoubleProperty) p; + if (dp.getDefault() != null) { + return dp.getDefault().toString(); + } + } else if (p instanceof FloatProperty) { + FloatProperty dp = (FloatProperty) p; + if (dp.getDefault() != null) { + return dp.getDefault().toString(); + } + } else if (p instanceof IntegerProperty) { + IntegerProperty dp = (IntegerProperty) p; + if (dp.getDefault() != null) { + return dp.getDefault().toString(); + } + } else if (p instanceof LongProperty) { + LongProperty dp = (LongProperty) p; + if (dp.getDefault() != null) { + return dp.getDefault().toString(); + } + } + + return null; + } + } diff --git a/modules/swagger-codegen/src/main/resources/php/model.mustache b/modules/swagger-codegen/src/main/resources/php/model.mustache index 861673982f2..66cabf0122b 100644 --- a/modules/swagger-codegen/src/main/resources/php/model.mustache +++ b/modules/swagger-codegen/src/main/resources/php/model.mustache @@ -89,7 +89,7 @@ class {{classname}} implements ArrayAccess * ${{name}} {{#description}}{{{description}}}{{/description}} * @var {{datatype}} */ - protected ${{name}}; + protected ${{name}}{{#defaultValue}} = {{{defaultValue}}}{{/defaultValue}}; {{/vars}} /** diff --git a/modules/swagger-codegen/src/test/java/io/swagger/codegen/php/PhpModelTest.java b/modules/swagger-codegen/src/test/java/io/swagger/codegen/php/PhpModelTest.java index 52ca64f2f59..79da2d2ccda 100644 --- a/modules/swagger-codegen/src/test/java/io/swagger/codegen/php/PhpModelTest.java +++ b/modules/swagger-codegen/src/test/java/io/swagger/codegen/php/PhpModelTest.java @@ -42,7 +42,7 @@ public class PhpModelTest { Assert.assertEquals(property1.baseName, "id"); Assert.assertEquals(property1.datatype, "int"); Assert.assertEquals(property1.name, "id"); - Assert.assertEquals(property1.defaultValue, "null"); + Assert.assertEquals(property1.defaultValue, null); Assert.assertEquals(property1.baseType, "int"); Assert.assertTrue(property1.hasMore); Assert.assertTrue(property1.required); @@ -53,7 +53,7 @@ public class PhpModelTest { Assert.assertEquals(property2.baseName, "name"); Assert.assertEquals(property2.datatype, "string"); Assert.assertEquals(property2.name, "name"); - Assert.assertEquals(property2.defaultValue, "null"); + Assert.assertEquals(property2.defaultValue, null); Assert.assertEquals(property2.baseType, "string"); Assert.assertTrue(property2.hasMore); Assert.assertTrue(property2.required); @@ -65,7 +65,7 @@ public class PhpModelTest { Assert.assertEquals(property3.complexType, "\\DateTime"); Assert.assertEquals(property3.datatype, "\\DateTime"); Assert.assertEquals(property3.name, "created_at"); - Assert.assertEquals(property3.defaultValue, "null"); + Assert.assertEquals(property3.defaultValue, null); Assert.assertEquals(property3.baseType, "\\DateTime"); Assert.assertNull(property3.hasMore); Assert.assertNull(property3.required); @@ -92,7 +92,7 @@ public class PhpModelTest { Assert.assertEquals(property1.baseName, "id"); Assert.assertEquals(property1.datatype, "int"); Assert.assertEquals(property1.name, "id"); - Assert.assertEquals(property1.defaultValue, "null"); + Assert.assertEquals(property1.defaultValue, null); Assert.assertEquals(property1.baseType, "int"); Assert.assertTrue(property1.hasMore); Assert.assertTrue(property1.required); From bf63be3a6322417433b095ce7e99f02f892991d8 Mon Sep 17 00:00:00 2001 From: wing328 Date: Tue, 8 Dec 2015 17:23:54 +0800 Subject: [PATCH 150/211] improve cpp test case --- .../petstore/qt5cpp/PetStore/PetApiTests.cpp | 24 +------------- .../petstore/qt5cpp/PetStore/PetApiTests.h | 1 - .../qt5cpp/PetStore/PetStore.pro.user | 32 ++++++++++--------- 3 files changed, 18 insertions(+), 39 deletions(-) diff --git a/samples/client/petstore/qt5cpp/PetStore/PetApiTests.cpp b/samples/client/petstore/qt5cpp/PetStore/PetApiTests.cpp index 829fbe92640..e2d0ffb5d37 100644 --- a/samples/client/petstore/qt5cpp/PetStore/PetApiTests.cpp +++ b/samples/client/petstore/qt5cpp/PetStore/PetApiTests.cpp @@ -35,34 +35,12 @@ void PetApiTests::runTests() { delete tests; } -void PetApiTests::getPetByIdTest() { - SWGPetApi* api = getApi(); - - static QEventLoop loop; - QTimer timer; - timer.setInterval(1000); - timer.setSingleShot(true); - - auto validator = [](SWGPet* pet) { - QVERIFY(pet->getId() == 3); - loop.quit(); - }; - - connect(api, &SWGPetApi::getPetByIdSignal, this, validator); - connect(&timer, &QTimer::timeout, &loop, &QEventLoop::quit); - api->getPetById(3); - timer.start(); - loop.exec(); - QVERIFY2(timer.isActive(), "didn't finish within timeout"); - delete api; -} - void PetApiTests::findPetsByStatusTest() { SWGPetApi* api = getApi(); static QEventLoop loop; QTimer timer; - timer.setInterval(1000); + timer.setInterval(4000); timer.setSingleShot(true); auto validator = [](QList* pets) { diff --git a/samples/client/petstore/qt5cpp/PetStore/PetApiTests.h b/samples/client/petstore/qt5cpp/PetStore/PetApiTests.h index 9fdc939ab11..e219bb9a639 100644 --- a/samples/client/petstore/qt5cpp/PetStore/PetApiTests.h +++ b/samples/client/petstore/qt5cpp/PetStore/PetApiTests.h @@ -25,7 +25,6 @@ signals: bool success(); private slots: - void getPetByIdTest(); void findPetsByStatusTest(); void createAndGetPetTest(); void updatePetTest(); diff --git a/samples/client/petstore/qt5cpp/PetStore/PetStore.pro.user b/samples/client/petstore/qt5cpp/PetStore/PetStore.pro.user index a506d15a1d1..c8f28a4d2b1 100644 --- a/samples/client/petstore/qt5cpp/PetStore/PetStore.pro.user +++ b/samples/client/petstore/qt5cpp/PetStore/PetStore.pro.user @@ -1,10 +1,10 @@ - + EnvironmentId - {e1009bf2-3b8d-440a-a972-23a1fd0a9453} + {20946a4e-8558-4260-a72e-14a8108ad944} ProjectExplorer.Project.ActiveTarget @@ -58,14 +58,14 @@ ProjectExplorer.Project.Target.0 - Desktop Qt 5.4.1 clang 64bit - Desktop Qt 5.4.1 clang 64bit - qt.54.clang_64_kit + Desktop Qt 5.5.1 clang 64bit + Desktop Qt 5.5.1 clang 64bit + qt.55.clang_64_kit 0 0 0 - /Users/tony/dev/projects/swagger-api/swagger-codegen/samples/client/petstore/qt5cpp/build-PetStore-Desktop_Qt_5_4_1_clang_64bit-Debug + /Users/williamcheng/Code/wing328/swagger-codegen/samples/client/petstore/qt5cpp/build-PetStore-Desktop_Qt_5_5_1_clang_64bit-Debug true @@ -76,6 +76,7 @@ true false + false false @@ -125,7 +126,7 @@ true - /Users/tony/dev/projects/swagger-api/swagger-codegen/samples/client/petstore/qt5cpp/build-PetStore-Desktop_Qt_5_4_1_clang_64bit-Release + /Users/williamcheng/Code/wing328/swagger-codegen/samples/client/petstore/qt5cpp/build-PetStore-Desktop_Qt_5_5_1_clang_64bit-Release true @@ -136,6 +137,7 @@ true false + false false @@ -216,12 +218,10 @@ true false true - /usr/local/bin/valgrind + valgrind - 11 - 14 - 12 - 13 + 0 + 1 2 3 4 @@ -231,14 +231,16 @@ 8 9 10 - 0 - 1 + 11 + 12 + 13 + 14 2 PetStore - Qt4ProjectManager.Qt4RunConfiguration:/Users/tony/dev/projects/swagger-api/swagger-codegen/samples/client/petstore/qt5cpp/PetStore/PetStore.pro + Qt4ProjectManager.Qt4RunConfiguration:/Users/williamcheng/Code/wing328/swagger-codegen/samples/client/petstore/qt5cpp/PetStore/PetStore.pro PetStore.pro false From a01dfb693bf267a88f6ceb3532d458cfc52af94a Mon Sep 17 00:00:00 2001 From: Mateusz Mackowiak Date: Tue, 8 Dec 2015 18:52:59 +0100 Subject: [PATCH 151/211] Support for extended 'application/json' HeaderAccept types --- .../resources/objc/ApiClient-body.mustache | 22 +++++++++---------- 1 file changed, 10 insertions(+), 12 deletions(-) diff --git a/modules/swagger-codegen/src/main/resources/objc/ApiClient-body.mustache b/modules/swagger-codegen/src/main/resources/objc/ApiClient-body.mustache index d1908e5d2f1..0c23c800469 100644 --- a/modules/swagger-codegen/src/main/resources/objc/ApiClient-body.mustache +++ b/modules/swagger-codegen/src/main/resources/objc/ApiClient-body.mustache @@ -128,24 +128,22 @@ static void (^reachabilityChangeBlock)(int); /* * Detect `Accept` from accepts */ -+ (NSString *) selectHeaderAccept:(NSArray *)accepts -{ ++ (NSString *) selectHeaderAccept:(NSArray *)accepts { if (accepts == nil || [accepts count] == 0) { return @""; } - NSMutableArray *lowerAccepts = [[NSMutableArray alloc] initWithCapacity:[accepts count]]; - [accepts enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) { - [lowerAccepts addObject:[obj lowercaseString]]; - }]; - - - if ([lowerAccepts containsObject:@"application/json"]) { - return @"application/json"; + for (NSString *string in accepts) { + NSString * lowerAccept = [string lowercaseString]; + if([lowerAccept containsString:@"application/json"]) { + return @"application/json"; + } + [lowerAccepts addObject:lowerAccept]; } - else { - return [lowerAccepts componentsJoinedByString:@", "]; + if(lowerAccepts.count == 1){ + return [lowerAccepts firstObject]; } + return [lowerAccepts componentsJoinedByString:@", "]; } /* From 21bd4fbbc1d4018e5e5b0fe57fce19a3a065aa64 Mon Sep 17 00:00:00 2001 From: xhh Date: Tue, 8 Dec 2015 17:56:06 +0800 Subject: [PATCH 152/211] Add default value to Ruby model --- .../codegen/languages/RubyClientCodegen.java | 45 ++++++++++++++++--- .../src/main/resources/ruby/model.mustache | 6 ++- .../ruby/lib/petstore/models/category.rb | 2 +- .../ruby/lib/petstore/models/order.rb | 2 +- .../petstore/ruby/lib/petstore/models/pet.rb | 2 +- .../petstore/ruby/lib/petstore/models/tag.rb | 2 +- .../petstore/ruby/lib/petstore/models/user.rb | 2 +- 7 files changed, 47 insertions(+), 14 deletions(-) diff --git a/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/RubyClientCodegen.java b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/RubyClientCodegen.java index f30b2ef8b85..2fd6d8d8bc0 100644 --- a/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/RubyClientCodegen.java +++ b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/RubyClientCodegen.java @@ -6,9 +6,7 @@ import io.swagger.codegen.CodegenConstants; import io.swagger.codegen.CodegenType; import io.swagger.codegen.DefaultCodegen; import io.swagger.codegen.SupportingFile; -import io.swagger.models.properties.ArrayProperty; -import io.swagger.models.properties.MapProperty; -import io.swagger.models.properties.Property; +import io.swagger.models.properties.*; import java.io.File; import java.util.Arrays; @@ -186,6 +184,43 @@ public class RubyClientCodegen extends DefaultCodegen implements CodegenConfig { return super.getTypeDeclaration(p); } + @Override + public String toDefaultValue(Property p) { + if (p instanceof IntegerProperty) { + IntegerProperty dp = (IntegerProperty) p; + if (dp.getDefault() != null) { + return dp.getDefault().toString(); + } + } else if (p instanceof LongProperty) { + LongProperty dp = (LongProperty) p; + if (dp.getDefault() != null) { + return dp.getDefault().toString(); + } + } else if (p instanceof DoubleProperty) { + DoubleProperty dp = (DoubleProperty) p; + if (dp.getDefault() != null) { + return dp.getDefault().toString(); + } + } else if (p instanceof FloatProperty) { + FloatProperty dp = (FloatProperty) p; + if (dp.getDefault() != null) { + return dp.getDefault().toString(); + } + } else if (p instanceof BooleanProperty) { + BooleanProperty bp = (BooleanProperty) p; + if (bp.getDefault() != null) { + return bp.getDefault().toString(); + } + } else if (p instanceof StringProperty) { + StringProperty sp = (StringProperty) p; + if (sp.getDefault() != null) { + return "\"" + escapeText(sp.getDefault()) + "\""; + } + } + + return null; + } + @Override public String getSwaggerType(Property p) { String swaggerType = super.getSwaggerType(p); @@ -204,10 +239,6 @@ public class RubyClientCodegen extends DefaultCodegen implements CodegenConfig { return type; } - public String toDefaultValue(Property p) { - return "null"; - } - @Override public String toVarName(String name) { // sanitize name diff --git a/modules/swagger-codegen/src/main/resources/ruby/model.mustache b/modules/swagger-codegen/src/main/resources/ruby/model.mustache index 35742384c26..aff5ba60c02 100644 --- a/modules/swagger-codegen/src/main/resources/ruby/model.mustache +++ b/modules/swagger-codegen/src/main/resources/ruby/model.mustache @@ -21,7 +21,7 @@ module {{moduleName}} end def initialize(attributes = {}) - return if !attributes.is_a?(Hash) || attributes.empty? + return unless attributes.is_a?(Hash) # convert string to symbol for hash key attributes = attributes.inject({}){|memo,(k,v)| memo[k.to_sym] = v; memo} @@ -30,7 +30,9 @@ module {{moduleName}} if attributes[:'{{{baseName}}}'] {{#isContainer}}if (value = attributes[:'{{{baseName}}}']).is_a?(Array) self.{{{name}}} = value - end{{/isContainer}}{{^isContainer}}self.{{{name}}} = attributes[:'{{{baseName}}}']{{/isContainer}} + end{{/isContainer}}{{^isContainer}}self.{{{name}}} = attributes[:'{{{baseName}}}']{{/isContainer}}{{#defaultValue}} + else + self.{{{name}}} = {{{defaultValue}}}{{/defaultValue}} end {{/vars}} end diff --git a/samples/client/petstore/ruby/lib/petstore/models/category.rb b/samples/client/petstore/ruby/lib/petstore/models/category.rb index ab5b9cabbaa..8a0db248656 100644 --- a/samples/client/petstore/ruby/lib/petstore/models/category.rb +++ b/samples/client/petstore/ruby/lib/petstore/models/category.rb @@ -25,7 +25,7 @@ module Petstore end def initialize(attributes = {}) - return if !attributes.is_a?(Hash) || attributes.empty? + return unless attributes.is_a?(Hash) # convert string to symbol for hash key attributes = attributes.inject({}){|memo,(k,v)| memo[k.to_sym] = v; memo} diff --git a/samples/client/petstore/ruby/lib/petstore/models/order.rb b/samples/client/petstore/ruby/lib/petstore/models/order.rb index 74eab3436e3..c8de9162980 100644 --- a/samples/client/petstore/ruby/lib/petstore/models/order.rb +++ b/samples/client/petstore/ruby/lib/petstore/models/order.rb @@ -41,7 +41,7 @@ module Petstore end def initialize(attributes = {}) - return if !attributes.is_a?(Hash) || attributes.empty? + return unless attributes.is_a?(Hash) # convert string to symbol for hash key attributes = attributes.inject({}){|memo,(k,v)| memo[k.to_sym] = v; memo} diff --git a/samples/client/petstore/ruby/lib/petstore/models/pet.rb b/samples/client/petstore/ruby/lib/petstore/models/pet.rb index 8c5fe6e17e7..dcfe46d9534 100644 --- a/samples/client/petstore/ruby/lib/petstore/models/pet.rb +++ b/samples/client/petstore/ruby/lib/petstore/models/pet.rb @@ -41,7 +41,7 @@ module Petstore end def initialize(attributes = {}) - return if !attributes.is_a?(Hash) || attributes.empty? + return unless attributes.is_a?(Hash) # convert string to symbol for hash key attributes = attributes.inject({}){|memo,(k,v)| memo[k.to_sym] = v; memo} diff --git a/samples/client/petstore/ruby/lib/petstore/models/tag.rb b/samples/client/petstore/ruby/lib/petstore/models/tag.rb index 51439de5846..0861036ef18 100644 --- a/samples/client/petstore/ruby/lib/petstore/models/tag.rb +++ b/samples/client/petstore/ruby/lib/petstore/models/tag.rb @@ -25,7 +25,7 @@ module Petstore end def initialize(attributes = {}) - return if !attributes.is_a?(Hash) || attributes.empty? + return unless attributes.is_a?(Hash) # convert string to symbol for hash key attributes = attributes.inject({}){|memo,(k,v)| memo[k.to_sym] = v; memo} diff --git a/samples/client/petstore/ruby/lib/petstore/models/user.rb b/samples/client/petstore/ruby/lib/petstore/models/user.rb index 3d20ab95c4f..01bcc822347 100644 --- a/samples/client/petstore/ruby/lib/petstore/models/user.rb +++ b/samples/client/petstore/ruby/lib/petstore/models/user.rb @@ -49,7 +49,7 @@ module Petstore end def initialize(attributes = {}) - return if !attributes.is_a?(Hash) || attributes.empty? + return unless attributes.is_a?(Hash) # convert string to symbol for hash key attributes = attributes.inject({}){|memo,(k,v)| memo[k.to_sym] = v; memo} From b896c9169a48f4df946ef8ae425a62ac354b3eb6 Mon Sep 17 00:00:00 2001 From: xhh Date: Wed, 9 Dec 2015 11:16:14 +0800 Subject: [PATCH 153/211] Add comments to model classes in Ruby client --- .../src/main/resources/ruby/model.mustache | 19 ++++++++++++------- .../ruby/lib/petstore/models/category.rb | 11 ++++++----- .../ruby/lib/petstore/models/order.rb | 15 +++++++-------- .../petstore/ruby/lib/petstore/models/pet.rb | 15 +++++++-------- .../petstore/ruby/lib/petstore/models/tag.rb | 11 ++++++----- .../petstore/ruby/lib/petstore/models/user.rb | 16 ++++++---------- 6 files changed, 44 insertions(+), 43 deletions(-) diff --git a/modules/swagger-codegen/src/main/resources/ruby/model.mustache b/modules/swagger-codegen/src/main/resources/ruby/model.mustache index aff5ba60c02..5d4eb954767 100644 --- a/modules/swagger-codegen/src/main/resources/ruby/model.mustache +++ b/modules/swagger-codegen/src/main/resources/ruby/model.mustache @@ -1,18 +1,19 @@ -module {{moduleName}} -{{#models}} # {{description}} -{{#model}} class {{classname}} < BaseObject +module {{moduleName}}{{#models}}{{#model}}{{#description}} + # {{{description}}}{{/description}} + class {{classname}} < BaseObject attr_accessor {{#vars}}:{{{name}}}{{#hasMore}}, {{/hasMore}}{{/vars}}{{newline}} - # attribute mapping from ruby-style variable name to JSON key + + # Attribute mapping from ruby-style variable name to JSON key. def self.attribute_map { - {{#vars}} - # {{description}} + {{#vars}}{{#description}} + # {{{description}}}{{/description}} :'{{{name}}}' => :'{{{baseName}}}'{{#hasMore}},{{/hasMore}} {{/vars}} } end - # attribute type + # Attribute type mapping. def self.swagger_types { {{#vars}}:'{{{name}}}' => :'{{{datatype}}}'{{#hasMore}},{{/hasMore}} @@ -37,6 +38,7 @@ module {{moduleName}} {{/vars}} end {{#vars}}{{#isEnum}} + # Custom attribute writer method checking allowed values (enum). def {{{name}}}=({{{name}}}) allowed_values = [{{#allowableValues}}{{#values}}"{{{this}}}"{{^-last}}, {{/-last}}{{/values}}{{/allowableValues}}] if {{{name}}} && !allowed_values.include?({{{name}}}) @@ -45,16 +47,19 @@ module {{moduleName}} @{{{name}}} = {{{name}}} end {{/isEnum}}{{/vars}} + # Check equality by comparing each attribute. def ==(o) return true if self.equal?(o) self.class == o.class{{#vars}} && {{name}} == o.{{name}}{{/vars}} end + # @see the `==` method def eql?(o) self == o end + # Calculate hash code according to all attributes. def hash [{{#vars}}{{name}}{{#hasMore}}, {{/hasMore}}{{/vars}}].hash end diff --git a/samples/client/petstore/ruby/lib/petstore/models/category.rb b/samples/client/petstore/ruby/lib/petstore/models/category.rb index 8a0db248656..8864ad10f75 100644 --- a/samples/client/petstore/ruby/lib/petstore/models/category.rb +++ b/samples/client/petstore/ruby/lib/petstore/models/category.rb @@ -1,21 +1,19 @@ module Petstore - # class Category < BaseObject attr_accessor :id, :name - # attribute mapping from ruby-style variable name to JSON key + + # Attribute mapping from ruby-style variable name to JSON key. def self.attribute_map { - # :'id' => :'id', - # :'name' => :'name' } end - # attribute type + # Attribute type mapping. def self.swagger_types { :'id' => :'Integer', @@ -41,6 +39,7 @@ module Petstore end + # Check equality by comparing each attribute. def ==(o) return true if self.equal?(o) self.class == o.class && @@ -48,10 +47,12 @@ module Petstore name == o.name end + # @see the `==` method def eql?(o) self == o end + # Calculate hash code according to all attributes. def hash [id, name].hash end diff --git a/samples/client/petstore/ruby/lib/petstore/models/order.rb b/samples/client/petstore/ruby/lib/petstore/models/order.rb index c8de9162980..59c84f65666 100644 --- a/samples/client/petstore/ruby/lib/petstore/models/order.rb +++ b/samples/client/petstore/ruby/lib/petstore/models/order.rb @@ -1,33 +1,28 @@ module Petstore - # class Order < BaseObject attr_accessor :id, :pet_id, :quantity, :ship_date, :status, :complete - # attribute mapping from ruby-style variable name to JSON key + + # Attribute mapping from ruby-style variable name to JSON key. def self.attribute_map { - # :'id' => :'id', - # :'pet_id' => :'petId', - # :'quantity' => :'quantity', - # :'ship_date' => :'shipDate', # Order Status :'status' => :'status', - # :'complete' => :'complete' } end - # attribute type + # Attribute type mapping. def self.swagger_types { :'id' => :'Integer', @@ -73,6 +68,7 @@ module Petstore end + # Custom attribute writer method checking allowed values (enum). def status=(status) allowed_values = ["placed", "approved", "delivered"] if status && !allowed_values.include?(status) @@ -81,6 +77,7 @@ module Petstore @status = status end + # Check equality by comparing each attribute. def ==(o) return true if self.equal?(o) self.class == o.class && @@ -92,10 +89,12 @@ module Petstore complete == o.complete end + # @see the `==` method def eql?(o) self == o end + # Calculate hash code according to all attributes. def hash [id, pet_id, quantity, ship_date, status, complete].hash end diff --git a/samples/client/petstore/ruby/lib/petstore/models/pet.rb b/samples/client/petstore/ruby/lib/petstore/models/pet.rb index dcfe46d9534..303a12d702c 100644 --- a/samples/client/petstore/ruby/lib/petstore/models/pet.rb +++ b/samples/client/petstore/ruby/lib/petstore/models/pet.rb @@ -1,24 +1,19 @@ module Petstore - # class Pet < BaseObject attr_accessor :id, :category, :name, :photo_urls, :tags, :status - # attribute mapping from ruby-style variable name to JSON key + + # Attribute mapping from ruby-style variable name to JSON key. def self.attribute_map { - # :'id' => :'id', - # :'category' => :'category', - # :'name' => :'name', - # :'photo_urls' => :'photoUrls', - # :'tags' => :'tags', # pet status in the store @@ -27,7 +22,7 @@ module Petstore } end - # attribute type + # Attribute type mapping. def self.swagger_types { :'id' => :'Integer', @@ -77,6 +72,7 @@ module Petstore end + # Custom attribute writer method checking allowed values (enum). def status=(status) allowed_values = ["available", "pending", "sold"] if status && !allowed_values.include?(status) @@ -85,6 +81,7 @@ module Petstore @status = status end + # Check equality by comparing each attribute. def ==(o) return true if self.equal?(o) self.class == o.class && @@ -96,10 +93,12 @@ module Petstore status == o.status end + # @see the `==` method def eql?(o) self == o end + # Calculate hash code according to all attributes. def hash [id, category, name, photo_urls, tags, status].hash end diff --git a/samples/client/petstore/ruby/lib/petstore/models/tag.rb b/samples/client/petstore/ruby/lib/petstore/models/tag.rb index 0861036ef18..06d779c2c54 100644 --- a/samples/client/petstore/ruby/lib/petstore/models/tag.rb +++ b/samples/client/petstore/ruby/lib/petstore/models/tag.rb @@ -1,21 +1,19 @@ module Petstore - # class Tag < BaseObject attr_accessor :id, :name - # attribute mapping from ruby-style variable name to JSON key + + # Attribute mapping from ruby-style variable name to JSON key. def self.attribute_map { - # :'id' => :'id', - # :'name' => :'name' } end - # attribute type + # Attribute type mapping. def self.swagger_types { :'id' => :'Integer', @@ -41,6 +39,7 @@ module Petstore end + # Check equality by comparing each attribute. def ==(o) return true if self.equal?(o) self.class == o.class && @@ -48,10 +47,12 @@ module Petstore name == o.name end + # @see the `==` method def eql?(o) self == o end + # Calculate hash code according to all attributes. def hash [id, name].hash end diff --git a/samples/client/petstore/ruby/lib/petstore/models/user.rb b/samples/client/petstore/ruby/lib/petstore/models/user.rb index 01bcc822347..1b49db1c96b 100644 --- a/samples/client/petstore/ruby/lib/petstore/models/user.rb +++ b/samples/client/petstore/ruby/lib/petstore/models/user.rb @@ -1,30 +1,23 @@ module Petstore - # class User < BaseObject attr_accessor :id, :username, :first_name, :last_name, :email, :password, :phone, :user_status - # attribute mapping from ruby-style variable name to JSON key + + # Attribute mapping from ruby-style variable name to JSON key. def self.attribute_map { - # :'id' => :'id', - # :'username' => :'username', - # :'first_name' => :'firstName', - # :'last_name' => :'lastName', - # :'email' => :'email', - # :'password' => :'password', - # :'phone' => :'phone', # User Status @@ -33,7 +26,7 @@ module Petstore } end - # attribute type + # Attribute type mapping. def self.swagger_types { :'id' => :'Integer', @@ -89,6 +82,7 @@ module Petstore end + # Check equality by comparing each attribute. def ==(o) return true if self.equal?(o) self.class == o.class && @@ -102,10 +96,12 @@ module Petstore user_status == o.user_status end + # @see the `==` method def eql?(o) self == o end + # Calculate hash code according to all attributes. def hash [id, username, first_name, last_name, email, password, phone, user_status].hash end From 4fdaeb737127c46937c54c6e384c64c4762ec13b Mon Sep 17 00:00:00 2001 From: xhh Date: Wed, 9 Dec 2015 12:38:38 +0800 Subject: [PATCH 154/211] Improve checking of JSON MIME --- .../main/resources/ruby/api_client.mustache | 36 +++++++------- .../petstore/ruby/lib/petstore/api_client.rb | 36 +++++++------- .../petstore/ruby/spec/api_client_spec.rb | 47 +++++++++++++++++++ 3 files changed, 85 insertions(+), 34 deletions(-) diff --git a/modules/swagger-codegen/src/main/resources/ruby/api_client.mustache b/modules/swagger-codegen/src/main/resources/ruby/api_client.mustache index 3873d476577..fa14e2f88ca 100644 --- a/modules/swagger-codegen/src/main/resources/ruby/api_client.mustache +++ b/modules/swagger-codegen/src/main/resources/ruby/api_client.mustache @@ -86,6 +86,15 @@ module {{moduleName}} Typhoeus::Request.new(url, req_opts) end + # Check if the given MIME is a JSON MIME. + # JSON MIME examples: + # application/json + # application/json; charset=UTF8 + # APPLICATION/JSON + def json_mime?(mime) + !!(mime =~ /\Aapplication\/json(;.*)?\z/i) + end + # Deserialize the response to the given return type. # # @param [String] return_type some examples: "User", "Array[User]", "Hash[String,Integer]" @@ -99,9 +108,7 @@ module {{moduleName}} # ensuring a default content type content_type = response.headers['Content-Type'] || 'application/json' - unless content_type.start_with?('application/json') - fail "Content-Type is not supported: #{content_type}" - end + fail "Content-Type is not supported: #{content_type}" unless json_mime?(content_type) begin data = JSON.parse("[#{body}]", :symbolize_names => true)[0] @@ -228,26 +235,21 @@ module {{moduleName}} # @param [Array] accepts array for Accept # @return [String] the Accept header (e.g. application/json) def select_header_accept(accepts) - if accepts.empty? - return - elsif accepts.any?{ |s| s.casecmp('application/json') == 0 } - 'application/json' # look for json data by default - else - accepts.join(',') - end + return nil if accepts.nil? || accepts.empty? + # use JSON when present, otherwise use all of the provided + json_accept = accepts.find { |s| json_mime?(s) } + return json_accept || accepts.join(',') end # Return Content-Type header based on an array of content types provided. # @param [Array] content_types array for Content-Type # @return [String] the Content-Type header (e.g. application/json) def select_header_content_type(content_types) - if content_types.empty? - 'application/json' # use application/json by default - elsif content_types.any?{ |s| s.casecmp('application/json')==0 } - 'application/json' # use application/json if it's included - else - content_types[0] # otherwise, use the first one - end + # use application/json by default + return 'application/json' if content_types.nil? || content_types.empty? + # use JSON when present, otherwise use the first one + json_content_type = content_types.find { |s| json_mime?(s) } + return json_content_type || content_types.first end # Convert object (array, hash, object, etc) to JSON string. diff --git a/samples/client/petstore/ruby/lib/petstore/api_client.rb b/samples/client/petstore/ruby/lib/petstore/api_client.rb index 412fb7946ad..0648ee54cf3 100644 --- a/samples/client/petstore/ruby/lib/petstore/api_client.rb +++ b/samples/client/petstore/ruby/lib/petstore/api_client.rb @@ -86,6 +86,15 @@ module Petstore Typhoeus::Request.new(url, req_opts) end + # Check if the given MIME is a JSON MIME. + # JSON MIME examples: + # application/json + # application/json; charset=UTF8 + # APPLICATION/JSON + def json_mime?(mime) + !!(mime =~ /\Aapplication\/json(;.*)?\z/i) + end + # Deserialize the response to the given return type. # # @param [String] return_type some examples: "User", "Array[User]", "Hash[String,Integer]" @@ -99,9 +108,7 @@ module Petstore # ensuring a default content type content_type = response.headers['Content-Type'] || 'application/json' - unless content_type.start_with?('application/json') - fail "Content-Type is not supported: #{content_type}" - end + fail "Content-Type is not supported: #{content_type}" unless json_mime?(content_type) begin data = JSON.parse("[#{body}]", :symbolize_names => true)[0] @@ -228,26 +235,21 @@ module Petstore # @param [Array] accepts array for Accept # @return [String] the Accept header (e.g. application/json) def select_header_accept(accepts) - if accepts.empty? - return - elsif accepts.any?{ |s| s.casecmp('application/json') == 0 } - 'application/json' # look for json data by default - else - accepts.join(',') - end + return nil if accepts.nil? || accepts.empty? + # use JSON when present, otherwise use all of the provided + json_accept = accepts.find { |s| json_mime?(s) } + return json_accept || accepts.join(',') end # Return Content-Type header based on an array of content types provided. # @param [Array] content_types array for Content-Type # @return [String] the Content-Type header (e.g. application/json) def select_header_content_type(content_types) - if content_types.empty? - 'application/json' # use application/json by default - elsif content_types.any?{ |s| s.casecmp('application/json')==0 } - 'application/json' # use application/json if it's included - else - content_types[0] # otherwise, use the first one - end + # use application/json by default + return 'application/json' if content_types.nil? || content_types.empty? + # use JSON when present, otherwise use the first one + json_content_type = content_types.find { |s| json_mime?(s) } + return json_content_type || content_types.first end # Convert object (array, hash, object, etc) to JSON string. diff --git a/samples/client/petstore/ruby/spec/api_client_spec.rb b/samples/client/petstore/ruby/spec/api_client_spec.rb index eeb27300bf3..054f63bc4ef 100644 --- a/samples/client/petstore/ruby/spec/api_client_spec.rb +++ b/samples/client/petstore/ruby/spec/api_client_spec.rb @@ -145,4 +145,51 @@ describe Petstore::ApiClient do end end + describe "#json_mime?" do + let(:api_client) { Petstore::ApiClient.new } + + it "works" do + api_client.json_mime?(nil).should == false + api_client.json_mime?('').should == false + + api_client.json_mime?('application/json').should == true + api_client.json_mime?('application/json; charset=UTF8').should == true + api_client.json_mime?('APPLICATION/JSON').should == true + + api_client.json_mime?('application/xml').should == false + api_client.json_mime?('text/plain').should == false + end + end + + describe "#select_header_accept" do + let(:api_client) { Petstore::ApiClient.new } + + it "works" do + api_client.select_header_accept(nil).should == nil + api_client.select_header_accept([]).should == nil + + api_client.select_header_accept(['application/json']).should == 'application/json' + api_client.select_header_accept(['application/xml', 'application/json; charset=UTF8']).should == 'application/json; charset=UTF8' + api_client.select_header_accept(['APPLICATION/JSON', 'text/html']).should == 'APPLICATION/JSON' + + api_client.select_header_accept(['application/xml']).should == 'application/xml' + api_client.select_header_accept(['text/html', 'application/xml']).should == 'text/html,application/xml' + end + end + + describe "#select_header_content_type" do + let(:api_client) { Petstore::ApiClient.new } + + it "works" do + api_client.select_header_content_type(nil).should == 'application/json' + api_client.select_header_content_type([]).should == 'application/json' + + api_client.select_header_content_type(['application/json']).should == 'application/json' + api_client.select_header_content_type(['application/xml', 'application/json; charset=UTF8']).should == 'application/json; charset=UTF8' + api_client.select_header_content_type(['APPLICATION/JSON', 'text/html']).should == 'APPLICATION/JSON' + api_client.select_header_content_type(['application/xml']).should == 'application/xml' + api_client.select_header_content_type(['text/plain', 'application/xml']).should == 'text/plain' + end + end + end From 78158d79ca9efd115fbb0a352e7402c8db5db2c1 Mon Sep 17 00:00:00 2001 From: Tony Tam Date: Tue, 8 Dec 2015 20:40:34 -0800 Subject: [PATCH 155/211] updated instructions --- README.md | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 8bdb6be693e..30af2fc837c 100644 --- a/README.md +++ b/README.md @@ -214,6 +214,22 @@ java -jar modules/swagger-codegen-cli/target/swagger-codegen-cli.jar meta \ This will write, in the folder `output/myLibrary`, all the files you need to get started, including a README.md. Once modified and compiled, you can load your library with the codegen and generate clients with your own, custom-rolled logic. +You would then compile your library in the `output/myLibrary` folder with `mvn package` and execute the codegen like such: + + +``` +java -cp output/myLibrary/target/myClientCodegen-swagger-codegen-1.0.0.jar:modules/swagger-codegen-cli/target/swagger-codegen-cli.jar io.swagger.codegen.Codegen +``` + +Note the `myClientCodegen` is an option now, and you can use the usual arguments for generating your library: + +``` +java -cp output/myLibrary/target/myClientCodegen-swagger-codegen-1.0.0.jar:modules/swagger-codegen-cli/target/swagger-codegen-cli.jar \ + io.swagger.codegen.Codegen generate -l myClientCodegen\ + -i http://petstore.swagger.io/v2/swagger.json \ + -o myClient +``` + ### Where is Javascript??? See our [javascript library](http://github.com/swagger-api/swagger-js)--it's completely dynamic and doesn't require static code generation. @@ -516,7 +532,7 @@ Then you will receieve a JSON response with the URL to download the zipped code. Guidelines for Contribution --------------------------- -Please refer to this [page](https://github.com/swagger-api/swagger-codegen/wiki/Guidelines-for-Contribution) +Please refer to this [page](https://github.com/swagger-api/swagger-codegen/blob/master/CONTRIBUTING.md) License ------- From bf3c1d36d5b579ad86654e2cf8172e858c583b49 Mon Sep 17 00:00:00 2001 From: wing328 Date: Wed, 9 Dec 2015 15:34:39 +0800 Subject: [PATCH 156/211] add default value to python model --- .../languages/PythonClientCodegen.java | 59 ++++++++++++++++--- .../src/main/resources/python/model.mustache | 2 +- samples/client/petstore/python/.coverage | 2 +- .../petstore/python/dev-requirements.txt.log | 56 ++++++++++++++++++ 4 files changed, 110 insertions(+), 9 deletions(-) diff --git a/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/PythonClientCodegen.java b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/PythonClientCodegen.java index 1759e515258..b5aa56aa2c4 100755 --- a/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/PythonClientCodegen.java +++ b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/PythonClientCodegen.java @@ -6,9 +6,7 @@ import io.swagger.codegen.CodegenConstants; import io.swagger.codegen.CodegenType; import io.swagger.codegen.DefaultCodegen; import io.swagger.codegen.SupportingFile; -import io.swagger.models.properties.ArrayProperty; -import io.swagger.models.properties.MapProperty; -import io.swagger.models.properties.Property; +import io.swagger.models.properties.*; import java.io.File; import java.util.Arrays; @@ -166,10 +164,6 @@ public class PythonClientCodegen extends DefaultCodegen implements CodegenConfig return type; } - public String toDefaultValue(Property p) { - return "None"; - } - @Override public String toVarName(String name) { // sanitize name @@ -291,4 +285,55 @@ public class PythonClientCodegen extends DefaultCodegen implements CodegenConfig public String generatePackageName(String packageName) { return underscore(packageName.replaceAll("[^\\w]+", "")); } + + /** + * Return the default value of the property + * + * @param p Swagger property object + * @return string presentation of the default value of the property + */ + @Override + public String toDefaultValue(Property p) { + if (p instanceof StringProperty) { + StringProperty dp = (StringProperty) p; + if (dp.getDefault() != null) { + return "'" + dp.getDefault().toString() + "'"; + } + } else if (p instanceof BooleanProperty) { + BooleanProperty dp = (BooleanProperty) p; + if (dp.getDefault() != null) { + if (dp.getDefault().toString().equalsIgnoreCase("false")) + return "False"; + else + return "True"; + } + } else if (p instanceof DateProperty) { + // TODO + } else if (p instanceof DateTimeProperty) { + // TODO + } else if (p instanceof DoubleProperty) { + DoubleProperty dp = (DoubleProperty) p; + if (dp.getDefault() != null) { + return dp.getDefault().toString(); + } + } else if (p instanceof FloatProperty) { + FloatProperty dp = (FloatProperty) p; + if (dp.getDefault() != null) { + return dp.getDefault().toString(); + } + } else if (p instanceof IntegerProperty) { + IntegerProperty dp = (IntegerProperty) p; + if (dp.getDefault() != null) { + return dp.getDefault().toString(); + } + } else if (p instanceof LongProperty) { + LongProperty dp = (LongProperty) p; + if (dp.getDefault() != null) { + return dp.getDefault().toString(); + } + } + + return null; + } + } diff --git a/modules/swagger-codegen/src/main/resources/python/model.mustache b/modules/swagger-codegen/src/main/resources/python/model.mustache index 0dbe29add4f..aae43175a2e 100644 --- a/modules/swagger-codegen/src/main/resources/python/model.mustache +++ b/modules/swagger-codegen/src/main/resources/python/model.mustache @@ -49,7 +49,7 @@ class {{classname}}(object): } {{#vars}} - self._{{name}} = None + self._{{name}} = {{#defaultValue}}{{{defaultValue}}}{{/defaultValue}}{{^defaultValue}}None{{/defaultValue}} {{/vars}} {{#vars}} diff --git a/samples/client/petstore/python/.coverage b/samples/client/petstore/python/.coverage index 98dd5627b87..26331c636b3 100644 --- a/samples/client/petstore/python/.coverage +++ b/samples/client/petstore/python/.coverage @@ -1 +1 @@ -!coverage.py: This is a private format, don't read it directly!{"lines": {"/Users/williamcheng/Code/wing328/swagger-codegen/samples/client/petstore/python/swagger_client/models/order.py": [130, 172, 141, 173, 19, 21, 22, 152, 25, 29, 30, 161, 163, 39, 40, 41, 42, 43, 44, 45, 174, 175, 48, 49, 50, 51, 180, 53, 54, 52, 58, 59, 60, 61, 62, 191, 64, 202, 75, 86, 57, 176, 222, 97, 228, 178, 234, 108, 240, 119], "/Users/williamcheng/Code/wing328/swagger-codegen/samples/client/petstore/python/swagger_client/models/tag.py": [128, 132, 134, 19, 21, 22, 25, 29, 30, 39, 40, 41, 44, 45, 46, 49, 50, 52, 61, 63, 72, 74, 83, 85, 94, 96, 100, 102, 103, 104, 109, 112, 114, 116, 122], "/Users/williamcheng/Code/wing328/swagger-codegen/samples/client/petstore/python/swagger_client/models/__init__.py": [1, 4, 5, 6, 7, 8], "/Users/williamcheng/Code/wing328/swagger-codegen/samples/client/petstore/python/swagger_client/apis/__init__.py": [1, 4, 5, 6], "/Users/williamcheng/Code/wing328/swagger-codegen/samples/client/petstore/python/swagger_client/models/pet.py": [128, 130, 150, 172, 139, 141, 19, 215, 21, 22, 152, 25, 29, 30, 161, 163, 39, 40, 41, 42, 43, 44, 45, 174, 48, 49, 50, 51, 52, 53, 54, 183, 185, 58, 59, 60, 61, 62, 64, 194, 195, 200, 73, 202, 75, 206, 208, 209, 210, 211, 84, 213, 86, 57, 216, 218, 220, 222, 95, 97, 226, 228, 234, 108, 238, 240, 117, 119, 212, 106], "/Users/williamcheng/Code/wing328/swagger-codegen/samples/client/petstore/python/swagger_client/configuration.py": [135, 136, 137, 138, 139, 142, 19, 149, 22, 23, 25, 26, 157, 158, 31, 32, 34, 36, 37, 39, 40, 41, 170, 43, 172, 46, 47, 189, 179, 52, 54, 59, 61, 190, 63, 192, 224, 67, 69, 71, 200, 73, 204, 80, 81, 82, 84, 213, 86, 199, 88, 90, 219, 92, 221, 222, 223, 96, 225, 98, 100, 102, 230, 104, 167, 111, 76, 168, 122, 123, 42, 21], "/Users/williamcheng/Code/wing328/swagger-codegen/samples/client/petstore/python/swagger_client/apis/store_api.py": [87, 18, 276, 22, 23, 26, 28, 29, 197, 32, 37, 39, 40, 41, 44, 46, 48, 68, 69, 71, 72, 79, 82, 83, 85, 121, 89, 91, 92, 94, 97, 98, 99, 103, 104, 107, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 20], "/Users/williamcheng/Code/wing328/swagger-codegen/samples/client/petstore/python/swagger_client/models/category.py": [128, 134, 19, 21, 22, 25, 29, 30, 39, 40, 41, 44, 45, 46, 49, 50, 52, 61, 63, 72, 74, 83, 85, 94, 96, 100, 102, 103, 104, 109, 112, 114, 116, 122], "/Users/williamcheng/Code/wing328/swagger-codegen/samples/client/petstore/python/swagger_client/api_client.py": [518, 525, 526, 527, 19, 21, 22, 23, 24, 537, 26, 27, 28, 29, 30, 31, 32, 33, 34, 547, 36, 37, 40, 42, 44, 45, 558, 47, 49, 52, 566, 568, 569, 570, 571, 572, 573, 575, 68, 69, 70, 75, 76, 77, 79, 80, 82, 84, 91, 96, 98, 102, 103, 104, 107, 108, 109, 111, 112, 115, 116, 117, 118, 119, 120, 123, 124, 125, 126, 129, 130, 131, 134, 137, 138, 141, 144, 145, 146, 147, 149, 152, 153, 155, 157, 158, 160, 162, 171, 172, 174, 176, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 204, 205, 212, 213, 214, 216, 217, 219, 231, 235, 236, 240, 242, 251, 252, 254, 255, 256, 257, 258, 260, 261, 262, 263, 267, 268, 269, 272, 274, 275, 276, 278, 279, 280, 281, 283, 286, 287, 288, 316, 317, 318, 319, 320, 322, 323, 324, 325, 326, 327, 328, 329, 330, 332, 333, 337, 338, 339, 340, 341, 345, 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, 369, 370, 371, 372, 379, 387, 389, 390, 392, 393, 394, 395, 548, 397, 398, 399, 400, 401, 402, 404, 406, 413, 414, 416, 418, 419, 421, 423, 430, 431, 433, 435, 436, 438, 440, 448, 450, 453, 454, 455, 456, 458, 459, 467, 546, 493, 502, 503, 508, 510], "/Users/williamcheng/Code/wing328/swagger-codegen/samples/client/petstore/python/swagger_client/apis/pet_api.py": [512, 513, 514, 516, 86, 18, 20, 22, 23, 26, 539, 28, 29, 542, 543, 32, 548, 37, 39, 40, 41, 42, 555, 556, 45, 558, 559, 48, 562, 564, 565, 566, 568, 569, 345, 571, 574, 575, 576, 580, 581, 70, 584, 73, 586, 587, 588, 589, 590, 591, 592, 593, 594, 595, 596, 598, 88, 90, 92, 93, 95, 96, 97, 100, 101, 102, 106, 107, 621, 622, 624, 625, 626, 79, 116, 117, 118, 631, 632, 121, 122, 635, 124, 638, 639, 641, 642, 643, 645, 647, 649, 650, 651, 652, 653, 654, 656, 145, 146, 659, 660, 149, 150, 665, 666, 155, 156, 669, 671, 160, 673, 162, 675, 164, 677, 166, 679, 168, 169, 171, 172, 173, 541, 176, 177, 178, 115, 182, 183, 186, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 200, 119, 120, 377, 221, 222, 549, 224, 225, 226, 231, 232, 235, 236, 110, 238, 240, 552, 242, 244, 246, 247, 249, 383, 252, 253, 254, 258, 259, 262, 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 276, 46, 560, 538, 297, 298, 300, 301, 302, 44, 307, 308, 311, 312, 314, 316, 317, 318, 320, 322, 323, 325, 113, 328, 329, 330, 334, 335, 338, 340, 341, 342, 343, 344, 241, 346, 347, 348, 349, 350, 485, 352, 84, 114, 373, 374, 376, 148, 378, 661, 384, 387, 390, 391, 393, 394, 395, 397, 399, 401, 402, 404, 407, 408, 409, 413, 414, 69, 417, 419, 420, 421, 422, 423, 424, 425, 426, 427, 428, 429, 431, 72, 159, 74, 672, 83, 454, 455, 457, 458, 459, 674, 112, 464, 465, 468, 471, 472, 676, 474, 475, 476, 478, 480, 80, 482, 483, 484, 678, 486, 487, 489, 492, 493, 494, 680, 498, 499, 502, 681, 504, 505, 506, 507, 508, 509, 510, 511], "/Users/williamcheng/Code/wing328/swagger-codegen/samples/client/petstore/python/swagger_client/apis/user_api.py": [32, 355, 37, 39, 200, 124, 428, 589, 48, 18, 20, 22, 23, 276, 26, 507, 28, 29], "/Users/williamcheng/Code/wing328/swagger-codegen/samples/client/petstore/python/swagger_client/models/user.py": [278, 136, 266, 272, 147, 21, 22, 25, 284, 29, 158, 169, 180, 30, 191, 70, 202, 81, 213, 92, 224, 103, 235, 114, 19, 246, 125], "/Users/williamcheng/Code/wing328/swagger-codegen/samples/client/petstore/python/swagger_client/__init__.py": [1, 4, 5, 6, 7, 8, 11, 12, 13, 16, 18, 20], "/Users/williamcheng/Code/wing328/swagger-codegen/samples/client/petstore/python/swagger_client/rest.py": [20, 21, 23, 24, 25, 26, 27, 28, 31, 33, 35, 36, 40, 42, 43, 45, 48, 51, 53, 54, 55, 56, 57, 59, 63, 65, 72, 74, 82, 83, 88, 92, 95, 98, 101, 102, 103, 104, 105, 106, 109, 110, 121, 122, 124, 129, 130, 132, 135, 137, 138, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 152, 153, 154, 155, 156, 159, 160, 161, 166, 170, 174, 176, 177, 179, 181, 182, 183, 184, 186, 191, 198, 199, 200, 201, 203, 204, 205, 206, 207, 208, 210, 211, 212, 213, 214, 215, 217, 225, 227, 228, 229, 230, 231, 232, 239, 243, 244, 245, 246, 248, 249, 251]}} \ No newline at end of file +!coverage.py: This is a private format, don't read it directly!{"lines": {"/Users/williamcheng/Code/wing328/swagger-codegen/samples/client/petstore/python/swagger_client/__init__.py": [1, 4, 5, 6, 7, 8, 11, 12, 13, 16, 18, 20], "/Users/williamcheng/Code/wing328/swagger-codegen/samples/client/petstore/python/swagger_client/apis/pet_api.py": [512, 513, 514, 516, 86, 18, 20, 22, 23, 26, 539, 28, 29, 542, 543, 32, 548, 37, 39, 40, 41, 42, 555, 556, 45, 558, 559, 560, 562, 564, 565, 566, 568, 569, 571, 574, 575, 576, 580, 581, 70, 584, 73, 586, 587, 588, 589, 590, 591, 592, 593, 594, 595, 596, 598, 88, 90, 92, 93, 95, 96, 97, 100, 101, 102, 106, 107, 621, 622, 624, 625, 626, 79, 116, 117, 118, 631, 632, 121, 122, 635, 124, 638, 639, 641, 642, 643, 645, 647, 649, 650, 651, 652, 653, 654, 656, 145, 146, 659, 148, 661, 150, 665, 666, 155, 156, 538, 159, 160, 673, 162, 675, 164, 677, 166, 679, 168, 169, 171, 172, 173, 541, 176, 177, 178, 115, 182, 183, 186, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 200, 119, 120, 377, 221, 222, 549, 224, 225, 226, 231, 232, 431, 235, 236, 110, 238, 240, 552, 242, 244, 246, 247, 249, 383, 252, 253, 254, 258, 259, 262, 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 276, 46, 48, 297, 298, 300, 301, 302, 44, 307, 308, 311, 312, 314, 316, 317, 318, 320, 322, 323, 325, 113, 328, 329, 330, 334, 335, 338, 340, 341, 342, 343, 344, 345, 346, 347, 348, 349, 350, 485, 352, 84, 114, 373, 374, 376, 660, 378, 149, 384, 387, 390, 391, 393, 394, 395, 397, 399, 401, 402, 404, 407, 408, 409, 413, 414, 69, 417, 419, 420, 421, 422, 423, 424, 425, 426, 427, 428, 429, 669, 72, 241, 671, 74, 672, 83, 454, 455, 457, 458, 459, 674, 112, 464, 465, 468, 471, 472, 676, 474, 475, 476, 478, 480, 80, 482, 483, 484, 678, 486, 487, 489, 492, 493, 494, 680, 498, 499, 502, 681, 504, 505, 506, 507, 508, 509, 510, 511], "/Users/williamcheng/Code/wing328/swagger-codegen/samples/client/petstore/python/swagger_client/models/order.py": [130, 172, 141, 173, 19, 21, 22, 152, 25, 29, 30, 52, 161, 163, 39, 40, 41, 42, 43, 44, 45, 174, 175, 48, 49, 50, 51, 180, 53, 54, 57, 58, 59, 60, 61, 62, 191, 64, 202, 75, 86, 176, 222, 97, 228, 178, 234, 108, 240, 119], "/Users/williamcheng/Code/wing328/swagger-codegen/samples/client/petstore/python/swagger_client/models/__init__.py": [1, 4, 5, 6, 7, 8], "/Users/williamcheng/Code/wing328/swagger-codegen/samples/client/petstore/python/swagger_client/models/tag.py": [128, 132, 134, 72, 74, 109, 19, 21, 22, 104, 25, 29, 30, 96, 100, 114, 102, 39, 40, 41, 103, 44, 45, 46, 112, 49, 50, 83, 116, 94, 52, 122, 61, 85, 63], "/Users/williamcheng/Code/wing328/swagger-codegen/samples/client/petstore/python/swagger_client/apis/user_api.py": [32, 355, 37, 39, 200, 124, 428, 589, 48, 18, 20, 22, 23, 276, 26, 507, 28, 29], "/Users/williamcheng/Code/wing328/swagger-codegen/samples/client/petstore/python/swagger_client/configuration.py": [135, 136, 137, 138, 139, 142, 19, 149, 22, 23, 25, 26, 27, 29, 158, 31, 32, 34, 36, 37, 39, 40, 41, 170, 43, 172, 46, 47, 189, 179, 52, 54, 59, 61, 190, 63, 192, 224, 67, 69, 71, 200, 73, 204, 80, 81, 82, 84, 213, 86, 199, 88, 90, 219, 92, 221, 222, 223, 96, 225, 98, 100, 102, 230, 104, 167, 111, 76, 168, 157, 122, 123, 42, 21], "/Users/williamcheng/Code/wing328/swagger-codegen/samples/client/petstore/python/swagger_client/apis/store_api.py": [18, 276, 22, 23, 26, 28, 29, 197, 32, 37, 39, 40, 41, 44, 46, 48, 20, 68, 69, 71, 72, 79, 82, 83, 85, 87, 89, 91, 92, 94, 97, 98, 99, 103, 104, 107, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 121], "/Users/williamcheng/Code/wing328/swagger-codegen/samples/client/petstore/python/swagger_client/models/category.py": [128, 134, 72, 74, 109, 19, 21, 22, 104, 25, 29, 30, 96, 100, 114, 102, 39, 40, 41, 103, 44, 45, 46, 112, 49, 50, 83, 116, 94, 52, 122, 61, 85, 63], "/Users/williamcheng/Code/wing328/swagger-codegen/samples/client/petstore/python/swagger_client/rest.py": [20, 21, 23, 24, 25, 26, 27, 28, 31, 33, 35, 36, 40, 42, 48, 51, 53, 54, 55, 56, 57, 59, 63, 65, 72, 74, 82, 83, 88, 92, 95, 98, 101, 102, 103, 104, 105, 106, 109, 110, 121, 122, 124, 129, 130, 132, 135, 137, 138, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 152, 153, 154, 155, 156, 159, 160, 161, 166, 170, 171, 174, 176, 177, 179, 181, 182, 183, 184, 186, 191, 198, 199, 200, 201, 203, 204, 205, 206, 207, 208, 210, 211, 212, 213, 214, 215, 217, 225, 227, 228, 229, 230, 231, 232, 239, 243, 244, 245, 246, 248, 249, 251], "/Users/williamcheng/Code/wing328/swagger-codegen/samples/client/petstore/python/swagger_client/models/pet.py": [128, 130, 150, 172, 139, 141, 19, 215, 21, 22, 152, 25, 29, 30, 161, 163, 39, 40, 41, 42, 43, 44, 45, 174, 48, 49, 50, 51, 52, 53, 54, 183, 57, 58, 59, 60, 61, 62, 64, 194, 195, 200, 73, 202, 75, 206, 208, 209, 210, 211, 84, 213, 86, 185, 216, 218, 220, 222, 95, 97, 226, 228, 234, 108, 238, 240, 117, 119, 212, 106], "/Users/williamcheng/Code/wing328/swagger-codegen/samples/client/petstore/python/swagger_client/api_client.py": [518, 525, 526, 527, 19, 21, 22, 23, 24, 537, 26, 27, 28, 29, 30, 31, 32, 33, 34, 547, 36, 37, 40, 42, 44, 558, 49, 52, 566, 568, 569, 570, 571, 572, 573, 575, 68, 69, 70, 75, 76, 77, 79, 80, 82, 84, 91, 96, 98, 102, 103, 104, 107, 108, 109, 111, 112, 115, 116, 117, 118, 119, 120, 123, 124, 125, 126, 129, 130, 131, 134, 137, 138, 141, 144, 145, 146, 147, 149, 152, 153, 155, 157, 158, 160, 162, 171, 172, 174, 176, 191, 192, 194, 195, 196, 197, 198, 199, 200, 201, 202, 204, 205, 212, 213, 214, 216, 217, 219, 231, 235, 236, 240, 242, 251, 252, 254, 255, 256, 257, 258, 260, 261, 262, 263, 267, 268, 269, 272, 274, 275, 276, 278, 279, 280, 281, 283, 286, 287, 288, 316, 317, 318, 319, 320, 322, 323, 324, 325, 326, 327, 328, 329, 330, 332, 333, 337, 338, 339, 340, 341, 345, 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, 369, 370, 371, 372, 379, 387, 389, 390, 392, 393, 394, 395, 548, 397, 398, 399, 400, 401, 402, 404, 406, 413, 414, 416, 418, 419, 421, 423, 430, 431, 433, 435, 436, 438, 440, 448, 450, 453, 454, 455, 456, 458, 459, 467, 546, 493, 502, 503, 508, 510], "/Users/williamcheng/Code/wing328/swagger-codegen/samples/client/petstore/python/swagger_client/models/user.py": [278, 70, 136, 202, 272, 81, 147, 213, 22, 25, 92, 29, 158, 224, 103, 169, 235, 284, 114, 19, 180, 30, 246, 266, 191, 125, 21], "/Users/williamcheng/Code/wing328/swagger-codegen/samples/client/petstore/python/swagger_client/apis/__init__.py": [1, 4, 5, 6]}} \ No newline at end of file diff --git a/samples/client/petstore/python/dev-requirements.txt.log b/samples/client/petstore/python/dev-requirements.txt.log index 382d1cf081d..bd935e805bf 100644 --- a/samples/client/petstore/python/dev-requirements.txt.log +++ b/samples/client/petstore/python/dev-requirements.txt.log @@ -69,3 +69,59 @@ Requirement already satisfied (use --upgrade to upgrade): randomize in ./venv/li Requirement already satisfied (use --upgrade to upgrade): virtualenv>=1.11.2 in ./venv/lib/python2.7/site-packages (from tox->-r dev-requirements.txt (line 2)) Requirement already satisfied (use --upgrade to upgrade): py>=1.4.17 in ./venv/lib/python2.7/site-packages (from tox->-r dev-requirements.txt (line 2)) Requirement already satisfied (use --upgrade to upgrade): pluggy<0.4.0,>=0.3.0 in ./venv/lib/python2.7/site-packages (from tox->-r dev-requirements.txt (line 2)) +Collecting nose (from -r dev-requirements.txt (line 1)) + Using cached nose-1.3.7-py2-none-any.whl +Collecting tox (from -r dev-requirements.txt (line 2)) + Using cached tox-2.2.1-py2.py3-none-any.whl +Collecting coverage (from -r dev-requirements.txt (line 3)) + Downloading coverage-4.0.3.tar.gz (354kB) +Collecting randomize (from -r dev-requirements.txt (line 4)) + Using cached randomize-0.13-py2.py3-none-any.whl +Requirement already satisfied (use --upgrade to upgrade): virtualenv>=1.11.2 in /Library/Python/2.7/site-packages (from tox->-r dev-requirements.txt (line 2)) +Collecting py>=1.4.17 (from tox->-r dev-requirements.txt (line 2)) + Downloading py-1.4.31-py2.py3-none-any.whl (81kB) +Collecting pluggy<0.4.0,>=0.3.0 (from tox->-r dev-requirements.txt (line 2)) + Using cached pluggy-0.3.1-py2.py3-none-any.whl +Installing collected packages: nose, py, pluggy, tox, coverage, randomize +Collecting nose (from -r dev-requirements.txt (line 1)) + Using cached nose-1.3.7-py2-none-any.whl +Collecting tox (from -r dev-requirements.txt (line 2)) + Using cached tox-2.2.1-py2.py3-none-any.whl +Collecting coverage (from -r dev-requirements.txt (line 3)) + Using cached coverage-4.0.3.tar.gz +Collecting randomize (from -r dev-requirements.txt (line 4)) + Using cached randomize-0.13-py2.py3-none-any.whl +Requirement already satisfied (use --upgrade to upgrade): virtualenv>=1.11.2 in /Library/Python/2.7/site-packages (from tox->-r dev-requirements.txt (line 2)) +Collecting py>=1.4.17 (from tox->-r dev-requirements.txt (line 2)) + Using cached py-1.4.31-py2.py3-none-any.whl +Collecting pluggy<0.4.0,>=0.3.0 (from tox->-r dev-requirements.txt (line 2)) + Using cached pluggy-0.3.1-py2.py3-none-any.whl +Installing collected packages: nose, py, pluggy, tox, coverage, randomize +Requirement already satisfied (use --upgrade to upgrade): nose in ./venv/lib/python2.7/site-packages (from -r dev-requirements.txt (line 1)) +Requirement already satisfied (use --upgrade to upgrade): tox in ./venv/lib/python2.7/site-packages (from -r dev-requirements.txt (line 2)) +Requirement already satisfied (use --upgrade to upgrade): coverage in ./venv/lib/python2.7/site-packages (from -r dev-requirements.txt (line 3)) +Requirement already satisfied (use --upgrade to upgrade): randomize in ./venv/lib/python2.7/site-packages (from -r dev-requirements.txt (line 4)) +Requirement already satisfied (use --upgrade to upgrade): virtualenv>=1.11.2 in ./venv/lib/python2.7/site-packages (from tox->-r dev-requirements.txt (line 2)) +Requirement already satisfied (use --upgrade to upgrade): py>=1.4.17 in ./venv/lib/python2.7/site-packages (from tox->-r dev-requirements.txt (line 2)) +Requirement already satisfied (use --upgrade to upgrade): pluggy<0.4.0,>=0.3.0 in ./venv/lib/python2.7/site-packages (from tox->-r dev-requirements.txt (line 2)) +Requirement already satisfied (use --upgrade to upgrade): nose in ./venv/lib/python2.7/site-packages (from -r dev-requirements.txt (line 1)) +Requirement already satisfied (use --upgrade to upgrade): tox in ./venv/lib/python2.7/site-packages (from -r dev-requirements.txt (line 2)) +Requirement already satisfied (use --upgrade to upgrade): coverage in ./venv/lib/python2.7/site-packages (from -r dev-requirements.txt (line 3)) +Requirement already satisfied (use --upgrade to upgrade): randomize in ./venv/lib/python2.7/site-packages (from -r dev-requirements.txt (line 4)) +Requirement already satisfied (use --upgrade to upgrade): virtualenv>=1.11.2 in ./venv/lib/python2.7/site-packages (from tox->-r dev-requirements.txt (line 2)) +Requirement already satisfied (use --upgrade to upgrade): py>=1.4.17 in ./venv/lib/python2.7/site-packages (from tox->-r dev-requirements.txt (line 2)) +Requirement already satisfied (use --upgrade to upgrade): pluggy<0.4.0,>=0.3.0 in ./venv/lib/python2.7/site-packages (from tox->-r dev-requirements.txt (line 2)) +Requirement already satisfied (use --upgrade to upgrade): nose in ./venv/lib/python2.7/site-packages (from -r dev-requirements.txt (line 1)) +Requirement already satisfied (use --upgrade to upgrade): tox in ./venv/lib/python2.7/site-packages (from -r dev-requirements.txt (line 2)) +Requirement already satisfied (use --upgrade to upgrade): coverage in ./venv/lib/python2.7/site-packages (from -r dev-requirements.txt (line 3)) +Requirement already satisfied (use --upgrade to upgrade): randomize in ./venv/lib/python2.7/site-packages (from -r dev-requirements.txt (line 4)) +Requirement already satisfied (use --upgrade to upgrade): virtualenv>=1.11.2 in ./venv/lib/python2.7/site-packages (from tox->-r dev-requirements.txt (line 2)) +Requirement already satisfied (use --upgrade to upgrade): py>=1.4.17 in ./venv/lib/python2.7/site-packages (from tox->-r dev-requirements.txt (line 2)) +Requirement already satisfied (use --upgrade to upgrade): pluggy<0.4.0,>=0.3.0 in ./venv/lib/python2.7/site-packages (from tox->-r dev-requirements.txt (line 2)) +Requirement already satisfied (use --upgrade to upgrade): nose in ./venv/lib/python2.7/site-packages (from -r dev-requirements.txt (line 1)) +Requirement already satisfied (use --upgrade to upgrade): tox in ./venv/lib/python2.7/site-packages (from -r dev-requirements.txt (line 2)) +Requirement already satisfied (use --upgrade to upgrade): coverage in ./venv/lib/python2.7/site-packages (from -r dev-requirements.txt (line 3)) +Requirement already satisfied (use --upgrade to upgrade): randomize in ./venv/lib/python2.7/site-packages (from -r dev-requirements.txt (line 4)) +Requirement already satisfied (use --upgrade to upgrade): virtualenv>=1.11.2 in ./venv/lib/python2.7/site-packages (from tox->-r dev-requirements.txt (line 2)) +Requirement already satisfied (use --upgrade to upgrade): py>=1.4.17 in ./venv/lib/python2.7/site-packages (from tox->-r dev-requirements.txt (line 2)) +Requirement already satisfied (use --upgrade to upgrade): pluggy<0.4.0,>=0.3.0 in ./venv/lib/python2.7/site-packages (from tox->-r dev-requirements.txt (line 2)) From 921659be5cc565a01c0a2467ed7caa58ee9f0f9b Mon Sep 17 00:00:00 2001 From: xhh Date: Wed, 9 Dec 2015 16:09:15 +0800 Subject: [PATCH 157/211] Improve checking of JSON MIME in Java okhttp-gson client to support suffix like charset in "application/json; charset=UTF8" --- .../libraries/okhttp-gson/ApiClient.mustache | 39 +++++++++++++++---- .../java/io/swagger/client/ApiClient.java | 39 +++++++++++++++---- .../java/io/swagger/client/ApiClientTest.java | 33 +++++++++++----- 3 files changed, 87 insertions(+), 24 deletions(-) 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 e97e4c7f97d..99dcdb51780 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 @@ -549,6 +549,17 @@ public class ApiClient { return params; } + /** + * Check if the given MIME is a JSON MIME. + * JSON MIME examples: + * application/json + * application/json; charset=UTF8 + * APPLICATION/JSON + */ + public boolean isJsonMime(String mime) { + return mime != null && mime.matches("(?i)application\\/json(;.*)?"); + } + /** * Select the Accept header's value from the given accepts array: * if JSON exists in the given array, use it; @@ -559,8 +570,14 @@ public class ApiClient { * null will be returned (not to set the Accept header explicitly). */ public String selectHeaderAccept(String[] accepts) { - if (accepts.length == 0) return null; - if (StringUtil.containsIgnoreCase(accepts, "application/json")) return "application/json"; + if (accepts.length == 0) { + return null; + } + for (String accept : accepts) { + if (isJsonMime(accept)) { + return accept; + } + } return StringUtil.join(accepts, ","); } @@ -574,8 +591,14 @@ public class ApiClient { * JSON will be used. */ public String selectHeaderContentType(String[] contentTypes) { - if (contentTypes.length == 0) return "application/json"; - if (StringUtil.containsIgnoreCase(contentTypes, "application/json")) return "application/json"; + if (contentTypes.length == 0) { + return "application/json"; + } + for (String contentType : contentTypes) { + if (isJsonMime(contentType)) { + return contentType; + } + } return contentTypes[0]; } @@ -626,7 +649,7 @@ public class ApiClient { // ensuring a default content type contentType = "application/json"; } - if (contentType.startsWith("application/json")) { + if (isJsonMime(contentType)) { return json.deserialize(respBody, returnType); } else if (returnType.equals(String.class)) { // Expecting string, return the raw response body. @@ -650,7 +673,7 @@ public class ApiClient { * @throws ApiException If fail to serialize the given object */ public String serialize(Object obj, String contentType) throws ApiException { - if (contentType.startsWith("application/json")) { + if (isJsonMime(contentType)) { if (obj != null) return json.serialize(obj); else @@ -822,7 +845,9 @@ public class ApiClient { String contentType = (String) headerParams.get("Content-Type"); // ensuring a default content type - if (contentType == null) contentType = "application/json"; + if (contentType == null) { + contentType = "application/json"; + } RequestBody reqBody; if (!HttpMethod.permitsRequestBody(method)) { 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 d4ee79cb3ad..19cb83d620c 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 @@ -548,6 +548,17 @@ public class ApiClient { return params; } + /** + * Check if the given MIME is a JSON MIME. + * JSON MIME examples: + * application/json + * application/json; charset=UTF8 + * APPLICATION/JSON + */ + public boolean isJsonMime(String mime) { + return mime != null && mime.matches("(?i)application\\/json(;.*)?"); + } + /** * Select the Accept header's value from the given accepts array: * if JSON exists in the given array, use it; @@ -558,8 +569,14 @@ public class ApiClient { * null will be returned (not to set the Accept header explicitly). */ public String selectHeaderAccept(String[] accepts) { - if (accepts.length == 0) return null; - if (StringUtil.containsIgnoreCase(accepts, "application/json")) return "application/json"; + if (accepts.length == 0) { + return null; + } + for (String accept : accepts) { + if (isJsonMime(accept)) { + return accept; + } + } return StringUtil.join(accepts, ","); } @@ -573,8 +590,14 @@ public class ApiClient { * JSON will be used. */ public String selectHeaderContentType(String[] contentTypes) { - if (contentTypes.length == 0) return "application/json"; - if (StringUtil.containsIgnoreCase(contentTypes, "application/json")) return "application/json"; + if (contentTypes.length == 0) { + return "application/json"; + } + for (String contentType : contentTypes) { + if (isJsonMime(contentType)) { + return contentType; + } + } return contentTypes[0]; } @@ -625,7 +648,7 @@ public class ApiClient { // ensuring a default content type contentType = "application/json"; } - if (contentType.startsWith("application/json")) { + if (isJsonMime(contentType)) { return json.deserialize(respBody, returnType); } else if (returnType.equals(String.class)) { // Expecting string, return the raw response body. @@ -649,7 +672,7 @@ public class ApiClient { * @throws ApiException If fail to serialize the given object */ public String serialize(Object obj, String contentType) throws ApiException { - if (contentType.startsWith("application/json")) { + if (isJsonMime(contentType)) { if (obj != null) return json.serialize(obj); else @@ -821,7 +844,9 @@ public class ApiClient { String contentType = (String) headerParams.get("Content-Type"); // ensuring a default content type - if (contentType == null) contentType = "application/json"; + if (contentType == null) { + contentType = "application/json"; + } RequestBody reqBody; if (!HttpMethod.permitsRequestBody(method)) { 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 aaf4f33c49e..9b5c6805744 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 @@ -77,16 +77,29 @@ public class ApiClientTest { assertEquals(dateStr, apiClient.formatDate(apiClient.parseDate("2015-11"))); } + @Test + public void testIsJsonMime() { + assertFalse(apiClient.isJsonMime(null)); + assertFalse(apiClient.isJsonMime("")); + assertFalse(apiClient.isJsonMime("text/plain")); + assertFalse(apiClient.isJsonMime("application/xml")); + assertFalse(apiClient.isJsonMime("application/jsonp")); + + assertTrue(apiClient.isJsonMime("application/json")); + assertTrue(apiClient.isJsonMime("application/json; charset=UTF8")); + assertTrue(apiClient.isJsonMime("APPLICATION/JSON")); + } + @Test public void testSelectHeaderAccept() { - String[] accepts = {"APPLICATION/JSON", "APPLICATION/XML"}; + String[] accepts = {"application/json", "application/xml"}; assertEquals("application/json", apiClient.selectHeaderAccept(accepts)); - accepts = new String[]{"application/json", "application/xml"}; - assertEquals("application/json", apiClient.selectHeaderAccept(accepts)); + accepts = new String[]{"APPLICATION/XML", "APPLICATION/JSON"}; + assertEquals("APPLICATION/JSON", apiClient.selectHeaderAccept(accepts)); - accepts = new String[]{"application/xml", "application/json"}; - assertEquals("application/json", apiClient.selectHeaderAccept(accepts)); + accepts = new String[]{"application/xml", "application/json; charset=UTF8"}; + assertEquals("application/json; charset=UTF8", apiClient.selectHeaderAccept(accepts)); accepts = new String[]{"text/plain", "application/xml"}; assertEquals("text/plain,application/xml", apiClient.selectHeaderAccept(accepts)); @@ -97,14 +110,14 @@ public class ApiClientTest { @Test public void testSelectHeaderContentType() { - String[] contentTypes = {"APPLICATION/JSON", "APPLICATION/XML"}; + String[] contentTypes = {"application/json", "application/xml"}; assertEquals("application/json", apiClient.selectHeaderContentType(contentTypes)); - contentTypes = new String[]{"application/json", "application/xml"}; - assertEquals("application/json", apiClient.selectHeaderContentType(contentTypes)); + contentTypes = new String[]{"APPLICATION/JSON", "APPLICATION/XML"}; + assertEquals("APPLICATION/JSON", apiClient.selectHeaderContentType(contentTypes)); - contentTypes = new String[]{"application/xml", "application/json"}; - assertEquals("application/json", apiClient.selectHeaderContentType(contentTypes)); + contentTypes = new String[]{"application/xml", "application/json; charset=UTF8"}; + assertEquals("application/json; charset=UTF8", apiClient.selectHeaderContentType(contentTypes)); contentTypes = new String[]{"text/plain", "application/xml"}; assertEquals("text/plain", apiClient.selectHeaderContentType(contentTypes)); From e767a7d6d812d976edde3478ef0cc4893c793b15 Mon Sep 17 00:00:00 2001 From: wing328 Date: Wed, 9 Dec 2015 16:21:00 +0800 Subject: [PATCH 158/211] add default value to objc model properties --- .../codegen/languages/ObjcClientCodegen.java | 60 ++++++++++++++++--- .../main/resources/objc/model-body.mustache | 11 ++++ .../petstore/objc/SwaggerClient/SWGCategory.m | 10 ++++ .../petstore/objc/SwaggerClient/SWGOrder.m | 10 ++++ .../petstore/objc/SwaggerClient/SWGPet.m | 10 ++++ .../petstore/objc/SwaggerClient/SWGTag.m | 10 ++++ .../petstore/objc/SwaggerClient/SWGUser.m | 10 ++++ 7 files changed, 113 insertions(+), 8 deletions(-) diff --git a/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/ObjcClientCodegen.java b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/ObjcClientCodegen.java index 7037ee06f9b..9c488db1254 100644 --- a/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/ObjcClientCodegen.java +++ b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/ObjcClientCodegen.java @@ -7,9 +7,7 @@ import io.swagger.codegen.CodegenProperty; import io.swagger.codegen.CodegenType; import io.swagger.codegen.DefaultCodegen; import io.swagger.codegen.SupportingFile; -import io.swagger.models.properties.ArrayProperty; -import io.swagger.models.properties.MapProperty; -import io.swagger.models.properties.Property; +import io.swagger.models.properties.*; import java.io.File; import java.util.Arrays; @@ -343,11 +341,6 @@ public class ObjcClientCodegen extends DefaultCodegen implements CodegenConfig { return name; } - @Override - public String toDefaultValue(Property p) { - return null; - } - @Override public String apiFileFolder() { return outputFolder + File.separatorChar + apiPackage(); @@ -452,4 +445,55 @@ public class ObjcClientCodegen extends DefaultCodegen implements CodegenConfig { public void setLicense(String license) { this.license = license; } + + /** + * Return the default value of the property + * + * @param p Swagger property object + * @return string presentation of the default value of the property + */ + @Override + public String toDefaultValue(Property p) { + if (p instanceof StringProperty) { + StringProperty dp = (StringProperty) p; + if (dp.getDefault() != null) { + return "@\"" + dp.getDefault().toString() + "\""; + } + } else if (p instanceof BooleanProperty) { + BooleanProperty dp = (BooleanProperty) p; + if (dp.getDefault() != null) { + if (dp.getDefault().toString().equalsIgnoreCase("false")) + return "@0"; + else + return "@1"; + } + } else if (p instanceof DateProperty) { + // TODO + } else if (p instanceof DateTimeProperty) { + // TODO + } else if (p instanceof DoubleProperty) { + DoubleProperty dp = (DoubleProperty) p; + if (dp.getDefault() != null) { + return "@" + dp.getDefault().toString(); + } + } else if (p instanceof FloatProperty) { + FloatProperty dp = (FloatProperty) p; + if (dp.getDefault() != null) { + return "@" + dp.getDefault().toString(); + } + } else if (p instanceof IntegerProperty) { + IntegerProperty dp = (IntegerProperty) p; + if (dp.getDefault() != null) { + return "@" + dp.getDefault().toString(); + } + } else if (p instanceof LongProperty) { + LongProperty dp = (LongProperty) p; + if (dp.getDefault() != null) { + return "@" + dp.getDefault().toString(); + } + } + + return null; + } + } diff --git a/modules/swagger-codegen/src/main/resources/objc/model-body.mustache b/modules/swagger-codegen/src/main/resources/objc/model-body.mustache index 33c0f8cf42b..ba76b12aeb8 100644 --- a/modules/swagger-codegen/src/main/resources/objc/model-body.mustache +++ b/modules/swagger-codegen/src/main/resources/objc/model-body.mustache @@ -4,6 +4,17 @@ @implementation {{classname}} +- (instancetype)init { + self = [super init]; + if (self) + { + // initalise property's default value, if any + {{#vars}}{{#defaultValue}}self.{{name}} = {{{defaultValue}}}; + {{/defaultValue}}{{/vars}} + } + return self; +} + /** * Maps json key to property name. * This method is used by `JSONModel`. diff --git a/samples/client/petstore/objc/SwaggerClient/SWGCategory.m b/samples/client/petstore/objc/SwaggerClient/SWGCategory.m index fb3ccecf176..7c71e4af0f4 100644 --- a/samples/client/petstore/objc/SwaggerClient/SWGCategory.m +++ b/samples/client/petstore/objc/SwaggerClient/SWGCategory.m @@ -2,6 +2,16 @@ @implementation SWGCategory +- (instancetype)init { + self = [super init]; + if (self) + { + // initalise property's default value, if any + + } + return self; +} + /** * Maps json key to property name. * This method is used by `JSONModel`. diff --git a/samples/client/petstore/objc/SwaggerClient/SWGOrder.m b/samples/client/petstore/objc/SwaggerClient/SWGOrder.m index 83fe5741cd7..ba0b637eb09 100644 --- a/samples/client/petstore/objc/SwaggerClient/SWGOrder.m +++ b/samples/client/petstore/objc/SwaggerClient/SWGOrder.m @@ -2,6 +2,16 @@ @implementation SWGOrder +- (instancetype)init { + self = [super init]; + if (self) + { + // initalise property's default value, if any + + } + return self; +} + /** * Maps json key to property name. * This method is used by `JSONModel`. diff --git a/samples/client/petstore/objc/SwaggerClient/SWGPet.m b/samples/client/petstore/objc/SwaggerClient/SWGPet.m index 3fd315ab011..388157eb0cc 100644 --- a/samples/client/petstore/objc/SwaggerClient/SWGPet.m +++ b/samples/client/petstore/objc/SwaggerClient/SWGPet.m @@ -2,6 +2,16 @@ @implementation SWGPet +- (instancetype)init { + self = [super init]; + if (self) + { + // initalise property's default value, if any + + } + return self; +} + /** * Maps json key to property name. * This method is used by `JSONModel`. diff --git a/samples/client/petstore/objc/SwaggerClient/SWGTag.m b/samples/client/petstore/objc/SwaggerClient/SWGTag.m index 3bcb9973dfd..7a7e7550deb 100644 --- a/samples/client/petstore/objc/SwaggerClient/SWGTag.m +++ b/samples/client/petstore/objc/SwaggerClient/SWGTag.m @@ -2,6 +2,16 @@ @implementation SWGTag +- (instancetype)init { + self = [super init]; + if (self) + { + // initalise property's default value, if any + + } + return self; +} + /** * Maps json key to property name. * This method is used by `JSONModel`. diff --git a/samples/client/petstore/objc/SwaggerClient/SWGUser.m b/samples/client/petstore/objc/SwaggerClient/SWGUser.m index d040a6bce6d..bdb26cf36a6 100644 --- a/samples/client/petstore/objc/SwaggerClient/SWGUser.m +++ b/samples/client/petstore/objc/SwaggerClient/SWGUser.m @@ -2,6 +2,16 @@ @implementation SWGUser +- (instancetype)init { + self = [super init]; + if (self) + { + // initalise property's default value, if any + + } + return self; +} + /** * Maps json key to property name. * This method is used by `JSONModel`. From be0bc71c863a2c5a7e3dca5c55853311d61f7db5 Mon Sep 17 00:00:00 2001 From: xhh Date: Wed, 9 Dec 2015 16:30:55 +0800 Subject: [PATCH 159/211] Improve checking of JSON MIME in Java default and jersey2 to support suffix like charset in "application/json; charset=UTF8" --- .../main/resources/Java/ApiClient.mustache | 35 +++++++++++++++--- .../Java/libraries/jersey2/ApiClient.mustache | 35 +++++++++++++++--- .../java/io/swagger/client/ApiClient.java | 37 +++++++++++++++---- .../java/io/swagger/client/ApiClientTest.java | 33 ++++++++++++----- .../java/io/swagger/client/ApiClient.java | 37 +++++++++++++++---- .../java/io/swagger/client/ApiClientTest.java | 33 ++++++++++++----- 6 files changed, 164 insertions(+), 46 deletions(-) diff --git a/modules/swagger-codegen/src/main/resources/Java/ApiClient.mustache b/modules/swagger-codegen/src/main/resources/Java/ApiClient.mustache index 2e73cd702e9..562df7e1f79 100644 --- a/modules/swagger-codegen/src/main/resources/Java/ApiClient.mustache +++ b/modules/swagger-codegen/src/main/resources/Java/ApiClient.mustache @@ -337,6 +337,17 @@ public class ApiClient { return params; } + /** + * Check if the given MIME is a JSON MIME. + * JSON MIME examples: + * application/json + * application/json; charset=UTF8 + * APPLICATION/JSON + */ + public boolean isJsonMime(String mime) { + return mime != null && mime.matches("(?i)application\\/json(;.*)?"); + } + /** * Select the Accept header's value from the given accepts array: * if JSON exists in the given array, use it; @@ -347,8 +358,14 @@ public class ApiClient { * null will be returned (not to set the Accept header explicitly). */ public String selectHeaderAccept(String[] accepts) { - if (accepts.length == 0) return null; - if (StringUtil.containsIgnoreCase(accepts, "application/json")) return "application/json"; + if (accepts.length == 0) { + return null; + } + for (String accept : accepts) { + if (isJsonMime(accept)) { + return accept; + } + } return StringUtil.join(accepts, ","); } @@ -362,8 +379,14 @@ public class ApiClient { * JSON will be used. */ public String selectHeaderContentType(String[] contentTypes) { - if (contentTypes.length == 0) return "application/json"; - if (StringUtil.containsIgnoreCase(contentTypes, "application/json")) return "application/json"; + if (contentTypes.length == 0) { + return "application/json"; + } + for (String contentType : contentTypes) { + if (isJsonMime(contentType)) { + return contentType; + } + } return contentTypes[0]; } @@ -383,7 +406,7 @@ public class ApiClient { * Content-Type (only JSON is supported for now). */ public String serialize(Object obj, String contentType) throws ApiException { - if (contentType.startsWith("application/json")) { + if (isJsonMime(contentType)) { return json.serialize(obj); } else { throw new ApiException(400, "can not serialize object into Content-Type: " + contentType); @@ -407,7 +430,7 @@ public class ApiClient { else body = ""; - if (contentType.startsWith("application/json")) { + if (isJsonMime(contentType)) { return json.deserialize(body, returnType); } else if (returnType.getType().equals(String.class)) { // Expecting string, return the raw response body. 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 d29beeea34c..4f08158ab75 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 @@ -344,6 +344,17 @@ public class ApiClient { return params; } + /** + * Check if the given MIME is a JSON MIME. + * JSON MIME examples: + * application/json + * application/json; charset=UTF8 + * APPLICATION/JSON + */ + public boolean isJsonMime(String mime) { + return mime != null && mime.matches("(?i)application\\/json(;.*)?"); + } + /** * Select the Accept header's value from the given accepts array: * if JSON exists in the given array, use it; @@ -354,8 +365,14 @@ public class ApiClient { * null will be returned (not to set the Accept header explicitly). */ public String selectHeaderAccept(String[] accepts) { - if (accepts.length == 0) return null; - if (StringUtil.containsIgnoreCase(accepts, "application/json")) return "application/json"; + if (accepts.length == 0) { + return null; + } + for (String accept : accepts) { + if (isJsonMime(accept)) { + return accept; + } + } return StringUtil.join(accepts, ","); } @@ -369,8 +386,14 @@ public class ApiClient { * JSON will be used. */ public String selectHeaderContentType(String[] contentTypes) { - if (contentTypes.length == 0) return "application/json"; - if (StringUtil.containsIgnoreCase(contentTypes, "application/json")) return "application/json"; + if (contentTypes.length == 0) { + return "application/json"; + } + for (String contentType : contentTypes) { + if (isJsonMime(contentType)) { + return contentType; + } + } return contentTypes[0]; } @@ -390,7 +413,7 @@ public class ApiClient { * Content-Type (only JSON is supported for now). */ public Entity serialize(Object obj, String contentType) throws ApiException { - if (contentType.startsWith("application/json")) { + if (isJsonMime(contentType)) { return Entity.json(json.serialize(obj)); } else { throw new ApiException(400, "can not serialize object into Content-Type: " + contentType); @@ -414,7 +437,7 @@ public class ApiClient { else body = ""; - if (contentType.startsWith("application/json")) { + if (isJsonMime(contentType)) { return json.deserialize(body, returnType); } else if (returnType.getType().equals(String.class)) { // Expecting string, return the raw response body. diff --git a/samples/client/petstore/java/default/src/main/java/io/swagger/client/ApiClient.java b/samples/client/petstore/java/default/src/main/java/io/swagger/client/ApiClient.java index 1966b0a34c6..3d40225c78f 100644 --- a/samples/client/petstore/java/default/src/main/java/io/swagger/client/ApiClient.java +++ b/samples/client/petstore/java/default/src/main/java/io/swagger/client/ApiClient.java @@ -39,7 +39,7 @@ import io.swagger.client.auth.HttpBasicAuth; import io.swagger.client.auth.ApiKeyAuth; import io.swagger.client.auth.OAuth; -@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-12-02T18:29:05.463+08:00") +@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-12-09T16:17:57.986+08:00") public class ApiClient { private Map hostMap = new HashMap(); private Map defaultHeaderMap = new HashMap(); @@ -336,6 +336,17 @@ public class ApiClient { return params; } + /** + * Check if the given MIME is a JSON MIME. + * JSON MIME examples: + * application/json + * application/json; charset=UTF8 + * APPLICATION/JSON + */ + public boolean isJsonMime(String mime) { + return mime != null && mime.matches("(?i)application\\/json(;.*)?"); + } + /** * Select the Accept header's value from the given accepts array: * if JSON exists in the given array, use it; @@ -346,8 +357,14 @@ public class ApiClient { * null will be returned (not to set the Accept header explicitly). */ public String selectHeaderAccept(String[] accepts) { - if (accepts.length == 0) return null; - if (StringUtil.containsIgnoreCase(accepts, "application/json")) return "application/json"; + if (accepts.length == 0) { + return null; + } + for (String accept : accepts) { + if (isJsonMime(accept)) { + return accept; + } + } return StringUtil.join(accepts, ","); } @@ -361,8 +378,14 @@ public class ApiClient { * JSON will be used. */ public String selectHeaderContentType(String[] contentTypes) { - if (contentTypes.length == 0) return "application/json"; - if (StringUtil.containsIgnoreCase(contentTypes, "application/json")) return "application/json"; + if (contentTypes.length == 0) { + return "application/json"; + } + for (String contentType : contentTypes) { + if (isJsonMime(contentType)) { + return contentType; + } + } return contentTypes[0]; } @@ -382,7 +405,7 @@ public class ApiClient { * Content-Type (only JSON is supported for now). */ public String serialize(Object obj, String contentType) throws ApiException { - if (contentType.startsWith("application/json")) { + if (isJsonMime(contentType)) { return json.serialize(obj); } else { throw new ApiException(400, "can not serialize object into Content-Type: " + contentType); @@ -406,7 +429,7 @@ public class ApiClient { else body = ""; - if (contentType.startsWith("application/json")) { + if (isJsonMime(contentType)) { return json.deserialize(body, returnType); } else if (returnType.getType().equals(String.class)) { // Expecting string, return the raw response body. diff --git a/samples/client/petstore/java/default/src/test/java/io/swagger/client/ApiClientTest.java b/samples/client/petstore/java/default/src/test/java/io/swagger/client/ApiClientTest.java index 3d57f3fa84c..29eae3d017e 100644 --- a/samples/client/petstore/java/default/src/test/java/io/swagger/client/ApiClientTest.java +++ b/samples/client/petstore/java/default/src/test/java/io/swagger/client/ApiClientTest.java @@ -38,16 +38,29 @@ public class ApiClientTest { assertEquals(dateStr, apiClient.formatDate(apiClient.parseDate("2015-11-07T13:49:09+10:00"))); } + @Test + public void testIsJsonMime() { + assertFalse(apiClient.isJsonMime(null)); + assertFalse(apiClient.isJsonMime("")); + assertFalse(apiClient.isJsonMime("text/plain")); + assertFalse(apiClient.isJsonMime("application/xml")); + assertFalse(apiClient.isJsonMime("application/jsonp")); + + assertTrue(apiClient.isJsonMime("application/json")); + assertTrue(apiClient.isJsonMime("application/json; charset=UTF8")); + assertTrue(apiClient.isJsonMime("APPLICATION/JSON")); + } + @Test public void testSelectHeaderAccept() { - String[] accepts = {"APPLICATION/JSON", "APPLICATION/XML"}; + String[] accepts = {"application/json", "application/xml"}; assertEquals("application/json", apiClient.selectHeaderAccept(accepts)); - accepts = new String[]{"application/json", "application/xml"}; - assertEquals("application/json", apiClient.selectHeaderAccept(accepts)); + accepts = new String[]{"APPLICATION/XML", "APPLICATION/JSON"}; + assertEquals("APPLICATION/JSON", apiClient.selectHeaderAccept(accepts)); - accepts = new String[]{"application/xml", "application/json"}; - assertEquals("application/json", apiClient.selectHeaderAccept(accepts)); + accepts = new String[]{"application/xml", "application/json; charset=UTF8"}; + assertEquals("application/json; charset=UTF8", apiClient.selectHeaderAccept(accepts)); accepts = new String[]{"text/plain", "application/xml"}; assertEquals("text/plain,application/xml", apiClient.selectHeaderAccept(accepts)); @@ -58,14 +71,14 @@ public class ApiClientTest { @Test public void testSelectHeaderContentType() { - String[] contentTypes = {"APPLICATION/JSON", "APPLICATION/XML"}; + String[] contentTypes = {"application/json", "application/xml"}; assertEquals("application/json", apiClient.selectHeaderContentType(contentTypes)); - contentTypes = new String[]{"application/json", "application/xml"}; - assertEquals("application/json", apiClient.selectHeaderContentType(contentTypes)); + contentTypes = new String[]{"APPLICATION/JSON", "APPLICATION/XML"}; + assertEquals("APPLICATION/JSON", apiClient.selectHeaderContentType(contentTypes)); - contentTypes = new String[]{"application/xml", "application/json"}; - assertEquals("application/json", apiClient.selectHeaderContentType(contentTypes)); + contentTypes = new String[]{"application/xml", "application/json; charset=UTF8"}; + assertEquals("application/json; charset=UTF8", apiClient.selectHeaderContentType(contentTypes)); contentTypes = new String[]{"text/plain", "application/xml"}; assertEquals("text/plain", apiClient.selectHeaderContentType(contentTypes)); diff --git a/samples/client/petstore/java/jersey2/src/main/java/io/swagger/client/ApiClient.java b/samples/client/petstore/java/jersey2/src/main/java/io/swagger/client/ApiClient.java index e9c55bfb710..c5c74cc11e4 100644 --- a/samples/client/petstore/java/jersey2/src/main/java/io/swagger/client/ApiClient.java +++ b/samples/client/petstore/java/jersey2/src/main/java/io/swagger/client/ApiClient.java @@ -42,7 +42,7 @@ import io.swagger.client.auth.HttpBasicAuth; import io.swagger.client.auth.ApiKeyAuth; import io.swagger.client.auth.OAuth; -@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-12-02T18:29:08.393+08:00") +@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-12-09T16:27:55.818+08:00") public class ApiClient { private Client client; private Map hostMap = new HashMap(); @@ -343,6 +343,17 @@ public class ApiClient { return params; } + /** + * Check if the given MIME is a JSON MIME. + * JSON MIME examples: + * application/json + * application/json; charset=UTF8 + * APPLICATION/JSON + */ + public boolean isJsonMime(String mime) { + return mime != null && mime.matches("(?i)application\\/json(;.*)?"); + } + /** * Select the Accept header's value from the given accepts array: * if JSON exists in the given array, use it; @@ -353,8 +364,14 @@ public class ApiClient { * null will be returned (not to set the Accept header explicitly). */ public String selectHeaderAccept(String[] accepts) { - if (accepts.length == 0) return null; - if (StringUtil.containsIgnoreCase(accepts, "application/json")) return "application/json"; + if (accepts.length == 0) { + return null; + } + for (String accept : accepts) { + if (isJsonMime(accept)) { + return accept; + } + } return StringUtil.join(accepts, ","); } @@ -368,8 +385,14 @@ public class ApiClient { * JSON will be used. */ public String selectHeaderContentType(String[] contentTypes) { - if (contentTypes.length == 0) return "application/json"; - if (StringUtil.containsIgnoreCase(contentTypes, "application/json")) return "application/json"; + if (contentTypes.length == 0) { + return "application/json"; + } + for (String contentType : contentTypes) { + if (isJsonMime(contentType)) { + return contentType; + } + } return contentTypes[0]; } @@ -389,7 +412,7 @@ public class ApiClient { * Content-Type (only JSON is supported for now). */ public Entity serialize(Object obj, String contentType) throws ApiException { - if (contentType.startsWith("application/json")) { + if (isJsonMime(contentType)) { return Entity.json(json.serialize(obj)); } else { throw new ApiException(400, "can not serialize object into Content-Type: " + contentType); @@ -413,7 +436,7 @@ public class ApiClient { else body = ""; - if (contentType.startsWith("application/json")) { + if (isJsonMime(contentType)) { return json.deserialize(body, returnType); } else if (returnType.getType().equals(String.class)) { // Expecting string, return the raw response body. diff --git a/samples/client/petstore/java/jersey2/src/test/java/io/swagger/client/ApiClientTest.java b/samples/client/petstore/java/jersey2/src/test/java/io/swagger/client/ApiClientTest.java index 3d57f3fa84c..29eae3d017e 100644 --- a/samples/client/petstore/java/jersey2/src/test/java/io/swagger/client/ApiClientTest.java +++ b/samples/client/petstore/java/jersey2/src/test/java/io/swagger/client/ApiClientTest.java @@ -38,16 +38,29 @@ public class ApiClientTest { assertEquals(dateStr, apiClient.formatDate(apiClient.parseDate("2015-11-07T13:49:09+10:00"))); } + @Test + public void testIsJsonMime() { + assertFalse(apiClient.isJsonMime(null)); + assertFalse(apiClient.isJsonMime("")); + assertFalse(apiClient.isJsonMime("text/plain")); + assertFalse(apiClient.isJsonMime("application/xml")); + assertFalse(apiClient.isJsonMime("application/jsonp")); + + assertTrue(apiClient.isJsonMime("application/json")); + assertTrue(apiClient.isJsonMime("application/json; charset=UTF8")); + assertTrue(apiClient.isJsonMime("APPLICATION/JSON")); + } + @Test public void testSelectHeaderAccept() { - String[] accepts = {"APPLICATION/JSON", "APPLICATION/XML"}; + String[] accepts = {"application/json", "application/xml"}; assertEquals("application/json", apiClient.selectHeaderAccept(accepts)); - accepts = new String[]{"application/json", "application/xml"}; - assertEquals("application/json", apiClient.selectHeaderAccept(accepts)); + accepts = new String[]{"APPLICATION/XML", "APPLICATION/JSON"}; + assertEquals("APPLICATION/JSON", apiClient.selectHeaderAccept(accepts)); - accepts = new String[]{"application/xml", "application/json"}; - assertEquals("application/json", apiClient.selectHeaderAccept(accepts)); + accepts = new String[]{"application/xml", "application/json; charset=UTF8"}; + assertEquals("application/json; charset=UTF8", apiClient.selectHeaderAccept(accepts)); accepts = new String[]{"text/plain", "application/xml"}; assertEquals("text/plain,application/xml", apiClient.selectHeaderAccept(accepts)); @@ -58,14 +71,14 @@ public class ApiClientTest { @Test public void testSelectHeaderContentType() { - String[] contentTypes = {"APPLICATION/JSON", "APPLICATION/XML"}; + String[] contentTypes = {"application/json", "application/xml"}; assertEquals("application/json", apiClient.selectHeaderContentType(contentTypes)); - contentTypes = new String[]{"application/json", "application/xml"}; - assertEquals("application/json", apiClient.selectHeaderContentType(contentTypes)); + contentTypes = new String[]{"APPLICATION/JSON", "APPLICATION/XML"}; + assertEquals("APPLICATION/JSON", apiClient.selectHeaderContentType(contentTypes)); - contentTypes = new String[]{"application/xml", "application/json"}; - assertEquals("application/json", apiClient.selectHeaderContentType(contentTypes)); + contentTypes = new String[]{"application/xml", "application/json; charset=UTF8"}; + assertEquals("application/json; charset=UTF8", apiClient.selectHeaderContentType(contentTypes)); contentTypes = new String[]{"text/plain", "application/xml"}; assertEquals("text/plain", apiClient.selectHeaderContentType(contentTypes)); From ba48f8712d53f910a847c8da6b158ff6efa28adb Mon Sep 17 00:00:00 2001 From: xhh Date: Wed, 9 Dec 2015 16:34:53 +0800 Subject: [PATCH 160/211] Add test case for the "json_mime?" method --- samples/client/petstore/ruby/spec/api_client_spec.rb | 1 + 1 file changed, 1 insertion(+) diff --git a/samples/client/petstore/ruby/spec/api_client_spec.rb b/samples/client/petstore/ruby/spec/api_client_spec.rb index 054f63bc4ef..7b2478ea67c 100644 --- a/samples/client/petstore/ruby/spec/api_client_spec.rb +++ b/samples/client/petstore/ruby/spec/api_client_spec.rb @@ -158,6 +158,7 @@ describe Petstore::ApiClient do api_client.json_mime?('application/xml').should == false api_client.json_mime?('text/plain').should == false + api_client.json_mime?('application/jsonp').should == false end end From 8e0816b5dd8773c98bd833fa172f1f83f42dcb14 Mon Sep 17 00:00:00 2001 From: thibaultclem Date: Wed, 9 Dec 2015 16:11:08 +0700 Subject: [PATCH 161/211] Fix syntax issue when generating Javascript client operation without parameters --- .../swagger-codegen/src/main/resources/Javascript/api.mustache | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/swagger-codegen/src/main/resources/Javascript/api.mustache b/modules/swagger-codegen/src/main/resources/Javascript/api.mustache index a9af0d54c15..f7bc498ff18 100644 --- a/modules/swagger-codegen/src/main/resources/Javascript/api.mustache +++ b/modules/swagger-codegen/src/main/resources/Javascript/api.mustache @@ -20,7 +20,7 @@ var {{classname}} = function {{classname}}() { {{/allParams}} * @param {function} callback the callback function * @return {{#returnType}}{{{returnType}}}{{/returnType}}{{^returnType}}void{{/returnType}} */ - self.{{nickname}} = function({{#allParams}}{{paramName}}{{#hasMore}}, {{/hasMore}}{{/allParams}}, callback) { + self.{{nickname}} = function({{#allParams}}{{paramName}}{{#hasMore}}, {{/hasMore}}{{/allParams}}{{#hasParams}}, {{/hasParams}}callback) { var {{localVariablePrefix}}postBody = {{#bodyParam}}{{^isBinary}}JSON.stringify({{paramName}}){{/isBinary}}{{#isBinary}}null{{/isBinary}}{{/bodyParam}}{{^bodyParam}}null{{/bodyParam}}; var {{localVariablePrefix}}postBinaryBody = {{#bodyParam}}{{#isBinary}}{{paramName}}{{/isBinary}}{{^isBinary}}null{{/isBinary}}{{/bodyParam}}{{^bodyParam}}null{{/bodyParam}}; From 7c7255278082337f69971844f734e7022a5e269b Mon Sep 17 00:00:00 2001 From: thibaultclem Date: Wed, 9 Dec 2015 16:32:18 +0700 Subject: [PATCH 162/211] Update JS Client Petstore samples after fixing issue on the JS api.mustache --- .../client/petstore/javascript/src/scripts/rest/api/PetApi.js | 2 +- .../petstore/javascript/src/scripts/rest/api/StoreApi.js | 4 ++-- .../petstore/javascript/src/scripts/rest/api/UserApi.js | 4 ++-- .../client/petstore/javascript/src/scripts/rest/model/Pet.js | 2 +- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/samples/client/petstore/javascript/src/scripts/rest/api/PetApi.js b/samples/client/petstore/javascript/src/scripts/rest/api/PetApi.js index a693d83dbc2..bf35463dc1a 100644 --- a/samples/client/petstore/javascript/src/scripts/rest/api/PetApi.js +++ b/samples/client/petstore/javascript/src/scripts/rest/api/PetApi.js @@ -1,5 +1,5 @@ /* - * @javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavascriptClientCodegen", date = "2015-12-07T10:51:19.835+08:00") + * @javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavascriptClientCodegen", date = "2015-12-09T16:07:21.000+07:00") */ //export module diff --git a/samples/client/petstore/javascript/src/scripts/rest/api/StoreApi.js b/samples/client/petstore/javascript/src/scripts/rest/api/StoreApi.js index 086ce8b4ae9..5487b1c386e 100644 --- a/samples/client/petstore/javascript/src/scripts/rest/api/StoreApi.js +++ b/samples/client/petstore/javascript/src/scripts/rest/api/StoreApi.js @@ -1,5 +1,5 @@ /* - * @javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavascriptClientCodegen", date = "2015-12-07T10:51:19.835+08:00") + * @javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavascriptClientCodegen", date = "2015-12-09T16:07:21.000+07:00") */ //export module @@ -18,7 +18,7 @@ var StoreApi = function StoreApi() { * @param {function} callback the callback function * @return Map */ - self.getInventory = function(, callback) { + self.getInventory = function(callback) { var postBody = null; var postBinaryBody = null; diff --git a/samples/client/petstore/javascript/src/scripts/rest/api/UserApi.js b/samples/client/petstore/javascript/src/scripts/rest/api/UserApi.js index 53cecbdf8f7..30c797cf25f 100644 --- a/samples/client/petstore/javascript/src/scripts/rest/api/UserApi.js +++ b/samples/client/petstore/javascript/src/scripts/rest/api/UserApi.js @@ -1,5 +1,5 @@ /* - * @javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavascriptClientCodegen", date = "2015-12-07T10:51:19.835+08:00") + * @javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavascriptClientCodegen", date = "2015-12-09T16:07:21.000+07:00") */ //export module @@ -230,7 +230,7 @@ var UserApi = function UserApi() { * @param {function} callback the callback function * @return void */ - self.logoutUser = function(, callback) { + self.logoutUser = function(callback) { var postBody = null; var postBinaryBody = null; diff --git a/samples/client/petstore/javascript/src/scripts/rest/model/Pet.js b/samples/client/petstore/javascript/src/scripts/rest/model/Pet.js index e3f3a747c84..b97907396f1 100644 --- a/samples/client/petstore/javascript/src/scripts/rest/model/Pet.js +++ b/samples/client/petstore/javascript/src/scripts/rest/model/Pet.js @@ -38,7 +38,7 @@ if ( typeof define === "function" && define.amd ) { } -var Pet = function Pet(name, photoUrls) { +var Pet = function Pet(photoUrls, name) { var self = this; /** From 63092b89237be6577895848230db1976c5a5af48 Mon Sep 17 00:00:00 2001 From: xhh Date: Wed, 9 Dec 2015 22:55:49 +0800 Subject: [PATCH 163/211] Clojure client: use case-insensitive checking on JSON MIME --- .../src/main/resources/clojure/core.mustache | 2 +- .../client/petstore/clojure/src/swagger_petstore/core.clj | 2 +- .../petstore/clojure/test/swagger_petstore/core_test.clj | 6 ++++-- 3 files changed, 6 insertions(+), 4 deletions(-) diff --git a/modules/swagger-codegen/src/main/resources/clojure/core.mustache b/modules/swagger-codegen/src/main/resources/clojure/core.mustache index 79d0ee9b5ee..0da2a451495 100644 --- a/modules/swagger-codegen/src/main/resources/clojure/core.mustache +++ b/modules/swagger-codegen/src/main/resources/clojure/core.mustache @@ -174,7 +174,7 @@ [mime] (if mime (or (= :json mime) - (re-matches #"application/json(;.*)?" (name mime))))) + (re-matches #"(?i)application/json(;.*)?" (name mime))))) (defn json-preferred-mime "Choose a MIME from the given MIMEs with JSON preferred, diff --git a/samples/client/petstore/clojure/src/swagger_petstore/core.clj b/samples/client/petstore/clojure/src/swagger_petstore/core.clj index 4c8a8426968..665adfbc775 100644 --- a/samples/client/petstore/clojure/src/swagger_petstore/core.clj +++ b/samples/client/petstore/clojure/src/swagger_petstore/core.clj @@ -174,7 +174,7 @@ [mime] (if mime (or (= :json mime) - (re-matches #"application/json(;.*)?" (name mime))))) + (re-matches #"(?i)application/json(;.*)?" (name mime))))) (defn json-preferred-mime "Choose a MIME from the given MIMEs with JSON preferred, diff --git a/samples/client/petstore/clojure/test/swagger_petstore/core_test.clj b/samples/client/petstore/clojure/test/swagger_petstore/core_test.clj index 27a9e1db291..87ac0a8b73d 100644 --- a/samples/client/petstore/clojure/test/swagger_petstore/core_test.clj +++ b/samples/client/petstore/clojure/test/swagger_petstore/core_test.clj @@ -151,10 +151,12 @@ (is (= expected (boolean (json-mime? mime)))) :json true "application/json" true + "APPLICATION/JSON" true "application/json; charset=utf8" true nil false :xml false - "application/pdf" false)) + "application/pdf" false + "application/jsonp" false)) (deftest test-json-preferred-mime (are [mimes expected] @@ -177,4 +179,4 @@ "{\"aa\": 1, \"bb\": \"2\"}" "application/json" {:aa 1 :bb "2"} "[1, \"2\"]" "application/json; charset=UTF8" [1 "2"] "{invalid json}" "application/json" "{invalid json}" - "plain text" "text/plain" "plain text")) \ No newline at end of file + "plain text" "text/plain" "plain text")) From 0d19b30c9967275ad1ed217bf833ad74a5e0c4cd Mon Sep 17 00:00:00 2001 From: David Kiss Date: Wed, 9 Dec 2015 23:12:42 -0500 Subject: [PATCH 164/211] using isBodyParam instead of vendorExtention.x-isBody --- .../java/io/swagger/codegen/languages/JavaClientCodegen.java | 1 - .../src/main/resources/Java/libraries/feign/api.mustache | 2 +- .../java/feign/src/main/java/io/swagger/client/ApiClient.java | 2 +- .../feign/src/main/java/io/swagger/client/FormAwareEncoder.java | 2 +- .../java/feign/src/main/java/io/swagger/client/StringUtil.java | 2 +- .../java/feign/src/main/java/io/swagger/client/api/PetApi.java | 2 +- .../feign/src/main/java/io/swagger/client/api/StoreApi.java | 2 +- .../java/feign/src/main/java/io/swagger/client/api/UserApi.java | 2 +- .../src/main/java/io/swagger/client/model/ApiResponse.java | 2 +- .../feign/src/main/java/io/swagger/client/model/Category.java | 2 +- .../java/feign/src/main/java/io/swagger/client/model/Order.java | 2 +- .../java/feign/src/main/java/io/swagger/client/model/Pet.java | 2 +- .../java/feign/src/main/java/io/swagger/client/model/Tag.java | 2 +- .../java/feign/src/main/java/io/swagger/client/model/User.java | 2 +- 14 files changed, 13 insertions(+), 14 deletions(-) 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 b12894a7300..254bedf4708 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 @@ -560,7 +560,6 @@ public class JavaClientCodegen extends DefaultCodegen implements CodegenConfig { for (Operation operation : path.getOperations()) { boolean hasFormParameters = false; for (Parameter parameter : operation.getParameters()) { - parameter.getVendorExtensions().put("x-isBody", parameter instanceof BodyParameter); if (parameter instanceof FormParameter) { hasFormParameters = true; } diff --git a/modules/swagger-codegen/src/main/resources/Java/libraries/feign/api.mustache b/modules/swagger-codegen/src/main/resources/Java/libraries/feign/api.mustache index 30c8a793914..729320bd2e5 100644 --- a/modules/swagger-codegen/src/main/resources/Java/libraries/feign/api.mustache +++ b/modules/swagger-codegen/src/main/resources/Java/libraries/feign/api.mustache @@ -26,7 +26,7 @@ public interface {{classname}} extends ApiClient.Api { "{{paramName}}: {{=<% %>=}}{<%paramName%>}<%={{ }}=%>"{{#hasMore}}, {{/hasMore}}{{/headerParams}} }) - {{#returnType}}{{{returnType}}} {{/returnType}}{{^returnType}}void {{/returnType}}{{nickname}}({{#allParams}}{{^vendorExtensions.x-isBody}}@Param("{{paramName}}") {{/vendorExtensions.x-isBody}}{{{dataType}}} {{paramName}}{{#hasMore}}, {{/hasMore}}{{/allParams}}); + {{#returnType}}{{{returnType}}} {{/returnType}}{{^returnType}}void {{/returnType}}{{nickname}}({{#allParams}}{{^isBodyParam}}@Param("{{paramName}}") {{/isBodyParam}}{{{dataType}}} {{paramName}}{{#hasMore}}, {{/hasMore}}{{/allParams}}); {{/operation}} {{/operations}} } diff --git a/samples/client/petstore/java/feign/src/main/java/io/swagger/client/ApiClient.java b/samples/client/petstore/java/feign/src/main/java/io/swagger/client/ApiClient.java index 001d05f49f0..42439dbdf24 100644 --- a/samples/client/petstore/java/feign/src/main/java/io/swagger/client/ApiClient.java +++ b/samples/client/petstore/java/feign/src/main/java/io/swagger/client/ApiClient.java @@ -8,7 +8,7 @@ import feign.jackson.JacksonDecoder; import feign.jackson.JacksonEncoder; import feign.slf4j.Slf4jLogger; -@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-12-07T22:27:06.680-05:00") +@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-12-09T22:59:22.180-05:00") public class ApiClient { public interface Api {} diff --git a/samples/client/petstore/java/feign/src/main/java/io/swagger/client/FormAwareEncoder.java b/samples/client/petstore/java/feign/src/main/java/io/swagger/client/FormAwareEncoder.java index 3f0230a406a..e38faaf009a 100644 --- a/samples/client/petstore/java/feign/src/main/java/io/swagger/client/FormAwareEncoder.java +++ b/samples/client/petstore/java/feign/src/main/java/io/swagger/client/FormAwareEncoder.java @@ -14,7 +14,7 @@ import feign.codec.EncodeException; import feign.codec.Encoder; import feign.RequestTemplate; -@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-12-07T22:27:06.680-05:00") +@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-12-09T22:59:22.180-05:00") public class FormAwareEncoder implements Encoder { public static final String UTF_8 = "utf-8"; private static final String LINE_FEED = "\r\n"; diff --git a/samples/client/petstore/java/feign/src/main/java/io/swagger/client/StringUtil.java b/samples/client/petstore/java/feign/src/main/java/io/swagger/client/StringUtil.java index db6460490fa..cc437fee0c0 100644 --- a/samples/client/petstore/java/feign/src/main/java/io/swagger/client/StringUtil.java +++ b/samples/client/petstore/java/feign/src/main/java/io/swagger/client/StringUtil.java @@ -1,6 +1,6 @@ package io.swagger.client; -@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-12-07T22:27:06.680-05:00") +@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-12-09T22:59:22.180-05:00") public class StringUtil { /** * Check if the given array contains the given value (with case-insensitive comparison). diff --git a/samples/client/petstore/java/feign/src/main/java/io/swagger/client/api/PetApi.java b/samples/client/petstore/java/feign/src/main/java/io/swagger/client/api/PetApi.java index caa70b4260a..536e953e699 100644 --- a/samples/client/petstore/java/feign/src/main/java/io/swagger/client/api/PetApi.java +++ b/samples/client/petstore/java/feign/src/main/java/io/swagger/client/api/PetApi.java @@ -11,7 +11,7 @@ import java.util.*; import feign.*; -@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-12-07T22:27:06.680-05:00") +@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-12-09T22:59:22.180-05:00") public interface PetApi extends ApiClient.Api { diff --git a/samples/client/petstore/java/feign/src/main/java/io/swagger/client/api/StoreApi.java b/samples/client/petstore/java/feign/src/main/java/io/swagger/client/api/StoreApi.java index a022f684a4e..552c62db919 100644 --- a/samples/client/petstore/java/feign/src/main/java/io/swagger/client/api/StoreApi.java +++ b/samples/client/petstore/java/feign/src/main/java/io/swagger/client/api/StoreApi.java @@ -10,7 +10,7 @@ import java.util.*; import feign.*; -@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-12-07T22:27:06.680-05:00") +@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-12-09T22:59:22.180-05:00") public interface StoreApi extends ApiClient.Api { diff --git a/samples/client/petstore/java/feign/src/main/java/io/swagger/client/api/UserApi.java b/samples/client/petstore/java/feign/src/main/java/io/swagger/client/api/UserApi.java index b2bac15d873..610bd399700 100644 --- a/samples/client/petstore/java/feign/src/main/java/io/swagger/client/api/UserApi.java +++ b/samples/client/petstore/java/feign/src/main/java/io/swagger/client/api/UserApi.java @@ -10,7 +10,7 @@ import java.util.*; import feign.*; -@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-12-07T22:27:06.680-05:00") +@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-12-09T22:59:22.180-05:00") public interface UserApi extends ApiClient.Api { diff --git a/samples/client/petstore/java/feign/src/main/java/io/swagger/client/model/ApiResponse.java b/samples/client/petstore/java/feign/src/main/java/io/swagger/client/model/ApiResponse.java index 4843a51e988..ab98bf61e89 100644 --- a/samples/client/petstore/java/feign/src/main/java/io/swagger/client/model/ApiResponse.java +++ b/samples/client/petstore/java/feign/src/main/java/io/swagger/client/model/ApiResponse.java @@ -12,7 +12,7 @@ import com.fasterxml.jackson.annotation.JsonProperty; @ApiModel(description = "") -@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-12-07T22:27:06.680-05:00") +@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-12-09T22:59:22.180-05:00") public class ApiResponse { private Integer code = null; diff --git a/samples/client/petstore/java/feign/src/main/java/io/swagger/client/model/Category.java b/samples/client/petstore/java/feign/src/main/java/io/swagger/client/model/Category.java index a414345dd63..3a22c2b9c60 100644 --- a/samples/client/petstore/java/feign/src/main/java/io/swagger/client/model/Category.java +++ b/samples/client/petstore/java/feign/src/main/java/io/swagger/client/model/Category.java @@ -12,7 +12,7 @@ import com.fasterxml.jackson.annotation.JsonProperty; @ApiModel(description = "") -@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-12-07T22:27:06.680-05:00") +@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-12-09T22:59:22.180-05:00") public class Category { private Long id = null; diff --git a/samples/client/petstore/java/feign/src/main/java/io/swagger/client/model/Order.java b/samples/client/petstore/java/feign/src/main/java/io/swagger/client/model/Order.java index 4f045ca0410..9b87b66c9e6 100644 --- a/samples/client/petstore/java/feign/src/main/java/io/swagger/client/model/Order.java +++ b/samples/client/petstore/java/feign/src/main/java/io/swagger/client/model/Order.java @@ -13,7 +13,7 @@ import com.fasterxml.jackson.annotation.JsonProperty; @ApiModel(description = "") -@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-12-07T22:27:06.680-05:00") +@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-12-09T22:59:22.180-05:00") public class Order { private Long id = null; diff --git a/samples/client/petstore/java/feign/src/main/java/io/swagger/client/model/Pet.java b/samples/client/petstore/java/feign/src/main/java/io/swagger/client/model/Pet.java index 4029fc4362e..07c18075bd2 100644 --- a/samples/client/petstore/java/feign/src/main/java/io/swagger/client/model/Pet.java +++ b/samples/client/petstore/java/feign/src/main/java/io/swagger/client/model/Pet.java @@ -15,7 +15,7 @@ import com.fasterxml.jackson.annotation.JsonProperty; @ApiModel(description = "") -@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-12-07T22:27:06.680-05:00") +@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-12-09T22:59:22.180-05:00") public class Pet { private Long id = null; diff --git a/samples/client/petstore/java/feign/src/main/java/io/swagger/client/model/Tag.java b/samples/client/petstore/java/feign/src/main/java/io/swagger/client/model/Tag.java index 2c3b0132bc6..80b3919e532 100644 --- a/samples/client/petstore/java/feign/src/main/java/io/swagger/client/model/Tag.java +++ b/samples/client/petstore/java/feign/src/main/java/io/swagger/client/model/Tag.java @@ -12,7 +12,7 @@ import com.fasterxml.jackson.annotation.JsonProperty; @ApiModel(description = "") -@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-12-07T22:27:06.680-05:00") +@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-12-09T22:59:22.180-05:00") public class Tag { private Long id = null; diff --git a/samples/client/petstore/java/feign/src/main/java/io/swagger/client/model/User.java b/samples/client/petstore/java/feign/src/main/java/io/swagger/client/model/User.java index a8e902dd21f..efa18d38dcf 100644 --- a/samples/client/petstore/java/feign/src/main/java/io/swagger/client/model/User.java +++ b/samples/client/petstore/java/feign/src/main/java/io/swagger/client/model/User.java @@ -12,7 +12,7 @@ import com.fasterxml.jackson.annotation.JsonProperty; @ApiModel(description = "") -@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-12-07T22:27:06.680-05:00") +@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-12-09T22:59:22.180-05:00") public class User { private Long id = null; From 75a1f97a1e116dd47758266e8465be4bc8184d33 Mon Sep 17 00:00:00 2001 From: wing328 Date: Thu, 10 Dec 2015 15:21:52 +0800 Subject: [PATCH 165/211] minor style change for objc client --- .../resources/objc/ApiClient-body.mustache | 43 +++++++------- .../src/main/resources/objc/api-body.mustache | 6 +- .../main/resources/objc/model-body.mustache | 5 +- .../objc/SwaggerClient/SWGApiClient.m | 59 ++++++++++--------- .../petstore/objc/SwaggerClient/SWGCategory.m | 5 +- .../petstore/objc/SwaggerClient/SWGOrder.m | 5 +- .../petstore/objc/SwaggerClient/SWGPet.m | 5 +- .../petstore/objc/SwaggerClient/SWGPetApi.m | 6 +- .../petstore/objc/SwaggerClient/SWGTag.m | 5 +- .../petstore/objc/SwaggerClient/SWGUser.m | 5 +- .../petstore/objc/SwaggerClient/SWGUserApi.m | 4 +- 11 files changed, 79 insertions(+), 69 deletions(-) diff --git a/modules/swagger-codegen/src/main/resources/objc/ApiClient-body.mustache b/modules/swagger-codegen/src/main/resources/objc/ApiClient-body.mustache index 0c23c800469..25b5d9adfbf 100644 --- a/modules/swagger-codegen/src/main/resources/objc/ApiClient-body.mustache +++ b/modules/swagger-codegen/src/main/resources/objc/ApiClient-body.mustache @@ -132,17 +132,20 @@ static void (^reachabilityChangeBlock)(int); if (accepts == nil || [accepts count] == 0) { return @""; } + NSMutableArray *lowerAccepts = [[NSMutableArray alloc] initWithCapacity:[accepts count]]; for (NSString *string in accepts) { NSString * lowerAccept = [string lowercaseString]; - if([lowerAccept containsString:@"application/json"]) { + if ([lowerAccept containsString:@"application/json"]) { return @"application/json"; } [lowerAccepts addObject:lowerAccept]; } - if(lowerAccepts.count == 1){ + + if (lowerAccepts.count == 1) { return [lowerAccepts firstObject]; } + return [lowerAccepts componentsJoinedByString:@", "]; } @@ -169,7 +172,7 @@ static void (^reachabilityChangeBlock)(int); } + (NSString*)escape:(id)unescaped { - if([unescaped isKindOfClass:[NSString class]]){ + if ([unescaped isKindOfClass:[NSString class]]){ return (NSString *)CFBridgingRelease (CFURLCreateStringByAddingPercentEscapes( NULL, @@ -210,7 +213,7 @@ static void (^reachabilityChangeBlock)(int); -(Boolean) executeRequestWithId:(NSNumber*) requestId { NSSet* matchingItems = [queuedRequests objectsPassingTest:^BOOL(id obj, BOOL *stop) { - if([obj intValue] == [requestId intValue]) { + if ([obj intValue] == [requestId intValue]) { return YES; } else { @@ -218,7 +221,7 @@ static void (^reachabilityChangeBlock)(int); } }]; - if(matchingItems.count == 1) { + if (matchingItems.count == 1) { {{classPrefix}}DebugLog(@"removed request id %@", requestId); [queuedRequests removeObject:requestId]; return YES; @@ -266,7 +269,7 @@ static void (^reachabilityChangeBlock)(int); } // call the reachability block, if configured - if(reachabilityChangeBlock != nil) { + if (reachabilityChangeBlock != nil) { reachabilityChangeBlock(status); } }]; @@ -408,16 +411,16 @@ static void (^reachabilityChangeBlock)(int); completionBlock: (void (^)(id, NSError *))completionBlock { AFHTTPRequestOperation *op = [self HTTPRequestOperationWithRequest:request success:^(AFHTTPRequestOperation *operation, id response) { - if([self executeRequestWithId:requestId]) { + if ([self executeRequestWithId:requestId]) { [self logResponse:operation forRequest:request error:nil]; NSDictionary *responseHeaders = [[operation response] allHeaderFields]; self.HTTPResponseHeaders = responseHeaders; completionBlock(response, nil); } } failure:^(AFHTTPRequestOperation *operation, NSError *error) { - if([self executeRequestWithId:requestId]) { + if ([self executeRequestWithId:requestId]) { NSMutableDictionary *userInfo = [error.userInfo mutableCopy]; - if(operation.responseObject) { + if (operation.responseObject) { // Add in the (parsed) response body. userInfo[{{classPrefix}}ResponseObjectErrorKey] = operation.responseObject; } @@ -588,10 +591,10 @@ static void (^reachabilityChangeBlock)(int); // request cache BOOL hasHeaderParams = false; - if(headerParams != nil && [headerParams count] > 0) { + if (headerParams != nil && [headerParams count] > 0) { hasHeaderParams = true; } - if(offlineState) { + if (offlineState) { {{classPrefix}}DebugLog(@"%@ cache forced", resourcePath); [request setCachePolicy:NSURLRequestReturnCacheDataDontLoad]; } @@ -604,7 +607,7 @@ static void (^reachabilityChangeBlock)(int); [request setCachePolicy:NSURLRequestReloadIgnoringLocalCacheData]; } - if(hasHeaderParams){ + if (hasHeaderParams){ for(NSString * key in [headerParams keyEnumerator]){ [request setValue:[headerParams valueForKey:key] forHTTPHeaderField:key]; } @@ -637,36 +640,36 @@ static void (^reachabilityChangeBlock)(int); int counter = 0; NSMutableString * requestUrl = [NSMutableString stringWithFormat:@"%@", path]; - if(queryParams != nil){ + if (queryParams != nil){ for(NSString * key in [queryParams keyEnumerator]){ - if(counter == 0) separator = @"?"; + if (counter == 0) separator = @"?"; else separator = @"&"; id queryParam = [queryParams valueForKey:key]; - if([queryParam isKindOfClass:[NSString class]]){ + if ([queryParam isKindOfClass:[NSString class]]){ [requestUrl appendString:[NSString stringWithFormat:@"%@%@=%@", separator, [{{classPrefix}}ApiClient escape:key], [{{classPrefix}}ApiClient escape:[queryParams valueForKey:key]]]]; } - else if([queryParam isKindOfClass:[{{classPrefix}}QueryParamCollection class]]){ + else if ([queryParam isKindOfClass:[{{classPrefix}}QueryParamCollection class]]){ {{classPrefix}}QueryParamCollection * coll = ({{classPrefix}}QueryParamCollection*) queryParam; NSArray* values = [coll values]; NSString* format = [coll format]; - if([format isEqualToString:@"csv"]) { + if ([format isEqualToString:@"csv"]) { [requestUrl appendString:[NSString stringWithFormat:@"%@%@=%@", separator, [{{classPrefix}}ApiClient escape:key], [NSString stringWithFormat:@"%@", [values componentsJoinedByString:@","]]]]; } - else if([format isEqualToString:@"tsv"]) { + else if ([format isEqualToString:@"tsv"]) { [requestUrl appendString:[NSString stringWithFormat:@"%@%@=%@", separator, [{{classPrefix}}ApiClient escape:key], [NSString stringWithFormat:@"%@", [values componentsJoinedByString:@"\t"]]]]; } - else if([format isEqualToString:@"pipes"]) { + else if ([format isEqualToString:@"pipes"]) { [requestUrl appendString:[NSString stringWithFormat:@"%@%@=%@", separator, [{{classPrefix}}ApiClient escape:key], [NSString stringWithFormat:@"%@", [values componentsJoinedByString:@"|"]]]]; } - else if([format isEqualToString:@"multi"]) { + else if ([format isEqualToString:@"multi"]) { for(id obj in values) { [requestUrl appendString:[NSString stringWithFormat:@"%@%@=%@", separator, [{{classPrefix}}ApiClient escape:key], [NSString stringWithFormat:@"%@", obj]]]; diff --git a/modules/swagger-codegen/src/main/resources/objc/api-body.mustache b/modules/swagger-codegen/src/main/resources/objc/api-body.mustache index 60358e4e9da..d84e350360f 100644 --- a/modules/swagger-codegen/src/main/resources/objc/api-body.mustache +++ b/modules/swagger-codegen/src/main/resources/objc/api-body.mustache @@ -105,7 +105,7 @@ static {{classname}}* singletonAPI = nil; {{/pathParams}} NSMutableDictionary* queryParams = [[NSMutableDictionary alloc] init]; - {{#queryParams}}if({{paramName}} != nil) { + {{#queryParams}}if ({{paramName}} != nil) { {{#collectionFormat}} queryParams[@"{{baseName}}"] = [[{{classPrefix}}QueryParamCollection alloc] initWithValuesAndFormat: {{baseName}} format: @"{{collectionFormat}}"]; {{/collectionFormat}} @@ -114,7 +114,7 @@ static {{classname}}* singletonAPI = nil; {{/queryParams}} NSMutableDictionary* headerParams = [NSMutableDictionary dictionaryWithDictionary:self.defaultHeaders]; - {{#headerParams}}if({{paramName}} != nil) { + {{#headerParams}}if ({{paramName}} != nil) { headerParams[@"{{baseName}}"] = {{paramName}}; } {{/headerParams}} @@ -159,7 +159,7 @@ static {{classname}}* singletonAPI = nil; {{#requiredParamCount}} {{#requiredParams}} - if({{paramName}} == nil) { + if ({{paramName}} == nil) { // error } {{/requiredParams}} diff --git a/modules/swagger-codegen/src/main/resources/objc/model-body.mustache b/modules/swagger-codegen/src/main/resources/objc/model-body.mustache index ba76b12aeb8..3d70cebfae2 100644 --- a/modules/swagger-codegen/src/main/resources/objc/model-body.mustache +++ b/modules/swagger-codegen/src/main/resources/objc/model-body.mustache @@ -6,12 +6,13 @@ - (instancetype)init { self = [super init]; - if (self) - { + + if (self) { // initalise property's default value, if any {{#vars}}{{#defaultValue}}self.{{name}} = {{{defaultValue}}}; {{/defaultValue}}{{/vars}} } + return self; } diff --git a/samples/client/petstore/objc/SwaggerClient/SWGApiClient.m b/samples/client/petstore/objc/SwaggerClient/SWGApiClient.m index dcd33575fc6..4dce6d2fa8b 100644 --- a/samples/client/petstore/objc/SwaggerClient/SWGApiClient.m +++ b/samples/client/petstore/objc/SwaggerClient/SWGApiClient.m @@ -128,24 +128,25 @@ static void (^reachabilityChangeBlock)(int); /* * Detect `Accept` from accepts */ -+ (NSString *) selectHeaderAccept:(NSArray *)accepts -{ ++ (NSString *) selectHeaderAccept:(NSArray *)accepts { if (accepts == nil || [accepts count] == 0) { return @""; } NSMutableArray *lowerAccepts = [[NSMutableArray alloc] initWithCapacity:[accepts count]]; - [accepts enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) { - [lowerAccepts addObject:[obj lowercaseString]]; - }]; - - - if ([lowerAccepts containsObject:@"application/json"]) { - return @"application/json"; + for (NSString *string in accepts) { + NSString * lowerAccept = [string lowercaseString]; + if ([lowerAccept containsString:@"application/json"]) { + return @"application/json"; + } + [lowerAccepts addObject:lowerAccept]; } - else { - return [lowerAccepts componentsJoinedByString:@", "]; + + if (lowerAccepts.count == 1) { + return [lowerAccepts firstObject]; } + + return [lowerAccepts componentsJoinedByString:@", "]; } /* @@ -171,7 +172,7 @@ static void (^reachabilityChangeBlock)(int); } + (NSString*)escape:(id)unescaped { - if([unescaped isKindOfClass:[NSString class]]){ + if ([unescaped isKindOfClass:[NSString class]]){ return (NSString *)CFBridgingRelease (CFURLCreateStringByAddingPercentEscapes( NULL, @@ -212,7 +213,7 @@ static void (^reachabilityChangeBlock)(int); -(Boolean) executeRequestWithId:(NSNumber*) requestId { NSSet* matchingItems = [queuedRequests objectsPassingTest:^BOOL(id obj, BOOL *stop) { - if([obj intValue] == [requestId intValue]) { + if ([obj intValue] == [requestId intValue]) { return YES; } else { @@ -220,7 +221,7 @@ static void (^reachabilityChangeBlock)(int); } }]; - if(matchingItems.count == 1) { + if (matchingItems.count == 1) { SWGDebugLog(@"removed request id %@", requestId); [queuedRequests removeObject:requestId]; return YES; @@ -268,7 +269,7 @@ static void (^reachabilityChangeBlock)(int); } // call the reachability block, if configured - if(reachabilityChangeBlock != nil) { + if (reachabilityChangeBlock != nil) { reachabilityChangeBlock(status); } }]; @@ -410,16 +411,16 @@ static void (^reachabilityChangeBlock)(int); completionBlock: (void (^)(id, NSError *))completionBlock { AFHTTPRequestOperation *op = [self HTTPRequestOperationWithRequest:request success:^(AFHTTPRequestOperation *operation, id response) { - if([self executeRequestWithId:requestId]) { + if ([self executeRequestWithId:requestId]) { [self logResponse:operation forRequest:request error:nil]; NSDictionary *responseHeaders = [[operation response] allHeaderFields]; self.HTTPResponseHeaders = responseHeaders; completionBlock(response, nil); } } failure:^(AFHTTPRequestOperation *operation, NSError *error) { - if([self executeRequestWithId:requestId]) { + if ([self executeRequestWithId:requestId]) { NSMutableDictionary *userInfo = [error.userInfo mutableCopy]; - if(operation.responseObject) { + if (operation.responseObject) { // Add in the (parsed) response body. userInfo[SWGResponseObjectErrorKey] = operation.responseObject; } @@ -590,10 +591,10 @@ static void (^reachabilityChangeBlock)(int); // request cache BOOL hasHeaderParams = false; - if(headerParams != nil && [headerParams count] > 0) { + if (headerParams != nil && [headerParams count] > 0) { hasHeaderParams = true; } - if(offlineState) { + if (offlineState) { SWGDebugLog(@"%@ cache forced", resourcePath); [request setCachePolicy:NSURLRequestReturnCacheDataDontLoad]; } @@ -606,7 +607,7 @@ static void (^reachabilityChangeBlock)(int); [request setCachePolicy:NSURLRequestReloadIgnoringLocalCacheData]; } - if(hasHeaderParams){ + if (hasHeaderParams){ for(NSString * key in [headerParams keyEnumerator]){ [request setValue:[headerParams valueForKey:key] forHTTPHeaderField:key]; } @@ -639,36 +640,36 @@ static void (^reachabilityChangeBlock)(int); int counter = 0; NSMutableString * requestUrl = [NSMutableString stringWithFormat:@"%@", path]; - if(queryParams != nil){ + if (queryParams != nil){ for(NSString * key in [queryParams keyEnumerator]){ - if(counter == 0) separator = @"?"; + if (counter == 0) separator = @"?"; else separator = @"&"; id queryParam = [queryParams valueForKey:key]; - if([queryParam isKindOfClass:[NSString class]]){ + if ([queryParam isKindOfClass:[NSString class]]){ [requestUrl appendString:[NSString stringWithFormat:@"%@%@=%@", separator, [SWGApiClient escape:key], [SWGApiClient escape:[queryParams valueForKey:key]]]]; } - else if([queryParam isKindOfClass:[SWGQueryParamCollection class]]){ + else if ([queryParam isKindOfClass:[SWGQueryParamCollection class]]){ SWGQueryParamCollection * coll = (SWGQueryParamCollection*) queryParam; NSArray* values = [coll values]; NSString* format = [coll format]; - if([format isEqualToString:@"csv"]) { + if ([format isEqualToString:@"csv"]) { [requestUrl appendString:[NSString stringWithFormat:@"%@%@=%@", separator, [SWGApiClient escape:key], [NSString stringWithFormat:@"%@", [values componentsJoinedByString:@","]]]]; } - else if([format isEqualToString:@"tsv"]) { + else if ([format isEqualToString:@"tsv"]) { [requestUrl appendString:[NSString stringWithFormat:@"%@%@=%@", separator, [SWGApiClient escape:key], [NSString stringWithFormat:@"%@", [values componentsJoinedByString:@"\t"]]]]; } - else if([format isEqualToString:@"pipes"]) { + else if ([format isEqualToString:@"pipes"]) { [requestUrl appendString:[NSString stringWithFormat:@"%@%@=%@", separator, [SWGApiClient escape:key], [NSString stringWithFormat:@"%@", [values componentsJoinedByString:@"|"]]]]; } - else if([format isEqualToString:@"multi"]) { + else if ([format isEqualToString:@"multi"]) { for(id obj in values) { [requestUrl appendString:[NSString stringWithFormat:@"%@%@=%@", separator, [SWGApiClient escape:key], [NSString stringWithFormat:@"%@", obj]]]; diff --git a/samples/client/petstore/objc/SwaggerClient/SWGCategory.m b/samples/client/petstore/objc/SwaggerClient/SWGCategory.m index 7c71e4af0f4..0d10e25426e 100644 --- a/samples/client/petstore/objc/SwaggerClient/SWGCategory.m +++ b/samples/client/petstore/objc/SwaggerClient/SWGCategory.m @@ -4,11 +4,12 @@ - (instancetype)init { self = [super init]; - if (self) - { + + if (self) { // initalise property's default value, if any } + return self; } diff --git a/samples/client/petstore/objc/SwaggerClient/SWGOrder.m b/samples/client/petstore/objc/SwaggerClient/SWGOrder.m index ba0b637eb09..abf77a7b399 100644 --- a/samples/client/petstore/objc/SwaggerClient/SWGOrder.m +++ b/samples/client/petstore/objc/SwaggerClient/SWGOrder.m @@ -4,11 +4,12 @@ - (instancetype)init { self = [super init]; - if (self) - { + + if (self) { // initalise property's default value, if any } + return self; } diff --git a/samples/client/petstore/objc/SwaggerClient/SWGPet.m b/samples/client/petstore/objc/SwaggerClient/SWGPet.m index 388157eb0cc..f4fd77ea33f 100644 --- a/samples/client/petstore/objc/SwaggerClient/SWGPet.m +++ b/samples/client/petstore/objc/SwaggerClient/SWGPet.m @@ -4,11 +4,12 @@ - (instancetype)init { self = [super init]; - if (self) - { + + if (self) { // initalise property's default value, if any } + return self; } diff --git a/samples/client/petstore/objc/SwaggerClient/SWGPetApi.m b/samples/client/petstore/objc/SwaggerClient/SWGPetApi.m index bff6c3765b1..c7c2ed175c6 100644 --- a/samples/client/petstore/objc/SwaggerClient/SWGPetApi.m +++ b/samples/client/petstore/objc/SwaggerClient/SWGPetApi.m @@ -250,7 +250,7 @@ static SWGPetApi* singletonAPI = nil; NSMutableDictionary* queryParams = [[NSMutableDictionary alloc] init]; - if(status != nil) { + if (status != nil) { queryParams[@"status"] = [[SWGQueryParamCollection alloc] initWithValuesAndFormat: status format: @"multi"]; @@ -334,7 +334,7 @@ static SWGPetApi* singletonAPI = nil; NSMutableDictionary* queryParams = [[NSMutableDictionary alloc] init]; - if(tags != nil) { + if (tags != nil) { queryParams[@"tags"] = [[SWGQueryParamCollection alloc] initWithValuesAndFormat: tags format: @"multi"]; @@ -622,7 +622,7 @@ static SWGPetApi* singletonAPI = nil; NSMutableDictionary* headerParams = [NSMutableDictionary dictionaryWithDictionary:self.defaultHeaders]; - if(apiKey != nil) { + if (apiKey != nil) { headerParams[@"api_key"] = apiKey; } diff --git a/samples/client/petstore/objc/SwaggerClient/SWGTag.m b/samples/client/petstore/objc/SwaggerClient/SWGTag.m index 7a7e7550deb..b19085e2e6b 100644 --- a/samples/client/petstore/objc/SwaggerClient/SWGTag.m +++ b/samples/client/petstore/objc/SwaggerClient/SWGTag.m @@ -4,11 +4,12 @@ - (instancetype)init { self = [super init]; - if (self) - { + + if (self) { // initalise property's default value, if any } + return self; } diff --git a/samples/client/petstore/objc/SwaggerClient/SWGUser.m b/samples/client/petstore/objc/SwaggerClient/SWGUser.m index bdb26cf36a6..ac059240e7f 100644 --- a/samples/client/petstore/objc/SwaggerClient/SWGUser.m +++ b/samples/client/petstore/objc/SwaggerClient/SWGUser.m @@ -4,11 +4,12 @@ - (instancetype)init { self = [super init]; - if (self) - { + + if (self) { // initalise property's default value, if any } + return self; } diff --git a/samples/client/petstore/objc/SwaggerClient/SWGUserApi.m b/samples/client/petstore/objc/SwaggerClient/SWGUserApi.m index 75cf8d51b0e..faf0f928baf 100644 --- a/samples/client/petstore/objc/SwaggerClient/SWGUserApi.m +++ b/samples/client/petstore/objc/SwaggerClient/SWGUserApi.m @@ -331,11 +331,11 @@ static SWGUserApi* singletonAPI = nil; NSMutableDictionary* queryParams = [[NSMutableDictionary alloc] init]; - if(username != nil) { + if (username != nil) { queryParams[@"username"] = username; } - if(password != nil) { + if (password != nil) { queryParams[@"password"] = password; } From e9ef143d8f4120664e7c009bbccd79d44b372cc2 Mon Sep 17 00:00:00 2001 From: xhh Date: Thu, 10 Dec 2015 15:25:07 +0800 Subject: [PATCH 166/211] Ruby client: allow setting Configuration in ApiClient Removed the singleton design from the Configuration class. Added a `config` field to ApiClient to hold the settings the ApiClient uses. --- .../src/main/resources/ruby/api.mustache | 12 ++-- .../main/resources/ruby/api_client.mustache | 43 ++++++------ .../resources/ruby/configuration.mustache | 29 +++----- .../src/main/resources/ruby/gem.mustache | 16 ++--- samples/client/petstore/ruby/lib/petstore.rb | 16 ++--- .../petstore/ruby/lib/petstore/api/pet_api.rb | 68 +++++++++---------- .../ruby/lib/petstore/api/store_api.rb | 36 +++++----- .../ruby/lib/petstore/api/user_api.rb | 68 +++++++++---------- .../petstore/ruby/lib/petstore/api_client.rb | 43 ++++++------ .../ruby/lib/petstore/configuration.rb | 29 +++----- .../petstore/ruby/spec/api_client_spec.rb | 27 ++++++-- .../petstore/ruby/spec/configuration_spec.rb | 2 +- .../client/petstore/ruby/spec/spec_helper.rb | 2 +- 13 files changed, 194 insertions(+), 197 deletions(-) diff --git a/modules/swagger-codegen/src/main/resources/ruby/api.mustache b/modules/swagger-codegen/src/main/resources/ruby/api.mustache index 65e00081686..d7967135336 100644 --- a/modules/swagger-codegen/src/main/resources/ruby/api.mustache +++ b/modules/swagger-codegen/src/main/resources/ruby/api.mustache @@ -5,8 +5,8 @@ module {{moduleName}} class {{classname}} attr_accessor :api_client - def initialize(api_client = nil) - @api_client = api_client || Configuration.api_client + def initialize(api_client = ApiClient.default) + @api_client = api_client end {{#operation}} {{newline}} @@ -28,8 +28,8 @@ module {{moduleName}} {{#allParams}}{{^required}} # @option opts [{{{dataType}}}] :{{paramName}} {{description}} {{/required}}{{/allParams}} # @return [Array<({{#returnType}}{{{returnType}}}{{/returnType}}{{^returnType}}nil{{/returnType}}, Fixnum, Hash)>] {{#returnType}}{{{returnType}}} data{{/returnType}}{{^returnType}}nil{{/returnType}}, response status code and response headers def {{operationId}}_with_http_info({{#allParams}}{{#required}}{{paramName}}, {{/required}}{{/allParams}}opts = {}) - if Configuration.debugging - Configuration.logger.debug "Calling API: {{classname}}#{{operationId}} ..." + if @api_client.config.debugging + @api_client.config.logger.debug "Calling API: {{classname}}#{{operationId}} ..." end {{#allParams}}{{#required}} # verify the required parameter '{{paramName}}' is set @@ -81,8 +81,8 @@ module {{moduleName}} :body => post_body, :auth_names => auth_names{{#returnType}}, :return_type => '{{{returnType}}}'{{/returnType}}) - if Configuration.debugging - Configuration.logger.debug "API called: {{classname}}#{{operationId}}\nData: #{data.inspect}\nStatus code: #{status_code}\nHeaders: #{headers}" + if @api_client.config.debugging + @api_client.config.logger.debug "API called: {{classname}}#{{operationId}}\nData: #{data.inspect}\nStatus code: #{status_code}\nHeaders: #{headers}" end return data, status_code, headers end diff --git a/modules/swagger-codegen/src/main/resources/ruby/api_client.mustache b/modules/swagger-codegen/src/main/resources/ruby/api_client.mustache index fa14e2f88ca..837b1234fd0 100644 --- a/modules/swagger-codegen/src/main/resources/ruby/api_client.mustache +++ b/modules/swagger-codegen/src/main/resources/ruby/api_client.mustache @@ -7,24 +7,27 @@ require 'uri' module {{moduleName}} class ApiClient - - attr_accessor :host + # The Configuration object holding settings to be used in the API client. + attr_accessor :config # Defines the headers to be used in HTTP requests of all API calls by default. # # @return [Hash] attr_accessor :default_headers - def initialize(host = nil) - @host = host || Configuration.base_url - @format = 'json' + def initialize(config = Configuration.default) + @config = config @user_agent = "ruby-swagger-#{VERSION}" @default_headers = { - 'Content-Type' => "application/#{@format.downcase}", + 'Content-Type' => "application/json", 'User-Agent' => @user_agent } end + def self.default + @@default ||= ApiClient.new + end + # Call an API with given options. # # @return [Array<(Object, Fixnum, Hash)>] an array of 3 elements: @@ -33,8 +36,8 @@ module {{moduleName}} request = build_request(http_method, path, opts) response = request.run - if Configuration.debugging - Configuration.logger.debug "HTTP response body ~BEGIN~\n#{response.body}\n~END~\n" + if @config.debugging + @config.logger.debug "HTTP response body ~BEGIN~\n#{response.body}\n~END~\n" end unless response.success? @@ -68,18 +71,18 @@ module {{moduleName}} :method => http_method, :headers => header_params, :params => query_params, - :ssl_verifypeer => Configuration.verify_ssl, - :sslcert => Configuration.cert_file, - :sslkey => Configuration.key_file, - :cainfo => Configuration.ssl_ca_cert, - :verbose => Configuration.debugging + :ssl_verifypeer => @config.verify_ssl, + :sslcert => @config.cert_file, + :sslkey => @config.key_file, + :cainfo => @config.ssl_ca_cert, + :verbose => @config.debugging } if [:post, :patch, :put, :delete].include?(http_method) req_body = build_request_body(header_params, form_params, opts[:body]) req_opts.update :body => req_body - if Configuration.debugging - Configuration.logger.debug "HTTP request body param ~BEGIN~\n#{req_body}\n~END~\n" + if @config.debugging + @config.logger.debug "HTTP request body param ~BEGIN~\n#{req_body}\n~END~\n" end end @@ -168,7 +171,7 @@ module {{moduleName}} # @see Configuration#temp_folder_path # @return [File] the file downloaded def download_file(response) - tmp_file = Tempfile.new '', Configuration.temp_folder_path + tmp_file = Tempfile.new '', @config.temp_folder_path content_disposition = response.headers['Content-Disposition'] if content_disposition filename = content_disposition[/filename=['"]?([^'"\s]+)['"]?/, 1] @@ -180,15 +183,15 @@ module {{moduleName}} tmp_file.close! File.open(path, 'w') { |file| file.write(response.body) } - Configuration.logger.info "File written to #{path}. Please move the file to a proper "\ - "folder for further processing and delete the temp afterwards" + @config.logger.info "File written to #{path}. Please move the file to a proper folder "\ + "for further processing and delete the temp afterwards" File.new(path) end def build_request_url(path) # Add leading and trailing slashes to path path = "/#{path}".gsub(/\/+/, '/') - URI.encode(host + path) + URI.encode(@config.base_url + path) end def build_request_body(header_params, form_params, body) @@ -216,7 +219,7 @@ module {{moduleName}} # Update hearder and query params based on authentication settings. def update_params_for_auth!(header_params, query_params, auth_names) Array(auth_names).each do |auth_name| - auth_setting = Configuration.auth_settings[auth_name] + auth_setting = @config.auth_settings[auth_name] next unless auth_setting case auth_setting[:in] when 'header' then header_params[auth_setting[:key]] = auth_setting[:value] diff --git a/modules/swagger-codegen/src/main/resources/ruby/configuration.mustache b/modules/swagger-codegen/src/main/resources/ruby/configuration.mustache index 89bf133b22c..4c05f2560fa 100644 --- a/modules/swagger-codegen/src/main/resources/ruby/configuration.mustache +++ b/modules/swagger-codegen/src/main/resources/ruby/configuration.mustache @@ -1,14 +1,7 @@ require 'uri' -require 'singleton' module {{moduleName}} class Configuration - - include Singleton - - # Default api client - attr_accessor :api_client - # Defines url scheme attr_accessor :scheme @@ -94,17 +87,6 @@ module {{moduleName}} attr_accessor :force_ending_format - class << self - def method_missing(method_name, *args, &block) - config = Configuration.instance - if config.respond_to?(method_name) - config.send(method_name, *args, &block) - else - super - end - end - end - def initialize @scheme = '{{scheme}}' @host = '{{host}}' @@ -118,10 +100,17 @@ module {{moduleName}} @inject_format = false @force_ending_format = false @logger = defined?(Rails) ? Rails.logger : Logger.new(STDOUT) + + yield(self) if block_given? end - def api_client - @api_client ||= ApiClient.new + # The default Configuration object. + def self.default + @@default ||= Configuration.new + end + + def configure + yield(self) if block_given? end def scheme=(scheme) diff --git a/modules/swagger-codegen/src/main/resources/ruby/gem.mustache b/modules/swagger-codegen/src/main/resources/ruby/gem.mustache index eb0b8cfbf0f..2000b2be86f 100644 --- a/modules/swagger-codegen/src/main/resources/ruby/gem.mustache +++ b/modules/swagger-codegen/src/main/resources/ruby/gem.mustache @@ -19,17 +19,17 @@ require '{{importPath}}' module {{moduleName}} class << self - # Configure sdk using block. - # {{moduleName}}.configure do |config| - # config.username = "xxx" - # config.password = "xxx" - # end - # If no block given, return the configuration singleton instance. + # Customize default settings for the SDK using block. + # {{moduleName}}.configure do |config| + # config.username = "xxx" + # config.password = "xxx" + # end + # If no block given, return the default Configuration object. def configure if block_given? - yield Configuration.instance + yield(Configuration.default) else - Configuration.instance + Configuration.default end end end diff --git a/samples/client/petstore/ruby/lib/petstore.rb b/samples/client/petstore/ruby/lib/petstore.rb index c13e99f29fc..4c21fb331d3 100644 --- a/samples/client/petstore/ruby/lib/petstore.rb +++ b/samples/client/petstore/ruby/lib/petstore.rb @@ -19,17 +19,17 @@ require 'petstore/api/pet_api' module Petstore class << self - # Configure sdk using block. - # Petstore.configure do |config| - # config.username = "xxx" - # config.password = "xxx" - # end - # If no block given, return the configuration singleton instance. + # Customize default settings for the SDK using block. + # Petstore.configure do |config| + # config.username = "xxx" + # config.password = "xxx" + # end + # If no block given, return the default Configuration object. def configure if block_given? - yield Configuration.instance + yield(Configuration.default) else - Configuration.instance + Configuration.default end end end diff --git a/samples/client/petstore/ruby/lib/petstore/api/pet_api.rb b/samples/client/petstore/ruby/lib/petstore/api/pet_api.rb index acbd564db53..9641ad0b707 100644 --- a/samples/client/petstore/ruby/lib/petstore/api/pet_api.rb +++ b/samples/client/petstore/ruby/lib/petstore/api/pet_api.rb @@ -4,8 +4,8 @@ module Petstore class PetApi attr_accessor :api_client - def initialize(api_client = nil) - @api_client = api_client || Configuration.api_client + def initialize(api_client = ApiClient.default) + @api_client = api_client end # Update an existing pet @@ -24,8 +24,8 @@ module Petstore # @option opts [Pet] :body Pet object that needs to be added to the store # @return [Array<(nil, Fixnum, Hash)>] nil, response status code and response headers def update_pet_with_http_info(opts = {}) - if Configuration.debugging - Configuration.logger.debug "Calling API: PetApi#update_pet ..." + if @api_client.config.debugging + @api_client.config.logger.debug "Calling API: PetApi#update_pet ..." end # resource path @@ -59,8 +59,8 @@ module Petstore :form_params => form_params, :body => post_body, :auth_names => auth_names) - if Configuration.debugging - Configuration.logger.debug "API called: PetApi#update_pet\nData: #{data.inspect}\nStatus code: #{status_code}\nHeaders: #{headers}" + if @api_client.config.debugging + @api_client.config.logger.debug "API called: PetApi#update_pet\nData: #{data.inspect}\nStatus code: #{status_code}\nHeaders: #{headers}" end return data, status_code, headers end @@ -81,8 +81,8 @@ module Petstore # @option opts [Pet] :body Pet object that needs to be added to the store # @return [Array<(nil, Fixnum, Hash)>] nil, response status code and response headers def add_pet_with_http_info(opts = {}) - if Configuration.debugging - Configuration.logger.debug "Calling API: PetApi#add_pet ..." + if @api_client.config.debugging + @api_client.config.logger.debug "Calling API: PetApi#add_pet ..." end # resource path @@ -116,8 +116,8 @@ module Petstore :form_params => form_params, :body => post_body, :auth_names => auth_names) - if Configuration.debugging - Configuration.logger.debug "API called: PetApi#add_pet\nData: #{data.inspect}\nStatus code: #{status_code}\nHeaders: #{headers}" + if @api_client.config.debugging + @api_client.config.logger.debug "API called: PetApi#add_pet\nData: #{data.inspect}\nStatus code: #{status_code}\nHeaders: #{headers}" end return data, status_code, headers end @@ -138,8 +138,8 @@ module Petstore # @option opts [Array] :status Status values that need to be considered for filter # @return [Array<(Array, Fixnum, Hash)>] Array data, response status code and response headers def find_pets_by_status_with_http_info(opts = {}) - if Configuration.debugging - Configuration.logger.debug "Calling API: PetApi#find_pets_by_status ..." + if @api_client.config.debugging + @api_client.config.logger.debug "Calling API: PetApi#find_pets_by_status ..." end # resource path @@ -175,8 +175,8 @@ module Petstore :body => post_body, :auth_names => auth_names, :return_type => 'Array') - if Configuration.debugging - Configuration.logger.debug "API called: PetApi#find_pets_by_status\nData: #{data.inspect}\nStatus code: #{status_code}\nHeaders: #{headers}" + if @api_client.config.debugging + @api_client.config.logger.debug "API called: PetApi#find_pets_by_status\nData: #{data.inspect}\nStatus code: #{status_code}\nHeaders: #{headers}" end return data, status_code, headers end @@ -197,8 +197,8 @@ module Petstore # @option opts [Array] :tags Tags to filter by # @return [Array<(Array, Fixnum, Hash)>] Array data, response status code and response headers def find_pets_by_tags_with_http_info(opts = {}) - if Configuration.debugging - Configuration.logger.debug "Calling API: PetApi#find_pets_by_tags ..." + if @api_client.config.debugging + @api_client.config.logger.debug "Calling API: PetApi#find_pets_by_tags ..." end # resource path @@ -234,8 +234,8 @@ module Petstore :body => post_body, :auth_names => auth_names, :return_type => 'Array') - if Configuration.debugging - Configuration.logger.debug "API called: PetApi#find_pets_by_tags\nData: #{data.inspect}\nStatus code: #{status_code}\nHeaders: #{headers}" + if @api_client.config.debugging + @api_client.config.logger.debug "API called: PetApi#find_pets_by_tags\nData: #{data.inspect}\nStatus code: #{status_code}\nHeaders: #{headers}" end return data, status_code, headers end @@ -256,8 +256,8 @@ module Petstore # @param [Hash] opts the optional parameters # @return [Array<(Pet, Fixnum, Hash)>] Pet data, response status code and response headers def get_pet_by_id_with_http_info(pet_id, opts = {}) - if Configuration.debugging - Configuration.logger.debug "Calling API: PetApi#get_pet_by_id ..." + if @api_client.config.debugging + @api_client.config.logger.debug "Calling API: PetApi#get_pet_by_id ..." end # verify the required parameter 'pet_id' is set @@ -295,8 +295,8 @@ module Petstore :body => post_body, :auth_names => auth_names, :return_type => 'Pet') - if Configuration.debugging - Configuration.logger.debug "API called: PetApi#get_pet_by_id\nData: #{data.inspect}\nStatus code: #{status_code}\nHeaders: #{headers}" + if @api_client.config.debugging + @api_client.config.logger.debug "API called: PetApi#get_pet_by_id\nData: #{data.inspect}\nStatus code: #{status_code}\nHeaders: #{headers}" end return data, status_code, headers end @@ -321,8 +321,8 @@ module Petstore # @option opts [String] :status Updated status of the pet # @return [Array<(nil, Fixnum, Hash)>] nil, response status code and response headers def update_pet_with_form_with_http_info(pet_id, opts = {}) - if Configuration.debugging - Configuration.logger.debug "Calling API: PetApi#update_pet_with_form ..." + if @api_client.config.debugging + @api_client.config.logger.debug "Calling API: PetApi#update_pet_with_form ..." end # verify the required parameter 'pet_id' is set @@ -361,8 +361,8 @@ module Petstore :form_params => form_params, :body => post_body, :auth_names => auth_names) - if Configuration.debugging - Configuration.logger.debug "API called: PetApi#update_pet_with_form\nData: #{data.inspect}\nStatus code: #{status_code}\nHeaders: #{headers}" + if @api_client.config.debugging + @api_client.config.logger.debug "API called: PetApi#update_pet_with_form\nData: #{data.inspect}\nStatus code: #{status_code}\nHeaders: #{headers}" end return data, status_code, headers end @@ -385,8 +385,8 @@ module Petstore # @option opts [String] :api_key # @return [Array<(nil, Fixnum, Hash)>] nil, response status code and response headers def delete_pet_with_http_info(pet_id, opts = {}) - if Configuration.debugging - Configuration.logger.debug "Calling API: PetApi#delete_pet ..." + if @api_client.config.debugging + @api_client.config.logger.debug "Calling API: PetApi#delete_pet ..." end # verify the required parameter 'pet_id' is set @@ -424,8 +424,8 @@ module Petstore :form_params => form_params, :body => post_body, :auth_names => auth_names) - if Configuration.debugging - Configuration.logger.debug "API called: PetApi#delete_pet\nData: #{data.inspect}\nStatus code: #{status_code}\nHeaders: #{headers}" + if @api_client.config.debugging + @api_client.config.logger.debug "API called: PetApi#delete_pet\nData: #{data.inspect}\nStatus code: #{status_code}\nHeaders: #{headers}" end return data, status_code, headers end @@ -450,8 +450,8 @@ module Petstore # @option opts [File] :file file to upload # @return [Array<(nil, Fixnum, Hash)>] nil, response status code and response headers def upload_file_with_http_info(pet_id, opts = {}) - if Configuration.debugging - Configuration.logger.debug "Calling API: PetApi#upload_file ..." + if @api_client.config.debugging + @api_client.config.logger.debug "Calling API: PetApi#upload_file ..." end # verify the required parameter 'pet_id' is set @@ -490,8 +490,8 @@ module Petstore :form_params => form_params, :body => post_body, :auth_names => auth_names) - if Configuration.debugging - Configuration.logger.debug "API called: PetApi#upload_file\nData: #{data.inspect}\nStatus code: #{status_code}\nHeaders: #{headers}" + if @api_client.config.debugging + @api_client.config.logger.debug "API called: PetApi#upload_file\nData: #{data.inspect}\nStatus code: #{status_code}\nHeaders: #{headers}" end return data, status_code, headers end diff --git a/samples/client/petstore/ruby/lib/petstore/api/store_api.rb b/samples/client/petstore/ruby/lib/petstore/api/store_api.rb index 548973eefd3..1d8a92e288f 100644 --- a/samples/client/petstore/ruby/lib/petstore/api/store_api.rb +++ b/samples/client/petstore/ruby/lib/petstore/api/store_api.rb @@ -4,8 +4,8 @@ module Petstore class StoreApi attr_accessor :api_client - def initialize(api_client = nil) - @api_client = api_client || Configuration.api_client + def initialize(api_client = ApiClient.default) + @api_client = api_client end # Returns pet inventories by status @@ -22,8 +22,8 @@ module Petstore # @param [Hash] opts the optional parameters # @return [Array<(Hash, Fixnum, Hash)>] Hash data, response status code and response headers def get_inventory_with_http_info(opts = {}) - if Configuration.debugging - Configuration.logger.debug "Calling API: StoreApi#get_inventory ..." + if @api_client.config.debugging + @api_client.config.logger.debug "Calling API: StoreApi#get_inventory ..." end # resource path @@ -58,8 +58,8 @@ module Petstore :body => post_body, :auth_names => auth_names, :return_type => 'Hash') - if Configuration.debugging - Configuration.logger.debug "API called: StoreApi#get_inventory\nData: #{data.inspect}\nStatus code: #{status_code}\nHeaders: #{headers}" + if @api_client.config.debugging + @api_client.config.logger.debug "API called: StoreApi#get_inventory\nData: #{data.inspect}\nStatus code: #{status_code}\nHeaders: #{headers}" end return data, status_code, headers end @@ -80,8 +80,8 @@ module Petstore # @option opts [Order] :body order placed for purchasing the pet # @return [Array<(Order, Fixnum, Hash)>] Order data, response status code and response headers def place_order_with_http_info(opts = {}) - if Configuration.debugging - Configuration.logger.debug "Calling API: StoreApi#place_order ..." + if @api_client.config.debugging + @api_client.config.logger.debug "Calling API: StoreApi#place_order ..." end # resource path @@ -116,8 +116,8 @@ module Petstore :body => post_body, :auth_names => auth_names, :return_type => 'Order') - if Configuration.debugging - Configuration.logger.debug "API called: StoreApi#place_order\nData: #{data.inspect}\nStatus code: #{status_code}\nHeaders: #{headers}" + if @api_client.config.debugging + @api_client.config.logger.debug "API called: StoreApi#place_order\nData: #{data.inspect}\nStatus code: #{status_code}\nHeaders: #{headers}" end return data, status_code, headers end @@ -138,8 +138,8 @@ module Petstore # @param [Hash] opts the optional parameters # @return [Array<(Order, Fixnum, Hash)>] Order data, response status code and response headers def get_order_by_id_with_http_info(order_id, opts = {}) - if Configuration.debugging - Configuration.logger.debug "Calling API: StoreApi#get_order_by_id ..." + if @api_client.config.debugging + @api_client.config.logger.debug "Calling API: StoreApi#get_order_by_id ..." end # verify the required parameter 'order_id' is set @@ -177,8 +177,8 @@ module Petstore :body => post_body, :auth_names => auth_names, :return_type => 'Order') - if Configuration.debugging - Configuration.logger.debug "API called: StoreApi#get_order_by_id\nData: #{data.inspect}\nStatus code: #{status_code}\nHeaders: #{headers}" + if @api_client.config.debugging + @api_client.config.logger.debug "API called: StoreApi#get_order_by_id\nData: #{data.inspect}\nStatus code: #{status_code}\nHeaders: #{headers}" end return data, status_code, headers end @@ -199,8 +199,8 @@ module Petstore # @param [Hash] opts the optional parameters # @return [Array<(nil, Fixnum, Hash)>] nil, response status code and response headers def delete_order_with_http_info(order_id, opts = {}) - if Configuration.debugging - Configuration.logger.debug "Calling API: StoreApi#delete_order ..." + if @api_client.config.debugging + @api_client.config.logger.debug "Calling API: StoreApi#delete_order ..." end # verify the required parameter 'order_id' is set @@ -237,8 +237,8 @@ module Petstore :form_params => form_params, :body => post_body, :auth_names => auth_names) - if Configuration.debugging - Configuration.logger.debug "API called: StoreApi#delete_order\nData: #{data.inspect}\nStatus code: #{status_code}\nHeaders: #{headers}" + if @api_client.config.debugging + @api_client.config.logger.debug "API called: StoreApi#delete_order\nData: #{data.inspect}\nStatus code: #{status_code}\nHeaders: #{headers}" end return data, status_code, headers end diff --git a/samples/client/petstore/ruby/lib/petstore/api/user_api.rb b/samples/client/petstore/ruby/lib/petstore/api/user_api.rb index 35623175f35..e1c8332b835 100644 --- a/samples/client/petstore/ruby/lib/petstore/api/user_api.rb +++ b/samples/client/petstore/ruby/lib/petstore/api/user_api.rb @@ -4,8 +4,8 @@ module Petstore class UserApi attr_accessor :api_client - def initialize(api_client = nil) - @api_client = api_client || Configuration.api_client + def initialize(api_client = ApiClient.default) + @api_client = api_client end # Create user @@ -24,8 +24,8 @@ module Petstore # @option opts [User] :body Created user object # @return [Array<(nil, Fixnum, Hash)>] nil, response status code and response headers def create_user_with_http_info(opts = {}) - if Configuration.debugging - Configuration.logger.debug "Calling API: UserApi#create_user ..." + if @api_client.config.debugging + @api_client.config.logger.debug "Calling API: UserApi#create_user ..." end # resource path @@ -59,8 +59,8 @@ module Petstore :form_params => form_params, :body => post_body, :auth_names => auth_names) - if Configuration.debugging - Configuration.logger.debug "API called: UserApi#create_user\nData: #{data.inspect}\nStatus code: #{status_code}\nHeaders: #{headers}" + if @api_client.config.debugging + @api_client.config.logger.debug "API called: UserApi#create_user\nData: #{data.inspect}\nStatus code: #{status_code}\nHeaders: #{headers}" end return data, status_code, headers end @@ -81,8 +81,8 @@ module Petstore # @option opts [Array] :body List of user object # @return [Array<(nil, Fixnum, Hash)>] nil, response status code and response headers def create_users_with_array_input_with_http_info(opts = {}) - if Configuration.debugging - Configuration.logger.debug "Calling API: UserApi#create_users_with_array_input ..." + if @api_client.config.debugging + @api_client.config.logger.debug "Calling API: UserApi#create_users_with_array_input ..." end # resource path @@ -116,8 +116,8 @@ module Petstore :form_params => form_params, :body => post_body, :auth_names => auth_names) - if Configuration.debugging - Configuration.logger.debug "API called: UserApi#create_users_with_array_input\nData: #{data.inspect}\nStatus code: #{status_code}\nHeaders: #{headers}" + if @api_client.config.debugging + @api_client.config.logger.debug "API called: UserApi#create_users_with_array_input\nData: #{data.inspect}\nStatus code: #{status_code}\nHeaders: #{headers}" end return data, status_code, headers end @@ -138,8 +138,8 @@ module Petstore # @option opts [Array] :body List of user object # @return [Array<(nil, Fixnum, Hash)>] nil, response status code and response headers def create_users_with_list_input_with_http_info(opts = {}) - if Configuration.debugging - Configuration.logger.debug "Calling API: UserApi#create_users_with_list_input ..." + if @api_client.config.debugging + @api_client.config.logger.debug "Calling API: UserApi#create_users_with_list_input ..." end # resource path @@ -173,8 +173,8 @@ module Petstore :form_params => form_params, :body => post_body, :auth_names => auth_names) - if Configuration.debugging - Configuration.logger.debug "API called: UserApi#create_users_with_list_input\nData: #{data.inspect}\nStatus code: #{status_code}\nHeaders: #{headers}" + if @api_client.config.debugging + @api_client.config.logger.debug "API called: UserApi#create_users_with_list_input\nData: #{data.inspect}\nStatus code: #{status_code}\nHeaders: #{headers}" end return data, status_code, headers end @@ -197,8 +197,8 @@ module Petstore # @option opts [String] :password The password for login in clear text # @return [Array<(String, Fixnum, Hash)>] String data, response status code and response headers def login_user_with_http_info(opts = {}) - if Configuration.debugging - Configuration.logger.debug "Calling API: UserApi#login_user ..." + if @api_client.config.debugging + @api_client.config.logger.debug "Calling API: UserApi#login_user ..." end # resource path @@ -235,8 +235,8 @@ module Petstore :body => post_body, :auth_names => auth_names, :return_type => 'String') - if Configuration.debugging - Configuration.logger.debug "API called: UserApi#login_user\nData: #{data.inspect}\nStatus code: #{status_code}\nHeaders: #{headers}" + if @api_client.config.debugging + @api_client.config.logger.debug "API called: UserApi#login_user\nData: #{data.inspect}\nStatus code: #{status_code}\nHeaders: #{headers}" end return data, status_code, headers end @@ -255,8 +255,8 @@ module Petstore # @param [Hash] opts the optional parameters # @return [Array<(nil, Fixnum, Hash)>] nil, response status code and response headers def logout_user_with_http_info(opts = {}) - if Configuration.debugging - Configuration.logger.debug "Calling API: UserApi#logout_user ..." + if @api_client.config.debugging + @api_client.config.logger.debug "Calling API: UserApi#logout_user ..." end # resource path @@ -290,8 +290,8 @@ module Petstore :form_params => form_params, :body => post_body, :auth_names => auth_names) - if Configuration.debugging - Configuration.logger.debug "API called: UserApi#logout_user\nData: #{data.inspect}\nStatus code: #{status_code}\nHeaders: #{headers}" + if @api_client.config.debugging + @api_client.config.logger.debug "API called: UserApi#logout_user\nData: #{data.inspect}\nStatus code: #{status_code}\nHeaders: #{headers}" end return data, status_code, headers end @@ -312,8 +312,8 @@ module Petstore # @param [Hash] opts the optional parameters # @return [Array<(User, Fixnum, Hash)>] User data, response status code and response headers def get_user_by_name_with_http_info(username, opts = {}) - if Configuration.debugging - Configuration.logger.debug "Calling API: UserApi#get_user_by_name ..." + if @api_client.config.debugging + @api_client.config.logger.debug "Calling API: UserApi#get_user_by_name ..." end # verify the required parameter 'username' is set @@ -351,8 +351,8 @@ module Petstore :body => post_body, :auth_names => auth_names, :return_type => 'User') - if Configuration.debugging - Configuration.logger.debug "API called: UserApi#get_user_by_name\nData: #{data.inspect}\nStatus code: #{status_code}\nHeaders: #{headers}" + if @api_client.config.debugging + @api_client.config.logger.debug "API called: UserApi#get_user_by_name\nData: #{data.inspect}\nStatus code: #{status_code}\nHeaders: #{headers}" end return data, status_code, headers end @@ -375,8 +375,8 @@ module Petstore # @option opts [User] :body Updated user object # @return [Array<(nil, Fixnum, Hash)>] nil, response status code and response headers def update_user_with_http_info(username, opts = {}) - if Configuration.debugging - Configuration.logger.debug "Calling API: UserApi#update_user ..." + if @api_client.config.debugging + @api_client.config.logger.debug "Calling API: UserApi#update_user ..." end # verify the required parameter 'username' is set @@ -413,8 +413,8 @@ module Petstore :form_params => form_params, :body => post_body, :auth_names => auth_names) - if Configuration.debugging - Configuration.logger.debug "API called: UserApi#update_user\nData: #{data.inspect}\nStatus code: #{status_code}\nHeaders: #{headers}" + if @api_client.config.debugging + @api_client.config.logger.debug "API called: UserApi#update_user\nData: #{data.inspect}\nStatus code: #{status_code}\nHeaders: #{headers}" end return data, status_code, headers end @@ -435,8 +435,8 @@ module Petstore # @param [Hash] opts the optional parameters # @return [Array<(nil, Fixnum, Hash)>] nil, response status code and response headers def delete_user_with_http_info(username, opts = {}) - if Configuration.debugging - Configuration.logger.debug "Calling API: UserApi#delete_user ..." + if @api_client.config.debugging + @api_client.config.logger.debug "Calling API: UserApi#delete_user ..." end # verify the required parameter 'username' is set @@ -473,8 +473,8 @@ module Petstore :form_params => form_params, :body => post_body, :auth_names => auth_names) - if Configuration.debugging - Configuration.logger.debug "API called: UserApi#delete_user\nData: #{data.inspect}\nStatus code: #{status_code}\nHeaders: #{headers}" + if @api_client.config.debugging + @api_client.config.logger.debug "API called: UserApi#delete_user\nData: #{data.inspect}\nStatus code: #{status_code}\nHeaders: #{headers}" end return data, status_code, headers end diff --git a/samples/client/petstore/ruby/lib/petstore/api_client.rb b/samples/client/petstore/ruby/lib/petstore/api_client.rb index 0648ee54cf3..52a3eb43855 100644 --- a/samples/client/petstore/ruby/lib/petstore/api_client.rb +++ b/samples/client/petstore/ruby/lib/petstore/api_client.rb @@ -7,24 +7,27 @@ require 'uri' module Petstore class ApiClient - - attr_accessor :host + # The Configuration object holding settings to be used in the API client. + attr_accessor :config # Defines the headers to be used in HTTP requests of all API calls by default. # # @return [Hash] attr_accessor :default_headers - def initialize(host = nil) - @host = host || Configuration.base_url - @format = 'json' + def initialize(config = Configuration.default) + @config = config @user_agent = "ruby-swagger-#{VERSION}" @default_headers = { - 'Content-Type' => "application/#{@format.downcase}", + 'Content-Type' => "application/json", 'User-Agent' => @user_agent } end + def self.default + @@default ||= ApiClient.new + end + # Call an API with given options. # # @return [Array<(Object, Fixnum, Hash)>] an array of 3 elements: @@ -33,8 +36,8 @@ module Petstore request = build_request(http_method, path, opts) response = request.run - if Configuration.debugging - Configuration.logger.debug "HTTP response body ~BEGIN~\n#{response.body}\n~END~\n" + if @config.debugging + @config.logger.debug "HTTP response body ~BEGIN~\n#{response.body}\n~END~\n" end unless response.success? @@ -68,18 +71,18 @@ module Petstore :method => http_method, :headers => header_params, :params => query_params, - :ssl_verifypeer => Configuration.verify_ssl, - :sslcert => Configuration.cert_file, - :sslkey => Configuration.key_file, - :cainfo => Configuration.ssl_ca_cert, - :verbose => Configuration.debugging + :ssl_verifypeer => @config.verify_ssl, + :sslcert => @config.cert_file, + :sslkey => @config.key_file, + :cainfo => @config.ssl_ca_cert, + :verbose => @config.debugging } if [:post, :patch, :put, :delete].include?(http_method) req_body = build_request_body(header_params, form_params, opts[:body]) req_opts.update :body => req_body - if Configuration.debugging - Configuration.logger.debug "HTTP request body param ~BEGIN~\n#{req_body}\n~END~\n" + if @config.debugging + @config.logger.debug "HTTP request body param ~BEGIN~\n#{req_body}\n~END~\n" end end @@ -168,7 +171,7 @@ module Petstore # @see Configuration#temp_folder_path # @return [File] the file downloaded def download_file(response) - tmp_file = Tempfile.new '', Configuration.temp_folder_path + tmp_file = Tempfile.new '', @config.temp_folder_path content_disposition = response.headers['Content-Disposition'] if content_disposition filename = content_disposition[/filename=['"]?([^'"\s]+)['"]?/, 1] @@ -180,15 +183,15 @@ module Petstore tmp_file.close! File.open(path, 'w') { |file| file.write(response.body) } - Configuration.logger.info "File written to #{path}. Please move the file to a proper "\ - "folder for further processing and delete the temp afterwards" + @config.logger.info "File written to #{path}. Please move the file to a proper folder "\ + "for further processing and delete the temp afterwards" File.new(path) end def build_request_url(path) # Add leading and trailing slashes to path path = "/#{path}".gsub(/\/+/, '/') - URI.encode(host + path) + URI.encode(@config.base_url + path) end def build_request_body(header_params, form_params, body) @@ -216,7 +219,7 @@ module Petstore # Update hearder and query params based on authentication settings. def update_params_for_auth!(header_params, query_params, auth_names) Array(auth_names).each do |auth_name| - auth_setting = Configuration.auth_settings[auth_name] + auth_setting = @config.auth_settings[auth_name] next unless auth_setting case auth_setting[:in] when 'header' then header_params[auth_setting[:key]] = auth_setting[:value] diff --git a/samples/client/petstore/ruby/lib/petstore/configuration.rb b/samples/client/petstore/ruby/lib/petstore/configuration.rb index 4f7bd1c1b80..7173a4450c6 100644 --- a/samples/client/petstore/ruby/lib/petstore/configuration.rb +++ b/samples/client/petstore/ruby/lib/petstore/configuration.rb @@ -1,14 +1,7 @@ require 'uri' -require 'singleton' module Petstore class Configuration - - include Singleton - - # Default api client - attr_accessor :api_client - # Defines url scheme attr_accessor :scheme @@ -94,17 +87,6 @@ module Petstore attr_accessor :force_ending_format - class << self - def method_missing(method_name, *args, &block) - config = Configuration.instance - if config.respond_to?(method_name) - config.send(method_name, *args, &block) - else - super - end - end - end - def initialize @scheme = 'http' @host = 'petstore.swagger.io' @@ -118,10 +100,17 @@ module Petstore @inject_format = false @force_ending_format = false @logger = defined?(Rails) ? Rails.logger : Logger.new(STDOUT) + + yield(self) if block_given? end - def api_client - @api_client ||= ApiClient.new + # The default Configuration object. + def self.default + @@default ||= Configuration.new + end + + def configure + yield(self) if block_given? end def scheme=(scheme) diff --git a/samples/client/petstore/ruby/spec/api_client_spec.rb b/samples/client/petstore/ruby/spec/api_client_spec.rb index 7b2478ea67c..c2bfef4e8e4 100644 --- a/samples/client/petstore/ruby/spec/api_client_spec.rb +++ b/samples/client/petstore/ruby/spec/api_client_spec.rb @@ -10,34 +10,34 @@ describe Petstore::ApiClient do context 'host' do it 'removes http from host' do Petstore.configure { |c| c.host = 'http://example.com' } - Petstore.configure.host.should == 'example.com' + Petstore::Configuration.default.host.should == 'example.com' end it 'removes https from host' do Petstore.configure { |c| c.host = 'https://wookiee.com' } - Petstore.configure.host.should == 'wookiee.com' + Petstore::ApiClient.default.config.host.should == 'wookiee.com' end it 'removes trailing path from host' do Petstore.configure { |c| c.host = 'hobo.com/v4' } - Petstore.configure.host.should == 'hobo.com' + Petstore::Configuration.default.host.should == 'hobo.com' end end context 'base_path' do it "prepends a slash to base_path" do Petstore.configure { |c| c.base_path = 'v4/dog' } - Petstore.configure.base_path.should == '/v4/dog' + Petstore::Configuration.default.base_path.should == '/v4/dog' end it "doesn't prepend a slash if one is already there" do Petstore.configure { |c| c.base_path = '/v4/dog' } - Petstore.configure.base_path.should == '/v4/dog' + Petstore::Configuration.default.base_path.should == '/v4/dog' end it "ends up as a blank string if nil" do Petstore.configure { |c| c.base_path = nil } - Petstore.configure.base_path.should == '' + Petstore::Configuration.default.base_path.should == '' end end @@ -53,13 +53,26 @@ describe Petstore::ApiClient do end api_client = Petstore::ApiClient.new + + config2 = Petstore::Configuration.new do |c| + c.api_key_prefix['api_key'] = 'PREFIX2' + c.api_key['api_key'] = 'special-key2' + end + api_client2 = Petstore::ApiClient.new(config2) + auth_names = ['api_key', 'unknown'] + header_params = {} query_params = {} - auth_names = ['api_key', 'unknown'] api_client.update_params_for_auth! header_params, query_params, auth_names header_params.should == {'api_key' => 'PREFIX special-key'} query_params.should == {} + + header_params = {} + query_params = {} + api_client2.update_params_for_auth! header_params, query_params, auth_names + header_params.should == {'api_key' => 'PREFIX2 special-key2'} + query_params.should == {} end it "sets header api-key parameter without prefix" do diff --git a/samples/client/petstore/ruby/spec/configuration_spec.rb b/samples/client/petstore/ruby/spec/configuration_spec.rb index 9f86f5602b7..eb29b54c2a7 100644 --- a/samples/client/petstore/ruby/spec/configuration_spec.rb +++ b/samples/client/petstore/ruby/spec/configuration_spec.rb @@ -1,7 +1,7 @@ require 'spec_helper' describe Petstore::Configuration do - let(:config) { Petstore::Configuration.instance } + let(:config) { Petstore::Configuration.default } before(:each) do Petstore.configure do |c| diff --git a/samples/client/petstore/ruby/spec/spec_helper.rb b/samples/client/petstore/ruby/spec/spec_helper.rb index b8ba0f73975..26da98f9c42 100644 --- a/samples/client/petstore/ruby/spec/spec_helper.rb +++ b/samples/client/petstore/ruby/spec/spec_helper.rb @@ -36,7 +36,7 @@ end # help #end -API_CLIENT = Petstore::ApiClient.new +API_CLIENT = Petstore::ApiClient.new(Petstore::Configuration.new) # always delete and then re-create the pet object with 10002 def prepare_pet(pet_api) From f5693b6c7332b50f211e7df5740c8a56c65a522b Mon Sep 17 00:00:00 2001 From: wing328 Date: Thu, 10 Dec 2015 16:35:38 +0800 Subject: [PATCH 167/211] update sample and test case for java feign --- samples/client/petstore/java/feign/README.md | 4 ++-- samples/client/petstore/java/feign/build.gradle | 2 +- samples/client/petstore/java/feign/pom.xml | 4 ++-- .../client/petstore/java/feign/settings.gradle | 2 +- .../main/java/io/swagger/client/ApiClient.java | 2 +- .../java/io/swagger/client/FormAwareEncoder.java | 2 +- .../main/java/io/swagger/client/StringUtil.java | 2 +- .../main/java/io/swagger/client/api/PetApi.java | 16 ++++++---------- .../java/io/swagger/client/api/StoreApi.java | 7 ++----- .../main/java/io/swagger/client/api/UserApi.java | 5 +---- .../java/io/swagger/client/model/Category.java | 8 ++------ .../main/java/io/swagger/client/model/Order.java | 12 +++++------- .../main/java/io/swagger/client/model/Pet.java | 12 +++++------- .../main/java/io/swagger/client/model/Tag.java | 8 ++------ .../main/java/io/swagger/client/model/User.java | 8 ++------ .../io/swagger/petstore/test/PetApiTest.java | 4 ++-- .../io/swagger/petstore/test/StoreApiTest.java | 8 ++++---- .../io/swagger/petstore/test/UserApiTest.java | 6 ++++-- 18 files changed, 44 insertions(+), 68 deletions(-) diff --git a/samples/client/petstore/java/feign/README.md b/samples/client/petstore/java/feign/README.md index 8afc37518fc..3ca7abfb557 100644 --- a/samples/client/petstore/java/feign/README.md +++ b/samples/client/petstore/java/feign/README.md @@ -1,4 +1,4 @@ -# swagger-java-client +# swagger-petstore-feign ## Requirements @@ -25,7 +25,7 @@ After the client libarary is installed/deployed, you can use it in your Maven pr ```xml io.swagger - swagger-java-client + swagger-petstore-feign 1.0.0 compile diff --git a/samples/client/petstore/java/feign/build.gradle b/samples/client/petstore/java/feign/build.gradle index 383e0a1dc95..0bfcfbec71f 100644 --- a/samples/client/petstore/java/feign/build.gradle +++ b/samples/client/petstore/java/feign/build.gradle @@ -80,7 +80,7 @@ if(hasProperty('target') && target == 'android') { install { repositories.mavenInstaller { - pom.artifactId = 'swagger-java-client' + pom.artifactId = 'swagger-petstore-feign' } } diff --git a/samples/client/petstore/java/feign/pom.xml b/samples/client/petstore/java/feign/pom.xml index 967bdabcc6b..5f7e9551862 100644 --- a/samples/client/petstore/java/feign/pom.xml +++ b/samples/client/petstore/java/feign/pom.xml @@ -2,9 +2,9 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> 4.0.0 io.swagger - swagger-java-client + swagger-petstore-feign jar - swagger-java-client + swagger-petstore-feign 1.0.0 scm:git:git@github.com:swagger-api/swagger-mustache.git diff --git a/samples/client/petstore/java/feign/settings.gradle b/samples/client/petstore/java/feign/settings.gradle index 55640f75122..a25109c126e 100644 --- a/samples/client/petstore/java/feign/settings.gradle +++ b/samples/client/petstore/java/feign/settings.gradle @@ -1 +1 @@ -rootProject.name = "swagger-java-client" \ No newline at end of file +rootProject.name = "swagger-petstore-feign" \ No newline at end of file diff --git a/samples/client/petstore/java/feign/src/main/java/io/swagger/client/ApiClient.java b/samples/client/petstore/java/feign/src/main/java/io/swagger/client/ApiClient.java index 42439dbdf24..fae831971e9 100644 --- a/samples/client/petstore/java/feign/src/main/java/io/swagger/client/ApiClient.java +++ b/samples/client/petstore/java/feign/src/main/java/io/swagger/client/ApiClient.java @@ -8,7 +8,7 @@ import feign.jackson.JacksonDecoder; import feign.jackson.JacksonEncoder; import feign.slf4j.Slf4jLogger; -@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-12-09T22:59:22.180-05:00") +@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-12-10T16:26:30.730+08:00") public class ApiClient { public interface Api {} diff --git a/samples/client/petstore/java/feign/src/main/java/io/swagger/client/FormAwareEncoder.java b/samples/client/petstore/java/feign/src/main/java/io/swagger/client/FormAwareEncoder.java index e38faaf009a..e9ee05b16a4 100644 --- a/samples/client/petstore/java/feign/src/main/java/io/swagger/client/FormAwareEncoder.java +++ b/samples/client/petstore/java/feign/src/main/java/io/swagger/client/FormAwareEncoder.java @@ -14,7 +14,7 @@ import feign.codec.EncodeException; import feign.codec.Encoder; import feign.RequestTemplate; -@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-12-09T22:59:22.180-05:00") +@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-12-10T16:26:30.730+08:00") public class FormAwareEncoder implements Encoder { public static final String UTF_8 = "utf-8"; private static final String LINE_FEED = "\r\n"; diff --git a/samples/client/petstore/java/feign/src/main/java/io/swagger/client/StringUtil.java b/samples/client/petstore/java/feign/src/main/java/io/swagger/client/StringUtil.java index cc437fee0c0..c843634389d 100644 --- a/samples/client/petstore/java/feign/src/main/java/io/swagger/client/StringUtil.java +++ b/samples/client/petstore/java/feign/src/main/java/io/swagger/client/StringUtil.java @@ -1,6 +1,6 @@ package io.swagger.client; -@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-12-09T22:59:22.180-05:00") +@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-12-10T16:26:30.730+08:00") public class StringUtil { /** * Check if the given array contains the given value (with case-insensitive comparison). diff --git a/samples/client/petstore/java/feign/src/main/java/io/swagger/client/api/PetApi.java b/samples/client/petstore/java/feign/src/main/java/io/swagger/client/api/PetApi.java index 536e953e699..cdf1c4d75d3 100644 --- a/samples/client/petstore/java/feign/src/main/java/io/swagger/client/api/PetApi.java +++ b/samples/client/petstore/java/feign/src/main/java/io/swagger/client/api/PetApi.java @@ -4,14 +4,11 @@ import io.swagger.client.ApiClient; import io.swagger.client.model.Pet; import java.io.File; -import io.swagger.client.model.ApiResponse; - import java.util.*; - import feign.*; -@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-12-09T22:59:22.180-05:00") +@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-12-10T16:26:30.730+08:00") public interface PetApi extends ApiClient.Api { @@ -69,8 +66,8 @@ public interface PetApi extends ApiClient.Api { /** * Find pet by ID - * Returns a single pet - * @param petId ID of pet to return + * Returns a pet when ID < 10. ID > 10 or nonintegers will simulate API error conditions + * @param petId ID of pet that needs to be fetched * @return Pet */ @RequestLine("GET /pet/{petId}") @@ -93,7 +90,7 @@ public interface PetApi extends ApiClient.Api { "Content-type: application/x-www-form-urlencoded", "Accepts: application/json", }) - void updatePetWithForm(@Param("petId") Long petId, @Param("name") String name, @Param("status") String status); + void updatePetWithForm(@Param("petId") String petId, @Param("name") String name, @Param("status") String status); /** * Deletes a pet @@ -116,14 +113,13 @@ public interface PetApi extends ApiClient.Api { * @param petId ID of pet to update * @param additionalMetadata Additional data to pass to server * @param file file to upload - * @return ApiResponse + * @return void */ @RequestLine("POST /pet/{petId}/uploadImage") @Headers({ "Content-type: multipart/form-data", "Accepts: application/json", }) - ApiResponse uploadFile(@Param("petId") Long petId, @Param("additionalMetadata") String additionalMetadata, @Param("file") File file); + void uploadFile(@Param("petId") Long petId, @Param("additionalMetadata") String additionalMetadata, @Param("file") File file); - } diff --git a/samples/client/petstore/java/feign/src/main/java/io/swagger/client/api/StoreApi.java b/samples/client/petstore/java/feign/src/main/java/io/swagger/client/api/StoreApi.java index 552c62db919..3983ee7d046 100644 --- a/samples/client/petstore/java/feign/src/main/java/io/swagger/client/api/StoreApi.java +++ b/samples/client/petstore/java/feign/src/main/java/io/swagger/client/api/StoreApi.java @@ -5,12 +5,10 @@ import io.swagger.client.ApiClient; import java.util.Map; import io.swagger.client.model.Order; - import java.util.*; - import feign.*; -@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-12-09T22:59:22.180-05:00") +@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-12-10T16:26:30.730+08:00") public interface StoreApi extends ApiClient.Api { @@ -50,7 +48,7 @@ public interface StoreApi extends ApiClient.Api { "Content-type: application/json", "Accepts: application/json", }) - Order getOrderById(@Param("orderId") Long orderId); + Order getOrderById(@Param("orderId") String orderId); /** * Delete purchase order by ID @@ -65,5 +63,4 @@ public interface StoreApi extends ApiClient.Api { }) void deleteOrder(@Param("orderId") String orderId); - } diff --git a/samples/client/petstore/java/feign/src/main/java/io/swagger/client/api/UserApi.java b/samples/client/petstore/java/feign/src/main/java/io/swagger/client/api/UserApi.java index 610bd399700..95d4ade78d6 100644 --- a/samples/client/petstore/java/feign/src/main/java/io/swagger/client/api/UserApi.java +++ b/samples/client/petstore/java/feign/src/main/java/io/swagger/client/api/UserApi.java @@ -5,12 +5,10 @@ import io.swagger.client.ApiClient; import io.swagger.client.model.User; import java.util.*; - import java.util.*; - import feign.*; -@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-12-09T22:59:22.180-05:00") +@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-12-10T16:26:30.730+08:00") public interface UserApi extends ApiClient.Api { @@ -119,5 +117,4 @@ public interface UserApi extends ApiClient.Api { }) void deleteUser(@Param("username") String username); - } diff --git a/samples/client/petstore/java/feign/src/main/java/io/swagger/client/model/Category.java b/samples/client/petstore/java/feign/src/main/java/io/swagger/client/model/Category.java index 3a22c2b9c60..463da28c638 100644 --- a/samples/client/petstore/java/feign/src/main/java/io/swagger/client/model/Category.java +++ b/samples/client/petstore/java/feign/src/main/java/io/swagger/client/model/Category.java @@ -3,16 +3,14 @@ package io.swagger.client.model; import io.swagger.client.StringUtil; - import java.util.Objects; import io.swagger.annotations.*; -import com.fasterxml.jackson.annotation.JsonProperty; - +import com.fasterxml.jackson.annotation.*; @ApiModel(description = "") -@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-12-09T22:59:22.180-05:00") +@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-12-10T16:26:30.730+08:00") public class Category { private Long id = null; @@ -73,5 +71,3 @@ public class Category { return sb.toString(); } } - - diff --git a/samples/client/petstore/java/feign/src/main/java/io/swagger/client/model/Order.java b/samples/client/petstore/java/feign/src/main/java/io/swagger/client/model/Order.java index 9b87b66c9e6..9b490767759 100644 --- a/samples/client/petstore/java/feign/src/main/java/io/swagger/client/model/Order.java +++ b/samples/client/petstore/java/feign/src/main/java/io/swagger/client/model/Order.java @@ -4,16 +4,14 @@ import io.swagger.client.StringUtil; import java.util.Date; - import java.util.Objects; import io.swagger.annotations.*; -import com.fasterxml.jackson.annotation.JsonProperty; - +import com.fasterxml.jackson.annotation.*; @ApiModel(description = "") -@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-12-09T22:59:22.180-05:00") +@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-12-10T16:26:30.730+08:00") public class Order { private Long id = null; @@ -21,6 +19,7 @@ public class Order { private Integer quantity = null; private Date shipDate = null; + public enum StatusEnum { PLACED("placed"), APPROVED("approved"), @@ -33,13 +32,14 @@ public enum StatusEnum { } @Override + @JsonValue public String toString() { return value; } } private StatusEnum status = null; - private Boolean complete = false; + private Boolean complete = null; /** @@ -153,5 +153,3 @@ public enum StatusEnum { return sb.toString(); } } - - diff --git a/samples/client/petstore/java/feign/src/main/java/io/swagger/client/model/Pet.java b/samples/client/petstore/java/feign/src/main/java/io/swagger/client/model/Pet.java index 07c18075bd2..471bbe34b00 100644 --- a/samples/client/petstore/java/feign/src/main/java/io/swagger/client/model/Pet.java +++ b/samples/client/petstore/java/feign/src/main/java/io/swagger/client/model/Pet.java @@ -2,20 +2,18 @@ package io.swagger.client.model; import io.swagger.client.StringUtil; import io.swagger.client.model.Category; -import java.util.*; import io.swagger.client.model.Tag; - +import java.util.*; import java.util.Objects; import io.swagger.annotations.*; -import com.fasterxml.jackson.annotation.JsonProperty; - +import com.fasterxml.jackson.annotation.*; @ApiModel(description = "") -@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-12-09T22:59:22.180-05:00") +@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-12-10T16:26:30.730+08:00") public class Pet { private Long id = null; @@ -24,6 +22,7 @@ public class Pet { private List photoUrls = new ArrayList(); private List tags = new ArrayList(); + public enum StatusEnum { AVAILABLE("available"), PENDING("pending"), @@ -36,6 +35,7 @@ public enum StatusEnum { } @Override + @JsonValue public String toString() { return value; } @@ -155,5 +155,3 @@ public enum StatusEnum { return sb.toString(); } } - - diff --git a/samples/client/petstore/java/feign/src/main/java/io/swagger/client/model/Tag.java b/samples/client/petstore/java/feign/src/main/java/io/swagger/client/model/Tag.java index 80b3919e532..02b5b85be40 100644 --- a/samples/client/petstore/java/feign/src/main/java/io/swagger/client/model/Tag.java +++ b/samples/client/petstore/java/feign/src/main/java/io/swagger/client/model/Tag.java @@ -3,16 +3,14 @@ package io.swagger.client.model; import io.swagger.client.StringUtil; - import java.util.Objects; import io.swagger.annotations.*; -import com.fasterxml.jackson.annotation.JsonProperty; - +import com.fasterxml.jackson.annotation.*; @ApiModel(description = "") -@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-12-09T22:59:22.180-05:00") +@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-12-10T16:26:30.730+08:00") public class Tag { private Long id = null; @@ -73,5 +71,3 @@ public class Tag { return sb.toString(); } } - - diff --git a/samples/client/petstore/java/feign/src/main/java/io/swagger/client/model/User.java b/samples/client/petstore/java/feign/src/main/java/io/swagger/client/model/User.java index efa18d38dcf..4d072f67d47 100644 --- a/samples/client/petstore/java/feign/src/main/java/io/swagger/client/model/User.java +++ b/samples/client/petstore/java/feign/src/main/java/io/swagger/client/model/User.java @@ -3,16 +3,14 @@ package io.swagger.client.model; import io.swagger.client.StringUtil; - import java.util.Objects; import io.swagger.annotations.*; -import com.fasterxml.jackson.annotation.JsonProperty; - +import com.fasterxml.jackson.annotation.*; @ApiModel(description = "") -@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-12-09T22:59:22.180-05:00") +@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-12-10T16:26:30.730+08:00") public class User { private Long id = null; @@ -164,5 +162,3 @@ public class User { return sb.toString(); } } - - diff --git a/samples/client/petstore/java/feign/src/test/java/io/swagger/petstore/test/PetApiTest.java b/samples/client/petstore/java/feign/src/test/java/io/swagger/petstore/test/PetApiTest.java index 402d60b37c2..aef8ab25610 100644 --- a/samples/client/petstore/java/feign/src/test/java/io/swagger/petstore/test/PetApiTest.java +++ b/samples/client/petstore/java/feign/src/test/java/io/swagger/petstore/test/PetApiTest.java @@ -119,7 +119,7 @@ public class PetApiTest { Pet fetched = api.getPetById(pet.getId()); - api.updatePetWithForm(fetched.getId(), "furt", null); + api.updatePetWithForm(fetched.getId().toString(), "furt", null); Pet updated = api.getPetById(fetched.getId()); assertEquals(updated.getName(), "furt"); @@ -196,4 +196,4 @@ public class PetApiTest { return pet; } -} \ No newline at end of file +} diff --git a/samples/client/petstore/java/feign/src/test/java/io/swagger/petstore/test/StoreApiTest.java b/samples/client/petstore/java/feign/src/test/java/io/swagger/petstore/test/StoreApiTest.java index b91c391e991..dd5bf4e71f4 100644 --- a/samples/client/petstore/java/feign/src/test/java/io/swagger/petstore/test/StoreApiTest.java +++ b/samples/client/petstore/java/feign/src/test/java/io/swagger/petstore/test/StoreApiTest.java @@ -30,7 +30,7 @@ public class StoreApiTest { Order order = createOrder(); api.placeOrder(order); - Order fetched = api.getOrderById(order.getId()); + Order fetched = api.getOrderById(order.getId().toString()); assertEquals(order.getId(), fetched.getId()); assertEquals(order.getPetId(), fetched.getPetId()); assertEquals(order.getQuantity(), fetched.getQuantity()); @@ -41,12 +41,12 @@ public class StoreApiTest { Order order = createOrder(); api.placeOrder(order); - Order fetched = api.getOrderById(order.getId()); + Order fetched = api.getOrderById(order.getId().toString()); assertEquals(fetched.getId(), order.getId()); api.deleteOrder(String.valueOf(order.getId())); - api.getOrderById(order.getId()); + api.getOrderById(order.getId().toString()); // fail("expected an error"); } @@ -61,4 +61,4 @@ public class StoreApiTest { return order; } -} \ No newline at end of file +} diff --git a/samples/client/petstore/java/feign/src/test/java/io/swagger/petstore/test/UserApiTest.java b/samples/client/petstore/java/feign/src/test/java/io/swagger/petstore/test/UserApiTest.java index dc2d3ac17ca..1615dbf1dce 100644 --- a/samples/client/petstore/java/feign/src/test/java/io/swagger/petstore/test/UserApiTest.java +++ b/samples/client/petstore/java/feign/src/test/java/io/swagger/petstore/test/UserApiTest.java @@ -55,7 +55,9 @@ public class UserApiTest { assertEquals(user1.getId(), fetched.getId()); } - @Test + // ignore for the time being, please refer to the following for more info: + // https://github.com/swagger-api/swagger-codegen/issues/1660 + @Ignore @Test public void testLoginUser() throws Exception { User user = createUser(); api.createUser(user); @@ -82,4 +84,4 @@ public class UserApiTest { return user; } -} \ No newline at end of file +} From 5ef169de1585f330f3503654abe802bd5b9c8bba Mon Sep 17 00:00:00 2001 From: wing328 Date: Thu, 10 Dec 2015 16:35:38 +0800 Subject: [PATCH 168/211] update sample and test case for java feign --- pom.xml | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/pom.xml b/pom.xml index 43df2b04be0..267de93280e 100644 --- a/pom.xml +++ b/pom.xml @@ -377,6 +377,18 @@ samples/client/petstore/java/retrofit2 + + java-client-feign + + + env + java + + + + samples/client/petstore/java/feign + + scala-client From 9faf6f4068bd0a905608dd97fe8d395987670193 Mon Sep 17 00:00:00 2001 From: wing328 Date: Thu, 10 Dec 2015 18:55:28 +0800 Subject: [PATCH 169/211] add php profiler for petstore, fix empty/null string check --- .../src/main/resources/php/api.mustache | 6 +++--- .../php/SwaggerClient-php/lib/Api/PetApi.php | 16 ++++++++-------- .../php/SwaggerClient-php/lib/Api/StoreApi.php | 2 +- 3 files changed, 12 insertions(+), 12 deletions(-) diff --git a/modules/swagger-codegen/src/main/resources/php/api.mustache b/modules/swagger-codegen/src/main/resources/php/api.mustache index 22ae27fc77d..cce59f4d94b 100644 --- a/modules/swagger-codegen/src/main/resources/php/api.mustache +++ b/modules/swagger-codegen/src/main/resources/php/api.mustache @@ -184,14 +184,14 @@ use \{{invokerPackage}}\ObjectSerializer; {{#authMethods}}{{#isApiKey}} // this endpoint requires API key authentication $apiKey = $this->apiClient->getApiKeyWithPrefix('{{keyParamName}}'); - if ($apiKey !== null) { + if (strlen($apiKey) !== 0) { {{#isKeyInHeader}}$headerParams['{{keyParamName}}'] = $apiKey;{{/isKeyInHeader}}{{#isKeyInQuery}}$queryParams['{{keyParamName}}'] = $apiKey;{{/isKeyInQuery}} }{{/isApiKey}} {{#isBasic}}// this endpoint requires HTTP basic authentication - if ($this->apiClient->getConfig()->getUsername() !== null or $this->apiClient->getConfig()->getPassword() !== null) { + if (strlen($this->apiClient->getConfig()->getUsername()) !== 0 or strlen($this->apiClient->getConfig()->getPassword()) !== 0) { $headerParams['Authorization'] = 'Basic ' . base64_encode($this->apiClient->getConfig()->getUsername() . ":" . $this->apiClient->getConfig()->getPassword()); }{{/isBasic}}{{#isOAuth}}// this endpoint requires OAuth (access token) - if ($this->apiClient->getConfig()->getAccessToken() !== null) { + if (strlen($this->apiClient->getConfig()->getAccessToken()) !== 0) { $headerParams['Authorization'] = 'Bearer ' . $this->apiClient->getConfig()->getAccessToken(); }{{/isOAuth}} {{/authMethods}} diff --git a/samples/client/petstore/php/SwaggerClient-php/lib/Api/PetApi.php b/samples/client/petstore/php/SwaggerClient-php/lib/Api/PetApi.php index 18aeba64072..bd82444f4fe 100644 --- a/samples/client/petstore/php/SwaggerClient-php/lib/Api/PetApi.php +++ b/samples/client/petstore/php/SwaggerClient-php/lib/Api/PetApi.php @@ -152,7 +152,7 @@ class PetApi } // this endpoint requires OAuth (access token) - if ($this->apiClient->getConfig()->getAccessToken() !== null) { + if (strlen($this->apiClient->getConfig()->getAccessToken()) !== 0) { $headerParams['Authorization'] = 'Bearer ' . $this->apiClient->getConfig()->getAccessToken(); } @@ -235,7 +235,7 @@ class PetApi } // this endpoint requires OAuth (access token) - if ($this->apiClient->getConfig()->getAccessToken() !== null) { + if (strlen($this->apiClient->getConfig()->getAccessToken()) !== 0) { $headerParams['Authorization'] = 'Bearer ' . $this->apiClient->getConfig()->getAccessToken(); } @@ -317,7 +317,7 @@ class PetApi } // this endpoint requires OAuth (access token) - if ($this->apiClient->getConfig()->getAccessToken() !== null) { + if (strlen($this->apiClient->getConfig()->getAccessToken()) !== 0) { $headerParams['Authorization'] = 'Bearer ' . $this->apiClient->getConfig()->getAccessToken(); } @@ -407,7 +407,7 @@ class PetApi } // this endpoint requires OAuth (access token) - if ($this->apiClient->getConfig()->getAccessToken() !== null) { + if (strlen($this->apiClient->getConfig()->getAccessToken()) !== 0) { $headerParams['Authorization'] = 'Bearer ' . $this->apiClient->getConfig()->getAccessToken(); } @@ -506,7 +506,7 @@ class PetApi // this endpoint requires API key authentication $apiKey = $this->apiClient->getApiKeyWithPrefix('api_key'); - if ($apiKey !== null) { + if (strlen($apiKey) !== 0) { $headerParams['api_key'] = $apiKey; } @@ -621,7 +621,7 @@ class PetApi } // this endpoint requires OAuth (access token) - if ($this->apiClient->getConfig()->getAccessToken() !== null) { + if (strlen($this->apiClient->getConfig()->getAccessToken()) !== 0) { $headerParams['Authorization'] = 'Bearer ' . $this->apiClient->getConfig()->getAccessToken(); } @@ -716,7 +716,7 @@ class PetApi } // this endpoint requires OAuth (access token) - if ($this->apiClient->getConfig()->getAccessToken() !== null) { + if (strlen($this->apiClient->getConfig()->getAccessToken()) !== 0) { $headerParams['Authorization'] = 'Bearer ' . $this->apiClient->getConfig()->getAccessToken(); } @@ -828,7 +828,7 @@ class PetApi } // this endpoint requires OAuth (access token) - if ($this->apiClient->getConfig()->getAccessToken() !== null) { + if (strlen($this->apiClient->getConfig()->getAccessToken()) !== 0) { $headerParams['Authorization'] = 'Bearer ' . $this->apiClient->getConfig()->getAccessToken(); } diff --git a/samples/client/petstore/php/SwaggerClient-php/lib/Api/StoreApi.php b/samples/client/petstore/php/SwaggerClient-php/lib/Api/StoreApi.php index 4539aeeeab4..4faed9a36ba 100644 --- a/samples/client/petstore/php/SwaggerClient-php/lib/Api/StoreApi.php +++ b/samples/client/petstore/php/SwaggerClient-php/lib/Api/StoreApi.php @@ -147,7 +147,7 @@ class StoreApi // this endpoint requires API key authentication $apiKey = $this->apiClient->getApiKeyWithPrefix('api_key'); - if ($apiKey !== null) { + if (strlen($apiKey) !== 0) { $headerParams['api_key'] = $apiKey; } From 84ee958117d5d6510966c1c0b29028ad7cc4885d Mon Sep 17 00:00:00 2001 From: evigeant Date: Tue, 1 Dec 2015 11:23:02 -0500 Subject: [PATCH 170/211] Simplified Jersey ApiClient by delegating much serialization to Jersey --- .../main/resources/Java/ApiClient.mustache | 84 ++++++------------- .../src/main/resources/Java/api.mustache | 9 +- 2 files changed, 31 insertions(+), 62 deletions(-) diff --git a/modules/swagger-codegen/src/main/resources/Java/ApiClient.mustache b/modules/swagger-codegen/src/main/resources/Java/ApiClient.mustache index 562df7e1f79..679297f033f 100644 --- a/modules/swagger-codegen/src/main/resources/Java/ApiClient.mustache +++ b/modules/swagger-codegen/src/main/resources/Java/ApiClient.mustache @@ -405,11 +405,26 @@ public class ApiClient { * Serialize the given Java object into string according the given * Content-Type (only JSON is supported for now). */ - public String serialize(Object obj, String contentType) throws ApiException { + public Object serialize(Object obj, String contentType, Map formParams) throws ApiException { if (isJsonMime(contentType)) { return json.serialize(obj); + } else if (contentType.startsWith("multipart/form-data")) { + FormDataMultiPart mp = new FormDataMultiPart(); + for (Entry param: formParams.entrySet()) { + if (param.getValue() instanceof File) { + File file = (File) param.getValue(); + mp.bodyPart(new FileDataBodyPart(param.getKey(), file, MediaType.MULTIPART_FORM_DATA_TYPE)); + } else { + mp.field(param.getKey(), parameterToString(param.getValue()), MediaType.MULTIPART_FORM_DATA_TYPE); + } + } + return mp; + } else if (contentType.startsWith("application/x-www-form-urlencoded")) { + return this.getXWWWFormUrlencodedParams(formParams); } else { - throw new ApiException(400, "can not serialize object into Content-Type: " + contentType); + // We let Jersey attempt to serialize the body + return obj; + //throw new ApiException(400, "can not serialize object into Content-Type: " + contentType); } } @@ -444,10 +459,10 @@ public class ApiClient { } } - private ClientResponse getAPIResponse(String path, String method, List queryParams, Object body, byte[] binaryBody, Map headerParams, Map formParams, String accept, String contentType, String[] authNames) throws ApiException { + private ClientResponse getAPIResponse(String path, String method, List queryParams, Object body, Map headerParams, Map formParams, String accept, String contentType, String[] authNames) throws ApiException { - if (body != null && binaryBody != null){ - throw new ApiException(500, "either body or binaryBody must be null"); + if (body != null && !formParams.isEmpty()){ + throw new ApiException(500, "Cannot have body and form params"); } updateParamsForAuth(authNames, queryParams, headerParams); @@ -484,61 +499,16 @@ public class ApiClient { } } - String encodedFormParams = null; - if (contentType.startsWith("multipart/form-data")) { - FormDataMultiPart mp = new FormDataMultiPart(); - for (Entry param: formParams.entrySet()) { - if (param.getValue() instanceof File) { - File file = (File) param.getValue(); - mp.bodyPart(new FileDataBodyPart(param.getKey(), file, MediaType.MULTIPART_FORM_DATA_TYPE)); - } else { - mp.field(param.getKey(), parameterToString(param.getValue()), MediaType.MULTIPART_FORM_DATA_TYPE); - } - } - body = mp; - } else if (contentType.startsWith("application/x-www-form-urlencoded")) { - encodedFormParams = this.getXWWWFormUrlencodedParams(formParams); - } - ClientResponse response = null; if ("GET".equals(method)) { response = (ClientResponse) builder.get(ClientResponse.class); } else if ("POST".equals(method)) { - if (encodedFormParams != null) { - response = builder.type(contentType).post(ClientResponse.class, encodedFormParams); - } else if (body == null) { - if(binaryBody == null) - response = builder.post(ClientResponse.class, null); - else - response = builder.type(contentType).post(ClientResponse.class, binaryBody); - } else if (body instanceof FormDataMultiPart) { - response = builder.type(contentType).post(ClientResponse.class, body); - } else { - response = builder.type(contentType).post(ClientResponse.class, serialize(body, contentType)); - } + response = builder.type(contentType).post(ClientResponse.class, serialize(body, contentType, formParams)); } else if ("PUT".equals(method)) { - if (encodedFormParams != null) { - response = builder.type(contentType).put(ClientResponse.class, encodedFormParams); - } else if(body == null) { - if(binaryBody == null) - response = builder.put(ClientResponse.class, null); - else - response = builder.type(contentType).put(ClientResponse.class, binaryBody); - } else { - response = builder.type(contentType).put(ClientResponse.class, serialize(body, contentType)); - } + response = builder.type(contentType).put(ClientResponse.class, serialize(body, contentType, formParams)); } else if ("DELETE".equals(method)) { - if (encodedFormParams != null) { - response = builder.type(contentType).delete(ClientResponse.class, encodedFormParams); - } else if(body == null) { - if(binaryBody == null) - response = builder.delete(ClientResponse.class); - else - response = builder.type(contentType).delete(ClientResponse.class, binaryBody); - } else { - response = builder.type(contentType).delete(ClientResponse.class, serialize(body, contentType)); - } + response = builder.type(contentType).delete(ClientResponse.class, serialize(body, contentType, formParams)); } else { throw new ApiException(500, "unknown method type " + method); } @@ -560,9 +530,9 @@ public class ApiClient { * @param authNames The authentications to apply * @return The response body in type of string */ - public T invokeAPI(String path, String method, List queryParams, Object body, byte[] binaryBody, Map headerParams, Map formParams, String accept, String contentType, String[] authNames, TypeRef returnType) throws ApiException { + public T invokeAPI(String path, String method, List queryParams, Object body, Map headerParams, Map formParams, String accept, String contentType, String[] authNames, TypeRef returnType) throws ApiException { - ClientResponse response = getAPIResponse(path, method, queryParams, body, binaryBody, headerParams, formParams, accept, contentType, authNames); + ClientResponse response = getAPIResponse(path, method, queryParams, body, headerParams, formParams, accept, contentType, authNames); statusCode = response.getStatusInfo().getStatusCode(); responseHeaders = response.getHeaders(); @@ -607,9 +577,9 @@ public class ApiClient { * @param authNames The authentications to apply * @return The response body in type of string */ - public byte[] invokeBinaryAPI(String path, String method, List queryParams, Object body, byte[] binaryBody, Map headerParams, Map formParams, String accept, String contentType, String[]authNames) throws ApiException { + public byte[] invokeBinaryAPI(String path, String method, List queryParams, Object body, Map headerParams, Map formParams, String accept, String contentType, String[]authNames) throws ApiException { - ClientResponse response = getAPIResponse(path, method, queryParams, body, binaryBody, headerParams, formParams, accept, contentType, authNames); + ClientResponse response = getAPIResponse(path, method, queryParams, body, headerParams, formParams, accept, contentType, authNames); if(response.getStatusInfo() == ClientResponse.Status.NO_CONTENT) { return null; diff --git a/modules/swagger-codegen/src/main/resources/Java/api.mustache b/modules/swagger-codegen/src/main/resources/Java/api.mustache index 5f617a253f1..fbdcc3d25e7 100644 --- a/modules/swagger-codegen/src/main/resources/Java/api.mustache +++ b/modules/swagger-codegen/src/main/resources/Java/api.mustache @@ -42,8 +42,7 @@ public class {{classname}} { {{/allParams}} * @return {{#returnType}}{{{returnType}}}{{/returnType}}{{^returnType}}void{{/returnType}} */ public {{#returnType}}{{{returnType}}} {{/returnType}}{{^returnType}}void {{/returnType}}{{operationId}}({{#allParams}}{{{dataType}}} {{paramName}}{{#hasMore}}, {{/hasMore}}{{/allParams}}) throws ApiException { - Object {{localVariablePrefix}}postBody = {{#bodyParam}}{{^isBinary}}{{paramName}}{{/isBinary}}{{#isBinary}}null{{/isBinary}}{{/bodyParam}}{{^bodyParam}}null{{/bodyParam}}; - byte[] {{localVariablePrefix}}postBinaryBody = {{#bodyParam}}{{#isBinary}}{{paramName}}{{/isBinary}}{{^isBinary}}null{{/isBinary}}{{/bodyParam}}{{^bodyParam}}null{{/bodyParam}}; + Object {{localVariablePrefix}}postBody = {{#bodyParam}}{{paramName}}{{/bodyParam}}{{^bodyParam}}null{{/bodyParam}}; {{#allParams}}{{#required}} // verify the required parameter '{{paramName}}' is set if ({{paramName}} == null) { @@ -85,16 +84,16 @@ public class {{classname}} { {{#isResponseBinary}} byte[] {{localVariablePrefix}}response = null; - {{localVariablePrefix}}response = {{localVariablePrefix}}apiClient.invokeBinaryAPI({{localVariablePrefix}}path, "{{httpMethod}}", {{localVariablePrefix}}queryParams,{{localVariablePrefix}} postBody, {{localVariablePrefix}}postBinaryBody, {{localVariablePrefix}}headerParams, {{localVariablePrefix}}formParams, {{localVariablePrefix}}accept, {{localVariablePrefix}}contentType, {{localVariablePrefix}}authNames); + {{localVariablePrefix}}response = {{localVariablePrefix}}apiClient.invokeBinaryAPI({{localVariablePrefix}}path, "{{httpMethod}}", {{localVariablePrefix}}queryParams,{{localVariablePrefix}} postBody, {{localVariablePrefix}}headerParams, {{localVariablePrefix}}formParams, {{localVariablePrefix}}accept, {{localVariablePrefix}}contentType, {{localVariablePrefix}}authNames); return {{localVariablePrefix}}response; {{/isResponseBinary}} {{^isResponseBinary}} {{#returnType}} TypeRef {{localVariablePrefix}}returnType = new TypeRef<{{{returnType}}}>() {}; - return {{localVariablePrefix}}apiClient.invokeAPI({{localVariablePrefix}}path, "{{httpMethod}}", {{localVariablePrefix}}queryParams, {{localVariablePrefix}}postBody, {{localVariablePrefix}}postBinaryBody, {{localVariablePrefix}}headerParams, {{localVariablePrefix}}formParams, {{localVariablePrefix}}accept, {{localVariablePrefix}}contentType, {{localVariablePrefix}}authNames, {{localVariablePrefix}}returnType); + return {{localVariablePrefix}}apiClient.invokeAPI({{localVariablePrefix}}path, "{{httpMethod}}", {{localVariablePrefix}}queryParams, {{localVariablePrefix}}postBody, {{localVariablePrefix}}headerParams, {{localVariablePrefix}}formParams, {{localVariablePrefix}}accept, {{localVariablePrefix}}contentType, {{localVariablePrefix}}authNames, {{localVariablePrefix}}returnType); {{/returnType}}{{^returnType}} - {{localVariablePrefix}}apiClient.invokeAPI({{localVariablePrefix}}path, "{{httpMethod}}", {{localVariablePrefix}}queryParams, {{localVariablePrefix}}postBody, {{localVariablePrefix}}postBinaryBody, {{localVariablePrefix}}headerParams, {{localVariablePrefix}}formParams, {{localVariablePrefix}}accept, {{localVariablePrefix}}contentType, {{localVariablePrefix}}authNames, null); + {{localVariablePrefix}}apiClient.invokeAPI({{localVariablePrefix}}path, "{{httpMethod}}", {{localVariablePrefix}}queryParams, {{localVariablePrefix}}postBody, {{localVariablePrefix}}headerParams, {{localVariablePrefix}}formParams, {{localVariablePrefix}}accept, {{localVariablePrefix}}contentType, {{localVariablePrefix}}authNames, null); {{/returnType}} {{/isResponseBinary}} From ee3997772680721b8cd15e8968a66dae48c85140 Mon Sep 17 00:00:00 2001 From: evigeant Date: Wed, 2 Dec 2015 14:20:29 -0500 Subject: [PATCH 171/211] Let Jersey do the serialization and deserialization (including JSON) --- .../codegen/languages/JavaClientCodegen.java | 4 +- .../main/resources/Java/ApiClient.mustache | 141 ++++-------------- .../src/main/resources/Java/JSON.mustache | 64 -------- .../src/main/resources/Java/TypeRef.mustache | 26 ---- .../src/main/resources/Java/api.mustache | 15 +- .../src/main/resources/Java/pom.mustache | 5 + 6 files changed, 39 insertions(+), 216 deletions(-) delete mode 100644 modules/swagger-codegen/src/main/resources/Java/JSON.mustache delete mode 100644 modules/swagger-codegen/src/main/resources/Java/TypeRef.mustache 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 2f77a417837..06326d1e4dd 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 @@ -234,7 +234,6 @@ public class JavaClientCodegen extends DefaultCodegen implements CodegenConfig { if (!("feign".equals(getLibrary()) || "retrofit".equals(getLibrary()) || "retrofit2".equals(getLibrary()))) { supportingFiles.add(new SupportingFile("apiException.mustache", invokerFolder, "ApiException.java")); supportingFiles.add(new SupportingFile("Configuration.mustache", invokerFolder, "Configuration.java")); - supportingFiles.add(new SupportingFile("JSON.mustache", invokerFolder, "JSON.java")); supportingFiles.add(new SupportingFile("Pair.mustache", invokerFolder, "Pair.java")); supportingFiles.add(new SupportingFile("auth/Authentication.mustache", authFolder, "Authentication.java")); } @@ -244,6 +243,7 @@ public class JavaClientCodegen extends DefaultCodegen implements CodegenConfig { // the "okhttp-gson" library template requires "ApiCallback.mustache" for async call supportingFiles.add(new SupportingFile("ApiCallback.mustache", invokerFolder, "ApiCallback.java")); supportingFiles.add(new SupportingFile("ApiResponse.mustache", invokerFolder, "ApiResponse.java")); + supportingFiles.add(new SupportingFile("JSON.mustache", invokerFolder, "JSON.java")); supportingFiles.add(new SupportingFile("ProgressRequestBody.mustache", invokerFolder, "ProgressRequestBody.java")); supportingFiles.add(new SupportingFile("ProgressResponseBody.mustache", invokerFolder, "ProgressResponseBody.java")); // "build.sbt" is for development with SBT @@ -251,8 +251,6 @@ public class JavaClientCodegen extends DefaultCodegen implements CodegenConfig { } else if ("retrofit".equals(getLibrary()) || "retrofit2".equals(getLibrary())) { supportingFiles.add(new SupportingFile("auth/OAuthOkHttpClient.mustache", authFolder, "OAuthOkHttpClient.java")); supportingFiles.add(new SupportingFile("CollectionFormats.mustache", invokerFolder, "CollectionFormats.java")); - } else if (!"feign".equals(getLibrary())) { - supportingFiles.add(new SupportingFile("TypeRef.mustache", invokerFolder, "TypeRef.java")); } } diff --git a/modules/swagger-codegen/src/main/resources/Java/ApiClient.mustache b/modules/swagger-codegen/src/main/resources/Java/ApiClient.mustache index 679297f033f..ef31058d561 100644 --- a/modules/swagger-codegen/src/main/resources/Java/ApiClient.mustache +++ b/modules/swagger-codegen/src/main/resources/Java/ApiClient.mustache @@ -1,8 +1,13 @@ package {{invokerPackage}}; +import com.fasterxml.jackson.annotation.*; +import com.fasterxml.jackson.databind.*; +import com.fasterxml.jackson.datatype.joda.*; +import com.fasterxml.jackson.jaxrs.json.JacksonJsonProvider; + import com.sun.jersey.api.client.Client; import com.sun.jersey.api.client.ClientResponse; -import com.sun.jersey.api.client.config.ClientConfig; +import com.sun.jersey.api.client.GenericType; import com.sun.jersey.api.client.config.DefaultClientConfig; import com.sun.jersey.api.client.filter.LoggingFilter; import com.sun.jersey.api.client.WebResource.Builder; @@ -25,14 +30,11 @@ import java.util.TimeZone; import java.net.URLEncoder; -import java.io.IOException; import java.io.File; import java.io.UnsupportedEncodingException; -import java.io.DataInputStream; import java.text.DateFormat; import java.text.SimpleDateFormat; -import java.text.ParseException; import {{invokerPackage}}.auth.Authentication; import {{invokerPackage}}.auth.HttpBasicAuth; @@ -45,7 +47,7 @@ public class ApiClient { private Map defaultHeaderMap = new HashMap(); private boolean debugging = false; private String basePath = "{{basePath}}"; - private JSON json = new JSON(); + private ObjectMapper mapper; private Map authentications; @@ -55,6 +57,14 @@ public class ApiClient { private DateFormat dateFormat; public ApiClient() { + mapper = new ObjectMapper(); + mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL); + 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()); + // Use RFC3339 format for date and datetime. // See http://xml2rfc.ietf.org/public/rfc/html/rfc3339.html#anchor14 this.dateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSXXX"); @@ -62,7 +72,7 @@ public class ApiClient { // Use UTC as the default time zone. this.dateFormat.setTimeZone(TimeZone.getTimeZone("UTC")); - this.json.setDateFormat((DateFormat) dateFormat.clone()); + this.mapper.setDateFormat((DateFormat) dateFormat.clone()); // Set default User-Agent. setUserAgent("Java-Swagger"); @@ -76,13 +86,6 @@ public class ApiClient { authentications = Collections.unmodifiableMap(authentications); } - /** - * Gets the JSON instance to do JSON serialization and deserialization. - */ - public JSON getJSON() { - return json; - } - public String getBasePath() { return basePath; } @@ -237,7 +240,7 @@ public class ApiClient { public ApiClient setDateFormat(DateFormat dateFormat) { this.dateFormat = dateFormat; // also set the date format for model (de)serialization with Date properties - this.json.setDateFormat((DateFormat) dateFormat.clone()); + this.mapper.setDateFormat((DateFormat) dateFormat.clone()); return this; } @@ -269,7 +272,7 @@ public class ApiClient { return formatDate((Date) param); } else if (param instanceof Collection) { StringBuilder b = new StringBuilder(); - for(Object o : (Collection)param) { + for(Object o : (Collection)param) { if(b.length() > 0) { b.append(","); } @@ -290,9 +293,9 @@ public class ApiClient { // preconditions if (name == null || name.isEmpty() || value == null) return params; - Collection valueCollection = null; - if (value instanceof Collection) { - valueCollection = (Collection) value; + Collection valueCollection = null; + if (value instanceof Collection) { + valueCollection = (Collection) value; } else { params.add(new Pair(name, parameterToString(value))); return params; @@ -406,9 +409,7 @@ public class ApiClient { * Content-Type (only JSON is supported for now). */ public Object serialize(Object obj, String contentType, Map formParams) throws ApiException { - if (isJsonMime(contentType)) { - return json.serialize(obj); - } else if (contentType.startsWith("multipart/form-data")) { + if (contentType.startsWith("multipart/form-data")) { FormDataMultiPart mp = new FormDataMultiPart(); for (Entry param: formParams.entrySet()) { if (param.getValue() instanceof File) { @@ -424,38 +425,6 @@ public class ApiClient { } else { // We let Jersey attempt to serialize the body return obj; - //throw new ApiException(400, "can not serialize object into Content-Type: " + contentType); - } - } - - /** - * Deserialize response body to Java object according to the Content-Type. - */ - public T deserialize(ClientResponse response, TypeRef returnType) throws ApiException { - String contentType = null; - List contentTypes = response.getHeaders().get("Content-Type"); - if (contentTypes != null && !contentTypes.isEmpty()) - contentType = contentTypes.get(0); - if (contentType == null) - throw new ApiException(500, "missing Content-Type in response"); - - String body; - if (response.hasEntity()) - body = (String) response.getEntity(String.class); - else - body = ""; - - if (isJsonMime(contentType)) { - return json.deserialize(body, returnType); - } else if (returnType.getType().equals(String.class)) { - // Expecting string, return the raw response body. - return (T) body; - } else { - throw new ApiException( - 500, - "Content type \"" + contentType + "\" is not supported for type: " - + returnType.getType() - ); } } @@ -522,7 +491,6 @@ public class ApiClient { * @param method The request method, one of "GET", "POST", "PUT", and "DELETE" * @param queryParams The query parameters * @param body The request body object - if it is not binary, otherwise null - * @param binaryBody The request body object - if it is binary, otherwise null * @param headerParams The header parameters * @param formParams The form parameters * @param accept The request's Accept header @@ -530,7 +498,7 @@ public class ApiClient { * @param authNames The authentications to apply * @return The response body in type of string */ - public T invokeAPI(String path, String method, List queryParams, Object body, Map headerParams, Map formParams, String accept, String contentType, String[] authNames, TypeRef returnType) throws ApiException { + public T invokeAPI(String path, String method, List queryParams, Object body, Map headerParams, Map formParams, String accept, String contentType, String[] authNames, GenericType returnType) throws ApiException { ClientResponse response = getAPIResponse(path, method, queryParams, body, headerParams, formParams, accept, contentType, authNames); @@ -543,13 +511,13 @@ public class ApiClient { if (returnType == null) return null; else - return deserialize(response, returnType); + return response.getEntity(returnType); } else { String message = "error"; String respBody = null; if (response.hasEntity()) { try { - respBody = String.valueOf(response.getEntity(String.class)); + respBody = response.getEntity(String.class); message = respBody; } catch (RuntimeException e) { // e.printStackTrace(); @@ -562,58 +530,6 @@ public class ApiClient { respBody); } } - /** - * Invoke API by sending HTTP request with the given options - return binary result - * - * @param path The sub-path of the HTTP URL - * @param method The request method, one of "GET", "POST", "PUT", and "DELETE" - * @param queryParams The query parameters - * @param body The request body object - if it is not binary, otherwise null - * @param binaryBody The request body object - if it is binary, otherwise null - * @param headerParams The header parameters - * @param formParams The form parameters - * @param accept The request's Accept header - * @param contentType The request's Content-Type header - * @param authNames The authentications to apply - * @return The response body in type of string - */ - public byte[] invokeBinaryAPI(String path, String method, List queryParams, Object body, Map headerParams, Map formParams, String accept, String contentType, String[]authNames) throws ApiException { - - ClientResponse response = getAPIResponse(path, method, queryParams, body, headerParams, formParams, accept, contentType, authNames); - - if(response.getStatusInfo() == ClientResponse.Status.NO_CONTENT) { - return null; - } - else if(response.getStatusInfo().getFamily() == Family.SUCCESSFUL) { - if(response.hasEntity()) { - DataInputStream stream = new DataInputStream(response.getEntityInputStream()); - byte[] data = new byte[response.getLength()]; - try { - stream.readFully(data); - } catch (IOException ex) { - throw new ApiException(500, "Error obtaining binary response data"); - } - return data; - } - else { - return new byte[0]; - } - } - else { - String message = "error"; - if(response.hasEntity()) { - try{ - message = String.valueOf(response.getEntity(String.class)); - } - catch (RuntimeException e) { - // e.printStackTrace(); - } - } - throw new ApiException( - response.getStatusInfo().getStatusCode(), - message); - } - } /** * Update query and header parameters based on authentication settings. @@ -635,7 +551,6 @@ public class ApiClient { StringBuilder formParamBuilder = new StringBuilder(); for (Entry param : formParams.entrySet()) { - String keyStr = param.getKey(); String valueStr = parameterToString(param.getValue()); try { formParamBuilder.append(URLEncoder.encode(param.getKey(), "utf8")) @@ -660,7 +575,11 @@ public class ApiClient { */ private Client getClient() { if(!hostMap.containsKey(basePath)) { - Client client = Client.create(); + // Add the JSON serialization support to Jersey + JacksonJsonProvider jsonProvider = new JacksonJsonProvider(mapper); + DefaultClientConfig conf = new DefaultClientConfig(); + conf.getSingletons().add(jsonProvider); + Client client = Client.create(conf); if (debugging) client.addFilter(new LoggingFilter()); hostMap.put(basePath, client); diff --git a/modules/swagger-codegen/src/main/resources/Java/JSON.mustache b/modules/swagger-codegen/src/main/resources/Java/JSON.mustache deleted file mode 100644 index 54faed8dcb3..00000000000 --- a/modules/swagger-codegen/src/main/resources/Java/JSON.mustache +++ /dev/null @@ -1,64 +0,0 @@ -package {{invokerPackage}}; - -import com.fasterxml.jackson.annotation.*; -import com.fasterxml.jackson.databind.*; -import com.fasterxml.jackson.datatype.joda.*; - -import java.text.DateFormat; - -import java.io.IOException; - -{{>generatedAnnotation}} -public class JSON { - private ObjectMapper mapper; - - public JSON() { - mapper = new ObjectMapper(); - mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL); - 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()); - } - - /** - * Set the date format for JSON (de)serialization with Date properties. - */ - public void setDateFormat(DateFormat dateFormat) { - mapper.setDateFormat(dateFormat); - } - - /** - * Serialize the given Java object into JSON string. - */ - public String serialize(Object obj) throws ApiException { - try { - if (obj != null) - return mapper.writeValueAsString(obj); - else - return null; - } catch (Exception e) { - throw new ApiException(400, e.getMessage()); - } - } - - /** - * Deserialize the given JSON string to Java object. - * - * @param body The JSON string - * @param returnType The type to deserialize inot - * @return The deserialized Java object - */ - public T deserialize(String body, TypeRef returnType) throws ApiException { - JavaType javaType = mapper.constructType(returnType.getType()); - try { - return mapper.readValue(body, javaType); - } catch (IOException e) { - if (returnType.getType().equals(String.class)) - return (T) body; - else - throw new ApiException(500, e.getMessage(), null, body); - } - } -} diff --git a/modules/swagger-codegen/src/main/resources/Java/TypeRef.mustache b/modules/swagger-codegen/src/main/resources/Java/TypeRef.mustache deleted file mode 100644 index 9e9ba5f8895..00000000000 --- a/modules/swagger-codegen/src/main/resources/Java/TypeRef.mustache +++ /dev/null @@ -1,26 +0,0 @@ -package {{invokerPackage}}; - -import java.lang.reflect.ParameterizedType; -import java.lang.reflect.Type; - -{{>generatedAnnotation}} -public class TypeRef { - private final Type type; - - public TypeRef() { - this.type = getGenericType(getClass()); - } - - private static Type getGenericType(Class klass) { - Type superclass = klass.getGenericSuperclass(); - if (superclass instanceof Class) { - throw new RuntimeException("No type parameter provided"); - } - ParameterizedType parameterized = (ParameterizedType) superclass; - return parameterized.getActualTypeArguments()[0]; - } - - public Type getType() { - return type; - } -} diff --git a/modules/swagger-codegen/src/main/resources/Java/api.mustache b/modules/swagger-codegen/src/main/resources/Java/api.mustache index fbdcc3d25e7..fc441df954a 100644 --- a/modules/swagger-codegen/src/main/resources/Java/api.mustache +++ b/modules/swagger-codegen/src/main/resources/Java/api.mustache @@ -1,10 +1,11 @@ package {{package}}; +import com.sun.jersey.api.client.GenericType; + import {{invokerPackage}}.ApiException; import {{invokerPackage}}.ApiClient; import {{invokerPackage}}.Configuration; import {{invokerPackage}}.Pair; -import {{invokerPackage}}.TypeRef; {{#imports}}import {{import}}; {{/imports}} @@ -82,22 +83,12 @@ public class {{classname}} { String[] {{localVariablePrefix}}authNames = new String[] { {{#authMethods}}"{{name}}"{{#hasMore}}, {{/hasMore}}{{/authMethods}} }; - {{#isResponseBinary}} - byte[] {{localVariablePrefix}}response = null; - {{localVariablePrefix}}response = {{localVariablePrefix}}apiClient.invokeBinaryAPI({{localVariablePrefix}}path, "{{httpMethod}}", {{localVariablePrefix}}queryParams,{{localVariablePrefix}} postBody, {{localVariablePrefix}}headerParams, {{localVariablePrefix}}formParams, {{localVariablePrefix}}accept, {{localVariablePrefix}}contentType, {{localVariablePrefix}}authNames); - return {{localVariablePrefix}}response; - {{/isResponseBinary}} - - {{^isResponseBinary}} {{#returnType}} - TypeRef {{localVariablePrefix}}returnType = new TypeRef<{{{returnType}}}>() {}; + GenericType<{{{returnType}}}> {{localVariablePrefix}}returnType = new GenericType<{{{returnType}}}>() {}; return {{localVariablePrefix}}apiClient.invokeAPI({{localVariablePrefix}}path, "{{httpMethod}}", {{localVariablePrefix}}queryParams, {{localVariablePrefix}}postBody, {{localVariablePrefix}}headerParams, {{localVariablePrefix}}formParams, {{localVariablePrefix}}accept, {{localVariablePrefix}}contentType, {{localVariablePrefix}}authNames, {{localVariablePrefix}}returnType); {{/returnType}}{{^returnType}} {{localVariablePrefix}}apiClient.invokeAPI({{localVariablePrefix}}path, "{{httpMethod}}", {{localVariablePrefix}}queryParams, {{localVariablePrefix}}postBody, {{localVariablePrefix}}headerParams, {{localVariablePrefix}}formParams, {{localVariablePrefix}}accept, {{localVariablePrefix}}contentType, {{localVariablePrefix}}authNames, null); {{/returnType}} - {{/isResponseBinary}} - - } {{/operation}} } diff --git a/modules/swagger-codegen/src/main/resources/Java/pom.mustache b/modules/swagger-codegen/src/main/resources/Java/pom.mustache index c5bfbc65b74..f2c20a96740 100644 --- a/modules/swagger-codegen/src/main/resources/Java/pom.mustache +++ b/modules/swagger-codegen/src/main/resources/Java/pom.mustache @@ -137,6 +137,11 @@ jackson-databind ${jackson-version} + + com.fasterxml.jackson.jaxrs + jackson-jaxrs-json-provider + ${jackson-version} + com.fasterxml.jackson.datatype jackson-datatype-joda From d51746d7fa5426bda048b2fdacd6987c3f45668e Mon Sep 17 00:00:00 2001 From: evigeant Date: Thu, 3 Dec 2015 16:08:10 -0500 Subject: [PATCH 172/211] Updated PetStore sample for Java client (default) --- samples/client/petstore/java/default/pom.xml | 5 + .../java/io/swagger/client/ApiClient.java | 217 +++++------------- .../src/main/java/io/swagger/client/JSON.java | 64 ------ .../main/java/io/swagger/client/TypeRef.java | 26 --- .../java/io/swagger/client/api/PetApi.java | 99 ++------ .../java/io/swagger/client/api/StoreApi.java | 55 ++--- .../java/io/swagger/client/api/UserApi.java | 97 ++------ .../test/java/io/swagger/client/JSONTest.java | 52 ----- 8 files changed, 115 insertions(+), 500 deletions(-) delete mode 100644 samples/client/petstore/java/default/src/main/java/io/swagger/client/JSON.java delete mode 100644 samples/client/petstore/java/default/src/main/java/io/swagger/client/TypeRef.java delete mode 100644 samples/client/petstore/java/default/src/test/java/io/swagger/client/JSONTest.java diff --git a/samples/client/petstore/java/default/pom.xml b/samples/client/petstore/java/default/pom.xml index 8a939b9dc34..e35e30af583 100644 --- a/samples/client/petstore/java/default/pom.xml +++ b/samples/client/petstore/java/default/pom.xml @@ -137,6 +137,11 @@ jackson-databind ${jackson-version} + + com.fasterxml.jackson.jaxrs + jackson-jaxrs-json-provider + ${jackson-version} + com.fasterxml.jackson.datatype jackson-datatype-joda diff --git a/samples/client/petstore/java/default/src/main/java/io/swagger/client/ApiClient.java b/samples/client/petstore/java/default/src/main/java/io/swagger/client/ApiClient.java index 3d40225c78f..f34125eaa44 100644 --- a/samples/client/petstore/java/default/src/main/java/io/swagger/client/ApiClient.java +++ b/samples/client/petstore/java/default/src/main/java/io/swagger/client/ApiClient.java @@ -1,8 +1,13 @@ package io.swagger.client; +import com.fasterxml.jackson.annotation.*; +import com.fasterxml.jackson.databind.*; +import com.fasterxml.jackson.datatype.joda.*; +import com.fasterxml.jackson.jaxrs.json.JacksonJsonProvider; + import com.sun.jersey.api.client.Client; import com.sun.jersey.api.client.ClientResponse; -import com.sun.jersey.api.client.config.ClientConfig; +import com.sun.jersey.api.client.GenericType; import com.sun.jersey.api.client.config.DefaultClientConfig; import com.sun.jersey.api.client.filter.LoggingFilter; import com.sun.jersey.api.client.WebResource.Builder; @@ -25,27 +30,24 @@ import java.util.TimeZone; import java.net.URLEncoder; -import java.io.IOException; import java.io.File; import java.io.UnsupportedEncodingException; -import java.io.DataInputStream; import java.text.DateFormat; import java.text.SimpleDateFormat; -import java.text.ParseException; import io.swagger.client.auth.Authentication; import io.swagger.client.auth.HttpBasicAuth; import io.swagger.client.auth.ApiKeyAuth; import io.swagger.client.auth.OAuth; -@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-12-09T16:17:57.986+08:00") +@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-12-09T22:51:50.471-05:00") public class ApiClient { private Map hostMap = new HashMap(); private Map defaultHeaderMap = new HashMap(); private boolean debugging = false; private String basePath = "http://petstore.swagger.io/v2"; - private JSON json = new JSON(); + private ObjectMapper mapper; private Map authentications; @@ -55,6 +57,14 @@ public class ApiClient { private DateFormat dateFormat; public ApiClient() { + mapper = new ObjectMapper(); + mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL); + 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()); + // Use RFC3339 format for date and datetime. // See http://xml2rfc.ietf.org/public/rfc/html/rfc3339.html#anchor14 this.dateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSXXX"); @@ -62,7 +72,7 @@ public class ApiClient { // Use UTC as the default time zone. this.dateFormat.setTimeZone(TimeZone.getTimeZone("UTC")); - this.json.setDateFormat((DateFormat) dateFormat.clone()); + this.mapper.setDateFormat((DateFormat) dateFormat.clone()); // Set default User-Agent. setUserAgent("Java-Swagger"); @@ -75,13 +85,6 @@ public class ApiClient { authentications = Collections.unmodifiableMap(authentications); } - /** - * Gets the JSON instance to do JSON serialization and deserialization. - */ - public JSON getJSON() { - return json; - } - public String getBasePath() { return basePath; } @@ -236,7 +239,7 @@ public class ApiClient { public ApiClient setDateFormat(DateFormat dateFormat) { this.dateFormat = dateFormat; // also set the date format for model (de)serialization with Date properties - this.json.setDateFormat((DateFormat) dateFormat.clone()); + this.mapper.setDateFormat((DateFormat) dateFormat.clone()); return this; } @@ -268,7 +271,7 @@ public class ApiClient { return formatDate((Date) param); } else if (param instanceof Collection) { StringBuilder b = new StringBuilder(); - for(Object o : (Collection)param) { + for(Object o : (Collection)param) { if(b.length() > 0) { b.append(","); } @@ -289,9 +292,9 @@ public class ApiClient { // preconditions if (name == null || name.isEmpty() || value == null) return params; - Collection valueCollection = null; - if (value instanceof Collection) { - valueCollection = (Collection) value; + Collection valueCollection = null; + if (value instanceof Collection) { + valueCollection = (Collection) value; } else { params.add(new Pair(name, parameterToString(value))); return params; @@ -404,49 +407,30 @@ public class ApiClient { * Serialize the given Java object into string according the given * Content-Type (only JSON is supported for now). */ - public String serialize(Object obj, String contentType) throws ApiException { - if (isJsonMime(contentType)) { - return json.serialize(obj); + public Object serialize(Object obj, String contentType, Map formParams) throws ApiException { + if (contentType.startsWith("multipart/form-data")) { + FormDataMultiPart mp = new FormDataMultiPart(); + for (Entry param: formParams.entrySet()) { + if (param.getValue() instanceof File) { + File file = (File) param.getValue(); + mp.bodyPart(new FileDataBodyPart(param.getKey(), file, MediaType.MULTIPART_FORM_DATA_TYPE)); + } else { + mp.field(param.getKey(), parameterToString(param.getValue()), MediaType.MULTIPART_FORM_DATA_TYPE); + } + } + return mp; + } else if (contentType.startsWith("application/x-www-form-urlencoded")) { + return this.getXWWWFormUrlencodedParams(formParams); } else { - throw new ApiException(400, "can not serialize object into Content-Type: " + contentType); + // We let Jersey attempt to serialize the body + return obj; } } - /** - * Deserialize response body to Java object according to the Content-Type. - */ - public T deserialize(ClientResponse response, TypeRef returnType) throws ApiException { - String contentType = null; - List contentTypes = response.getHeaders().get("Content-Type"); - if (contentTypes != null && !contentTypes.isEmpty()) - contentType = contentTypes.get(0); - if (contentType == null) - throw new ApiException(500, "missing Content-Type in response"); + private ClientResponse getAPIResponse(String path, String method, List queryParams, Object body, Map headerParams, Map formParams, String accept, String contentType, String[] authNames) throws ApiException { - String body; - if (response.hasEntity()) - body = (String) response.getEntity(String.class); - else - body = ""; - - if (isJsonMime(contentType)) { - return json.deserialize(body, returnType); - } else if (returnType.getType().equals(String.class)) { - // Expecting string, return the raw response body. - return (T) body; - } else { - throw new ApiException( - 500, - "Content type \"" + contentType + "\" is not supported for type: " - + returnType.getType() - ); - } - } - - private ClientResponse getAPIResponse(String path, String method, List queryParams, Object body, byte[] binaryBody, Map headerParams, Map formParams, String accept, String contentType, String[] authNames) throws ApiException { - - if (body != null && binaryBody != null){ - throw new ApiException(500, "either body or binaryBody must be null"); + if (body != null && !formParams.isEmpty()){ + throw new ApiException(500, "Cannot have body and form params"); } updateParamsForAuth(authNames, queryParams, headerParams); @@ -483,61 +467,16 @@ public class ApiClient { } } - String encodedFormParams = null; - if (contentType.startsWith("multipart/form-data")) { - FormDataMultiPart mp = new FormDataMultiPart(); - for (Entry param: formParams.entrySet()) { - if (param.getValue() instanceof File) { - File file = (File) param.getValue(); - mp.bodyPart(new FileDataBodyPart(param.getKey(), file, MediaType.MULTIPART_FORM_DATA_TYPE)); - } else { - mp.field(param.getKey(), parameterToString(param.getValue()), MediaType.MULTIPART_FORM_DATA_TYPE); - } - } - body = mp; - } else if (contentType.startsWith("application/x-www-form-urlencoded")) { - encodedFormParams = this.getXWWWFormUrlencodedParams(formParams); - } - ClientResponse response = null; if ("GET".equals(method)) { response = (ClientResponse) builder.get(ClientResponse.class); } else if ("POST".equals(method)) { - if (encodedFormParams != null) { - response = builder.type(contentType).post(ClientResponse.class, encodedFormParams); - } else if (body == null) { - if(binaryBody == null) - response = builder.post(ClientResponse.class, null); - else - response = builder.type(contentType).post(ClientResponse.class, binaryBody); - } else if (body instanceof FormDataMultiPart) { - response = builder.type(contentType).post(ClientResponse.class, body); - } else { - response = builder.type(contentType).post(ClientResponse.class, serialize(body, contentType)); - } + response = builder.type(contentType).post(ClientResponse.class, serialize(body, contentType, formParams)); } else if ("PUT".equals(method)) { - if (encodedFormParams != null) { - response = builder.type(contentType).put(ClientResponse.class, encodedFormParams); - } else if(body == null) { - if(binaryBody == null) - response = builder.put(ClientResponse.class, null); - else - response = builder.type(contentType).put(ClientResponse.class, binaryBody); - } else { - response = builder.type(contentType).put(ClientResponse.class, serialize(body, contentType)); - } + response = builder.type(contentType).put(ClientResponse.class, serialize(body, contentType, formParams)); } else if ("DELETE".equals(method)) { - if (encodedFormParams != null) { - response = builder.type(contentType).delete(ClientResponse.class, encodedFormParams); - } else if(body == null) { - if(binaryBody == null) - response = builder.delete(ClientResponse.class); - else - response = builder.type(contentType).delete(ClientResponse.class, binaryBody); - } else { - response = builder.type(contentType).delete(ClientResponse.class, serialize(body, contentType)); - } + response = builder.type(contentType).delete(ClientResponse.class, serialize(body, contentType, formParams)); } else { throw new ApiException(500, "unknown method type " + method); } @@ -551,7 +490,6 @@ public class ApiClient { * @param method The request method, one of "GET", "POST", "PUT", and "DELETE" * @param queryParams The query parameters * @param body The request body object - if it is not binary, otherwise null - * @param binaryBody The request body object - if it is binary, otherwise null * @param headerParams The header parameters * @param formParams The form parameters * @param accept The request's Accept header @@ -559,9 +497,9 @@ public class ApiClient { * @param authNames The authentications to apply * @return The response body in type of string */ - public T invokeAPI(String path, String method, List queryParams, Object body, byte[] binaryBody, Map headerParams, Map formParams, String accept, String contentType, String[] authNames, TypeRef returnType) throws ApiException { + public T invokeAPI(String path, String method, List queryParams, Object body, Map headerParams, Map formParams, String accept, String contentType, String[] authNames, GenericType returnType) throws ApiException { - ClientResponse response = getAPIResponse(path, method, queryParams, body, binaryBody, headerParams, formParams, accept, contentType, authNames); + ClientResponse response = getAPIResponse(path, method, queryParams, body, headerParams, formParams, accept, contentType, authNames); statusCode = response.getStatusInfo().getStatusCode(); responseHeaders = response.getHeaders(); @@ -572,13 +510,13 @@ public class ApiClient { if (returnType == null) return null; else - return deserialize(response, returnType); + return response.getEntity(returnType); } else { String message = "error"; String respBody = null; if (response.hasEntity()) { try { - respBody = String.valueOf(response.getEntity(String.class)); + respBody = response.getEntity(String.class); message = respBody; } catch (RuntimeException e) { // e.printStackTrace(); @@ -591,58 +529,6 @@ public class ApiClient { respBody); } } - /** - * Invoke API by sending HTTP request with the given options - return binary result - * - * @param path The sub-path of the HTTP URL - * @param method The request method, one of "GET", "POST", "PUT", and "DELETE" - * @param queryParams The query parameters - * @param body The request body object - if it is not binary, otherwise null - * @param binaryBody The request body object - if it is binary, otherwise null - * @param headerParams The header parameters - * @param formParams The form parameters - * @param accept The request's Accept header - * @param contentType The request's Content-Type header - * @param authNames The authentications to apply - * @return The response body in type of string - */ - public byte[] invokeBinaryAPI(String path, String method, List queryParams, Object body, byte[] binaryBody, Map headerParams, Map formParams, String accept, String contentType, String[]authNames) throws ApiException { - - ClientResponse response = getAPIResponse(path, method, queryParams, body, binaryBody, headerParams, formParams, accept, contentType, authNames); - - if(response.getStatusInfo() == ClientResponse.Status.NO_CONTENT) { - return null; - } - else if(response.getStatusInfo().getFamily() == Family.SUCCESSFUL) { - if(response.hasEntity()) { - DataInputStream stream = new DataInputStream(response.getEntityInputStream()); - byte[] data = new byte[response.getLength()]; - try { - stream.readFully(data); - } catch (IOException ex) { - throw new ApiException(500, "Error obtaining binary response data"); - } - return data; - } - else { - return new byte[0]; - } - } - else { - String message = "error"; - if(response.hasEntity()) { - try{ - message = String.valueOf(response.getEntity(String.class)); - } - catch (RuntimeException e) { - // e.printStackTrace(); - } - } - throw new ApiException( - response.getStatusInfo().getStatusCode(), - message); - } - } /** * Update query and header parameters based on authentication settings. @@ -664,7 +550,6 @@ public class ApiClient { StringBuilder formParamBuilder = new StringBuilder(); for (Entry param : formParams.entrySet()) { - String keyStr = param.getKey(); String valueStr = parameterToString(param.getValue()); try { formParamBuilder.append(URLEncoder.encode(param.getKey(), "utf8")) @@ -689,7 +574,11 @@ public class ApiClient { */ private Client getClient() { if(!hostMap.containsKey(basePath)) { - Client client = Client.create(); + // Add the JSON serialization support to Jersey + JacksonJsonProvider jsonProvider = new JacksonJsonProvider(mapper); + DefaultClientConfig conf = new DefaultClientConfig(); + conf.getSingletons().add(jsonProvider); + Client client = Client.create(conf); if (debugging) client.addFilter(new LoggingFilter()); hostMap.put(basePath, client); 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 deleted file mode 100644 index e26cf13bee5..00000000000 --- a/samples/client/petstore/java/default/src/main/java/io/swagger/client/JSON.java +++ /dev/null @@ -1,64 +0,0 @@ -package io.swagger.client; - -import com.fasterxml.jackson.annotation.*; -import com.fasterxml.jackson.databind.*; -import com.fasterxml.jackson.datatype.joda.*; - -import java.text.DateFormat; - -import java.io.IOException; - -@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-11-29T00:18:25.953+08:00") -public class JSON { - private ObjectMapper mapper; - - public JSON() { - mapper = new ObjectMapper(); - mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL); - 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()); - } - - /** - * Set the date format for JSON (de)serialization with Date properties. - */ - public void setDateFormat(DateFormat dateFormat) { - mapper.setDateFormat(dateFormat); - } - - /** - * Serialize the given Java object into JSON string. - */ - public String serialize(Object obj) throws ApiException { - try { - if (obj != null) - return mapper.writeValueAsString(obj); - else - return null; - } catch (Exception e) { - throw new ApiException(400, e.getMessage()); - } - } - - /** - * Deserialize the given JSON string to Java object. - * - * @param body The JSON string - * @param returnType The type to deserialize inot - * @return The deserialized Java object - */ - public T deserialize(String body, TypeRef returnType) throws ApiException { - JavaType javaType = mapper.constructType(returnType.getType()); - try { - return mapper.readValue(body, javaType); - } catch (IOException e) { - if (returnType.getType().equals(String.class)) - return (T) body; - else - throw new ApiException(500, e.getMessage(), null, body); - } - } -} diff --git a/samples/client/petstore/java/default/src/main/java/io/swagger/client/TypeRef.java b/samples/client/petstore/java/default/src/main/java/io/swagger/client/TypeRef.java deleted file mode 100644 index 41677e9d557..00000000000 --- a/samples/client/petstore/java/default/src/main/java/io/swagger/client/TypeRef.java +++ /dev/null @@ -1,26 +0,0 @@ -package io.swagger.client; - -import java.lang.reflect.ParameterizedType; -import java.lang.reflect.Type; - -@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-11-29T00:18:25.953+08:00") -public class TypeRef { - private final Type type; - - public TypeRef() { - this.type = getGenericType(getClass()); - } - - private static Type getGenericType(Class klass) { - Type superclass = klass.getGenericSuperclass(); - if (superclass instanceof Class) { - throw new RuntimeException("No type parameter provided"); - } - ParameterizedType parameterized = (ParameterizedType) superclass; - return parameterized.getActualTypeArguments()[0]; - } - - public Type getType() { - return type; - } -} diff --git a/samples/client/petstore/java/default/src/main/java/io/swagger/client/api/PetApi.java b/samples/client/petstore/java/default/src/main/java/io/swagger/client/api/PetApi.java index 080d4aa1dab..9f07449e6f8 100644 --- a/samples/client/petstore/java/default/src/main/java/io/swagger/client/api/PetApi.java +++ b/samples/client/petstore/java/default/src/main/java/io/swagger/client/api/PetApi.java @@ -1,17 +1,18 @@ package io.swagger.client.api; +import com.sun.jersey.api.client.GenericType; + import io.swagger.client.ApiException; import io.swagger.client.ApiClient; import io.swagger.client.Configuration; import io.swagger.client.Pair; -import io.swagger.client.TypeRef; import io.swagger.client.model.Pet; import java.io.File; import java.util.*; -@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-11-29T00:18:25.953+08:00") +@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-12-09T22:51:50.471-05:00") public class PetApi { private ApiClient apiClient; @@ -38,9 +39,8 @@ public class PetApi { * @param body Pet object that needs to be added to the store * @return void */ - public void updatePet (Pet body) throws ApiException { + public void updatePet(Pet body) throws ApiException { Object postBody = body; - byte[] postBinaryBody = null; // create path and map variables String path = "/pet".replaceAll("\\{format\\}","json"); @@ -69,14 +69,8 @@ public class PetApi { String[] authNames = new String[] { "petstore_auth" }; - + apiClient.invokeAPI(path, "PUT", queryParams, postBody, headerParams, formParams, accept, contentType, authNames, null); - - apiClient.invokeAPI(path, "PUT", queryParams, postBody, postBinaryBody, headerParams, formParams, accept, contentType, authNames, null); - - - - } /** @@ -85,9 +79,8 @@ public class PetApi { * @param body Pet object that needs to be added to the store * @return void */ - public void addPet (Pet body) throws ApiException { + public void addPet(Pet body) throws ApiException { Object postBody = body; - byte[] postBinaryBody = null; // create path and map variables String path = "/pet".replaceAll("\\{format\\}","json"); @@ -116,14 +109,8 @@ public class PetApi { String[] authNames = new String[] { "petstore_auth" }; - + apiClient.invokeAPI(path, "POST", queryParams, postBody, headerParams, formParams, accept, contentType, authNames, null); - - apiClient.invokeAPI(path, "POST", queryParams, postBody, postBinaryBody, headerParams, formParams, accept, contentType, authNames, null); - - - - } /** @@ -132,9 +119,8 @@ public class PetApi { * @param status Status values that need to be considered for filter * @return List */ - public List findPetsByStatus (List status) throws ApiException { + public List findPetsByStatus(List status) throws ApiException { Object postBody = null; - byte[] postBinaryBody = null; // create path and map variables String path = "/pet/findByStatus".replaceAll("\\{format\\}","json"); @@ -165,15 +151,9 @@ public class PetApi { String[] authNames = new String[] { "petstore_auth" }; - + GenericType> returnType = new GenericType>() {}; + return apiClient.invokeAPI(path, "GET", queryParams, postBody, headerParams, formParams, accept, contentType, authNames, returnType); - - TypeRef returnType = new TypeRef>() {}; - return apiClient.invokeAPI(path, "GET", queryParams, postBody, postBinaryBody, headerParams, formParams, accept, contentType, authNames, returnType); - - - - } /** @@ -182,9 +162,8 @@ public class PetApi { * @param tags Tags to filter by * @return List */ - public List findPetsByTags (List tags) throws ApiException { + public List findPetsByTags(List tags) throws ApiException { Object postBody = null; - byte[] postBinaryBody = null; // create path and map variables String path = "/pet/findByTags".replaceAll("\\{format\\}","json"); @@ -215,15 +194,9 @@ public class PetApi { String[] authNames = new String[] { "petstore_auth" }; - + GenericType> returnType = new GenericType>() {}; + return apiClient.invokeAPI(path, "GET", queryParams, postBody, headerParams, formParams, accept, contentType, authNames, returnType); - - TypeRef returnType = new TypeRef>() {}; - return apiClient.invokeAPI(path, "GET", queryParams, postBody, postBinaryBody, headerParams, formParams, accept, contentType, authNames, returnType); - - - - } /** @@ -232,9 +205,8 @@ public class PetApi { * @param petId ID of pet that needs to be fetched * @return Pet */ - public Pet getPetById (Long petId) throws ApiException { + public Pet getPetById(Long petId) throws ApiException { Object postBody = null; - byte[] postBinaryBody = null; // verify the required parameter 'petId' is set if (petId == null) { @@ -269,15 +241,9 @@ public class PetApi { String[] authNames = new String[] { "api_key" }; - + GenericType returnType = new GenericType() {}; + return apiClient.invokeAPI(path, "GET", queryParams, postBody, headerParams, formParams, accept, contentType, authNames, returnType); - - TypeRef returnType = new TypeRef() {}; - return apiClient.invokeAPI(path, "GET", queryParams, postBody, postBinaryBody, headerParams, formParams, accept, contentType, authNames, returnType); - - - - } /** @@ -288,9 +254,8 @@ public class PetApi { * @param status Updated status of the pet * @return void */ - public void updatePetWithForm (String petId, String name, String status) throws ApiException { + public void updatePetWithForm(String petId, String name, String status) throws ApiException { Object postBody = null; - byte[] postBinaryBody = null; // verify the required parameter 'petId' is set if (petId == null) { @@ -329,14 +294,8 @@ public class PetApi { String[] authNames = new String[] { "petstore_auth" }; - + apiClient.invokeAPI(path, "POST", queryParams, postBody, headerParams, formParams, accept, contentType, authNames, null); - - apiClient.invokeAPI(path, "POST", queryParams, postBody, postBinaryBody, headerParams, formParams, accept, contentType, authNames, null); - - - - } /** @@ -346,9 +305,8 @@ public class PetApi { * @param apiKey * @return void */ - public void deletePet (Long petId, String apiKey) throws ApiException { + public void deletePet(Long petId, String apiKey) throws ApiException { Object postBody = null; - byte[] postBinaryBody = null; // verify the required parameter 'petId' is set if (petId == null) { @@ -385,14 +343,8 @@ public class PetApi { String[] authNames = new String[] { "petstore_auth" }; - + apiClient.invokeAPI(path, "DELETE", queryParams, postBody, headerParams, formParams, accept, contentType, authNames, null); - - apiClient.invokeAPI(path, "DELETE", queryParams, postBody, postBinaryBody, headerParams, formParams, accept, contentType, authNames, null); - - - - } /** @@ -403,9 +355,8 @@ public class PetApi { * @param file file to upload * @return void */ - public void uploadFile (Long petId, String additionalMetadata, File file) throws ApiException { + public void uploadFile(Long petId, String additionalMetadata, File file) throws ApiException { Object postBody = null; - byte[] postBinaryBody = null; // verify the required parameter 'petId' is set if (petId == null) { @@ -444,14 +395,8 @@ public class PetApi { String[] authNames = new String[] { "petstore_auth" }; - + apiClient.invokeAPI(path, "POST", queryParams, postBody, headerParams, formParams, accept, contentType, authNames, null); - - apiClient.invokeAPI(path, "POST", queryParams, postBody, postBinaryBody, headerParams, formParams, accept, contentType, authNames, null); - - - - } } diff --git a/samples/client/petstore/java/default/src/main/java/io/swagger/client/api/StoreApi.java b/samples/client/petstore/java/default/src/main/java/io/swagger/client/api/StoreApi.java index b7ce75e5532..f6f3b84708e 100644 --- a/samples/client/petstore/java/default/src/main/java/io/swagger/client/api/StoreApi.java +++ b/samples/client/petstore/java/default/src/main/java/io/swagger/client/api/StoreApi.java @@ -1,17 +1,18 @@ package io.swagger.client.api; +import com.sun.jersey.api.client.GenericType; + import io.swagger.client.ApiException; import io.swagger.client.ApiClient; import io.swagger.client.Configuration; import io.swagger.client.Pair; -import io.swagger.client.TypeRef; import java.util.Map; import io.swagger.client.model.Order; import java.util.*; -@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-11-29T00:18:25.953+08:00") +@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-12-09T22:51:50.471-05:00") public class StoreApi { private ApiClient apiClient; @@ -37,9 +38,8 @@ public class StoreApi { * Returns a map of status codes to quantities * @return Map */ - public Map getInventory () throws ApiException { + public Map getInventory() throws ApiException { Object postBody = null; - byte[] postBinaryBody = null; // create path and map variables String path = "/store/inventory".replaceAll("\\{format\\}","json"); @@ -68,15 +68,9 @@ public class StoreApi { String[] authNames = new String[] { "api_key" }; - + GenericType> returnType = new GenericType>() {}; + return apiClient.invokeAPI(path, "GET", queryParams, postBody, headerParams, formParams, accept, contentType, authNames, returnType); - - TypeRef returnType = new TypeRef>() {}; - return apiClient.invokeAPI(path, "GET", queryParams, postBody, postBinaryBody, headerParams, formParams, accept, contentType, authNames, returnType); - - - - } /** @@ -85,9 +79,8 @@ public class StoreApi { * @param body order placed for purchasing the pet * @return Order */ - public Order placeOrder (Order body) throws ApiException { + public Order placeOrder(Order body) throws ApiException { Object postBody = body; - byte[] postBinaryBody = null; // create path and map variables String path = "/store/order".replaceAll("\\{format\\}","json"); @@ -116,15 +109,9 @@ public class StoreApi { String[] authNames = new String[] { }; - + GenericType returnType = new GenericType() {}; + return apiClient.invokeAPI(path, "POST", queryParams, postBody, headerParams, formParams, accept, contentType, authNames, returnType); - - TypeRef returnType = new TypeRef() {}; - return apiClient.invokeAPI(path, "POST", queryParams, postBody, postBinaryBody, headerParams, formParams, accept, contentType, authNames, returnType); - - - - } /** @@ -133,9 +120,8 @@ public class StoreApi { * @param orderId ID of pet that needs to be fetched * @return Order */ - public Order getOrderById (String orderId) throws ApiException { + public Order getOrderById(String orderId) throws ApiException { Object postBody = null; - byte[] postBinaryBody = null; // verify the required parameter 'orderId' is set if (orderId == null) { @@ -170,15 +156,9 @@ public class StoreApi { String[] authNames = new String[] { }; - + GenericType returnType = new GenericType() {}; + return apiClient.invokeAPI(path, "GET", queryParams, postBody, headerParams, formParams, accept, contentType, authNames, returnType); - - TypeRef returnType = new TypeRef() {}; - return apiClient.invokeAPI(path, "GET", queryParams, postBody, postBinaryBody, headerParams, formParams, accept, contentType, authNames, returnType); - - - - } /** @@ -187,9 +167,8 @@ public class StoreApi { * @param orderId ID of the order that needs to be deleted * @return void */ - public void deleteOrder (String orderId) throws ApiException { + public void deleteOrder(String orderId) throws ApiException { Object postBody = null; - byte[] postBinaryBody = null; // verify the required parameter 'orderId' is set if (orderId == null) { @@ -224,14 +203,8 @@ public class StoreApi { String[] authNames = new String[] { }; - + apiClient.invokeAPI(path, "DELETE", queryParams, postBody, headerParams, formParams, accept, contentType, authNames, null); - - apiClient.invokeAPI(path, "DELETE", queryParams, postBody, postBinaryBody, headerParams, formParams, accept, contentType, authNames, null); - - - - } } diff --git a/samples/client/petstore/java/default/src/main/java/io/swagger/client/api/UserApi.java b/samples/client/petstore/java/default/src/main/java/io/swagger/client/api/UserApi.java index 9a4f4086d34..41b273b20b8 100644 --- a/samples/client/petstore/java/default/src/main/java/io/swagger/client/api/UserApi.java +++ b/samples/client/petstore/java/default/src/main/java/io/swagger/client/api/UserApi.java @@ -1,17 +1,18 @@ package io.swagger.client.api; +import com.sun.jersey.api.client.GenericType; + import io.swagger.client.ApiException; import io.swagger.client.ApiClient; import io.swagger.client.Configuration; import io.swagger.client.Pair; -import io.swagger.client.TypeRef; import io.swagger.client.model.User; import java.util.*; import java.util.*; -@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-11-29T00:18:25.953+08:00") +@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-12-09T22:51:50.471-05:00") public class UserApi { private ApiClient apiClient; @@ -38,9 +39,8 @@ public class UserApi { * @param body Created user object * @return void */ - public void createUser (User body) throws ApiException { + public void createUser(User body) throws ApiException { Object postBody = body; - byte[] postBinaryBody = null; // create path and map variables String path = "/user".replaceAll("\\{format\\}","json"); @@ -69,14 +69,8 @@ public class UserApi { String[] authNames = new String[] { }; - + apiClient.invokeAPI(path, "POST", queryParams, postBody, headerParams, formParams, accept, contentType, authNames, null); - - apiClient.invokeAPI(path, "POST", queryParams, postBody, postBinaryBody, headerParams, formParams, accept, contentType, authNames, null); - - - - } /** @@ -85,9 +79,8 @@ public class UserApi { * @param body List of user object * @return void */ - public void createUsersWithArrayInput (List body) throws ApiException { + public void createUsersWithArrayInput(List body) throws ApiException { Object postBody = body; - byte[] postBinaryBody = null; // create path and map variables String path = "/user/createWithArray".replaceAll("\\{format\\}","json"); @@ -116,14 +109,8 @@ public class UserApi { String[] authNames = new String[] { }; - + apiClient.invokeAPI(path, "POST", queryParams, postBody, headerParams, formParams, accept, contentType, authNames, null); - - apiClient.invokeAPI(path, "POST", queryParams, postBody, postBinaryBody, headerParams, formParams, accept, contentType, authNames, null); - - - - } /** @@ -132,9 +119,8 @@ public class UserApi { * @param body List of user object * @return void */ - public void createUsersWithListInput (List body) throws ApiException { + public void createUsersWithListInput(List body) throws ApiException { Object postBody = body; - byte[] postBinaryBody = null; // create path and map variables String path = "/user/createWithList".replaceAll("\\{format\\}","json"); @@ -163,14 +149,8 @@ public class UserApi { String[] authNames = new String[] { }; - + apiClient.invokeAPI(path, "POST", queryParams, postBody, headerParams, formParams, accept, contentType, authNames, null); - - apiClient.invokeAPI(path, "POST", queryParams, postBody, postBinaryBody, headerParams, formParams, accept, contentType, authNames, null); - - - - } /** @@ -180,9 +160,8 @@ public class UserApi { * @param password The password for login in clear text * @return String */ - public String loginUser (String username, String password) throws ApiException { + public String loginUser(String username, String password) throws ApiException { Object postBody = null; - byte[] postBinaryBody = null; // create path and map variables String path = "/user/login".replaceAll("\\{format\\}","json"); @@ -215,15 +194,9 @@ public class UserApi { String[] authNames = new String[] { }; - + GenericType returnType = new GenericType() {}; + return apiClient.invokeAPI(path, "GET", queryParams, postBody, headerParams, formParams, accept, contentType, authNames, returnType); - - TypeRef returnType = new TypeRef() {}; - return apiClient.invokeAPI(path, "GET", queryParams, postBody, postBinaryBody, headerParams, formParams, accept, contentType, authNames, returnType); - - - - } /** @@ -231,9 +204,8 @@ public class UserApi { * * @return void */ - public void logoutUser () throws ApiException { + public void logoutUser() throws ApiException { Object postBody = null; - byte[] postBinaryBody = null; // create path and map variables String path = "/user/logout".replaceAll("\\{format\\}","json"); @@ -262,14 +234,8 @@ public class UserApi { String[] authNames = new String[] { }; - + apiClient.invokeAPI(path, "GET", queryParams, postBody, headerParams, formParams, accept, contentType, authNames, null); - - apiClient.invokeAPI(path, "GET", queryParams, postBody, postBinaryBody, headerParams, formParams, accept, contentType, authNames, null); - - - - } /** @@ -278,9 +244,8 @@ public class UserApi { * @param username The name that needs to be fetched. Use user1 for testing. * @return User */ - public User getUserByName (String username) throws ApiException { + public User getUserByName(String username) throws ApiException { Object postBody = null; - byte[] postBinaryBody = null; // verify the required parameter 'username' is set if (username == null) { @@ -315,15 +280,9 @@ public class UserApi { String[] authNames = new String[] { }; - + GenericType returnType = new GenericType() {}; + return apiClient.invokeAPI(path, "GET", queryParams, postBody, headerParams, formParams, accept, contentType, authNames, returnType); - - TypeRef returnType = new TypeRef() {}; - return apiClient.invokeAPI(path, "GET", queryParams, postBody, postBinaryBody, headerParams, formParams, accept, contentType, authNames, returnType); - - - - } /** @@ -333,9 +292,8 @@ public class UserApi { * @param body Updated user object * @return void */ - public void updateUser (String username, User body) throws ApiException { + public void updateUser(String username, User body) throws ApiException { Object postBody = body; - byte[] postBinaryBody = null; // verify the required parameter 'username' is set if (username == null) { @@ -370,14 +328,8 @@ public class UserApi { String[] authNames = new String[] { }; - + apiClient.invokeAPI(path, "PUT", queryParams, postBody, headerParams, formParams, accept, contentType, authNames, null); - - apiClient.invokeAPI(path, "PUT", queryParams, postBody, postBinaryBody, headerParams, formParams, accept, contentType, authNames, null); - - - - } /** @@ -386,9 +338,8 @@ public class UserApi { * @param username The name that needs to be deleted * @return void */ - public void deleteUser (String username) throws ApiException { + public void deleteUser(String username) throws ApiException { Object postBody = null; - byte[] postBinaryBody = null; // verify the required parameter 'username' is set if (username == null) { @@ -423,14 +374,8 @@ public class UserApi { String[] authNames = new String[] { }; - + apiClient.invokeAPI(path, "DELETE", queryParams, postBody, headerParams, formParams, accept, contentType, authNames, null); - - apiClient.invokeAPI(path, "DELETE", queryParams, postBody, postBinaryBody, headerParams, formParams, accept, contentType, authNames, null); - - - - } } diff --git a/samples/client/petstore/java/default/src/test/java/io/swagger/client/JSONTest.java b/samples/client/petstore/java/default/src/test/java/io/swagger/client/JSONTest.java deleted file mode 100644 index 1250a135078..00000000000 --- a/samples/client/petstore/java/default/src/test/java/io/swagger/client/JSONTest.java +++ /dev/null @@ -1,52 +0,0 @@ -package io.swagger.client; - -import io.swagger.client.model.Order; - -import java.lang.Exception; -import java.text.DateFormat; -import java.text.ParseException; -import java.text.SimpleDateFormat; -import java.util.*; -import java.util.TimeZone; - -import org.junit.*; -import static org.junit.Assert.*; - - -public class JSONTest { - JSON json = null; - Order order = null; - - @Before - public void setup() { - json = new JSON(); - order = new Order(); - } - - @Test - public void testDefaultDate() throws Exception { - final DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSXXX"); - dateFormat.setTimeZone(TimeZone.getTimeZone("UTC")); - final String dateStr = "2015-11-07T14:11:05.267Z"; - order.setShipDate(dateFormat.parse(dateStr)); - - String str = json.serialize(order); - TypeRef typeRef = new TypeRef() { }; - Order o = json.deserialize(str, typeRef); - assertEquals(dateStr, dateFormat.format(o.getShipDate())); - } - - @Test - public void testCustomDate() throws Exception { - final DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssXXX"); - dateFormat.setTimeZone(TimeZone.getTimeZone("GMT-2")); - final String dateStr = "2015-11-07T14:11:05-02:00"; - order.setShipDate(dateFormat.parse(dateStr)); - - json.setDateFormat(dateFormat); - String str = json.serialize(order); - TypeRef typeRef = new TypeRef() { }; - Order o = json.deserialize(str, typeRef); - assertEquals(dateStr, dateFormat.format(o.getShipDate())); - } -} \ No newline at end of file From 0f67be55907323d80d1c2600ba5e7fc31f27a2a1 Mon Sep 17 00:00:00 2001 From: evigeant Date: Tue, 8 Dec 2015 22:23:27 -0500 Subject: [PATCH 173/211] Simplified Jersey2 java client by letting Jersey do most serialization and deserialization --- .../Java/libraries/jersey2/ApiClient.mustache | 97 +++++++------------ .../Java/libraries/jersey2/JSON.mustache | 36 +++++++ .../Java/libraries/jersey2/api.mustache | 5 +- .../Java/libraries/jersey2/pom.mustache | 7 +- 4 files changed, 79 insertions(+), 66 deletions(-) create mode 100644 modules/swagger-codegen/src/main/resources/Java/libraries/jersey2/JSON.mustache 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 4f08158ab75..f482b8c34d4 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 @@ -6,6 +6,7 @@ import javax.ws.rs.client.Entity; import javax.ws.rs.client.Invocation; import javax.ws.rs.client.WebTarget; import javax.ws.rs.core.Form; +import javax.ws.rs.core.GenericType; import javax.ws.rs.core.MediaType; import javax.ws.rs.core.Response; import javax.ws.rs.core.Response.Status; @@ -29,13 +30,11 @@ import java.util.TimeZone; import java.net.URLEncoder; -import java.io.IOException; import java.io.File; import java.io.UnsupportedEncodingException; import java.text.DateFormat; import java.text.SimpleDateFormat; -import java.text.ParseException; import {{invokerPackage}}.auth.Authentication; import {{invokerPackage}}.auth.HttpBasicAuth; @@ -412,18 +411,39 @@ public class ApiClient { * Serialize the given Java object into string entity according the given * Content-Type (only JSON is supported for now). */ - public Entity serialize(Object obj, String contentType) throws ApiException { - if (isJsonMime(contentType)) { - return Entity.json(json.serialize(obj)); + public Entity serialize(Object obj, Map formParams, String contentType) throws ApiException { + Entity entity = null; + if (contentType.startsWith("multipart/form-data")) { + MultiPart multiPart = new MultiPart(); + for (Entry param: formParams.entrySet()) { + if (param.getValue() instanceof File) { + File file = (File) param.getValue(); + FormDataContentDisposition contentDisp = FormDataContentDisposition.name(param.getKey()) + .fileName(file.getName()).size(file.length()).build(); + multiPart.bodyPart(new FormDataBodyPart(contentDisp, file, MediaType.APPLICATION_OCTET_STREAM_TYPE)); + } else { + FormDataContentDisposition contentDisp = FormDataContentDisposition.name(param.getKey()).build(); + multiPart.bodyPart(new FormDataBodyPart(contentDisp, parameterToString(param.getValue()))); + } + } + entity = Entity.entity(multiPart, MediaType.MULTIPART_FORM_DATA_TYPE); + } else if (contentType.startsWith("application/x-www-form-urlencoded")) { + Form form = new Form(); + for (Entry param: formParams.entrySet()) { + form.param(param.getKey(), parameterToString(param.getValue())); + } + entity = Entity.entity(form, MediaType.APPLICATION_FORM_URLENCODED_TYPE); } else { - throw new ApiException(400, "can not serialize object into Content-Type: " + contentType); + // We let jersey handle the serialization + entity = Entity.entity(obj, contentType); } + return entity; } /** * Deserialize response body to Java object according to the Content-Type. */ - public T deserialize(Response response, TypeRef returnType) throws ApiException { + public T deserialize(Response response, GenericType returnType) throws ApiException { String contentType = null; List contentTypes = response.getHeaders().get("Content-Type"); if (contentTypes != null && !contentTypes.isEmpty()) @@ -431,24 +451,7 @@ public class ApiClient { if (contentType == null) throw new ApiException(500, "missing Content-Type in response"); - String body; - if (response.hasEntity()) - body = (String) response.readEntity(String.class); - else - body = ""; - - if (isJsonMime(contentType)) { - return json.deserialize(body, returnType); - } else if (returnType.getType().equals(String.class)) { - // Expecting string, return the raw response body. - return (T) body; - } else { - throw new ApiException( - 500, - "Content type \"" + contentType + "\" is not supported for type: " - + returnType.getType() - ); - } + return response.readEntity(returnType); } /** @@ -466,7 +469,7 @@ public class ApiClient { * @param returnType The return type into which to deserialize the response * @return The response body in type of string */ - public T invokeAPI(String path, String method, List queryParams, Object body, Map headerParams, Map formParams, String accept, String contentType, String[] authNames, TypeRef returnType) throws ApiException { + public T invokeAPI(String path, String method, List queryParams, Object body, Map headerParams, Map formParams, String accept, String contentType, String[] authNames, GenericType returnType) throws ApiException { updateParamsForAuth(authNames, queryParams, headerParams); WebTarget target = client.target(this.basePath).path(path); @@ -497,50 +500,16 @@ public class ApiClient { } } - Entity formEntity = null; - - if (contentType.startsWith("multipart/form-data")) { - MultiPart multiPart = new MultiPart(); - for (Entry param: formParams.entrySet()) { - if (param.getValue() instanceof File) { - File file = (File) param.getValue(); - FormDataContentDisposition contentDisp = FormDataContentDisposition.name(param.getKey()) - .fileName(file.getName()).size(file.length()).build(); - multiPart.bodyPart(new FormDataBodyPart(contentDisp, file, MediaType.APPLICATION_OCTET_STREAM_TYPE)); - } else { - FormDataContentDisposition contentDisp = FormDataContentDisposition.name(param.getKey()).build(); - multiPart.bodyPart(new FormDataBodyPart(contentDisp, parameterToString(param.getValue()))); - } - } - formEntity = Entity.entity(multiPart, MediaType.MULTIPART_FORM_DATA_TYPE); - } else if (contentType.startsWith("application/x-www-form-urlencoded")) { - Form form = new Form(); - for (Entry param: formParams.entrySet()) { - form.param(param.getKey(), parameterToString(param.getValue())); - } - formEntity = Entity.entity(form, MediaType.APPLICATION_FORM_URLENCODED_TYPE); - } + Entity entity = serialize(body, formParams, contentType); Response response = null; if ("GET".equals(method)) { response = invocationBuilder.get(); } else if ("POST".equals(method)) { - if (formEntity != null) { - response = invocationBuilder.post(formEntity); - } else if (body == null) { - response = invocationBuilder.post(null); - } else { - response = invocationBuilder.post(serialize(body, contentType)); - } + response = invocationBuilder.post(entity); } else if ("PUT".equals(method)) { - if (formEntity != null) { - response = invocationBuilder.put(formEntity); - } else if (body == null) { - response = invocationBuilder.put(null); - } else { - response = invocationBuilder.put(serialize(body, contentType)); - } + response = invocationBuilder.put(entity); } else if ("DELETE".equals(method)) { response = invocationBuilder.delete(); } else { @@ -579,6 +548,8 @@ public class ApiClient { private void buildClient() { final ClientConfig clientConfig = new ClientConfig(); clientConfig.register(MultiPartFeature.class); + clientConfig.register(json); + clientConfig.register(org.glassfish.jersey.jackson.JacksonFeature.class); if (debugging) { clientConfig.register(LoggingFilter.class); } diff --git a/modules/swagger-codegen/src/main/resources/Java/libraries/jersey2/JSON.mustache b/modules/swagger-codegen/src/main/resources/Java/libraries/jersey2/JSON.mustache new file mode 100644 index 00000000000..cc3f1baba14 --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/Java/libraries/jersey2/JSON.mustache @@ -0,0 +1,36 @@ +package {{invokerPackage}}; + +import com.fasterxml.jackson.annotation.*; +import com.fasterxml.jackson.databind.*; +import com.fasterxml.jackson.datatype.joda.*; + +import java.text.DateFormat; + +import javax.ws.rs.ext.ContextResolver; + +{{>generatedAnnotation}} +public class JSON implements ContextResolver { + private ObjectMapper mapper; + + public JSON() { + mapper = new ObjectMapper(); + mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL); + 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()); + } + + /** + * Set the date format for JSON (de)serialization with Date properties. + */ + public void setDateFormat(DateFormat dateFormat) { + mapper.setDateFormat(dateFormat); + } + + @Override + public ObjectMapper getContext(Class type) { + return mapper; + } +} diff --git a/modules/swagger-codegen/src/main/resources/Java/libraries/jersey2/api.mustache b/modules/swagger-codegen/src/main/resources/Java/libraries/jersey2/api.mustache index 0d5c3bcf7f0..f9572359ded 100644 --- a/modules/swagger-codegen/src/main/resources/Java/libraries/jersey2/api.mustache +++ b/modules/swagger-codegen/src/main/resources/Java/libraries/jersey2/api.mustache @@ -4,7 +4,8 @@ import {{invokerPackage}}.ApiException; import {{invokerPackage}}.ApiClient; import {{invokerPackage}}.Configuration; import {{invokerPackage}}.Pair; -import {{invokerPackage}}.TypeRef; + +import javax.ws.rs.core.GenericType; {{#imports}}import {{import}}; {{/imports}} @@ -83,7 +84,7 @@ public class {{classname}} { String[] {{localVariablePrefix}}authNames = new String[] { {{#authMethods}}"{{name}}"{{#hasMore}}, {{/hasMore}}{{/authMethods}} }; {{#returnType}} - TypeRef {{localVariablePrefix}}returnType = new TypeRef<{{{returnType}}}>() {}; + GenericType<{{{returnType}}}> {{localVariablePrefix}}returnType = new GenericType<{{{returnType}}}>() {}; return {{localVariablePrefix}}apiClient.invokeAPI({{localVariablePrefix}}path, "{{httpMethod}}", {{localVariablePrefix}}queryParams, {{localVariablePrefix}}postBody, {{localVariablePrefix}}headerParams, {{localVariablePrefix}}formParams, {{localVariablePrefix}}accept, {{localVariablePrefix}}contentType, {{localVariablePrefix}}authNames, {{localVariablePrefix}}returnType); {{/returnType}}{{^returnType}} {{localVariablePrefix}}apiClient.invokeAPI({{localVariablePrefix}}path, "{{httpMethod}}", {{localVariablePrefix}}queryParams, {{localVariablePrefix}}postBody, {{localVariablePrefix}}headerParams, {{localVariablePrefix}}formParams, {{localVariablePrefix}}accept, {{localVariablePrefix}}contentType, {{localVariablePrefix}}authNames, null); diff --git a/modules/swagger-codegen/src/main/resources/Java/libraries/jersey2/pom.mustache b/modules/swagger-codegen/src/main/resources/Java/libraries/jersey2/pom.mustache index dbe0138aa54..76f2164a1ad 100644 --- a/modules/swagger-codegen/src/main/resources/Java/libraries/jersey2/pom.mustache +++ b/modules/swagger-codegen/src/main/resources/Java/libraries/jersey2/pom.mustache @@ -124,7 +124,12 @@ jersey-media-multipart ${jersey-version} - + + org.glassfish.jersey.media + jersey-media-json-jackson + 2.22.1 + + com.fasterxml.jackson.core From a3024a3553f773da1fe4ebf725ce37046c43313f Mon Sep 17 00:00:00 2001 From: evigeant Date: Wed, 9 Dec 2015 12:37:12 -0500 Subject: [PATCH 174/211] Updated PetStore sample for java client jersey2 --- samples/client/petstore/java/jersey2/pom.xml | 7 +- .../java/io/swagger/client/ApiClient.java | 99 +++++++------------ .../src/main/java/io/swagger/client/JSON.java | 40 ++------ .../main/java/io/swagger/client/TypeRef.java | 26 ----- .../java/io/swagger/client/api/PetApi.java | 27 ++--- .../java/io/swagger/client/api/StoreApi.java | 19 ++-- .../java/io/swagger/client/api/UserApi.java | 25 ++--- .../test/java/io/swagger/client/JSONTest.java | 12 +-- 8 files changed, 88 insertions(+), 167 deletions(-) delete mode 100644 samples/client/petstore/java/jersey2/src/main/java/io/swagger/client/TypeRef.java diff --git a/samples/client/petstore/java/jersey2/pom.xml b/samples/client/petstore/java/jersey2/pom.xml index 0881cc29374..6b0ba2cba08 100644 --- a/samples/client/petstore/java/jersey2/pom.xml +++ b/samples/client/petstore/java/jersey2/pom.xml @@ -124,7 +124,12 @@ jersey-media-multipart ${jersey-version} - + + org.glassfish.jersey.media + jersey-media-json-jackson + 2.22.1 + + com.fasterxml.jackson.core diff --git a/samples/client/petstore/java/jersey2/src/main/java/io/swagger/client/ApiClient.java b/samples/client/petstore/java/jersey2/src/main/java/io/swagger/client/ApiClient.java index c5c74cc11e4..4ca24fbabb0 100644 --- a/samples/client/petstore/java/jersey2/src/main/java/io/swagger/client/ApiClient.java +++ b/samples/client/petstore/java/jersey2/src/main/java/io/swagger/client/ApiClient.java @@ -6,6 +6,7 @@ import javax.ws.rs.client.Entity; import javax.ws.rs.client.Invocation; import javax.ws.rs.client.WebTarget; import javax.ws.rs.core.Form; +import javax.ws.rs.core.GenericType; import javax.ws.rs.core.MediaType; import javax.ws.rs.core.Response; import javax.ws.rs.core.Response.Status; @@ -29,20 +30,18 @@ import java.util.TimeZone; import java.net.URLEncoder; -import java.io.IOException; import java.io.File; import java.io.UnsupportedEncodingException; import java.text.DateFormat; import java.text.SimpleDateFormat; -import java.text.ParseException; import io.swagger.client.auth.Authentication; import io.swagger.client.auth.HttpBasicAuth; import io.swagger.client.auth.ApiKeyAuth; import io.swagger.client.auth.OAuth; -@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-12-09T16:27:55.818+08:00") +@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-12-09T12:31:44.572-05:00") public class ApiClient { private Client client; private Map hostMap = new HashMap(); @@ -411,18 +410,39 @@ public class ApiClient { * Serialize the given Java object into string entity according the given * Content-Type (only JSON is supported for now). */ - public Entity serialize(Object obj, String contentType) throws ApiException { - if (isJsonMime(contentType)) { - return Entity.json(json.serialize(obj)); + public Entity serialize(Object obj, Map formParams, String contentType) throws ApiException { + Entity entity = null; + if (contentType.startsWith("multipart/form-data")) { + MultiPart multiPart = new MultiPart(); + for (Entry param: formParams.entrySet()) { + if (param.getValue() instanceof File) { + File file = (File) param.getValue(); + FormDataContentDisposition contentDisp = FormDataContentDisposition.name(param.getKey()) + .fileName(file.getName()).size(file.length()).build(); + multiPart.bodyPart(new FormDataBodyPart(contentDisp, file, MediaType.APPLICATION_OCTET_STREAM_TYPE)); + } else { + FormDataContentDisposition contentDisp = FormDataContentDisposition.name(param.getKey()).build(); + multiPart.bodyPart(new FormDataBodyPart(contentDisp, parameterToString(param.getValue()))); + } + } + entity = Entity.entity(multiPart, MediaType.MULTIPART_FORM_DATA_TYPE); + } else if (contentType.startsWith("application/x-www-form-urlencoded")) { + Form form = new Form(); + for (Entry param: formParams.entrySet()) { + form.param(param.getKey(), parameterToString(param.getValue())); + } + entity = Entity.entity(form, MediaType.APPLICATION_FORM_URLENCODED_TYPE); } else { - throw new ApiException(400, "can not serialize object into Content-Type: " + contentType); + // We let jersey handle the serialization + entity = Entity.entity(obj, contentType); } + return entity; } /** * Deserialize response body to Java object according to the Content-Type. */ - public T deserialize(Response response, TypeRef returnType) throws ApiException { + public T deserialize(Response response, GenericType returnType) throws ApiException { String contentType = null; List contentTypes = response.getHeaders().get("Content-Type"); if (contentTypes != null && !contentTypes.isEmpty()) @@ -430,24 +450,7 @@ public class ApiClient { if (contentType == null) throw new ApiException(500, "missing Content-Type in response"); - String body; - if (response.hasEntity()) - body = (String) response.readEntity(String.class); - else - body = ""; - - if (isJsonMime(contentType)) { - return json.deserialize(body, returnType); - } else if (returnType.getType().equals(String.class)) { - // Expecting string, return the raw response body. - return (T) body; - } else { - throw new ApiException( - 500, - "Content type \"" + contentType + "\" is not supported for type: " - + returnType.getType() - ); - } + return response.readEntity(returnType); } /** @@ -465,7 +468,7 @@ public class ApiClient { * @param returnType The return type into which to deserialize the response * @return The response body in type of string */ - public T invokeAPI(String path, String method, List queryParams, Object body, Map headerParams, Map formParams, String accept, String contentType, String[] authNames, TypeRef returnType) throws ApiException { + public T invokeAPI(String path, String method, List queryParams, Object body, Map headerParams, Map formParams, String accept, String contentType, String[] authNames, GenericType returnType) throws ApiException { updateParamsForAuth(authNames, queryParams, headerParams); WebTarget target = client.target(this.basePath).path(path); @@ -496,50 +499,16 @@ public class ApiClient { } } - Entity formEntity = null; - - if (contentType.startsWith("multipart/form-data")) { - MultiPart multiPart = new MultiPart(); - for (Entry param: formParams.entrySet()) { - if (param.getValue() instanceof File) { - File file = (File) param.getValue(); - FormDataContentDisposition contentDisp = FormDataContentDisposition.name(param.getKey()) - .fileName(file.getName()).size(file.length()).build(); - multiPart.bodyPart(new FormDataBodyPart(contentDisp, file, MediaType.APPLICATION_OCTET_STREAM_TYPE)); - } else { - FormDataContentDisposition contentDisp = FormDataContentDisposition.name(param.getKey()).build(); - multiPart.bodyPart(new FormDataBodyPart(contentDisp, parameterToString(param.getValue()))); - } - } - formEntity = Entity.entity(multiPart, MediaType.MULTIPART_FORM_DATA_TYPE); - } else if (contentType.startsWith("application/x-www-form-urlencoded")) { - Form form = new Form(); - for (Entry param: formParams.entrySet()) { - form.param(param.getKey(), parameterToString(param.getValue())); - } - formEntity = Entity.entity(form, MediaType.APPLICATION_FORM_URLENCODED_TYPE); - } + Entity entity = serialize(body, formParams, contentType); Response response = null; if ("GET".equals(method)) { response = invocationBuilder.get(); } else if ("POST".equals(method)) { - if (formEntity != null) { - response = invocationBuilder.post(formEntity); - } else if (body == null) { - response = invocationBuilder.post(null); - } else { - response = invocationBuilder.post(serialize(body, contentType)); - } + response = invocationBuilder.post(entity); } else if ("PUT".equals(method)) { - if (formEntity != null) { - response = invocationBuilder.put(formEntity); - } else if (body == null) { - response = invocationBuilder.put(null); - } else { - response = invocationBuilder.put(serialize(body, contentType)); - } + response = invocationBuilder.put(entity); } else if ("DELETE".equals(method)) { response = invocationBuilder.delete(); } else { @@ -578,6 +547,8 @@ public class ApiClient { private void buildClient() { final ClientConfig clientConfig = new ClientConfig(); clientConfig.register(MultiPartFeature.class); + clientConfig.register(json); + clientConfig.register(org.glassfish.jersey.jackson.JacksonFeature.class); if (debugging) { clientConfig.register(LoggingFilter.class); } 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 9116d366308..aab2d27e463 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,10 +6,10 @@ import com.fasterxml.jackson.datatype.joda.*; import java.text.DateFormat; -import java.io.IOException; +import javax.ws.rs.ext.ContextResolver; -@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-11-29T00:18:01.946+08:00") -public class JSON { +@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-12-09T12:31:44.572-05:00") +public class JSON implements ContextResolver { private ObjectMapper mapper; public JSON() { @@ -29,36 +29,8 @@ public class JSON { mapper.setDateFormat(dateFormat); } - /** - * Serialize the given Java object into JSON string. - */ - public String serialize(Object obj) throws ApiException { - try { - if (obj != null) - return mapper.writeValueAsString(obj); - else - return null; - } catch (Exception e) { - throw new ApiException(400, e.getMessage()); - } - } - - /** - * Deserialize the given JSON string to Java object. - * - * @param body The JSON string - * @param returnType The type to deserialize inot - * @return The deserialized Java object - */ - public T deserialize(String body, TypeRef returnType) throws ApiException { - JavaType javaType = mapper.constructType(returnType.getType()); - try { - return mapper.readValue(body, javaType); - } catch (IOException e) { - if (returnType.getType().equals(String.class)) - return (T) body; - else - throw new ApiException(500, e.getMessage(), null, body); - } + @Override + public ObjectMapper getContext(Class type) { + return mapper; } } diff --git a/samples/client/petstore/java/jersey2/src/main/java/io/swagger/client/TypeRef.java b/samples/client/petstore/java/jersey2/src/main/java/io/swagger/client/TypeRef.java deleted file mode 100644 index 9c97f34cd79..00000000000 --- a/samples/client/petstore/java/jersey2/src/main/java/io/swagger/client/TypeRef.java +++ /dev/null @@ -1,26 +0,0 @@ -package io.swagger.client; - -import java.lang.reflect.ParameterizedType; -import java.lang.reflect.Type; - -@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-11-29T00:18:01.946+08:00") -public class TypeRef { - private final Type type; - - public TypeRef() { - this.type = getGenericType(getClass()); - } - - private static Type getGenericType(Class klass) { - Type superclass = klass.getGenericSuperclass(); - if (superclass instanceof Class) { - throw new RuntimeException("No type parameter provided"); - } - ParameterizedType parameterized = (ParameterizedType) superclass; - return parameterized.getActualTypeArguments()[0]; - } - - public Type getType() { - return type; - } -} diff --git a/samples/client/petstore/java/jersey2/src/main/java/io/swagger/client/api/PetApi.java b/samples/client/petstore/java/jersey2/src/main/java/io/swagger/client/api/PetApi.java index a645de12c71..ab33fca7c79 100644 --- a/samples/client/petstore/java/jersey2/src/main/java/io/swagger/client/api/PetApi.java +++ b/samples/client/petstore/java/jersey2/src/main/java/io/swagger/client/api/PetApi.java @@ -4,14 +4,15 @@ import io.swagger.client.ApiException; import io.swagger.client.ApiClient; import io.swagger.client.Configuration; import io.swagger.client.Pair; -import io.swagger.client.TypeRef; + +import javax.ws.rs.core.GenericType; import io.swagger.client.model.Pet; import java.io.File; import java.util.*; -@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-11-29T00:18:01.946+08:00") +@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-12-09T12:31:44.572-05:00") public class PetApi { private ApiClient apiClient; @@ -38,7 +39,7 @@ public class PetApi { * @param body Pet object that needs to be added to the store * @return void */ - public void updatePet (Pet body) throws ApiException { + public void updatePet(Pet body) throws ApiException { Object postBody = body; // create path and map variables @@ -78,7 +79,7 @@ public class PetApi { * @param body Pet object that needs to be added to the store * @return void */ - public void addPet (Pet body) throws ApiException { + public void addPet(Pet body) throws ApiException { Object postBody = body; // create path and map variables @@ -118,7 +119,7 @@ public class PetApi { * @param status Status values that need to be considered for filter * @return List */ - public List findPetsByStatus (List status) throws ApiException { + public List findPetsByStatus(List status) throws ApiException { Object postBody = null; // create path and map variables @@ -150,7 +151,7 @@ public class PetApi { String[] authNames = new String[] { "petstore_auth" }; - TypeRef returnType = new TypeRef>() {}; + GenericType> returnType = new GenericType>() {}; return apiClient.invokeAPI(path, "GET", queryParams, postBody, headerParams, formParams, accept, contentType, authNames, returnType); } @@ -161,7 +162,7 @@ public class PetApi { * @param tags Tags to filter by * @return List */ - public List findPetsByTags (List tags) throws ApiException { + public List findPetsByTags(List tags) throws ApiException { Object postBody = null; // create path and map variables @@ -193,7 +194,7 @@ public class PetApi { String[] authNames = new String[] { "petstore_auth" }; - TypeRef returnType = new TypeRef>() {}; + GenericType> returnType = new GenericType>() {}; return apiClient.invokeAPI(path, "GET", queryParams, postBody, headerParams, formParams, accept, contentType, authNames, returnType); } @@ -204,7 +205,7 @@ public class PetApi { * @param petId ID of pet that needs to be fetched * @return Pet */ - public Pet getPetById (Long petId) throws ApiException { + public Pet getPetById(Long petId) throws ApiException { Object postBody = null; // verify the required parameter 'petId' is set @@ -240,7 +241,7 @@ public class PetApi { String[] authNames = new String[] { "api_key" }; - TypeRef returnType = new TypeRef() {}; + GenericType returnType = new GenericType() {}; return apiClient.invokeAPI(path, "GET", queryParams, postBody, headerParams, formParams, accept, contentType, authNames, returnType); } @@ -253,7 +254,7 @@ public class PetApi { * @param status Updated status of the pet * @return void */ - public void updatePetWithForm (String petId, String name, String status) throws ApiException { + public void updatePetWithForm(String petId, String name, String status) throws ApiException { Object postBody = null; // verify the required parameter 'petId' is set @@ -304,7 +305,7 @@ public class PetApi { * @param apiKey * @return void */ - public void deletePet (Long petId, String apiKey) throws ApiException { + public void deletePet(Long petId, String apiKey) throws ApiException { Object postBody = null; // verify the required parameter 'petId' is set @@ -354,7 +355,7 @@ public class PetApi { * @param file file to upload * @return void */ - public void uploadFile (Long petId, String additionalMetadata, File file) throws ApiException { + public void uploadFile(Long petId, String additionalMetadata, File file) throws ApiException { Object postBody = null; // verify the required parameter 'petId' is set diff --git a/samples/client/petstore/java/jersey2/src/main/java/io/swagger/client/api/StoreApi.java b/samples/client/petstore/java/jersey2/src/main/java/io/swagger/client/api/StoreApi.java index 7253d1909b6..5dfdbcc3e62 100644 --- a/samples/client/petstore/java/jersey2/src/main/java/io/swagger/client/api/StoreApi.java +++ b/samples/client/petstore/java/jersey2/src/main/java/io/swagger/client/api/StoreApi.java @@ -4,14 +4,15 @@ import io.swagger.client.ApiException; import io.swagger.client.ApiClient; import io.swagger.client.Configuration; import io.swagger.client.Pair; -import io.swagger.client.TypeRef; + +import javax.ws.rs.core.GenericType; import java.util.Map; import io.swagger.client.model.Order; import java.util.*; -@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-11-29T00:18:01.946+08:00") +@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-12-09T12:31:44.572-05:00") public class StoreApi { private ApiClient apiClient; @@ -37,7 +38,7 @@ public class StoreApi { * Returns a map of status codes to quantities * @return Map */ - public Map getInventory () throws ApiException { + public Map getInventory() throws ApiException { Object postBody = null; // create path and map variables @@ -67,7 +68,7 @@ public class StoreApi { String[] authNames = new String[] { "api_key" }; - TypeRef returnType = new TypeRef>() {}; + GenericType> returnType = new GenericType>() {}; return apiClient.invokeAPI(path, "GET", queryParams, postBody, headerParams, formParams, accept, contentType, authNames, returnType); } @@ -78,7 +79,7 @@ public class StoreApi { * @param body order placed for purchasing the pet * @return Order */ - public Order placeOrder (Order body) throws ApiException { + public Order placeOrder(Order body) throws ApiException { Object postBody = body; // create path and map variables @@ -108,7 +109,7 @@ public class StoreApi { String[] authNames = new String[] { }; - TypeRef returnType = new TypeRef() {}; + GenericType returnType = new GenericType() {}; return apiClient.invokeAPI(path, "POST", queryParams, postBody, headerParams, formParams, accept, contentType, authNames, returnType); } @@ -119,7 +120,7 @@ public class StoreApi { * @param orderId ID of pet that needs to be fetched * @return Order */ - public Order getOrderById (String orderId) throws ApiException { + public Order getOrderById(String orderId) throws ApiException { Object postBody = null; // verify the required parameter 'orderId' is set @@ -155,7 +156,7 @@ public class StoreApi { String[] authNames = new String[] { }; - TypeRef returnType = new TypeRef() {}; + GenericType returnType = new GenericType() {}; return apiClient.invokeAPI(path, "GET", queryParams, postBody, headerParams, formParams, accept, contentType, authNames, returnType); } @@ -166,7 +167,7 @@ public class StoreApi { * @param orderId ID of the order that needs to be deleted * @return void */ - public void deleteOrder (String orderId) throws ApiException { + public void deleteOrder(String orderId) throws ApiException { Object postBody = null; // verify the required parameter 'orderId' is set diff --git a/samples/client/petstore/java/jersey2/src/main/java/io/swagger/client/api/UserApi.java b/samples/client/petstore/java/jersey2/src/main/java/io/swagger/client/api/UserApi.java index d6115d939fc..0424382e7c3 100644 --- a/samples/client/petstore/java/jersey2/src/main/java/io/swagger/client/api/UserApi.java +++ b/samples/client/petstore/java/jersey2/src/main/java/io/swagger/client/api/UserApi.java @@ -4,14 +4,15 @@ import io.swagger.client.ApiException; import io.swagger.client.ApiClient; import io.swagger.client.Configuration; import io.swagger.client.Pair; -import io.swagger.client.TypeRef; + +import javax.ws.rs.core.GenericType; import io.swagger.client.model.User; import java.util.*; import java.util.*; -@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-11-29T00:18:01.946+08:00") +@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-12-09T12:31:44.572-05:00") public class UserApi { private ApiClient apiClient; @@ -38,7 +39,7 @@ public class UserApi { * @param body Created user object * @return void */ - public void createUser (User body) throws ApiException { + public void createUser(User body) throws ApiException { Object postBody = body; // create path and map variables @@ -78,7 +79,7 @@ public class UserApi { * @param body List of user object * @return void */ - public void createUsersWithArrayInput (List body) throws ApiException { + public void createUsersWithArrayInput(List body) throws ApiException { Object postBody = body; // create path and map variables @@ -118,7 +119,7 @@ public class UserApi { * @param body List of user object * @return void */ - public void createUsersWithListInput (List body) throws ApiException { + public void createUsersWithListInput(List body) throws ApiException { Object postBody = body; // create path and map variables @@ -159,7 +160,7 @@ public class UserApi { * @param password The password for login in clear text * @return String */ - public String loginUser (String username, String password) throws ApiException { + public String loginUser(String username, String password) throws ApiException { Object postBody = null; // create path and map variables @@ -193,7 +194,7 @@ public class UserApi { String[] authNames = new String[] { }; - TypeRef returnType = new TypeRef() {}; + GenericType returnType = new GenericType() {}; return apiClient.invokeAPI(path, "GET", queryParams, postBody, headerParams, formParams, accept, contentType, authNames, returnType); } @@ -203,7 +204,7 @@ public class UserApi { * * @return void */ - public void logoutUser () throws ApiException { + public void logoutUser() throws ApiException { Object postBody = null; // create path and map variables @@ -243,7 +244,7 @@ public class UserApi { * @param username The name that needs to be fetched. Use user1 for testing. * @return User */ - public User getUserByName (String username) throws ApiException { + public User getUserByName(String username) throws ApiException { Object postBody = null; // verify the required parameter 'username' is set @@ -279,7 +280,7 @@ public class UserApi { String[] authNames = new String[] { }; - TypeRef returnType = new TypeRef() {}; + GenericType returnType = new GenericType() {}; return apiClient.invokeAPI(path, "GET", queryParams, postBody, headerParams, formParams, accept, contentType, authNames, returnType); } @@ -291,7 +292,7 @@ public class UserApi { * @param body Updated user object * @return void */ - public void updateUser (String username, User body) throws ApiException { + public void updateUser(String username, User body) throws ApiException { Object postBody = body; // verify the required parameter 'username' is set @@ -337,7 +338,7 @@ public class UserApi { * @param username The name that needs to be deleted * @return void */ - public void deleteUser (String username) throws ApiException { + public void deleteUser(String username) throws ApiException { Object postBody = null; // verify the required parameter 'username' is set diff --git a/samples/client/petstore/java/jersey2/src/test/java/io/swagger/client/JSONTest.java b/samples/client/petstore/java/jersey2/src/test/java/io/swagger/client/JSONTest.java index 1250a135078..f10909ab9e7 100644 --- a/samples/client/petstore/java/jersey2/src/test/java/io/swagger/client/JSONTest.java +++ b/samples/client/petstore/java/jersey2/src/test/java/io/swagger/client/JSONTest.java @@ -4,9 +4,7 @@ import io.swagger.client.model.Order; import java.lang.Exception; import java.text.DateFormat; -import java.text.ParseException; import java.text.SimpleDateFormat; -import java.util.*; import java.util.TimeZone; import org.junit.*; @@ -30,9 +28,8 @@ public class JSONTest { final String dateStr = "2015-11-07T14:11:05.267Z"; order.setShipDate(dateFormat.parse(dateStr)); - String str = json.serialize(order); - TypeRef typeRef = new TypeRef() { }; - Order o = json.deserialize(str, typeRef); + String str = json.getContext(null).writeValueAsString(order); + Order o = json.getContext(null).readValue(str, Order.class); assertEquals(dateStr, dateFormat.format(o.getShipDate())); } @@ -44,9 +41,8 @@ public class JSONTest { order.setShipDate(dateFormat.parse(dateStr)); json.setDateFormat(dateFormat); - String str = json.serialize(order); - TypeRef typeRef = new TypeRef() { }; - Order o = json.deserialize(str, typeRef); + String str = json.getContext(null).writeValueAsString(order); + Order o = json.getContext(null).readValue(str, Order.class); assertEquals(dateStr, dateFormat.format(o.getShipDate())); } } \ No newline at end of file From cf3144d31fe3970c28a0b3debcb4fa30c3c0f651 Mon Sep 17 00:00:00 2001 From: Jeff Kwan Date: Thu, 10 Dec 2015 19:56:10 -0500 Subject: [PATCH 175/211] [C#] Fix date-time serialization to be ISO 8601 Fix the date-time serialization so that it's actually ISO 8601 compliant, currently it generates a date-time string Issue #1705 --- .../src/main/resources/CsharpDotNet2/ApiClient.mustache | 2 +- .../src/main/resources/csharp/ApiClient.mustache | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/swagger-codegen/src/main/resources/CsharpDotNet2/ApiClient.mustache b/modules/swagger-codegen/src/main/resources/CsharpDotNet2/ApiClient.mustache index 8e64db5af31..1d3fa50a284 100644 --- a/modules/swagger-codegen/src/main/resources/CsharpDotNet2/ApiClient.mustache +++ b/modules/swagger-codegen/src/main/resources/CsharpDotNet2/ApiClient.mustache @@ -143,7 +143,7 @@ namespace {{packageName}}.Client public string ParameterToString(object obj) { if (obj is DateTime) - return ((DateTime)obj).ToString ("u"); + return ((DateTime)obj).ToString ("o"); else if (obj is List) return String.Join(",", (obj as List).ToArray()); else diff --git a/modules/swagger-codegen/src/main/resources/csharp/ApiClient.mustache b/modules/swagger-codegen/src/main/resources/csharp/ApiClient.mustache index 5dda78a41a4..cbbcf1e743f 100644 --- a/modules/swagger-codegen/src/main/resources/csharp/ApiClient.mustache +++ b/modules/swagger-codegen/src/main/resources/csharp/ApiClient.mustache @@ -156,7 +156,7 @@ namespace {{packageName}}.Client public string ParameterToString(object obj) { if (obj is DateTime) - return ((DateTime)obj).ToString ("u"); + return ((DateTime)obj).ToString ("o"); else if (obj is IList) { string flattenString = ""; From 23fa84bff8cae86d73a1fbddd05470ff1ed3eab1 Mon Sep 17 00:00:00 2001 From: Jeff Kwan Date: Thu, 10 Dec 2015 20:03:29 -0500 Subject: [PATCH 176/211] Add some reasonable comments to this --- .../src/main/resources/CsharpDotNet2/ApiClient.mustache | 3 +++ .../src/main/resources/csharp/ApiClient.mustache | 3 +++ 2 files changed, 6 insertions(+) diff --git a/modules/swagger-codegen/src/main/resources/CsharpDotNet2/ApiClient.mustache b/modules/swagger-codegen/src/main/resources/CsharpDotNet2/ApiClient.mustache index 1d3fa50a284..6d5e45c186e 100644 --- a/modules/swagger-codegen/src/main/resources/CsharpDotNet2/ApiClient.mustache +++ b/modules/swagger-codegen/src/main/resources/CsharpDotNet2/ApiClient.mustache @@ -143,6 +143,9 @@ namespace {{packageName}}.Client public string ParameterToString(object obj) { if (obj is DateTime) + // Return an ISO 8601 formatted string, also known as a Round-trip date/time pattern + // https://msdn.microsoft.com/en-us/library/az4se3k1(v=vs.110).aspx#Anchor_8 + // For example: 2009-06-15T13:45:30.0000000 return ((DateTime)obj).ToString ("o"); else if (obj is List) return String.Join(",", (obj as List).ToArray()); diff --git a/modules/swagger-codegen/src/main/resources/csharp/ApiClient.mustache b/modules/swagger-codegen/src/main/resources/csharp/ApiClient.mustache index cbbcf1e743f..172e6bc627a 100644 --- a/modules/swagger-codegen/src/main/resources/csharp/ApiClient.mustache +++ b/modules/swagger-codegen/src/main/resources/csharp/ApiClient.mustache @@ -156,6 +156,9 @@ namespace {{packageName}}.Client public string ParameterToString(object obj) { if (obj is DateTime) + // Return an ISO 8601 formatted string, also known as a Round-trip date/time pattern + // https://msdn.microsoft.com/en-us/library/az4se3k1(v=vs.110).aspx#Anchor_8 + // For example: 2009-06-15T13:45:30.0000000 return ((DateTime)obj).ToString ("o"); else if (obj is IList) { From 74d80289dd24e5c7aad799d8b20c8ed47a6b8885 Mon Sep 17 00:00:00 2001 From: Jeff Kwan Date: Thu, 10 Dec 2015 20:28:44 -0500 Subject: [PATCH 177/211] Add a unit test for the datetime serialization --- .../src/main/csharp/IO/Swagger/Client/ApiClient.cs | 5 ++++- .../petstore/csharp/SwaggerClientTest/TestApiClient.cs | 5 +++++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Client/ApiClient.cs b/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Client/ApiClient.cs index 07b31cbf817..1dc978443a3 100644 --- a/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Client/ApiClient.cs +++ b/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Client/ApiClient.cs @@ -156,7 +156,10 @@ namespace IO.Swagger.Client public string ParameterToString(object obj) { if (obj is DateTime) - return ((DateTime)obj).ToString ("u"); + // Return an ISO 8601 formatted string, also known as a Round-trip date/time pattern + // https://msdn.microsoft.com/en-us/library/az4se3k1(v=vs.110).aspx#Anchor_8 + // For example: 2009-06-15T13:45:30.0000000 + return ((DateTime)obj).ToString ("o"); else if (obj is IList) { string flattenString = ""; diff --git a/samples/client/petstore/csharp/SwaggerClientTest/TestApiClient.cs b/samples/client/petstore/csharp/SwaggerClientTest/TestApiClient.cs index ff81f6b7c76..3e9bbfb12d2 100644 --- a/samples/client/petstore/csharp/SwaggerClientTest/TestApiClient.cs +++ b/samples/client/petstore/csharp/SwaggerClientTest/TestApiClient.cs @@ -19,6 +19,11 @@ namespace SwaggerClient.TestApiClient // test array of int List numList = new List(new int[] {1, 37}); Assert.AreEqual("1,37", api.ParameterToString (numList)); + + // test datetime + DateTime date = DateTime.Parse("2008-04-10T13:30:00.0000000Z", null, System.Globalization.DateTimeStyles.RoundtripKind); + Assert.AreEqual("2008-04-10T13:30:00.0000000Z", api.ParameterToString (date)); + } } } From ca26608b28bf2e229cfac3ee68fc8494f03421c3 Mon Sep 17 00:00:00 2001 From: Jeff Kwan Date: Thu, 10 Dec 2015 20:42:30 -0500 Subject: [PATCH 178/211] Add some tests for time zones --- .../csharp/SwaggerClientTest/TestApiClient.cs | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/samples/client/petstore/csharp/SwaggerClientTest/TestApiClient.cs b/samples/client/petstore/csharp/SwaggerClientTest/TestApiClient.cs index 3e9bbfb12d2..5b9b27ce656 100644 --- a/samples/client/petstore/csharp/SwaggerClientTest/TestApiClient.cs +++ b/samples/client/petstore/csharp/SwaggerClientTest/TestApiClient.cs @@ -21,8 +21,16 @@ namespace SwaggerClient.TestApiClient Assert.AreEqual("1,37", api.ParameterToString (numList)); // test datetime - DateTime date = DateTime.Parse("2008-04-10T13:30:00.0000000Z", null, System.Globalization.DateTimeStyles.RoundtripKind); - Assert.AreEqual("2008-04-10T13:30:00.0000000Z", api.ParameterToString (date)); + DateTime dateUtc = DateTime.Parse("2008-04-10T13:30:00.0000000z", null, System.Globalization.DateTimeStyles.RoundtripKind); + Assert.AreEqual("2008-04-10T13:30:00.0000000Z", api.ParameterToString (dateUtc)); + + // test datetime with no timezone + DateTime dateWithNoTz = DateTime.Parse("2008-04-10T13:30:00.000", null, System.Globalization.DateTimeStyles.RoundtripKind); + Assert.AreEqual("2008-04-10T13:30:00.0000000", api.ParameterToString (dateWithNoTz)); + + // test datetime with a time zone + DateTime dateWithTz = DateTime.Parse("2008-04-10T13:30:00.0000000-04:00", null, System.Globalization.DateTimeStyles.RoundtripKind); + Assert.AreEqual("2008-04-10T13:30:00.0000000-04:00", api.ParameterToString (dateWithTz)); } } From 3acb5d60a097cc6c06ca0ce0b5713109d5084d51 Mon Sep 17 00:00:00 2001 From: wing328 Date: Fri, 11 Dec 2015 14:36:28 +0800 Subject: [PATCH 179/211] add swgger client profiling for php --- .../php/swagger_client_profiling.output | 31 +++++++ .../petstore/php/swagger_client_profiling.php | 80 +++++++++++++++++++ 2 files changed, 111 insertions(+) create mode 100644 samples/client/petstore/php/swagger_client_profiling.output create mode 100644 samples/client/petstore/php/swagger_client_profiling.php diff --git a/samples/client/petstore/php/swagger_client_profiling.output b/samples/client/petstore/php/swagger_client_profiling.output new file mode 100644 index 00000000000..487dd36f4da --- /dev/null +++ b/samples/client/petstore/php/swagger_client_profiling.output @@ -0,0 +1,31 @@ +0: NEW PETAPI => 0.050940 +0: ADD PET => 0.901768 +0: GET PET => 0.368627 +0: UPDATE PET => 0.366801 +0: DELETE PET => 0.368657 +1: NEW PETAPI => 0.000020 +1: ADD PET => 0.365229 +1: GET PET => 0.366909 +1: UPDATE PET => 0.366458 +1: DELETE PET => 0.365904 +2: NEW PETAPI => 0.000018 +2: ADD PET => 0.367664 +2: GET PET => 0.364671 +2: UPDATE PET => 0.365267 +2: DELETE PET => 0.366162 +3: NEW PETAPI => 0.000018 +3: ADD PET => 0.364907 +3: GET PET => 0.364156 +3: UPDATE PET => 0.366996 +3: DELETE PET => 0.366705 +4: NEW PETAPI => 0.000018 +4: ADD PET => 0.370373 +4: GET PET => 0.365455 +4: UPDATE PET => 0.365915 +4: DELETE PET => 0.368835 +5: NEW PETAPI => 0.000017 +5: ADD PET => 0.367148 +5: GET PET => 0.368994 +5: UPDATE PET => 0.368870 +5: DELETE PET => 0.367270 +6: FINISH diff --git a/samples/client/petstore/php/swagger_client_profiling.php b/samples/client/petstore/php/swagger_client_profiling.php new file mode 100644 index 00000000000..20a3d6b6bf5 --- /dev/null +++ b/samples/client/petstore/php/swagger_client_profiling.php @@ -0,0 +1,80 @@ + %f\n", $prof_names[$i], $prof_timing[$i+1]-$prof_timing[$i]); + } + echo "{$prof_names[$size-1]}\n"; +} + +$counter = 5; // run 5 times by default +$new_pet_id = 50001; // ID of pet that needs to be fetched + +for ($x = 0; $x <= $counter; $x++) { + try { + prof_flag("$x: NEW PETAPI"); + $pet_api = new Swagger\Client\Api\PetApi(); + + // ~~~ ADD PET ~~~ + prof_flag("$x: ADD PET"); + // add pet (post json) + $new_pet = new Swagger\Client\Model\Pet; + $new_pet->setId($new_pet_id); + $new_pet->setName("profiler"); + $new_pet->setStatus("available"); + $new_pet->setPhotoUrls(array("http://profiler.com")); + // new tag + $tag= new Swagger\Client\Model\Tag; + $tag->setId($new_pet_id); // use the same id as pet + $tag->setName("profile tag 1"); + // new category + $category = new Swagger\Client\Model\Category; + $category->setId($new_pet_id); // use the same id as pet + $category->setName("profile category 1"); + + $new_pet->setTags(array($tag)); + $new_pet->setCategory($category); + + // add a new pet (model) + $add_response = $pet_api->addPet($new_pet); + + // ~~~ GET PET ~~~ + prof_flag("$x: GET PET"); + $response = $pet_api->getPetById($new_pet_id); + + // ~~~ UPDATE PET WITH FORM ~~~ + prof_flag("$x: UPDATE PET"); + $response = $pet_api->updatePetWithForm($new_pet_id, "new profiler", "sold"); + + // ~~~ DELETE PET ~~~ + prof_flag("$x: DELETE PET"); + $response = $pet_api->deletePet($new_pet_id); + + } catch (Swagger\Client\ApiException $e) { + echo 'Caught exception: ', $e->getMessage(), "\n"; + echo 'HTTP response headers: ', print_r($e->getResponseHeaders(), true), "\n"; + echo 'HTTP response body: ', print_r($e->getResponseBody(), true), "\n"; + echo 'HTTP status code: ', $e->getCode(), "\n"; + } + +} + +prof_flag("$x: FINISH"); +prof_print(); + + From 4272e9c027899f8ac970c3b3aa494975eb6cbd36 Mon Sep 17 00:00:00 2001 From: xhh Date: Fri, 11 Dec 2015 23:24:19 +0800 Subject: [PATCH 180/211] Add profiling script and results for Ruby Petstore sample --- .../petstore/ruby/petstore_profiling.output | 315 ++++++++++++++++++ .../petstore/ruby/petstore_profiling.rb | 75 +++++ 2 files changed, 390 insertions(+) create mode 100644 samples/client/petstore/ruby/petstore_profiling.output create mode 100644 samples/client/petstore/ruby/petstore_profiling.rb diff --git a/samples/client/petstore/ruby/petstore_profiling.output b/samples/client/petstore/ruby/petstore_profiling.output new file mode 100644 index 00000000000..36750b5e2b9 --- /dev/null +++ b/samples/client/petstore/ruby/petstore_profiling.output @@ -0,0 +1,315 @@ +Measure Mode: wall_time +Thread ID: 70329221636600 +Fiber ID: 70329234076680 +Total: 10.998497 +Sort by: self_time + + %self total self wait child calls name + 99.20 10.920 10.911 0.000 0.010 20 #easy_perform + 0.05 0.005 0.005 0.000 0.000 1392 Symbol#to_s + 0.04 0.019 0.005 0.000 0.015 268 Ethon::Curls::Options#set_option + 0.02 0.003 0.003 0.000 0.000 718 Ethon::Easy::Operations#handle + 0.02 0.003 0.003 0.000 0.000 657 String#downcase + 0.02 0.003 0.003 0.000 0.000 658 FFI::Enum#to_native + 0.02 0.003 0.003 0.000 0.000 678 FFI::Enum#from_native + 0.02 0.029 0.002 0.000 0.027 200 *Proc#call + 0.02 0.034 0.002 0.000 0.032 210 *Array#each + 0.02 0.014 0.002 0.000 0.012 309 *Class#new + 0.02 0.004 0.002 0.000 0.003 390 #easy_getinfo + 0.02 0.002 0.002 0.000 0.000 175 Typhoeus::EasyFactory#renamed_options + 0.01 0.001 0.001 0.000 0.000 744 Kernel#respond_to? + 0.01 0.003 0.001 0.000 0.002 201 *#method_missing + 0.01 0.006 0.001 0.000 0.005 75 Hash#each + 0.01 0.020 0.001 0.000 0.019 56 *Hash#each_pair + 0.01 0.001 0.001 0.000 0.000 430 Symbol#to_sym + 0.01 0.004 0.001 0.000 0.003 210 Ethon::Curls::Infos#get_info_double + 0.01 0.003 0.001 0.000 0.002 175 *Array#map + 0.01 0.001 0.001 0.000 0.000 268 Ethon::Curls::Options#easy_options + 0.01 0.001 0.001 0.000 0.000 201 #instance + 0.01 0.001 0.001 0.000 0.000 420 Ethon::Curls::Infos#double_ptr + 0.01 0.002 0.001 0.000 0.001 250 FFI::Pointer#read_string + 0.01 0.001 0.001 0.000 0.000 80 Hash#initialize_copy + 0.01 0.001 0.001 0.000 0.000 240 Typhoeus::Response::Header#set_value + 0.01 0.001 0.001 0.000 0.000 656 Kernel#is_a? + 0.01 0.001 0.001 0.000 0.000 42 String#gsub + 0.01 0.003 0.001 0.000 0.002 120 Ethon::Curls::Infos#get_info_long + 0.01 0.004 0.001 0.000 0.004 120 Typhoeus::Response::Header#process_line + 0.01 0.001 0.001 0.000 0.001 85 #easy_setopt_string + 0.01 0.001 0.001 0.000 0.000 140 String#split + 0.01 0.001 0.001 0.000 0.000 485 Kernel#nil? + 0.01 0.001 0.001 0.000 0.000 240 Ethon::Curls::Infos#long_ptr + 0.01 0.001 0.001 0.000 0.000 42 #easy_setopt_callback + 0.01 0.006 0.001 0.000 0.006 20 Petstore::ApiClient#build_request + 0.00 0.001 0.000 0.000 0.001 90 #easy_setopt_long + 0.00 0.000 0.000 0.000 0.000 170 FFI::AbstractMemory#get_bytes + 0.00 0.001 0.000 0.000 0.000 30 #informations_to_mirror + 0.00 0.002 0.000 0.000 0.002 120 Typhoeus::Response::Header#process_pair + 0.00 0.002 0.000 0.000 0.002 60 Ethon::Curls::Infos#get_info_string + 0.00 0.000 0.000 0.000 0.000 190 String#to_s + 0.00 0.000 0.000 0.000 0.000 130 Kernel#class + 0.00 0.000 0.000 0.000 0.000 240 String#strip + 0.00 0.001 0.000 0.000 0.001 42 Mutex#synchronize + 0.00 0.000 0.000 0.000 0.000 268 Hash#include? + 0.00 0.000 0.000 0.000 0.000 36 String#sub + 0.00 0.001 0.000 0.000 0.001 21 FFI::AutoPointer#initialize + 0.00 0.000 0.000 0.000 0.000 400 Array#include? + 0.00 10.941 0.000 0.000 10.941 20 Ethon::Easy::Operations#perform + 0.00 0.000 0.000 0.000 0.000 185 Integer#to_i + 0.00 0.006 0.000 0.000 0.006 21 Ethon::Easy::Callbacks#set_callbacks + 0.00 0.001 0.000 0.000 0.001 80 Ethon::Easy::Header#compose_header + 0.00 0.000 0.000 0.000 0.000 210 FFI::AbstractMemory#read_double + 0.00 0.001 0.000 0.000 0.000 90 #find_type + 0.00 0.001 0.000 0.000 0.001 90 #type_size + 0.00 0.002 0.000 0.000 0.001 30 Ethon::Easy::Informations#httpauth_avail + 0.00 0.000 0.000 0.000 0.000 80 #slist_append + 0.00 0.001 0.000 0.000 0.001 85 Kernel#initialize_dup + 0.00 0.000 0.000 0.000 0.000 330 Hash#has_key? + 0.00 10.993 0.000 0.000 10.992 20 Petstore::ApiClient#call_api + 0.00 0.000 0.000 0.000 0.000 80 String#encode + 0.00 0.001 0.000 0.000 0.000 20 Petstore::Configuration#auth_settings + 0.00 0.001 0.000 0.000 0.000 140 Typhoeus::Response::Informations#response_code + 0.00 0.000 0.000 0.000 0.000 65 #attribute_map + 0.00 0.000 0.000 0.000 0.000 35 Petstore::ApiClient#json_mime? + 0.00 0.001 0.000 0.000 0.000 85 Ethon::Easy::Http::Actionable#form + 0.00 0.000 0.000 0.000 0.000 45 Hash#keys + 0.00 0.023 0.000 0.000 0.022 20 Ethon::Easy::Http::Actionable#setup + 0.00 0.002 0.000 0.000 0.001 80 Typhoeus::EasyFactory#easy + 0.00 0.001 0.000 0.000 0.001 20 Typhoeus::Request::Callbacks#execute_callbacks + 0.00 0.001 0.000 0.000 0.000 40 Hash#merge + 0.00 0.001 0.000 0.000 0.000 80 Ethon::Easy::Util#escape_zero_byte + 0.00 0.000 0.000 0.000 0.000 120 Ethon::Curls::Infos#string_ptr + 0.00 0.001 0.000 0.000 0.000 50 Enumerable#find + 0.00 0.000 0.000 0.000 0.000 80 FFI::AbstractMemory#get_string + 0.00 0.000 0.000 0.000 0.000 80 Typhoeus::Request::Responseable#response + 0.00 0.000 0.000 0.000 0.000 120 FFI::AbstractMemory#read_long + 0.00 0.000 0.000 0.000 0.000 120 Hash#[]= + 0.00 0.001 0.000 0.000 0.001 40 Typhoeus::Response::Status#success? + 0.00 10.998 0.000 0.000 10.998 5 PetstoreProfiling#call_apis + 0.00 0.000 0.000 0.000 0.000 20 #easy_reset + 0.00 0.007 0.000 0.000 0.007 25 Typhoeus::Response::Informations#headers + 0.00 0.000 0.000 0.000 0.000 90 Fixnum#<< + 0.00 0.001 0.000 0.000 0.001 20 Petstore::ApiClient#build_request_url + 0.00 0.032 0.000 0.000 0.031 20 Typhoeus::EasyFactory#get + 0.00 0.001 0.000 0.000 0.001 45 Kernel#dup + 0.00 0.000 0.000 0.000 0.000 21 #easy_setopt_debug_callback + 0.00 0.016 0.000 0.000 0.016 30 #from_easy + 0.00 0.000 0.000 0.000 0.000 20 String#lines + 0.00 0.001 0.000 0.000 0.000 20 Typhoeus::Request#set_defaults + 0.00 0.006 0.000 0.000 0.006 20 Typhoeus::Response::Header#initialize + 0.00 0.000 0.000 0.000 0.000 40 Typhoeus::Request::Callbacks::Types#on_complete + 0.00 0.000 0.000 0.000 0.000 120 Symbol#to_proc + 0.00 0.001 0.000 0.000 0.000 20 Typhoeus::EasyFactory#set_callback + 0.00 10.974 0.000 0.000 10.973 20 Typhoeus::Request::Operations#run + 0.00 0.001 0.000 0.000 0.001 60 *Petstore::BaseObject#_to_hash + 0.00 0.000 0.000 0.000 0.000 90 FFI::Type#size + 0.00 0.000 0.000 0.000 0.000 60 FFI::AbstractMemory#read_pointer + 0.00 0.002 0.000 0.000 0.002 20 Typhoeus::Request::Operations#finish + 0.00 0.001 0.000 0.000 0.000 21 URI::Escape#escape + 0.00 0.000 0.000 0.000 0.000 40 Typhoeus::Request::Callbacks::Types#on_success + 0.00 0.000 0.000 0.000 0.000 22 Ethon::Loggable#logger + 0.00 0.000 0.000 0.000 0.000 65 Typhoeus::Response#mock + 0.00 0.006 0.000 0.000 0.006 20 Ethon::Easy#reset + 0.00 0.001 0.000 0.000 0.000 30 #easy_setopt_ffipointer + 0.00 0.001 0.000 0.000 0.001 5 JSON::Ext::Generator::GeneratorMethods::Hash#to_json + 0.00 3.494 0.000 0.000 3.494 5 Petstore::PetApi#get_pet_by_id_with_http_info + 0.00 0.000 0.000 0.000 0.000 160 Kernel#block_given? + 0.00 3.220 0.000 0.000 3.219 5 Petstore::PetApi#update_pet_with_form_with_http_info + 0.00 0.001 0.000 0.000 0.001 30 Ethon::Easy::Informations#effective_url + 0.00 0.006 0.000 0.000 0.006 20 Typhoeus::Response::Header#parse + 0.00 10.975 0.000 0.000 10.975 20 Typhoeus::Request::Before#run + 0.00 0.011 0.000 0.000 0.011 20 Ethon::Easy#mirror + 0.00 0.000 0.000 0.000 0.000 40 #easies + 0.00 0.000 0.000 0.000 0.000 40 Typhoeus::EasyFactory#sanitize_timeout! + 0.00 0.000 0.000 0.000 0.000 5 JSON::Ext::Parser#parse + 0.00 0.000 0.000 0.000 0.000 50 String#to_sym + 0.00 0.000 0.000 0.000 0.000 70 Hash#fetch + 0.00 0.001 0.000 0.000 0.001 20 Typhoeus::Request#initialize + 0.00 0.005 0.000 0.000 0.005 20 Typhoeus::EasyFactory#sanitize + 0.00 0.000 0.000 0.000 0.000 21 URI::RFC2396_Parser#escape + 0.00 0.001 0.000 0.000 0.001 30 Ethon::Easy::Informations#total_time + 0.00 0.001 0.000 0.000 0.001 30 Ethon::Easy::Informations#appconnect_time + 0.00 2.141 0.000 0.000 2.141 5 Petstore::PetApi#delete_pet_with_http_info + 0.00 0.001 0.000 0.000 0.000 20 Petstore::ApiClient#select_header_accept + 0.00 0.000 0.000 0.000 0.000 30 Enumerable#inject + 0.00 0.000 0.000 0.000 0.000 80 Integer#chr + 0.00 0.000 0.000 0.000 0.000 90 Fixnum#< + 0.00 10.974 0.000 0.000 10.974 20 Typhoeus::Request::BlockConnection#run + 0.00 2.143 0.000 0.000 2.143 5 Petstore::PetApi#add_pet_with_http_info + 0.00 0.000 0.000 0.000 0.000 21 Logger#add + 0.00 0.020 0.000 0.000 0.020 20 Ethon::Easy::ResponseCallbacks#complete + 0.00 0.000 0.000 0.000 0.000 21 Logger#debug + 0.00 10.975 0.000 0.000 10.974 20 Typhoeus::Request::Stubbable#run + 0.00 0.004 0.000 0.000 0.004 20 Ethon::Easy::Header#headers= + 0.00 0.000 0.000 0.000 0.000 20 Typhoeus::Request::Cacheable#response= + 0.00 0.001 0.000 0.000 0.001 50 *Petstore::BaseObject#_deserialize + 0.00 0.000 0.000 0.000 0.000 35 Module#const_get + 0.00 0.000 0.000 0.000 0.000 20 Ethon::Easy::Http::Actionable#params + 0.00 0.003 0.000 0.000 0.003 10 Ethon::Easy::Http::Postable#set_form + 0.00 0.000 0.000 0.000 0.000 50 Symbol#=~ + 0.00 0.001 0.000 0.000 0.001 30 Ethon::Easy::Informations#pretransfer_time + 0.00 0.000 0.000 0.000 0.000 30 Typhoeus::Response#initialize + 0.00 0.000 0.000 0.000 0.000 10 Petstore::Pet#initialize + 0.00 0.000 0.000 0.000 0.000 20 Petstore::ApiClient#select_header_content_type + 0.00 0.002 0.000 0.000 0.002 20 Ethon::Easy::Options#nosignal= + 0.00 0.001 0.000 0.000 0.001 20 Ethon::Easy::Http::Actionable#initialize + 0.00 0.000 0.000 0.000 0.000 21 #define_finalizer + 0.00 0.002 0.000 0.000 0.001 20 Ethon::Easy::Http#fabricate + 0.00 0.001 0.000 0.000 0.001 30 Ethon::Easy::Informations#primary_ip + 0.00 0.000 0.000 0.000 0.000 119 NilClass#nil? + 0.00 0.001 0.000 0.000 0.001 30 Ethon::Easy::Informations#redirect_time + 0.00 0.001 0.000 0.000 0.001 30 Ethon::Easy::Informations#starttransfer_time + 0.00 0.000 0.000 0.000 0.000 20 Symbol#downcase + 0.00 0.000 0.000 0.000 0.000 21 Kernel#method + 0.00 0.000 0.000 0.000 0.000 20 Petstore::Configuration#api_key_with_prefix + 0.00 0.000 0.000 0.000 0.000 25 #attribute_map + 0.00 10.974 0.000 0.000 10.974 20 Typhoeus::Request::Cacheable#run + 0.00 0.000 0.000 0.000 0.000 20 Typhoeus::Request::Callbacks::Types#on_headers + 0.00 0.001 0.000 0.000 0.001 30 Ethon::Easy::Informations#namelookup_time + 0.00 0.001 0.000 0.000 0.001 30 Ethon::Easy::Informations#connect_time + 0.00 0.001 0.000 0.000 0.001 30 Ethon::Easy::Informations#request_size + 0.00 0.000 0.000 0.000 0.000 21 String#force_encoding + 0.00 0.000 0.000 0.000 0.000 20 #before + 0.00 0.000 0.000 0.000 0.000 40 Typhoeus::Response::Informations#return_code + 0.00 0.000 0.000 0.000 0.000 30 Ethon::Easy::Mirror#initialize + 0.00 0.000 0.000 0.000 0.000 15 Petstore::ApiClient#build_request_body + 0.00 0.001 0.000 0.000 0.001 30 Ethon::Easy::Informations#redirect_count + 0.00 0.025 0.000 0.000 0.025 20 Ethon::Easy::Http#http_request + 0.00 0.001 0.000 0.000 0.001 30 Ethon::Easy::Informations#response_code + 0.00 0.000 0.000 0.000 0.000 50 Ethon::Easy::Http::Actionable#query_options + 0.00 0.000 0.000 0.000 0.000 25 #attribute_map + 0.00 0.000 0.000 0.000 0.000 25 NilClass#to_s + 0.00 0.007 0.000 0.000 0.007 20 #release + 0.00 0.000 0.000 0.000 0.000 20 Ethon::Easy::ResponseCallbacks#on_headers + 0.00 0.000 0.000 0.000 0.000 20 #response_for + 0.00 0.001 0.000 0.000 0.001 20 Ethon::Easy::Http::Actionable#parse_options + 0.00 0.000 0.000 0.000 0.000 35 Hash#delete + 0.00 0.000 0.000 0.000 0.000 45 Typhoeus::Response::Informations#response_headers + 0.00 0.000 0.000 0.000 0.000 20 #easy_escape + 0.00 0.000 0.000 0.000 0.000 21 FFI::AutoPointer::Releaser#initialize + 0.00 0.000 0.000 0.000 0.000 21 Ethon::Easy::Callbacks#header_write_callback + 0.00 0.000 0.000 0.000 0.000 21 Ethon::Easy::DebugInfo#initialize + 0.00 0.000 0.000 0.000 0.000 20 Typhoeus::EasyFactory#initialize + 0.00 0.000 0.000 0.000 0.000 20 Typhoeus::Request::Memoizable#response= + 0.00 0.000 0.000 0.000 0.000 105 Module#=== + 0.00 0.000 0.000 0.000 0.000 80 String#include? + 0.00 0.000 0.000 0.000 0.000 21 Ethon::Easy::Callbacks#body_write_callback + 0.00 0.000 0.000 0.000 0.000 16 Array#join + 0.00 0.000 0.000 0.000 0.000 20 #find_by + 0.00 0.005 0.000 0.000 0.005 5 Petstore::ApiClient#deserialize + 0.00 0.000 0.000 0.000 0.000 30 Regexp#=== + 0.00 0.006 0.000 0.000 0.006 10 Ethon::Easy::ResponseCallbacks#headers + 0.00 0.000 0.000 0.000 0.000 21 Ethon::Easy::Callbacks#debug_callback + 0.00 0.000 0.000 0.000 0.000 20 Ethon::Easy::ResponseCallbacks#on_complete + 0.00 0.002 0.000 0.000 0.002 20 Ethon::Easy::Options#url= + 0.00 0.000 0.000 0.000 0.000 84 Kernel#kind_of? + 0.00 0.000 0.000 0.000 0.000 40 Typhoeus::Request::Cacheable#cacheable? + 0.00 0.017 0.000 0.000 0.017 21 Ethon::Easy#set_attributes + 0.00 0.000 0.000 0.000 0.000 20 Module#const_defined? + 0.00 0.001 0.000 0.000 0.001 20 #get + 0.00 0.000 0.000 0.000 0.000 20 #pid + 0.00 0.000 0.000 0.000 0.000 40 String#bytesize + 0.00 0.000 0.000 0.000 0.000 20 Ethon::Easy::Params#initialize + 0.00 0.000 0.000 0.000 0.000 20 Kernel#lambda + 0.00 0.000 0.000 0.000 0.000 20 String#capitalize + 0.00 0.000 0.000 0.000 0.000 25 Ethon::Easy::Queryable#query_pairs + 0.00 0.000 0.000 0.000 0.000 195 Symbol#=== + 0.00 0.000 0.000 0.000 0.000 20 Ethon::Easy::Form#initialize + 0.00 0.000 0.000 0.000 0.000 13 FFI::MemoryPointer#initialize + 0.00 0.000 0.000 0.000 0.000 105 Hash#key? + 0.00 0.000 0.000 0.000 0.000 20 Ethon::Easy#escape + 0.00 0.000 0.000 0.000 0.000 20 #all + 0.00 0.000 0.000 0.000 0.000 10 Typhoeus::Request::Callbacks#execute_headers_callbacks + 0.00 0.000 0.000 0.000 0.000 20 Typhoeus::Response::Header#set_default_proc_on + 0.00 0.000 0.000 0.000 0.000 15 Hash#update + 0.00 0.000 0.000 0.000 0.000 60 FFI::Pointer#null? + 0.00 0.001 0.000 0.000 0.001 20 Ethon::Easy::Options#sslcert= + 0.00 0.001 0.000 0.000 0.001 20 Ethon::Easy::Queryable#to_s + 0.00 0.000 0.000 0.000 0.000 55 Ethon::Easy::Queryable#empty? + 0.00 0.000 0.000 0.000 0.000 20 Hash#default_proc= + 0.00 0.000 0.000 0.000 0.000 10 Petstore::Category#initialize + 0.00 0.000 0.000 0.000 0.000 10 Petstore::Tag#initialize + 0.00 0.000 0.000 0.000 0.000 21 FFI::Pointer#initialize + 0.00 0.002 0.000 0.000 0.001 20 Ethon::Easy::Options#verbose= + 0.00 0.002 0.000 0.000 0.002 20 Ethon::Easy::Options#maxredirs= + 0.00 0.001 0.000 0.000 0.001 20 Ethon::Easy::Options#sslkey= + 0.00 0.000 0.000 0.000 0.000 20 Array#pop + 0.00 0.000 0.000 0.000 0.000 21 FFI::Pointer#type_size + 0.00 0.000 0.000 0.000 0.000 20 Ethon::Easy::Http::Actionable#url + 0.00 0.000 0.000 0.000 0.000 20 Typhoeus::Request::BlockConnection#blocked? + 0.00 0.002 0.000 0.000 0.002 20 Ethon::Easy::Options#ssl_verifypeer= + 0.00 0.000 0.000 0.000 0.000 20 Ethon::Easy::Http::Actionable#options + 0.00 0.000 0.000 0.000 0.000 10 Ethon::Easy::ResponseCallbacks#body + 0.00 0.000 0.000 0.000 0.000 10 Petstore::Pet#status= + 0.00 0.001 0.000 0.000 0.001 20 Ethon::Easy::Options#cainfo= + 0.00 0.000 0.000 0.000 0.000 30 Array#last + 0.00 0.001 0.000 0.000 0.001 20 Petstore::ApiClient#update_params_for_auth! + 0.00 0.003 0.000 0.000 0.003 5 Petstore::ApiClient#convert_to_type + 0.00 10.998 0.000 0.000 10.998 1 PetstoreProfiling#run + 0.00 0.012 0.000 0.000 0.011 10 Ethon::Easy::Http::Post#setup + 0.00 0.000 0.000 0.000 0.000 5 JSON::Ext::Parser#initialize + 0.00 0.000 0.000 0.000 0.000 20 Typhoeus::Request::Memoizable#memoizable? + 0.00 0.000 0.000 0.000 0.000 20 Typhoeus::Response::Header#raw + 0.00 0.002 0.000 0.000 0.002 5 Petstore::ApiClient#object_to_http_body + 0.00 0.000 0.000 0.000 0.000 20 Typhoeus::Request::Responseable#response= + 0.00 0.000 0.000 0.000 0.000 15 Fixnum#to_s + 0.00 0.001 0.000 0.000 0.001 15 *Petstore::BaseObject#to_hash + 0.00 0.000 0.000 0.000 0.000 10 Array#any? + 0.00 0.000 0.000 0.000 0.000 10 Ethon::Easy::Queryable#build_query_pairs + 0.00 0.000 0.000 0.000 0.000 1 #easy_init + 0.00 0.000 0.000 0.000 0.000 10 Ethon::Easy::Queryable#pairs_for + 0.00 0.001 0.000 0.000 0.000 5 Petstore::PetApi#initialize + 0.00 0.000 0.000 0.000 0.000 10 Array#compact + 0.00 0.003 0.000 0.000 0.002 15 *Petstore::BaseObject#build_from_hash + 0.00 0.000 0.000 0.000 0.000 20 Typhoeus::Request::Streamable#streaming? + 0.00 0.000 0.000 0.000 0.000 10 Ethon::Easy::Http::Actionable#params_encoding + 0.00 0.000 0.000 0.000 0.000 10 FFI::AbstractMemory#put_bytes + 0.00 3.494 0.000 0.000 3.494 5 Petstore::PetApi#get_pet_by_id + 0.00 0.000 0.000 0.000 0.000 20 Proc#to_proc + 0.00 0.000 0.000 0.000 0.000 5 Petstore::Configuration#api_client + 0.00 0.006 0.000 0.000 0.006 5 Ethon::Easy::Http::Delete#setup + 0.00 0.001 0.000 0.000 0.001 10 Ethon::Easy::Options#postfieldsize= + 0.00 0.001 0.000 0.000 0.001 10 Ethon::Easy::Options#copypostfields= + 0.00 0.005 0.000 0.000 0.005 5 Ethon::Easy::Http::Get#setup + 0.00 2.143 0.000 0.000 2.143 5 Petstore::PetApi#add_pet + 0.00 0.000 0.000 0.000 0.000 20 #free + 0.00 0.000 0.000 0.000 0.000 1 Petstore::Configuration#initialize + 0.00 2.141 0.000 0.000 2.141 5 Petstore::PetApi#delete_pet + 0.00 0.000 0.000 0.000 0.000 20 Kernel#Array + 0.00 0.000 0.000 0.000 0.000 45 Kernel#respond_to_missing? + 0.00 0.000 0.000 0.000 0.000 1 #global_init + 0.00 0.000 0.000 0.000 0.000 5 #swagger_types + 0.00 0.001 0.000 0.000 0.001 5 Petstore::ApiClient#object_to_hash + 0.00 0.000 0.000 0.000 0.000 2 Logger#initialize + 0.00 0.000 0.000 0.000 0.000 10 Ethon::Easy::Form#multipart? + 0.00 0.000 0.000 0.000 0.000 5 JSON::Ext::Generator::State#initialize_copy + 0.00 0.000 0.000 0.000 0.000 2 MonitorMixin#initialize + 0.00 3.220 0.000 0.000 3.220 5 Petstore::PetApi#update_pet_with_form + 0.00 0.000 0.000 0.000 0.000 5 #swagger_types + 0.00 0.000 0.000 0.000 0.000 1 Petstore::ApiClient#initialize + 0.00 0.003 0.000 0.000 0.003 5 Kernel#tap + 0.00 0.000 0.000 0.000 0.000 5 JSON#parse + 0.00 0.000 0.000 0.000 0.000 5 Ethon::Easy::Options#customrequest= + 0.00 0.000 0.000 0.000 0.000 5 Ethon::Easy::Queryable#recursively_generate_pairs + 0.00 0.000 0.000 0.000 0.000 5 #swagger_types + 0.00 0.000 0.000 0.000 0.000 2 Logger::LogDevice#initialize + 0.00 10.998 0.000 0.000 10.998 1 Integer#times + 0.00 0.000 0.000 0.000 0.000 1 Petstore::Configuration#base_url + 0.00 0.000 0.000 0.000 0.000 2 MonitorMixin#mon_initialize + 0.00 0.000 0.000 0.000 0.000 35 String#=== + 0.00 0.000 0.000 0.000 0.000 3 Kernel#proc + 0.00 0.000 0.000 0.000 0.000 5 Typhoeus::Response::Informations#response_body + 0.00 0.000 0.000 0.000 0.000 10 Kernel#=== + 0.00 0.001 0.000 0.000 0.001 1 Ethon::Easy#initialize + 0.00 0.000 0.000 0.000 0.000 5 Ethon::Easy::Queryable#encode_hash_pairs + 0.00 0.000 0.000 0.000 0.000 5 String#encoding + 0.00 0.000 0.000 0.000 0.000 5 Array#first + 0.00 0.000 0.000 0.000 0.000 5 Hash#[] + 0.00 0.000 0.000 0.000 0.000 2 BasicObject#initialize + 0.00 0.000 0.000 0.000 0.000 1 Ethon::Loggable#default_logger + 0.00 0.000 0.000 0.000 0.000 2 Logger::Formatter#initialize + 0.00 0.000 0.000 0.000 0.000 1 #init + 0.00 0.000 0.000 0.000 0.000 2 Mutex#initialize + 0.00 0.000 0.000 0.000 0.000 1 Ethon::Loggable#rails_logger + 0.00 0.000 0.000 0.000 0.000 10 BasicObject#== + +* indicates recursively called methods diff --git a/samples/client/petstore/ruby/petstore_profiling.rb b/samples/client/petstore/ruby/petstore_profiling.rb new file mode 100644 index 00000000000..485bd40c0c7 --- /dev/null +++ b/samples/client/petstore/ruby/petstore_profiling.rb @@ -0,0 +1,75 @@ +# To run this profiling: +# gem install ruby-prof +# ruby -Ilib petstore_profiling.rb + +require 'petstore' +require 'ruby-prof' + +class PetstoreProfiling + attr_accessor :total, :new_pet_id, :output_file + + def initialize + @total = 5 + @new_pet_id = 50002 + @output_file = './petstore_profiling.output' + end + + def call_apis + pet_api = Petstore::PetApi.new + + ### ADD PET ### + pet = Petstore::Pet.new + pet.id = new_pet_id + pet.name = "profiler" + pet.status = "available" + pet.photo_urls = ["http://profiler.com"] + # new tag + tag= Petstore::Tag.new + tag.id = new_pet_id # use the same id as pet + tag.name = "profile tag 1" + # new category + category = Petstore::Category.new + category.id = new_pet_id # use the same id as pet + category.name = "profile category 1" + + pet.tags = [tag] + pet.category = category + + # add a new pet (model) + pet_api.add_pet(body: pet) + + ### GET PET ### + pet = pet_api.get_pet_by_id(new_pet_id) + + ### UPDATE PET WITH FORM ### + pet_api.update_pet_with_form(new_pet_id, name: 'new profiler', status: 'sold') + + ### DELETE PET ### + pet_api.delete_pet(new_pet_id) + rescue Petstore::ApiError => e + puts "Caught error: #{e.message}" + puts "HTTP response headers: #{e.response_headers}" + puts "HTTP response body: #{e.response_body}" + puts "HTTP status code: #{e.code}" + end + + def run + puts "Running profiling... (total: #{@total})" + + RubyProf.start + @total.times { call_apis } + result = RubyProf.stop + + printer = RubyProf::FlatPrinter.new(result) + File.open(@output_file, 'w') do |file| + printer.print(file) + end + + puts "Profiling results written to #{@output_file}" + end +end + +if __FILE__ == $0 + profiling = PetstoreProfiling.new + profiling.run +end From 8fc27b5f0c52161c861f2bb4b9d84ee29c7ec65c Mon Sep 17 00:00:00 2001 From: evigeant Date: Fri, 11 Dec 2015 12:57:05 -0500 Subject: [PATCH 181/211] Fixed a bug where the JSON.mustache file was removed from the jersey2 code generation --- .../java/io/swagger/codegen/languages/JavaClientCodegen.java | 2 ++ 1 file changed, 2 insertions(+) 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 06326d1e4dd..1c03e6c9e6f 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 @@ -251,6 +251,8 @@ public class JavaClientCodegen extends DefaultCodegen implements CodegenConfig { } else if ("retrofit".equals(getLibrary()) || "retrofit2".equals(getLibrary())) { supportingFiles.add(new SupportingFile("auth/OAuthOkHttpClient.mustache", authFolder, "OAuthOkHttpClient.java")); supportingFiles.add(new SupportingFile("CollectionFormats.mustache", invokerFolder, "CollectionFormats.java")); + } else if("jersey2".equals(getLibrary())) { + supportingFiles.add(new SupportingFile("JSON.mustache", invokerFolder, "JSON.java")); } } From e0582ae912732ae2849c081fa3af5486c8e7bfd3 Mon Sep 17 00:00:00 2001 From: Jeff Kwan Date: Fri, 11 Dec 2015 18:28:37 -0500 Subject: [PATCH 182/211] Added the ability to customize the DateTimeFormat Updated Configuration to have a DateTimeFormat Added Unit Tests for Configuration.DateTimeFormat Cleaned up namespaces in SwaggerClientTest Added an embedded resource for testing uploads --- .gitignore | 6 +- .../CsharpDotNet2/ApiClient.mustache | 7 +- .../CsharpDotNet2/Configuration.mustache | 35 ++++++++- .../main/resources/csharp/ApiClient.mustache | 7 +- .../resources/csharp/Configuration.mustache | 35 ++++++++- .../src/main/csharp/IO/Swagger/Api/PetApi.cs | 1 + .../main/csharp/IO/Swagger/Api/StoreApi.cs | 1 + .../src/main/csharp/IO/Swagger/Api/UserApi.cs | 1 + .../csharp/IO/Swagger/Client/ApiClient.cs | 7 +- .../csharp/IO/Swagger/Client/Configuration.cs | 35 ++++++++- .../main/csharp/IO/Swagger/Model/Category.cs | 4 ++ .../src/main/csharp/IO/Swagger/Model/Order.cs | 4 ++ .../src/main/csharp/IO/Swagger/Model/Pet.cs | 4 ++ .../src/main/csharp/IO/Swagger/Model/Tag.cs | 4 ++ .../src/main/csharp/IO/Swagger/Model/User.cs | 4 ++ .../SwaggerClientTest.csproj | 6 +- .../csharp/SwaggerClientTest/TestApiClient.cs | 68 +++++++++++++----- .../SwaggerClientTest/TestConfiguration.cs | 27 ++++++- .../csharp/SwaggerClientTest/TestPet.cs | 14 ++-- .../csharp/SwaggerClientTest/swagger-logo.png | Bin 0 -> 11917 bytes 20 files changed, 231 insertions(+), 39 deletions(-) create mode 100644 samples/client/petstore/csharp/SwaggerClientTest/swagger-logo.png diff --git a/.gitignore b/.gitignore index d55a8014a34..db34c76636c 100644 --- a/.gitignore +++ b/.gitignore @@ -13,6 +13,7 @@ generated-sources/* generated-code/* *.swp *.swo +*.csproj.user /target /generated-files @@ -36,6 +37,9 @@ samples/client/petstore/objc/SwaggerClientTests/Pods samples/client/petstore/objc/SwaggerClientTests/SwaggerClient.xcworkspace samples/client/petstore/objc/SwaggerClientTests/Podfile.lock samples/server/petstore/nodejs/node_modules +samples/client/petstore/csharp/SwaggerClientTest/.vs +samples/client/petstore/csharp/SwaggerClientTest/obj +samples/client/petstore/csharp/SwaggerClientTest/bin target .idea .lib @@ -60,4 +64,4 @@ samples/client/petstore/python/.venv/ *.java~ *.pm~ *.xml~ -*.t~ \ No newline at end of file +*.t~ diff --git a/modules/swagger-codegen/src/main/resources/CsharpDotNet2/ApiClient.mustache b/modules/swagger-codegen/src/main/resources/CsharpDotNet2/ApiClient.mustache index 6d5e45c186e..a428cdc3630 100644 --- a/modules/swagger-codegen/src/main/resources/CsharpDotNet2/ApiClient.mustache +++ b/modules/swagger-codegen/src/main/resources/CsharpDotNet2/ApiClient.mustache @@ -134,7 +134,7 @@ namespace {{packageName}}.Client } /// - /// If parameter is DateTime, output in ISO8601 format. + /// If parameter is DateTime, output in a formatted string (default ISO 8601), customizable with Configuration.DateTime. /// If parameter is a list of string, join the list with ",". /// Otherwise just return the string. /// @@ -143,10 +143,11 @@ namespace {{packageName}}.Client public string ParameterToString(object obj) { if (obj is DateTime) - // Return an ISO 8601 formatted string, also known as a Round-trip date/time pattern + // Return a formatted date string - Can be customized with Configuration.DateTimeFormat + // Defaults to an ISO 8601, using the known as a Round-trip date/time pattern ("o") // https://msdn.microsoft.com/en-us/library/az4se3k1(v=vs.110).aspx#Anchor_8 // For example: 2009-06-15T13:45:30.0000000 - return ((DateTime)obj).ToString ("o"); + return ((DateTime)obj).ToString (Configuration.DateTimeFormat); else if (obj is List) return String.Join(",", (obj as List).ToArray()); else diff --git a/modules/swagger-codegen/src/main/resources/CsharpDotNet2/Configuration.mustache b/modules/swagger-codegen/src/main/resources/CsharpDotNet2/Configuration.mustache index 67b07069e2f..56f4e617556 100644 --- a/modules/swagger-codegen/src/main/resources/CsharpDotNet2/Configuration.mustache +++ b/modules/swagger-codegen/src/main/resources/CsharpDotNet2/Configuration.mustache @@ -78,7 +78,40 @@ namespace {{packageName}}.Client _tempFolderPath = value + Path.DirectorySeparatorChar; } } - + + private const string ISO8601_DATETIME_FORMAT = "o"; + + private static string _dateTimeFormat = ISO8601_DATETIME_FORMAT; + + /// + /// Gets or sets the the date time format used when serializing in the ApiClient + /// By default, it's set to ISO 8601 - "o", for others see: + /// https://msdn.microsoft.com/en-us/library/az4se3k1(v=vs.110).aspx + /// and https://msdn.microsoft.com/en-us/library/8kb3ddd4(v=vs.110).aspx + /// No validation is done to ensure that the string you're providing is valid + /// + /// The DateTimeFormat string + public static String DateTimeFormat + { + get + { + return _dateTimeFormat; + } + set + { + if (string.IsNullOrEmpty(value)) + { + // Never allow a blank or null string, go back to the default + _dateTimeFormat = ISO8601_DATETIME_FORMAT; + return; + } + + // Caution, no validation when you choose date time format other than ISO 8601 + // Take a look at the above links + _dateTimeFormat = value; + } + } + /// /// Returns a string with essential information for debugging. /// diff --git a/modules/swagger-codegen/src/main/resources/csharp/ApiClient.mustache b/modules/swagger-codegen/src/main/resources/csharp/ApiClient.mustache index 172e6bc627a..707ce9eb560 100644 --- a/modules/swagger-codegen/src/main/resources/csharp/ApiClient.mustache +++ b/modules/swagger-codegen/src/main/resources/csharp/ApiClient.mustache @@ -147,7 +147,7 @@ namespace {{packageName}}.Client } /// - /// If parameter is DateTime, output in ISO8601 format. + /// If parameter is DateTime, output in a formatted string (default ISO 8601), customizable with Configuration.DateTime. /// If parameter is a list, join the list with ",". /// Otherwise just return the string. /// @@ -156,10 +156,11 @@ namespace {{packageName}}.Client public string ParameterToString(object obj) { if (obj is DateTime) - // Return an ISO 8601 formatted string, also known as a Round-trip date/time pattern + // Return a formatted date string - Can be customized with Configuration.DateTimeFormat + // Defaults to an ISO 8601, using the known as a Round-trip date/time pattern ("o") // https://msdn.microsoft.com/en-us/library/az4se3k1(v=vs.110).aspx#Anchor_8 // For example: 2009-06-15T13:45:30.0000000 - return ((DateTime)obj).ToString ("o"); + return ((DateTime)obj).ToString (Configuration.DateTimeFormat); else if (obj is IList) { string flattenString = ""; diff --git a/modules/swagger-codegen/src/main/resources/csharp/Configuration.mustache b/modules/swagger-codegen/src/main/resources/csharp/Configuration.mustache index 46dde35d8d3..44459e54440 100644 --- a/modules/swagger-codegen/src/main/resources/csharp/Configuration.mustache +++ b/modules/swagger-codegen/src/main/resources/csharp/Configuration.mustache @@ -138,7 +138,40 @@ namespace {{packageName}}.Client _tempFolderPath = value + Path.DirectorySeparatorChar; } } - + + private const string ISO8601_DATETIME_FORMAT = "o"; + + private static string _dateTimeFormat = ISO8601_DATETIME_FORMAT; + + /// + /// Gets or sets the the date time format used when serializing in the ApiClient + /// By default, it's set to ISO 8601 - "o", for others see: + /// https://msdn.microsoft.com/en-us/library/az4se3k1(v=vs.110).aspx + /// and https://msdn.microsoft.com/en-us/library/8kb3ddd4(v=vs.110).aspx + /// No validation is done to ensure that the string you're providing is valid + /// + /// The DateTimeFormat string + public static String DateTimeFormat + { + get + { + return _dateTimeFormat; + } + set + { + if (string.IsNullOrEmpty(value)) + { + // Never allow a blank or null string, go back to the default + _dateTimeFormat = ISO8601_DATETIME_FORMAT; + return; + } + + // Caution, no validation when you choose date time format other than ISO 8601 + // Take a look at the above links + _dateTimeFormat = value; + } + } + /// /// Returns a string with essential information for debugging. /// diff --git a/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Api/PetApi.cs b/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Api/PetApi.cs index ba58eeac9e0..9ab779c9f4b 100644 --- a/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Api/PetApi.cs +++ b/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Api/PetApi.cs @@ -6,6 +6,7 @@ using RestSharp; using IO.Swagger.Client; using IO.Swagger.Model; + namespace IO.Swagger.Api { diff --git a/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Api/StoreApi.cs b/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Api/StoreApi.cs index a9e9d6e9b74..db82bf8e644 100644 --- a/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Api/StoreApi.cs +++ b/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Api/StoreApi.cs @@ -6,6 +6,7 @@ using RestSharp; using IO.Swagger.Client; using IO.Swagger.Model; + namespace IO.Swagger.Api { diff --git a/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Api/UserApi.cs b/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Api/UserApi.cs index 5502fe15da1..ac4f138c568 100644 --- a/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Api/UserApi.cs +++ b/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Api/UserApi.cs @@ -6,6 +6,7 @@ using RestSharp; using IO.Swagger.Client; using IO.Swagger.Model; + namespace IO.Swagger.Api { diff --git a/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Client/ApiClient.cs b/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Client/ApiClient.cs index 1dc978443a3..faf688b5585 100644 --- a/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Client/ApiClient.cs +++ b/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Client/ApiClient.cs @@ -147,7 +147,7 @@ namespace IO.Swagger.Client } /// - /// If parameter is DateTime, output in ISO8601 format. + /// If parameter is DateTime, output in a formatted string (default ISO 8601), customizable with Configuration.DateTime. /// If parameter is a list, join the list with ",". /// Otherwise just return the string. /// @@ -156,10 +156,11 @@ namespace IO.Swagger.Client public string ParameterToString(object obj) { if (obj is DateTime) - // Return an ISO 8601 formatted string, also known as a Round-trip date/time pattern + // Return a formatted date string - Can be customized with Configuration.DateTimeFormat + // Defaults to an ISO 8601, using the known as a Round-trip date/time pattern ("o") // https://msdn.microsoft.com/en-us/library/az4se3k1(v=vs.110).aspx#Anchor_8 // For example: 2009-06-15T13:45:30.0000000 - return ((DateTime)obj).ToString ("o"); + return ((DateTime)obj).ToString (Configuration.DateTimeFormat); else if (obj is IList) { string flattenString = ""; diff --git a/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Client/Configuration.cs b/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Client/Configuration.cs index 151e4e42248..fcdc16f44db 100644 --- a/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Client/Configuration.cs +++ b/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Client/Configuration.cs @@ -138,7 +138,40 @@ namespace IO.Swagger.Client _tempFolderPath = value + Path.DirectorySeparatorChar; } } - + + private const string ISO8601_DATETIME_FORMAT = "o"; + + private static string _dateTimeFormat = ISO8601_DATETIME_FORMAT; + + /// + /// Gets or sets the the date time format used when serializing in the ApiClient + /// By default, it's set to ISO 8601 - "o", for others see: + /// https://msdn.microsoft.com/en-us/library/az4se3k1(v=vs.110).aspx + /// and https://msdn.microsoft.com/en-us/library/8kb3ddd4(v=vs.110).aspx + /// No validation is done to ensure that the string you're providing is valid + /// + /// The DateTimeFormat string + public static String DateTimeFormat + { + get + { + return _dateTimeFormat; + } + set + { + if (string.IsNullOrEmpty(value)) + { + // Never allow a blank or null string, go back to the default + _dateTimeFormat = ISO8601_DATETIME_FORMAT; + return; + } + + // Caution, no validation when you choose date time format other than ISO 8601 + // Take a look at the above links + _dateTimeFormat = value; + } + } + /// /// Returns a string with essential information for debugging. /// diff --git a/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Model/Category.cs b/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Model/Category.cs index d9cb6b21005..03551f9492b 100644 --- a/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Model/Category.cs +++ b/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Model/Category.cs @@ -7,6 +7,8 @@ using System.Collections.Generic; using System.Runtime.Serialization; using Newtonsoft.Json; + + namespace IO.Swagger.Model { @@ -122,4 +124,6 @@ namespace IO.Swagger.Model } } + + } diff --git a/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Model/Order.cs b/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Model/Order.cs index 2191707bd09..1d214430ec8 100644 --- a/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Model/Order.cs +++ b/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Model/Order.cs @@ -7,6 +7,8 @@ using System.Collections.Generic; using System.Runtime.Serialization; using Newtonsoft.Json; + + namespace IO.Swagger.Model { @@ -187,4 +189,6 @@ namespace IO.Swagger.Model } } + + } diff --git a/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Model/Pet.cs b/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Model/Pet.cs index 10c44fb46a7..ab60577e85a 100644 --- a/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Model/Pet.cs +++ b/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Model/Pet.cs @@ -7,6 +7,8 @@ using System.Collections.Generic; using System.Runtime.Serialization; using Newtonsoft.Json; + + namespace IO.Swagger.Model { @@ -187,4 +189,6 @@ namespace IO.Swagger.Model } } + + } diff --git a/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Model/Tag.cs b/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Model/Tag.cs index 93210505bf0..cf77c2470b2 100644 --- a/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Model/Tag.cs +++ b/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Model/Tag.cs @@ -7,6 +7,8 @@ using System.Collections.Generic; using System.Runtime.Serialization; using Newtonsoft.Json; + + namespace IO.Swagger.Model { @@ -122,4 +124,6 @@ namespace IO.Swagger.Model } } + + } diff --git a/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Model/User.cs b/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Model/User.cs index 1fbd17da993..eca977c3b18 100644 --- a/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Model/User.cs +++ b/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Model/User.cs @@ -7,6 +7,8 @@ using System.Collections.Generic; using System.Runtime.Serialization; using Newtonsoft.Json; + + namespace IO.Swagger.Model { @@ -219,4 +221,6 @@ namespace IO.Swagger.Model } } + + } diff --git a/samples/client/petstore/csharp/SwaggerClientTest/SwaggerClientTest.csproj b/samples/client/petstore/csharp/SwaggerClientTest/SwaggerClientTest.csproj index c1dc6a31e19..5556641ea1f 100644 --- a/samples/client/petstore/csharp/SwaggerClientTest/SwaggerClientTest.csproj +++ b/samples/client/petstore/csharp/SwaggerClientTest/SwaggerClientTest.csproj @@ -1,4 +1,4 @@ - + Debug @@ -69,5 +69,9 @@ + + + + \ No newline at end of file diff --git a/samples/client/petstore/csharp/SwaggerClientTest/TestApiClient.cs b/samples/client/petstore/csharp/SwaggerClientTest/TestApiClient.cs index 5b9b27ce656..adf59e0ae0c 100644 --- a/samples/client/petstore/csharp/SwaggerClientTest/TestApiClient.cs +++ b/samples/client/petstore/csharp/SwaggerClientTest/TestApiClient.cs @@ -3,11 +3,18 @@ using System; using System.Collections.Generic; using IO.Swagger.Client; -namespace SwaggerClient.TestApiClient +namespace SwaggerClientTest.TestApiClient { public class TestApiClient { - [Test ()] + [TearDown()] + public void TearDown() + { + // Reset to default, just in case + Configuration.DateTimeFormat = "o"; + } + + [Test ()] public void TestParameterToString () { ApiClient api = new ApiClient (); @@ -19,20 +26,49 @@ namespace SwaggerClient.TestApiClient // test array of int List numList = new List(new int[] {1, 37}); Assert.AreEqual("1,37", api.ParameterToString (numList)); - - // test datetime - DateTime dateUtc = DateTime.Parse("2008-04-10T13:30:00.0000000z", null, System.Globalization.DateTimeStyles.RoundtripKind); - Assert.AreEqual("2008-04-10T13:30:00.0000000Z", api.ParameterToString (dateUtc)); - - // test datetime with no timezone - DateTime dateWithNoTz = DateTime.Parse("2008-04-10T13:30:00.000", null, System.Globalization.DateTimeStyles.RoundtripKind); - Assert.AreEqual("2008-04-10T13:30:00.0000000", api.ParameterToString (dateWithNoTz)); - - // test datetime with a time zone - DateTime dateWithTz = DateTime.Parse("2008-04-10T13:30:00.0000000-04:00", null, System.Globalization.DateTimeStyles.RoundtripKind); - Assert.AreEqual("2008-04-10T13:30:00.0000000-04:00", api.ParameterToString (dateWithTz)); - } - } + + [Test ()] + public void TestParameterToString_DateTime () + { + ApiClient api = new ApiClient(); + + // test datetime + DateTime dateUtc = DateTime.Parse("2008-04-10T13:30:00.0000000z", null, System.Globalization.DateTimeStyles.RoundtripKind); + Assert.AreEqual("2008-04-10T13:30:00.0000000Z", api.ParameterToString(dateUtc)); + + // test datetime with no timezone + DateTime dateWithNoTz = DateTime.Parse("2008-04-10T13:30:00.000", null, System.Globalization.DateTimeStyles.RoundtripKind); + Assert.AreEqual("2008-04-10T13:30:00.0000000", api.ParameterToString(dateWithNoTz)); + + // test datetime with a time zone + DateTime dateWithTz = DateTime.Parse("2008-04-10T13:30:00.0000000-04:00", null, System.Globalization.DateTimeStyles.RoundtripKind); + Assert.AreEqual("2008-04-10T13:30:00.0000000-04:00", api.ParameterToString(dateWithTz)); + } + + [Test ()] + public void TestParameterToString_DateTime_WithUFormat () + { + // Setup the DateTimeFormat across all of the calls + Configuration.DateTimeFormat = "u"; + ApiClient api = new ApiClient(); + + // test datetime + DateTime dateUtc = DateTime.Parse("2009-06-15 20:45:30Z", null, System.Globalization.DateTimeStyles.RoundtripKind); + Assert.AreEqual("2009-06-15 20:45:30Z", api.ParameterToString(dateUtc)); + } + + [Test ()] + public void TestParameterToString_DateTime_WithCustomFormat () + { + // Setup the DateTimeFormat across all of the calls + Configuration.DateTimeFormat = "dd/MM/yy HH:mm:ss"; + ApiClient api = new ApiClient(); + + // test datetime + DateTime dateUtc = DateTime.Parse("2009-06-15 20:45:30Z", null, System.Globalization.DateTimeStyles.RoundtripKind); + Assert.AreEqual("15/06/09 20:45:30", api.ParameterToString(dateUtc)); + } + } } diff --git a/samples/client/petstore/csharp/SwaggerClientTest/TestConfiguration.cs b/samples/client/petstore/csharp/SwaggerClientTest/TestConfiguration.cs index c508917e7d5..c72a0006691 100644 --- a/samples/client/petstore/csharp/SwaggerClientTest/TestConfiguration.cs +++ b/samples/client/petstore/csharp/SwaggerClientTest/TestConfiguration.cs @@ -5,10 +5,17 @@ using IO.Swagger.Client; using IO.Swagger.Api; using IO.Swagger.Model; -namespace SwaggerClient.TestConfiguration +namespace SwaggerClientTest.TestConfiguration { public class TestConfiguration { + [TearDown ()] + public void TearDown () + { + // Reset to default, just in case + Configuration.DateTimeFormat = "o"; + } + [Test ()] public void TestAuthentication () { @@ -32,7 +39,23 @@ namespace SwaggerClient.TestConfiguration Assert.AreNotSame (p.Configuration, Configuration.Default); } - [Test ()] + [Test ()] + public void TestDateTimeFormat_Default () + { + // Should default to the Round-trip Format Specifier - "o" + // https://msdn.microsoft.com/en-us/library/az4se3k1(v=vs.110).aspx#Anchor_8 + Assert.AreEqual("o", Configuration.DateTimeFormat); + } + + [Test ()] + public void TestDateTimeFormat_UType() + { + Configuration.DateTimeFormat = "u"; + + Assert.AreEqual("u", Configuration.DateTimeFormat); + } + + [Test ()] public void TestDefautlConfiguration () { PetApi p1 = new PetApi (); diff --git a/samples/client/petstore/csharp/SwaggerClientTest/TestPet.cs b/samples/client/petstore/csharp/SwaggerClientTest/TestPet.cs index 55d081f9bb1..7c21f8efeaf 100644 --- a/samples/client/petstore/csharp/SwaggerClientTest/TestPet.cs +++ b/samples/client/petstore/csharp/SwaggerClientTest/TestPet.cs @@ -6,9 +6,9 @@ using System.Collections.Generic; using IO.Swagger.Api; using IO.Swagger.Model; using IO.Swagger.Client; +using System.Reflection; - -namespace SwaggerClient.TestPet +namespace SwaggerClientTest.TestPet { [TestFixture ()] public class TestPet @@ -166,15 +166,15 @@ namespace SwaggerClient.TestPet [Test ()] public void TestUploadFile () { - PetApi petApi = new PetApi (); - //NOTE: please provide a valid file (full path) - FileStream fileStream = new FileStream("/var/tmp/small.gif", FileMode.Open); + Assembly _assembly = Assembly.GetExecutingAssembly(); + Stream _imageStream = _assembly.GetManifestResourceStream("SwaggerClientTest.swagger-logo.png"); + PetApi petApi = new PetApi (); // test file upload with form parameters - petApi.UploadFile(petId, "new form name", fileStream); + petApi.UploadFile(petId, "new form name", _imageStream); // test file upload without any form parameters // using optional parameter syntax introduced at .net 4.0 - petApi.UploadFile(petId: petId, file: fileStream); + petApi.UploadFile(petId: petId, file: _imageStream); } diff --git a/samples/client/petstore/csharp/SwaggerClientTest/swagger-logo.png b/samples/client/petstore/csharp/SwaggerClientTest/swagger-logo.png new file mode 100644 index 0000000000000000000000000000000000000000..7671d64c7da5320f6a477a3ae9a6af9ebba077ae GIT binary patch literal 11917 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 Tf0=1800000NkvXXu0mjfB5M3m literal 0 HcmV?d00001 From ddc4b0a5482d382454a3e732ff3b88976d9e9075 Mon Sep 17 00:00:00 2001 From: xhh Date: Sat, 12 Dec 2015 21:33:32 +0800 Subject: [PATCH 183/211] Ruby: place properties on separate lines with description --- .../src/main/resources/ruby/model.mustache | 9 +++++---- .../ruby/lib/petstore/models/category.rb | 4 +++- .../petstore/ruby/lib/petstore/models/order.rb | 14 ++++++++++++-- .../petstore/ruby/lib/petstore/models/pet.rb | 14 ++++++++++++-- .../petstore/ruby/lib/petstore/models/tag.rb | 4 +++- .../petstore/ruby/lib/petstore/models/user.rb | 18 ++++++++++++++++-- 6 files changed, 51 insertions(+), 12 deletions(-) diff --git a/modules/swagger-codegen/src/main/resources/ruby/model.mustache b/modules/swagger-codegen/src/main/resources/ruby/model.mustache index 5d4eb954767..f253a2c0e60 100644 --- a/modules/swagger-codegen/src/main/resources/ruby/model.mustache +++ b/modules/swagger-codegen/src/main/resources/ruby/model.mustache @@ -1,13 +1,14 @@ module {{moduleName}}{{#models}}{{#model}}{{#description}} # {{{description}}}{{/description}} - class {{classname}} < BaseObject - attr_accessor {{#vars}}:{{{name}}}{{#hasMore}}, {{/hasMore}}{{/vars}}{{newline}} + class {{classname}} < BaseObject{{#vars}}{{#description}} + # {{{description}}}{{/description}} + attr_accessor :{{{name}}} +{{/vars}} # Attribute mapping from ruby-style variable name to JSON key. def self.attribute_map { - {{#vars}}{{#description}} - # {{{description}}}{{/description}} + {{#vars}} :'{{{name}}}' => :'{{{baseName}}}'{{#hasMore}},{{/hasMore}} {{/vars}} } diff --git a/samples/client/petstore/ruby/lib/petstore/models/category.rb b/samples/client/petstore/ruby/lib/petstore/models/category.rb index 8864ad10f75..e223e747e74 100644 --- a/samples/client/petstore/ruby/lib/petstore/models/category.rb +++ b/samples/client/petstore/ruby/lib/petstore/models/category.rb @@ -1,6 +1,8 @@ module Petstore class Category < BaseObject - attr_accessor :id, :name + attr_accessor :id + + attr_accessor :name # Attribute mapping from ruby-style variable name to JSON key. def self.attribute_map diff --git a/samples/client/petstore/ruby/lib/petstore/models/order.rb b/samples/client/petstore/ruby/lib/petstore/models/order.rb index 59c84f65666..19a33d1cfc3 100644 --- a/samples/client/petstore/ruby/lib/petstore/models/order.rb +++ b/samples/client/petstore/ruby/lib/petstore/models/order.rb @@ -1,6 +1,17 @@ module Petstore class Order < BaseObject - attr_accessor :id, :pet_id, :quantity, :ship_date, :status, :complete + attr_accessor :id + + attr_accessor :pet_id + + attr_accessor :quantity + + attr_accessor :ship_date + + # Order Status + attr_accessor :status + + attr_accessor :complete # Attribute mapping from ruby-style variable name to JSON key. def self.attribute_map @@ -14,7 +25,6 @@ module Petstore :'ship_date' => :'shipDate', - # Order Status :'status' => :'status', :'complete' => :'complete' diff --git a/samples/client/petstore/ruby/lib/petstore/models/pet.rb b/samples/client/petstore/ruby/lib/petstore/models/pet.rb index 303a12d702c..fb967cbbab4 100644 --- a/samples/client/petstore/ruby/lib/petstore/models/pet.rb +++ b/samples/client/petstore/ruby/lib/petstore/models/pet.rb @@ -1,6 +1,17 @@ module Petstore class Pet < BaseObject - attr_accessor :id, :category, :name, :photo_urls, :tags, :status + attr_accessor :id + + attr_accessor :category + + attr_accessor :name + + attr_accessor :photo_urls + + attr_accessor :tags + + # pet status in the store + attr_accessor :status # Attribute mapping from ruby-style variable name to JSON key. def self.attribute_map @@ -16,7 +27,6 @@ module Petstore :'tags' => :'tags', - # pet status in the store :'status' => :'status' } diff --git a/samples/client/petstore/ruby/lib/petstore/models/tag.rb b/samples/client/petstore/ruby/lib/petstore/models/tag.rb index 06d779c2c54..681c2a2a5c9 100644 --- a/samples/client/petstore/ruby/lib/petstore/models/tag.rb +++ b/samples/client/petstore/ruby/lib/petstore/models/tag.rb @@ -1,6 +1,8 @@ module Petstore class Tag < BaseObject - attr_accessor :id, :name + attr_accessor :id + + attr_accessor :name # Attribute mapping from ruby-style variable name to JSON key. def self.attribute_map diff --git a/samples/client/petstore/ruby/lib/petstore/models/user.rb b/samples/client/petstore/ruby/lib/petstore/models/user.rb index 1b49db1c96b..ca00bf34be1 100644 --- a/samples/client/petstore/ruby/lib/petstore/models/user.rb +++ b/samples/client/petstore/ruby/lib/petstore/models/user.rb @@ -1,6 +1,21 @@ module Petstore class User < BaseObject - attr_accessor :id, :username, :first_name, :last_name, :email, :password, :phone, :user_status + attr_accessor :id + + attr_accessor :username + + attr_accessor :first_name + + attr_accessor :last_name + + attr_accessor :email + + attr_accessor :password + + attr_accessor :phone + + # User Status + attr_accessor :user_status # Attribute mapping from ruby-style variable name to JSON key. def self.attribute_map @@ -20,7 +35,6 @@ module Petstore :'phone' => :'phone', - # User Status :'user_status' => :'userStatus' } From bef2dac0229d98057795910ccf30cb3a98d36ae5 Mon Sep 17 00:00:00 2001 From: wing328 Date: Sun, 13 Dec 2015 17:22:30 +0800 Subject: [PATCH 184/211] fix add route in sinatra --- .../src/main/resources/sinatra/Swaggering.rb | 6 ++++-- .../src/main/resources/sinatra/api.mustache | 2 +- .../src/main/resources/sinatra/my_app.mustache | 7 ++++--- samples/server/petstore/sinatra/api/pet_api.rb | 16 ++++++++-------- .../server/petstore/sinatra/api/store_api.rb | 8 ++++---- .../server/petstore/sinatra/api/user_api.rb | 18 +++++++++--------- .../server/petstore/sinatra/lib/swaggering.rb | 6 ++++-- samples/server/petstore/sinatra/my_app.rb | 4 ++++ 8 files changed, 38 insertions(+), 29 deletions(-) diff --git a/modules/swagger-codegen/src/main/resources/sinatra/Swaggering.rb b/modules/swagger-codegen/src/main/resources/sinatra/Swaggering.rb index 79aca1da2c9..14882a924d7 100644 --- a/modules/swagger-codegen/src/main/resources/sinatra/Swaggering.rb +++ b/modules/swagger-codegen/src/main/resources/sinatra/Swaggering.rb @@ -31,9 +31,10 @@ class Swaggering < Sinatra::Base end def self.add_route(method, path, swag={}, opts={}, &block) - fullPath = swag["resourcePath"].to_s + @@configuration.format_specifier + path + #fullPath = swag["resourcePath"].to_s + @@configuration.format_specifier + path + fullPath = path.gsub(/{(.*)}/, ':\1') - accepted = case method + accepted = case method.to_s.downcase when 'get' get(fullPath, opts, &block) true @@ -47,6 +48,7 @@ class Swaggering < Sinatra::Base put(fullPath, opts, &block) true else + puts "Error adding route: #{method} #{fullPath}" false end diff --git a/modules/swagger-codegen/src/main/resources/sinatra/api.mustache b/modules/swagger-codegen/src/main/resources/sinatra/api.mustache index 7dffb94cdf0..27830feed31 100644 --- a/modules/swagger-codegen/src/main/resources/sinatra/api.mustache +++ b/modules/swagger-codegen/src/main/resources/sinatra/api.mustache @@ -3,7 +3,7 @@ require 'json' {{#operations}} {{#operation}} -MyApp.add_route('{{httpMethod}}', '{{path}}', { +MyApp.add_route('{{httpMethod}}', '{{basePathWithoutHost}}{{path}}', { "resourcePath" => "/{{baseName}}", "summary" => "{{{summary}}}", "nickname" => "{{nickname}}", diff --git a/modules/swagger-codegen/src/main/resources/sinatra/my_app.mustache b/modules/swagger-codegen/src/main/resources/sinatra/my_app.mustache index 8c4a16d7ff5..7d4e87adffc 100644 --- a/modules/swagger-codegen/src/main/resources/sinatra/my_app.mustache +++ b/modules/swagger-codegen/src/main/resources/sinatra/my_app.mustache @@ -7,6 +7,7 @@ class MyApp < Swaggering end end -{{#apis}} -require './lib/{{className}}.rb' -{{/apis}} +# include the api files +Dir["./api/*.rb"].each { |file| + require file +} diff --git a/samples/server/petstore/sinatra/api/pet_api.rb b/samples/server/petstore/sinatra/api/pet_api.rb index 5f995c531d8..7ccad2056b9 100644 --- a/samples/server/petstore/sinatra/api/pet_api.rb +++ b/samples/server/petstore/sinatra/api/pet_api.rb @@ -1,7 +1,7 @@ require 'json' -MyApp.add_route('PUT', '/pet', { +MyApp.add_route('PUT', '/v2/pet', { "resourcePath" => "/Pet", "summary" => "Update an existing pet", "nickname" => "update_pet", @@ -28,7 +28,7 @@ MyApp.add_route('PUT', '/pet', { end -MyApp.add_route('POST', '/pet', { +MyApp.add_route('POST', '/v2/pet', { "resourcePath" => "/Pet", "summary" => "Add a new pet to the store", "nickname" => "add_pet", @@ -55,7 +55,7 @@ MyApp.add_route('POST', '/pet', { end -MyApp.add_route('GET', '/pet/findByStatus', { +MyApp.add_route('GET', '/v2/pet/findByStatus', { "resourcePath" => "/Pet", "summary" => "Finds Pets by status", "nickname" => "find_pets_by_status", @@ -85,7 +85,7 @@ MyApp.add_route('GET', '/pet/findByStatus', { end -MyApp.add_route('GET', '/pet/findByTags', { +MyApp.add_route('GET', '/v2/pet/findByTags', { "resourcePath" => "/Pet", "summary" => "Finds Pets by tags", "nickname" => "find_pets_by_tags", @@ -115,7 +115,7 @@ MyApp.add_route('GET', '/pet/findByTags', { end -MyApp.add_route('GET', '/pet/{petId}', { +MyApp.add_route('GET', '/v2/pet/{petId}', { "resourcePath" => "/Pet", "summary" => "Find pet by ID", "nickname" => "get_pet_by_id", @@ -142,7 +142,7 @@ MyApp.add_route('GET', '/pet/{petId}', { end -MyApp.add_route('POST', '/pet/{petId}', { +MyApp.add_route('POST', '/v2/pet/{petId}', { "resourcePath" => "/Pet", "summary" => "Updates a pet in the store with form data", "nickname" => "update_pet_with_form", @@ -169,7 +169,7 @@ MyApp.add_route('POST', '/pet/{petId}', { end -MyApp.add_route('DELETE', '/pet/{petId}', { +MyApp.add_route('DELETE', '/v2/pet/{petId}', { "resourcePath" => "/Pet", "summary" => "Deletes a pet", "nickname" => "delete_pet", @@ -203,7 +203,7 @@ MyApp.add_route('DELETE', '/pet/{petId}', { end -MyApp.add_route('POST', '/pet/{petId}/uploadImage', { +MyApp.add_route('POST', '/v2/pet/{petId}/uploadImage', { "resourcePath" => "/Pet", "summary" => "uploads an image", "nickname" => "upload_file", diff --git a/samples/server/petstore/sinatra/api/store_api.rb b/samples/server/petstore/sinatra/api/store_api.rb index 24498387412..37938b304db 100644 --- a/samples/server/petstore/sinatra/api/store_api.rb +++ b/samples/server/petstore/sinatra/api/store_api.rb @@ -1,7 +1,7 @@ require 'json' -MyApp.add_route('GET', '/store/inventory', { +MyApp.add_route('GET', '/v2/store/inventory', { "resourcePath" => "/Store", "summary" => "Returns pet inventories by status", "nickname" => "get_inventory", @@ -21,7 +21,7 @@ MyApp.add_route('GET', '/store/inventory', { end -MyApp.add_route('POST', '/store/order', { +MyApp.add_route('POST', '/v2/store/order', { "resourcePath" => "/Store", "summary" => "Place an order for a pet", "nickname" => "place_order", @@ -48,7 +48,7 @@ MyApp.add_route('POST', '/store/order', { end -MyApp.add_route('GET', '/store/order/{orderId}', { +MyApp.add_route('GET', '/v2/store/order/{orderId}', { "resourcePath" => "/Store", "summary" => "Find purchase order by ID", "nickname" => "get_order_by_id", @@ -75,7 +75,7 @@ MyApp.add_route('GET', '/store/order/{orderId}', { end -MyApp.add_route('DELETE', '/store/order/{orderId}', { +MyApp.add_route('DELETE', '/v2/store/order/{orderId}', { "resourcePath" => "/Store", "summary" => "Delete purchase order by ID", "nickname" => "delete_order", diff --git a/samples/server/petstore/sinatra/api/user_api.rb b/samples/server/petstore/sinatra/api/user_api.rb index 98f50549ba1..7b890004891 100644 --- a/samples/server/petstore/sinatra/api/user_api.rb +++ b/samples/server/petstore/sinatra/api/user_api.rb @@ -1,7 +1,7 @@ require 'json' -MyApp.add_route('POST', '/user', { +MyApp.add_route('POST', '/v2/user', { "resourcePath" => "/User", "summary" => "Create user", "nickname" => "create_user", @@ -28,7 +28,7 @@ MyApp.add_route('POST', '/user', { end -MyApp.add_route('POST', '/user/createWithArray', { +MyApp.add_route('POST', '/v2/user/createWithArray', { "resourcePath" => "/User", "summary" => "Creates list of users with given input array", "nickname" => "create_users_with_array_input", @@ -55,7 +55,7 @@ MyApp.add_route('POST', '/user/createWithArray', { end -MyApp.add_route('POST', '/user/createWithList', { +MyApp.add_route('POST', '/v2/user/createWithList', { "resourcePath" => "/User", "summary" => "Creates list of users with given input array", "nickname" => "create_users_with_list_input", @@ -82,7 +82,7 @@ MyApp.add_route('POST', '/user/createWithList', { end -MyApp.add_route('GET', '/user/login', { +MyApp.add_route('GET', '/v2/user/login', { "resourcePath" => "/User", "summary" => "Logs user into the system", "nickname" => "login_user", @@ -122,7 +122,7 @@ MyApp.add_route('GET', '/user/login', { end -MyApp.add_route('GET', '/user/logout', { +MyApp.add_route('GET', '/v2/user/logout', { "resourcePath" => "/User", "summary" => "Logs out current logged in user session", "nickname" => "logout_user", @@ -142,7 +142,7 @@ MyApp.add_route('GET', '/user/logout', { end -MyApp.add_route('GET', '/user/{username}', { +MyApp.add_route('GET', '/v2/user/{username}', { "resourcePath" => "/User", "summary" => "Get user by user name", "nickname" => "get_user_by_name", @@ -154,7 +154,7 @@ MyApp.add_route('GET', '/user/{username}', { { "name" => "username", - "description" => "The name that needs to be fetched. Use user1 for testing. ", + "description" => "The name that needs to be fetched. Use user1 for testing.", "dataType" => "string", "paramType" => "path", }, @@ -169,7 +169,7 @@ MyApp.add_route('GET', '/user/{username}', { end -MyApp.add_route('PUT', '/user/{username}', { +MyApp.add_route('PUT', '/v2/user/{username}', { "resourcePath" => "/User", "summary" => "Updated user", "nickname" => "update_user", @@ -203,7 +203,7 @@ MyApp.add_route('PUT', '/user/{username}', { end -MyApp.add_route('DELETE', '/user/{username}', { +MyApp.add_route('DELETE', '/v2/user/{username}', { "resourcePath" => "/User", "summary" => "Delete user", "nickname" => "delete_user", diff --git a/samples/server/petstore/sinatra/lib/swaggering.rb b/samples/server/petstore/sinatra/lib/swaggering.rb index 79aca1da2c9..14882a924d7 100644 --- a/samples/server/petstore/sinatra/lib/swaggering.rb +++ b/samples/server/petstore/sinatra/lib/swaggering.rb @@ -31,9 +31,10 @@ class Swaggering < Sinatra::Base end def self.add_route(method, path, swag={}, opts={}, &block) - fullPath = swag["resourcePath"].to_s + @@configuration.format_specifier + path + #fullPath = swag["resourcePath"].to_s + @@configuration.format_specifier + path + fullPath = path.gsub(/{(.*)}/, ':\1') - accepted = case method + accepted = case method.to_s.downcase when 'get' get(fullPath, opts, &block) true @@ -47,6 +48,7 @@ class Swaggering < Sinatra::Base put(fullPath, opts, &block) true else + puts "Error adding route: #{method} #{fullPath}" false end diff --git a/samples/server/petstore/sinatra/my_app.rb b/samples/server/petstore/sinatra/my_app.rb index 9f4d991d0f1..33376ef311d 100644 --- a/samples/server/petstore/sinatra/my_app.rb +++ b/samples/server/petstore/sinatra/my_app.rb @@ -7,3 +7,7 @@ class MyApp < Swaggering end end +# include the api files +Dir["./api/*.rb"].each { |file| + require file +} From 1dd05bb90fb0b459867c044bf103d66c8367ec95 Mon Sep 17 00:00:00 2001 From: wing328 Date: Sun, 13 Dec 2015 17:39:52 +0800 Subject: [PATCH 185/211] add swagger.yaml to ruby sinatra --- .../languages/SinatraServerCodegen.java | 18 + .../src/main/resources/sinatra/Swaggering.rb | 7 + .../main/resources/sinatra/swagger.mustache | 1 + .../server/petstore/sinatra/lib/swaggering.rb | 7 + samples/server/petstore/sinatra/swagger.yaml | 667 ++++++++++++++++++ 5 files changed, 700 insertions(+) create mode 100644 modules/swagger-codegen/src/main/resources/sinatra/swagger.mustache create mode 100644 samples/server/petstore/sinatra/swagger.yaml diff --git a/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/SinatraServerCodegen.java b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/SinatraServerCodegen.java index 9bcece87429..1c31b45664e 100644 --- a/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/SinatraServerCodegen.java +++ b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/SinatraServerCodegen.java @@ -1,5 +1,7 @@ package io.swagger.codegen.languages; +import com.fasterxml.jackson.core.JsonProcessingException; + import io.swagger.codegen.CliOption; import io.swagger.codegen.CodegenConfig; import io.swagger.codegen.CodegenType; @@ -8,10 +10,13 @@ import io.swagger.codegen.SupportingFile; import io.swagger.models.properties.ArrayProperty; import io.swagger.models.properties.MapProperty; import io.swagger.models.properties.Property; +import io.swagger.models.Swagger; +import io.swagger.util.Yaml; import java.io.File; import java.util.Arrays; import java.util.HashSet; +import java.util.Map; import org.apache.commons.lang.StringUtils; @@ -73,6 +78,7 @@ public class SinatraServerCodegen extends DefaultCodegen implements CodegenConfi supportingFiles.add(new SupportingFile("config.ru", "", "config.ru")); supportingFiles.add(new SupportingFile("Gemfile", "", "Gemfile")); supportingFiles.add(new SupportingFile("README.md", "", "README.md")); + supportingFiles.add(new SupportingFile("swagger.mustache","","swagger.yaml")); } public CodegenType getTag() { @@ -213,5 +219,17 @@ public class SinatraServerCodegen extends DefaultCodegen implements CodegenConfi return underscore(operationId); } + @Override + public Map postProcessSupportingFileData(Map objs) { + Swagger swagger = (Swagger)objs.get("swagger"); + if(swagger != null) { + try { + objs.put("swagger-yaml", Yaml.mapper().writeValueAsString(swagger)); + } catch (JsonProcessingException e) { + e.printStackTrace(); + } + } + return super.postProcessSupportingFileData(objs); + } } diff --git a/modules/swagger-codegen/src/main/resources/sinatra/Swaggering.rb b/modules/swagger-codegen/src/main/resources/sinatra/Swaggering.rb index 14882a924d7..1357bb19134 100644 --- a/modules/swagger-codegen/src/main/resources/sinatra/Swaggering.rb +++ b/modules/swagger-codegen/src/main/resources/sinatra/Swaggering.rb @@ -26,6 +26,13 @@ class Swaggering < Sinatra::Base cross_origin Swaggering.to_resource_listing } + + # for swagger.yaml + get("/swagger.yaml") { + cross_origin + File.read("./swagger.yaml"); + } + @@configuration ||= Configuration.new yield(@@configuration) if block_given? end diff --git a/modules/swagger-codegen/src/main/resources/sinatra/swagger.mustache b/modules/swagger-codegen/src/main/resources/sinatra/swagger.mustache new file mode 100644 index 00000000000..51560926bba --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/sinatra/swagger.mustache @@ -0,0 +1 @@ +{{{swagger-yaml}}} \ No newline at end of file diff --git a/samples/server/petstore/sinatra/lib/swaggering.rb b/samples/server/petstore/sinatra/lib/swaggering.rb index 14882a924d7..1357bb19134 100644 --- a/samples/server/petstore/sinatra/lib/swaggering.rb +++ b/samples/server/petstore/sinatra/lib/swaggering.rb @@ -26,6 +26,13 @@ class Swaggering < Sinatra::Base cross_origin Swaggering.to_resource_listing } + + # for swagger.yaml + get("/swagger.yaml") { + cross_origin + File.read("./swagger.yaml"); + } + @@configuration ||= Configuration.new yield(@@configuration) if block_given? end diff --git a/samples/server/petstore/sinatra/swagger.yaml b/samples/server/petstore/sinatra/swagger.yaml new file mode 100644 index 00000000000..49a3405de09 --- /dev/null +++ b/samples/server/petstore/sinatra/swagger.yaml @@ -0,0 +1,667 @@ +--- +swagger: "2.0" +info: + description: "This is a sample server Petstore server. You can find out more about\ + \ Swagger at http://swagger.io or on irc.freenode.net,\ + \ #swagger. For this sample, you can use the api key \"special-key\" to test\ + \ the authorization filters" + version: "1.0.0" + title: "Swagger Petstore" + termsOfService: "http://swagger.io/terms/" + contact: + email: "apiteam@swagger.io" + license: + name: "Apache 2.0" + url: "http://www.apache.org/licenses/LICENSE-2.0.html" +host: "petstore.swagger.io" +basePath: "/v2" +schemes: +- "http" +paths: + /pet: + post: + tags: + - "pet" + summary: "Add a new pet to the store" + description: "" + operationId: "addPet" + consumes: + - "application/json" + - "application/xml" + produces: + - "application/json" + - "application/xml" + parameters: + - in: "body" + name: "body" + description: "Pet object that needs to be added to the store" + required: false + schema: + $ref: "#/definitions/Pet" + responses: + 405: + description: "Invalid input" + security: + - petstore_auth: + - "write:pets" + - "read:pets" + put: + tags: + - "pet" + summary: "Update an existing pet" + description: "" + operationId: "updatePet" + consumes: + - "application/json" + - "application/xml" + produces: + - "application/json" + - "application/xml" + parameters: + - in: "body" + name: "body" + description: "Pet object that needs to be added to the store" + required: false + schema: + $ref: "#/definitions/Pet" + responses: + 400: + description: "Invalid ID supplied" + 404: + description: "Pet not found" + 405: + description: "Validation exception" + security: + - petstore_auth: + - "write:pets" + - "read:pets" + /pet/findByStatus: + get: + tags: + - "pet" + summary: "Finds Pets by status" + description: "Multiple status values can be provided with comma seperated strings" + operationId: "findPetsByStatus" + produces: + - "application/json" + - "application/xml" + parameters: + - name: "status" + in: "query" + description: "Status values that need to be considered for filter" + required: false + type: "array" + items: + type: "string" + collectionFormat: "multi" + default: "available" + responses: + 200: + description: "successful operation" + schema: + type: "array" + items: + $ref: "#/definitions/Pet" + 400: + description: "Invalid status value" + security: + - petstore_auth: + - "write:pets" + - "read:pets" + /pet/findByTags: + get: + tags: + - "pet" + summary: "Finds Pets by tags" + description: "Muliple tags can be provided with comma seperated strings. Use\ + \ tag1, tag2, tag3 for testing." + operationId: "findPetsByTags" + produces: + - "application/json" + - "application/xml" + parameters: + - name: "tags" + in: "query" + description: "Tags to filter by" + required: false + type: "array" + items: + type: "string" + collectionFormat: "multi" + responses: + 200: + description: "successful operation" + schema: + type: "array" + items: + $ref: "#/definitions/Pet" + 400: + description: "Invalid tag value" + security: + - petstore_auth: + - "write:pets" + - "read:pets" + /pet/{petId}: + get: + tags: + - "pet" + summary: "Find pet by ID" + description: "Returns a pet when ID < 10. ID > 10 or nonintegers will simulate\ + \ API error conditions" + operationId: "getPetById" + produces: + - "application/json" + - "application/xml" + parameters: + - name: "petId" + in: "path" + description: "ID of pet that needs to be fetched" + required: true + type: "integer" + format: "int64" + responses: + 200: + description: "successful operation" + schema: + $ref: "#/definitions/Pet" + 400: + description: "Invalid ID supplied" + 404: + description: "Pet not found" + security: + - api_key: [] + - petstore_auth: + - "write:pets" + - "read:pets" + post: + tags: + - "pet" + summary: "Updates a pet in the store with form data" + description: "" + operationId: "updatePetWithForm" + consumes: + - "application/x-www-form-urlencoded" + produces: + - "application/json" + - "application/xml" + parameters: + - name: "petId" + in: "path" + description: "ID of pet that needs to be updated" + required: true + type: "string" + - name: "name" + in: "formData" + description: "Updated name of the pet" + required: false + type: "string" + - name: "status" + in: "formData" + description: "Updated status of the pet" + required: false + type: "string" + responses: + 405: + description: "Invalid input" + security: + - petstore_auth: + - "write:pets" + - "read:pets" + delete: + tags: + - "pet" + summary: "Deletes a pet" + description: "" + operationId: "deletePet" + produces: + - "application/json" + - "application/xml" + parameters: + - name: "api_key" + in: "header" + description: "" + required: false + type: "string" + - name: "petId" + in: "path" + description: "Pet id to delete" + required: true + type: "integer" + format: "int64" + responses: + 400: + description: "Invalid pet value" + security: + - petstore_auth: + - "write:pets" + - "read:pets" + /pet/{petId}/uploadImage: + post: + tags: + - "pet" + summary: "uploads an image" + description: "" + operationId: "uploadFile" + consumes: + - "multipart/form-data" + produces: + - "application/json" + - "application/xml" + parameters: + - name: "petId" + in: "path" + description: "ID of pet to update" + required: true + type: "integer" + format: "int64" + - name: "additionalMetadata" + in: "formData" + description: "Additional data to pass to server" + required: false + type: "string" + - name: "file" + in: "formData" + description: "file to upload" + required: false + type: "file" + responses: + default: + description: "successful operation" + security: + - petstore_auth: + - "write:pets" + - "read:pets" + /store/inventory: + get: + tags: + - "store" + summary: "Returns pet inventories by status" + description: "Returns a map of status codes to quantities" + operationId: "getInventory" + produces: + - "application/json" + - "application/xml" + parameters: [] + responses: + 200: + description: "successful operation" + schema: + type: "object" + additionalProperties: + type: "integer" + format: "int32" + security: + - api_key: [] + /store/order: + post: + tags: + - "store" + summary: "Place an order for a pet" + description: "" + operationId: "placeOrder" + produces: + - "application/json" + - "application/xml" + parameters: + - in: "body" + name: "body" + description: "order placed for purchasing the pet" + required: false + schema: + $ref: "#/definitions/Order" + responses: + 200: + description: "successful operation" + schema: + $ref: "#/definitions/Order" + 400: + description: "Invalid Order" + /store/order/{orderId}: + get: + tags: + - "store" + summary: "Find purchase order by ID" + description: "For valid response try integer IDs with value <= 5 or > 10. Other\ + \ values will generated exceptions" + operationId: "getOrderById" + produces: + - "application/json" + - "application/xml" + parameters: + - name: "orderId" + in: "path" + description: "ID of pet that needs to be fetched" + required: true + type: "string" + responses: + 200: + description: "successful operation" + schema: + $ref: "#/definitions/Order" + 400: + description: "Invalid ID supplied" + 404: + description: "Order not found" + delete: + tags: + - "store" + summary: "Delete purchase order by ID" + description: "For valid response try integer IDs with value < 1000. Anything\ + \ above 1000 or nonintegers will generate API errors" + operationId: "deleteOrder" + produces: + - "application/json" + - "application/xml" + parameters: + - name: "orderId" + in: "path" + description: "ID of the order that needs to be deleted" + required: true + type: "string" + responses: + 400: + description: "Invalid ID supplied" + 404: + description: "Order not found" + /user: + post: + tags: + - "user" + summary: "Create user" + description: "This can only be done by the logged in user." + operationId: "createUser" + produces: + - "application/json" + - "application/xml" + parameters: + - in: "body" + name: "body" + description: "Created user object" + required: false + schema: + $ref: "#/definitions/User" + responses: + default: + description: "successful operation" + /user/createWithArray: + post: + tags: + - "user" + summary: "Creates list of users with given input array" + description: "" + operationId: "createUsersWithArrayInput" + produces: + - "application/json" + - "application/xml" + parameters: + - in: "body" + name: "body" + description: "List of user object" + required: false + schema: + type: "array" + items: + $ref: "#/definitions/User" + responses: + default: + description: "successful operation" + /user/createWithList: + post: + tags: + - "user" + summary: "Creates list of users with given input array" + description: "" + operationId: "createUsersWithListInput" + produces: + - "application/json" + - "application/xml" + parameters: + - in: "body" + name: "body" + description: "List of user object" + required: false + schema: + type: "array" + items: + $ref: "#/definitions/User" + responses: + default: + description: "successful operation" + /user/login: + get: + tags: + - "user" + summary: "Logs user into the system" + description: "" + operationId: "loginUser" + produces: + - "application/json" + - "application/xml" + parameters: + - name: "username" + in: "query" + description: "The user name for login" + required: false + type: "string" + - name: "password" + in: "query" + description: "The password for login in clear text" + required: false + type: "string" + responses: + 200: + description: "successful operation" + schema: + type: "string" + 400: + description: "Invalid username/password supplied" + /user/logout: + get: + tags: + - "user" + summary: "Logs out current logged in user session" + description: "" + operationId: "logoutUser" + produces: + - "application/json" + - "application/xml" + parameters: [] + responses: + default: + description: "successful operation" + /user/{username}: + get: + tags: + - "user" + summary: "Get user by user name" + description: "" + operationId: "getUserByName" + produces: + - "application/json" + - "application/xml" + parameters: + - name: "username" + in: "path" + description: "The name that needs to be fetched. Use user1 for testing. " + required: true + type: "string" + responses: + 200: + description: "successful operation" + schema: + $ref: "#/definitions/User" + examples: + application/json: + id: 1 + username: "johnp" + firstName: "John" + lastName: "Public" + email: "johnp@swagger.io" + password: "-secret-" + phone: "0123456789" + userStatus: 0 + 400: + description: "Invalid username supplied" + 404: + description: "User not found" + put: + tags: + - "user" + summary: "Updated user" + description: "This can only be done by the logged in user." + operationId: "updateUser" + produces: + - "application/json" + - "application/xml" + parameters: + - name: "username" + in: "path" + description: "name that need to be deleted" + required: true + type: "string" + - in: "body" + name: "body" + description: "Updated user object" + required: false + schema: + $ref: "#/definitions/User" + responses: + 400: + description: "Invalid user supplied" + 404: + description: "User not found" + delete: + tags: + - "user" + summary: "Delete user" + description: "This can only be done by the logged in user." + operationId: "deleteUser" + produces: + - "application/json" + - "application/xml" + parameters: + - name: "username" + in: "path" + description: "The name that needs to be deleted" + required: true + type: "string" + responses: + 400: + description: "Invalid username supplied" + 404: + description: "User not found" +securityDefinitions: + api_key: + type: "apiKey" + name: "api_key" + in: "header" + petstore_auth: + type: "oauth2" + authorizationUrl: "http://petstore.swagger.io/api/oauth/dialog" + flow: "implicit" + scopes: + write:pets: "modify pets in your account" + read:pets: "read your pets" +definitions: + User: + properties: + id: + type: "integer" + format: "int64" + username: + type: "string" + firstName: + type: "string" + lastName: + type: "string" + email: + type: "string" + password: + type: "string" + phone: + type: "string" + userStatus: + type: "integer" + format: "int32" + description: "User Status" + xml: + name: "User" + Category: + properties: + id: + type: "integer" + format: "int64" + name: + type: "string" + xml: + name: "Category" + Pet: + required: + - "name" + - "photoUrls" + properties: + id: + type: "integer" + format: "int64" + category: + $ref: "#/definitions/Category" + name: + type: "string" + example: "doggie" + photoUrls: + type: "array" + xml: + name: "photoUrl" + wrapped: true + items: + type: "string" + tags: + type: "array" + xml: + name: "tag" + wrapped: true + items: + $ref: "#/definitions/Tag" + status: + type: "string" + description: "pet status in the store" + enum: + - "available" + - "pending" + - "sold" + xml: + name: "Pet" + Tag: + properties: + id: + type: "integer" + format: "int64" + name: + type: "string" + xml: + name: "Tag" + Order: + properties: + id: + type: "integer" + format: "int64" + petId: + type: "integer" + format: "int64" + quantity: + type: "integer" + format: "int32" + shipDate: + type: "string" + format: "date-time" + status: + type: "string" + description: "Order Status" + enum: + - "placed" + - "approved" + - "delivered" + complete: + type: "boolean" + xml: + name: "Order" From 909ec298af11515dd959c1c8afc0bc6b9d978b52 Mon Sep 17 00:00:00 2001 From: wing328 Date: Sun, 13 Dec 2015 18:18:49 +0800 Subject: [PATCH 186/211] update regex to non-greedy match --- .../swagger-codegen/src/main/resources/sinatra/Swaggering.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/swagger-codegen/src/main/resources/sinatra/Swaggering.rb b/modules/swagger-codegen/src/main/resources/sinatra/Swaggering.rb index 1357bb19134..69cc74556ac 100644 --- a/modules/swagger-codegen/src/main/resources/sinatra/Swaggering.rb +++ b/modules/swagger-codegen/src/main/resources/sinatra/Swaggering.rb @@ -39,7 +39,7 @@ class Swaggering < Sinatra::Base def self.add_route(method, path, swag={}, opts={}, &block) #fullPath = swag["resourcePath"].to_s + @@configuration.format_specifier + path - fullPath = path.gsub(/{(.*)}/, ':\1') + fullPath = path.gsub(/{(.*?)}/, ':\1') accepted = case method.to_s.downcase when 'get' From f03bc1f3bc753132e6f2ce4d4e52ff2575ab1584 Mon Sep 17 00:00:00 2001 From: wing328 Date: Mon, 14 Dec 2015 16:07:41 +0800 Subject: [PATCH 187/211] remove some static methods in configuration --- .../main/resources/csharp/ApiClient.mustache | 39 ++++++++++++++++-- .../resources/csharp/Configuration.mustache | 8 ++-- .../src/main/csharp/IO/Swagger/Api/PetApi.cs | 1 - .../main/csharp/IO/Swagger/Api/StoreApi.cs | 1 - .../src/main/csharp/IO/Swagger/Api/UserApi.cs | 1 - .../csharp/IO/Swagger/Client/ApiClient.cs | 39 ++++++++++++++++-- .../csharp/IO/Swagger/Client/Configuration.cs | 8 ++-- .../main/csharp/IO/Swagger/Model/Category.cs | 4 -- .../src/main/csharp/IO/Swagger/Model/Order.cs | 4 -- .../src/main/csharp/IO/Swagger/Model/Pet.cs | 4 -- .../src/main/csharp/IO/Swagger/Model/Tag.cs | 4 -- .../src/main/csharp/IO/Swagger/Model/User.cs | 4 -- .../csharp/SwaggerClientTest/TestApiClient.cs | 34 ++++++++------- .../SwaggerClientTest/TestConfiguration.cs | 8 ++-- .../bin/Debug/SwaggerClientTest.dll | Bin 98816 -> 113152 bytes .../bin/Debug/SwaggerClientTest.dll.mdb | Bin 29758 -> 30575 bytes ...ClientTest.csproj.FilesWrittenAbsolute.txt | 1 + .../obj/Debug/SwaggerClientTest.dll | Bin 98816 -> 113152 bytes .../obj/Debug/SwaggerClientTest.dll.mdb | Bin 29758 -> 30575 bytes 19 files changed, 105 insertions(+), 55 deletions(-) diff --git a/modules/swagger-codegen/src/main/resources/csharp/ApiClient.mustache b/modules/swagger-codegen/src/main/resources/csharp/ApiClient.mustache index 707ce9eb560..b8b9fc7a5a1 100644 --- a/modules/swagger-codegen/src/main/resources/csharp/ApiClient.mustache +++ b/modules/swagger-codegen/src/main/resources/csharp/ApiClient.mustache @@ -19,23 +19,56 @@ namespace {{packageName}}.Client public class ApiClient { /// - /// Initializes a new instance of the class. + /// Initializes a new instance of the class + /// with default configuration and base path ({{basePath}}). + /// + public ApiClient() + { + Configuration = Configuration.Default; + RestClient = new RestClient("{{basePath}}"); + } + + /// + /// Initializes a new instance of the class + /// with default base path ({{basePath}}). + /// + /// An instance of Configuration. + public ApiClient(Configuration config = null) + { + if (config == null) + Configuration = Configuration.Default; + else + Configuration = config; + + RestClient = new RestClient("{{basePath}}"); + } + + /// + /// Initializes a new instance of the class + /// with default configuration. /// /// The base path. - public ApiClient(String basePath="{{basePath}}") + public ApiClient(String basePath = "{{basePath}}") { if (String.IsNullOrEmpty(basePath)) throw new ArgumentException("basePath cannot be empty"); RestClient = new RestClient(basePath); + Configuration = Configuration.Default; } /// /// Gets or sets the default API client for making HTTP calls. /// /// The default API client. - public static ApiClient Default = new ApiClient(); + public static ApiClient Default = new ApiClient(Configuration.Default); + /// + /// Gets or sets the Configuration. + /// + /// An instance of the Configuration. + public Configuration Configuration { get; set; } + /// /// Gets or sets the RestClient. /// diff --git a/modules/swagger-codegen/src/main/resources/csharp/Configuration.mustache b/modules/swagger-codegen/src/main/resources/csharp/Configuration.mustache index 44459e54440..440288a4832 100644 --- a/modules/swagger-codegen/src/main/resources/csharp/Configuration.mustache +++ b/modules/swagger-codegen/src/main/resources/csharp/Configuration.mustache @@ -109,13 +109,13 @@ namespace {{packageName}}.Client return apiKeyValue; } - private static string _tempFolderPath = Path.GetTempPath(); + private string _tempFolderPath = Path.GetTempPath(); /// /// Gets or sets the temporary folder path to store the files downloaded from the server. /// /// Folder path. - public static String TempFolderPath + public String TempFolderPath { get { return _tempFolderPath; } @@ -141,7 +141,7 @@ namespace {{packageName}}.Client private const string ISO8601_DATETIME_FORMAT = "o"; - private static string _dateTimeFormat = ISO8601_DATETIME_FORMAT; + private string _dateTimeFormat = ISO8601_DATETIME_FORMAT; /// /// Gets or sets the the date time format used when serializing in the ApiClient @@ -151,7 +151,7 @@ namespace {{packageName}}.Client /// No validation is done to ensure that the string you're providing is valid /// /// The DateTimeFormat string - public static String DateTimeFormat + public String DateTimeFormat { get { diff --git a/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Api/PetApi.cs b/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Api/PetApi.cs index 9ab779c9f4b..ba58eeac9e0 100644 --- a/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Api/PetApi.cs +++ b/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Api/PetApi.cs @@ -6,7 +6,6 @@ using RestSharp; using IO.Swagger.Client; using IO.Swagger.Model; - namespace IO.Swagger.Api { diff --git a/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Api/StoreApi.cs b/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Api/StoreApi.cs index db82bf8e644..a9e9d6e9b74 100644 --- a/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Api/StoreApi.cs +++ b/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Api/StoreApi.cs @@ -6,7 +6,6 @@ using RestSharp; using IO.Swagger.Client; using IO.Swagger.Model; - namespace IO.Swagger.Api { diff --git a/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Api/UserApi.cs b/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Api/UserApi.cs index ac4f138c568..5502fe15da1 100644 --- a/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Api/UserApi.cs +++ b/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Api/UserApi.cs @@ -6,7 +6,6 @@ using RestSharp; using IO.Swagger.Client; using IO.Swagger.Model; - namespace IO.Swagger.Api { diff --git a/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Client/ApiClient.cs b/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Client/ApiClient.cs index faf688b5585..58ade063718 100644 --- a/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Client/ApiClient.cs +++ b/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Client/ApiClient.cs @@ -19,23 +19,56 @@ namespace IO.Swagger.Client public class ApiClient { /// - /// Initializes a new instance of the class. + /// Initializes a new instance of the class + /// with default configuration and base path (http://petstore.swagger.io/v2). + /// + public ApiClient() + { + Configuration = Configuration.Default; + RestClient = new RestClient("http://petstore.swagger.io/v2"); + } + + /// + /// Initializes a new instance of the class + /// with default base path (http://petstore.swagger.io/v2). + /// + /// An instance of Configuration. + public ApiClient(Configuration config = null) + { + if (config == null) + Configuration = Configuration.Default; + else + Configuration = config; + + RestClient = new RestClient("http://petstore.swagger.io/v2"); + } + + /// + /// Initializes a new instance of the class + /// with default configuration. /// /// The base path. - public ApiClient(String basePath="http://petstore.swagger.io/v2") + public ApiClient(String basePath = "http://petstore.swagger.io/v2") { if (String.IsNullOrEmpty(basePath)) throw new ArgumentException("basePath cannot be empty"); RestClient = new RestClient(basePath); + Configuration = Configuration.Default; } /// /// Gets or sets the default API client for making HTTP calls. /// /// The default API client. - public static ApiClient Default = new ApiClient(); + public static ApiClient Default = new ApiClient(Configuration.Default); + /// + /// Gets or sets the Configuration. + /// + /// An instance of the Configuration. + public Configuration Configuration { get; set; } + /// /// Gets or sets the RestClient. /// diff --git a/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Client/Configuration.cs b/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Client/Configuration.cs index fcdc16f44db..588b106dec9 100644 --- a/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Client/Configuration.cs +++ b/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Client/Configuration.cs @@ -109,13 +109,13 @@ namespace IO.Swagger.Client return apiKeyValue; } - private static string _tempFolderPath = Path.GetTempPath(); + private string _tempFolderPath = Path.GetTempPath(); /// /// Gets or sets the temporary folder path to store the files downloaded from the server. /// /// Folder path. - public static String TempFolderPath + public String TempFolderPath { get { return _tempFolderPath; } @@ -141,7 +141,7 @@ namespace IO.Swagger.Client private const string ISO8601_DATETIME_FORMAT = "o"; - private static string _dateTimeFormat = ISO8601_DATETIME_FORMAT; + private string _dateTimeFormat = ISO8601_DATETIME_FORMAT; /// /// Gets or sets the the date time format used when serializing in the ApiClient @@ -151,7 +151,7 @@ namespace IO.Swagger.Client /// No validation is done to ensure that the string you're providing is valid /// /// The DateTimeFormat string - public static String DateTimeFormat + public String DateTimeFormat { get { diff --git a/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Model/Category.cs b/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Model/Category.cs index 03551f9492b..d9cb6b21005 100644 --- a/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Model/Category.cs +++ b/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Model/Category.cs @@ -7,8 +7,6 @@ using System.Collections.Generic; using System.Runtime.Serialization; using Newtonsoft.Json; - - namespace IO.Swagger.Model { @@ -124,6 +122,4 @@ namespace IO.Swagger.Model } } - - } diff --git a/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Model/Order.cs b/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Model/Order.cs index 1d214430ec8..2191707bd09 100644 --- a/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Model/Order.cs +++ b/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Model/Order.cs @@ -7,8 +7,6 @@ using System.Collections.Generic; using System.Runtime.Serialization; using Newtonsoft.Json; - - namespace IO.Swagger.Model { @@ -189,6 +187,4 @@ namespace IO.Swagger.Model } } - - } diff --git a/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Model/Pet.cs b/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Model/Pet.cs index ab60577e85a..10c44fb46a7 100644 --- a/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Model/Pet.cs +++ b/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Model/Pet.cs @@ -7,8 +7,6 @@ using System.Collections.Generic; using System.Runtime.Serialization; using Newtonsoft.Json; - - namespace IO.Swagger.Model { @@ -189,6 +187,4 @@ namespace IO.Swagger.Model } } - - } diff --git a/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Model/Tag.cs b/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Model/Tag.cs index cf77c2470b2..93210505bf0 100644 --- a/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Model/Tag.cs +++ b/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Model/Tag.cs @@ -7,8 +7,6 @@ using System.Collections.Generic; using System.Runtime.Serialization; using Newtonsoft.Json; - - namespace IO.Swagger.Model { @@ -124,6 +122,4 @@ namespace IO.Swagger.Model } } - - } diff --git a/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Model/User.cs b/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Model/User.cs index eca977c3b18..1fbd17da993 100644 --- a/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Model/User.cs +++ b/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Model/User.cs @@ -7,8 +7,6 @@ using System.Collections.Generic; using System.Runtime.Serialization; using Newtonsoft.Json; - - namespace IO.Swagger.Model { @@ -221,6 +219,4 @@ namespace IO.Swagger.Model } } - - } diff --git a/samples/client/petstore/csharp/SwaggerClientTest/TestApiClient.cs b/samples/client/petstore/csharp/SwaggerClientTest/TestApiClient.cs index adf59e0ae0c..f0232c330f0 100644 --- a/samples/client/petstore/csharp/SwaggerClientTest/TestApiClient.cs +++ b/samples/client/petstore/csharp/SwaggerClientTest/TestApiClient.cs @@ -11,7 +11,7 @@ namespace SwaggerClientTest.TestApiClient public void TearDown() { // Reset to default, just in case - Configuration.DateTimeFormat = "o"; + Configuration.Default.DateTimeFormat = "o"; } [Test ()] @@ -29,28 +29,34 @@ namespace SwaggerClientTest.TestApiClient } [Test ()] - public void TestParameterToString_DateTime () - { - ApiClient api = new ApiClient(); + public void TestParameterToStringForDateTime () + { + ApiClient api = new ApiClient (); - // test datetime - DateTime dateUtc = DateTime.Parse("2008-04-10T13:30:00.0000000z", null, System.Globalization.DateTimeStyles.RoundtripKind); - Assert.AreEqual("2008-04-10T13:30:00.0000000Z", api.ParameterToString(dateUtc)); + // test datetime + DateTime dateUtc = DateTime.Parse ("2008-04-10T13:30:00.0000000z", null, System.Globalization.DateTimeStyles.RoundtripKind); + Assert.AreEqual ("2008-04-10T13:30:00.0000000Z", api.ParameterToString (dateUtc)); - // test datetime with no timezone - DateTime dateWithNoTz = DateTime.Parse("2008-04-10T13:30:00.000", null, System.Globalization.DateTimeStyles.RoundtripKind); - Assert.AreEqual("2008-04-10T13:30:00.0000000", api.ParameterToString(dateWithNoTz)); + // test datetime with no timezone + DateTime dateWithNoTz = DateTime.Parse ("2008-04-10T13:30:00.000", null, System.Globalization.DateTimeStyles.RoundtripKind); + Assert.AreEqual ("2008-04-10T13:30:00.0000000", api.ParameterToString (dateWithNoTz)); + } + // The test below only passes when running at -04:00 timezone + [Ignore ()] + public void TestParameterToStringWithTimeZoneForDateTime () + { + ApiClient api = new ApiClient (); // test datetime with a time zone DateTime dateWithTz = DateTime.Parse("2008-04-10T13:30:00.0000000-04:00", null, System.Globalization.DateTimeStyles.RoundtripKind); Assert.AreEqual("2008-04-10T13:30:00.0000000-04:00", api.ParameterToString(dateWithTz)); } [Test ()] - public void TestParameterToString_DateTime_WithUFormat () + public void TestParameterToStringForDateTimeWithUFormat () { // Setup the DateTimeFormat across all of the calls - Configuration.DateTimeFormat = "u"; + Configuration.Default.DateTimeFormat = "u"; ApiClient api = new ApiClient(); // test datetime @@ -59,10 +65,10 @@ namespace SwaggerClientTest.TestApiClient } [Test ()] - public void TestParameterToString_DateTime_WithCustomFormat () + public void TestParameterToStringForDateTimeWithCustomFormat () { // Setup the DateTimeFormat across all of the calls - Configuration.DateTimeFormat = "dd/MM/yy HH:mm:ss"; + Configuration.Default.DateTimeFormat = "dd/MM/yy HH:mm:ss"; ApiClient api = new ApiClient(); // test datetime diff --git a/samples/client/petstore/csharp/SwaggerClientTest/TestConfiguration.cs b/samples/client/petstore/csharp/SwaggerClientTest/TestConfiguration.cs index c72a0006691..2ea6785529a 100644 --- a/samples/client/petstore/csharp/SwaggerClientTest/TestConfiguration.cs +++ b/samples/client/petstore/csharp/SwaggerClientTest/TestConfiguration.cs @@ -13,7 +13,7 @@ namespace SwaggerClientTest.TestConfiguration public void TearDown () { // Reset to default, just in case - Configuration.DateTimeFormat = "o"; + Configuration.Default.DateTimeFormat = "o"; } [Test ()] @@ -44,15 +44,15 @@ namespace SwaggerClientTest.TestConfiguration { // Should default to the Round-trip Format Specifier - "o" // https://msdn.microsoft.com/en-us/library/az4se3k1(v=vs.110).aspx#Anchor_8 - Assert.AreEqual("o", Configuration.DateTimeFormat); + Assert.AreEqual("o", Configuration.Default.DateTimeFormat); } [Test ()] public void TestDateTimeFormat_UType() { - Configuration.DateTimeFormat = "u"; + Configuration.Default.DateTimeFormat = "u"; - Assert.AreEqual("u", Configuration.DateTimeFormat); + Assert.AreEqual("u", Configuration.Default.DateTimeFormat); } [Test ()] diff --git a/samples/client/petstore/csharp/SwaggerClientTest/bin/Debug/SwaggerClientTest.dll b/samples/client/petstore/csharp/SwaggerClientTest/bin/Debug/SwaggerClientTest.dll index a438e10395475b6b219e30bbe99b06cf8364659c..dbeb4f0ebadc6185dbb278cebe2f41412981ff71 100755 GIT binary patch literal 113152 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

<0NT;M2>X&0QQzzkBw%;N5#v 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 delta 9563 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

<0NT;M2>X&0QQzzkBw%;N5#v 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 delta 9563 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 vqxhB!--H*zwNN>ngs(=o-~v1o-G Date: Mon, 14 Dec 2015 22:26:32 +0800 Subject: [PATCH 188/211] add constructor to configuration --- .../resources/csharp/Configuration.mustache | 39 ++++++++++++++++ .../csharp/IO/Swagger/Client/Configuration.cs | 44 +++++++++++++++++- .../SwaggerClientTest/TestConfiguration.cs | 9 ++++ .../bin/Debug/SwaggerClientTest.dll | Bin 113152 -> 113664 bytes .../bin/Debug/SwaggerClientTest.dll.mdb | Bin 30575 -> 30764 bytes .../obj/Debug/SwaggerClientTest.dll | Bin 113152 -> 113664 bytes .../obj/Debug/SwaggerClientTest.dll.mdb | Bin 30575 -> 30764 bytes 7 files changed, 91 insertions(+), 1 deletion(-) diff --git a/modules/swagger-codegen/src/main/resources/csharp/Configuration.mustache b/modules/swagger-codegen/src/main/resources/csharp/Configuration.mustache index 440288a4832..b5ebd08ba87 100644 --- a/modules/swagger-codegen/src/main/resources/csharp/Configuration.mustache +++ b/modules/swagger-codegen/src/main/resources/csharp/Configuration.mustache @@ -12,6 +12,45 @@ namespace {{packageName}}.Client /// public class Configuration { + ///

+ /// Initializes a new instance of the Configuration class with different settings + /// + /// Api client + /// Dictionary of default HTTP header + /// Username + /// Password + /// accessToken + /// Dictionary of API key + /// Dictionary of API key prefix + /// Temp folder path + /// DateTime format string + public Configuration(ApiClient apiClient, + Dictionary defaultHeader, + string username, + string password, + string accessToken, + Dictionary apiKey, + Dictionary apiKeyPrefix, + string tempFolderPath, + string dateTimeFormat + ) + { + if (apiClient == null) + ApiClient = ApiClient.Default; + else + ApiClient = apiClient; + + Username = username; + Password = password; + AccessToken = accessToken; + ApiKey = apiKey; + ApiKeyPrefix = apiKeyPrefix; + + TempFolderPath = tempFolderPath; + DateTimeFormat = dateTimeFormat; + + } + /// /// Initializes a new instance of the Configuration class. /// diff --git a/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Client/Configuration.cs b/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Client/Configuration.cs index 588b106dec9..bfbb9d7479d 100644 --- a/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Client/Configuration.cs +++ b/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Client/Configuration.cs @@ -12,11 +12,53 @@ namespace IO.Swagger.Client /// public class Configuration { + /// + /// Initializes a new instance of the Configuration class with different settings + /// + /// Api client + /// Dictionary of default HTTP header + /// Username + /// Password + /// accessToken + /// Dictionary of API key + /// Dictionary of API key prefix + /// Temp folder path + /// DateTime format string + public Configuration(ApiClient apiClient = null, + Dictionary defaultHeader = null, + string username = null, + string password = null, + string accessToken = null, + Dictionary apiKey = null, + Dictionary apiKeyPrefix = null, + string tempFolderPath = null, + string dateTimeFormat = null + ) + { + if (apiClient == null) + ApiClient = ApiClient.Default; + else + ApiClient = apiClient; + + Username = username; + Password = password; + AccessToken = accessToken; + + if (apiKey != null) + ApiKey = apiKey; + if (apiKeyPrefix != null) + ApiKeyPrefix = apiKeyPrefix; + + TempFolderPath = tempFolderPath; + DateTimeFormat = dateTimeFormat; + + } + /// /// Initializes a new instance of the Configuration class. /// /// Api client. - public Configuration(ApiClient apiClient=null) + public Configuration(ApiClient apiClient) { if (apiClient == null) ApiClient = ApiClient.Default; diff --git a/samples/client/petstore/csharp/SwaggerClientTest/TestConfiguration.cs b/samples/client/petstore/csharp/SwaggerClientTest/TestConfiguration.cs index 2ea6785529a..a72e1a5ed1d 100644 --- a/samples/client/petstore/csharp/SwaggerClientTest/TestConfiguration.cs +++ b/samples/client/petstore/csharp/SwaggerClientTest/TestConfiguration.cs @@ -55,6 +55,15 @@ namespace SwaggerClientTest.TestConfiguration Assert.AreEqual("u", Configuration.Default.DateTimeFormat); } + [Test ()] + public void TestConstructor() + { + Configuration c = new Configuration (username: "test username", password: "test password"); + Assert.AreEqual (c.Username, "test username"); + Assert.AreEqual (c.Password, "test password"); + + } + [Test ()] public void TestDefautlConfiguration () { diff --git a/samples/client/petstore/csharp/SwaggerClientTest/bin/Debug/SwaggerClientTest.dll b/samples/client/petstore/csharp/SwaggerClientTest/bin/Debug/SwaggerClientTest.dll index dbeb4f0ebadc6185dbb278cebe2f41412981ff71..1cc6bc94f0c97cc2eb0e3c881f9499928d0f3982 100755 GIT binary patch delta 15330 zcmdU$d3Y36*6`1%UeZZevL~H%lJ2Zc*dai|8U!IMLO=vTkbnePgvKPeA#{*M(6EFG z1O+re*b%`-K?x9iF`}Y_jtinPK^O){opBeH!S9??H{Ai|`~G_W`RaK%eSc@GdvBe4 ztGYUr{bVh>YF)jl`9TD*f*iv>sMtNa1$=-ogt-C1W~y*S=_z<`$f%dd&q>;Y`cv2% zU(sK|Ongm0k0}`)D1eWA`lo>f^1=~n>i`Tbz}_zbD%w?rzl2$Offk0>^-092Nf50*h5V5>5;A!8#UH{~Ob7>r4NvD9- z{(#LKAYw~nK!vX~Bicj(PqpHJms?T5I)A`x93bLIV?dQJt#!VM=51EH62y)Ah4v2I zlHk3ig_x9H-)t-jV>da-4C4qGa7DE&@<`Vge_B0{MpBi`jRbuZ(9 z#l1M-#a@(ZpN@ST_@bWF=Uu9>Z~AP!rNUiYQR_3NnleYl?5>Ca4Q=UX&jVdE8?*KdH&n?Ko1qx^Dc2`14(QrDS2Yq`Fh_w)aaI|d|`zvo1l11ojlD@mHCEG`B7PYN2l&Enmc^Wrt|9X zotSZtG437u88iMst9!2D9#;1D<+o&xZkE$PAIiB z_a&M~kIh%IzKaDn>$^5h&etq%joh^sX17^BEp97)wy@^fIHHAhKJ8QH7C{Pw=I0V> zEo|;!@eX!VVOp~Qd|Njy*06={t{#~J5ZNIZq9~q^sK%q@KXmr8P86S|FRQM>Fdg@$ zV}!o&K(v0QroWZCsJUbHrTem4hEdYc2z0kZ2r+rW^yB+7lUUb0!sO22flZ{unwwRT z<_I&pbl4K_jvzL9SaSD5y1T@SIXBYZBnN%Ki*4!j)mvgRI7PDv?RpHIJ%K|*?her; zQ7-K{U`@^)N2t$vAxpPz{RQK7+#TO6wk6E*{EPabxgD&~d)0(ul0K*=9i6&|WQq)G zH)+%KS8DFVR(kxltd{X~uE40`WmK&5kE(~pqhggYs(2bzR7{L$9jvuPSk#<2^w+n! zlSLU65oAot+jQ5V9!e;U~Bz&7_lUN%Z5$ukXDNWKlZ+9n)GBhI89YxCAu>r?s z5zS1VB>l1N@nKF5Y#!0v9W8-Qy=Hr!SClOyT8c9FjLfa*!Xm;<9&VL)rTM%b!_q@@ z9Fn_7oKnbS@~~`rg_v`ny2-&qx6+W@QqiW7Lu7bFxI0cdL9;q#hdWuckr9z@J9|>u z(db1N6%l3fr0IKhmngEXZN?8Zr@q zYsl!ohBDfKjnQwDVFhfAewz#+U}N+|(A>(7Bi#%byV8!c8hgtQnb){O>Sg;Zc)M(n zbcbzn*?Y@nXPy7D8yh66jLY6zHpo0;lZR!~DPmSrq#R^}>@6E4r?_=~BqY$?Jm3Bo z=^mReyJKdUe|H?rU2oPmpcpEO2?510QaG_d)K3T0BSo<-pcusp{kH?5*3s0V@-F(3 znznkkmpb7+`iz&dTIQ27unh8LK3M0UkBd_9tTN^!UzWi!(GDi9$-}bgtT5+py2-&P z>L*1zRKi#`4P(xodXs|@Rv_A862{W)ZE}}lMQ;0>Jd8NnD`*K*H1(2Y)6+5MUX}U} zI2d7Higu)gv1}T~oO@#OO&&&^u~UzdIF?Q0nAJ`la4^D*otm$X+@_5C%xHc5L3gq! z`8E|5*r-J(x2e(k)`K}zJG>hC0^M3|aw!7U#^_&FGT#9kqu(ZT8n7|?Z8C8I8>1(J z%34;VOi#eb=ns@B2-q0?w$b{5mt%0We(L4h@>`Q3#H!63O%FUJiImvWmNeGlPq?T% zO7q{`>_*KJdeE_k1|{drFg)qjXALSgg_Ai_f3G&~_FklD9^5n;JziUbi$}0aUuwp# zXhB7i9uvH!B$>_?X|{%&JzdCP4f0S`S*{4Sl|`Qq*<+Z#~k79O*_6H;azEMh`Q+YxDnC7mD|PWuefODBkaIBPMtqywIS z7oCJpM&C*sPgXoX2Idq$LqfiI%D2uCs|Ps)nP3=2Ni>J@Nzl1sfqZR`^5KFqd?u5Dx0AZv{9eCHE z{`7f<_#1ux51pfbqiaz||2mSEb_%GV&kyxCe&~qBzF&WMAH8Ry2Zn~g_adD!A88?w zF0zlv;V}mzLSTu=Pw*ox33kWS#U#NOBxB(FnApe^=n^|PHU-9soGx;n$V!qSa3Gd* z){%^bWz@$M_(SyF5?Q|?B7;B9X05cY!f)u+KnVPykNtUrw z0JIj`Av6?v3GERY1_OoOhW!*b8YT$+03Q&I0ebOCIjLTdX^v1=94fX)(S%{JnO^WN z!EsRL73>zoI1!!@8ci=bmS8a~6`CdVFf0@LOz0^n7YYex&(*L}=q{nHutumxKR<^g29?Uhd7<5Ki+kJSWC^LSI0&(3?U(K#kA^p{uZ6D4p)XORyR478)TG ziF<|0o3YJ}`-OH1wZ)f&J`l>oSJ338(|;>C01t~XsyPRa#af|`LKE?r&^V!Dd|l`v zp@;FL(0-w(@RZOyLaXp?p&x{{;Cn(2dMH_fJMavVHw;D!zJ?!)ah}j|{8(te&55=k99-!WGjN+&=<*2v3O>zACjgNZEmvO`FR7G;sTYmJ$ zjki;6C=9dDwo^4I%CMK&=@Ki-w-2+^|}J;DH@Q+Dq@JHJfhquz4XUTbfB(N}Nz$^IVg(Z*44vBrO7kMmPne1o0e zckoef=@Ea$o@4;gz45==U4EJtkMXH~S`gndo_-&Zqu#P2KE7*wrXP34w~24%CtrL{ zd>cQ#9iJcH-cRSM*4nU@_m}vY&<&0|S-%vt1P{?kgKRAlO5$_iydr19bfPN;L8pZI z@ws4=PA-MKgjGawLYI;2p$DWX;(F)_S5oK%a2dHCdVyPpa~YR=>B9DgB86NKePE6v zE{HtHma$$&E{MKRs)!5XHaMt=3!)#KRrDj(Lw`6WlX4lk9&QJl+c-Vf!vM%vlyCPA zvk!y^6mmi2!}u)2l?!4JY*fSrF&I8q#04>go(&C8E{LHJ*4Cg?_I>s{pg2 zf{334iJc7_*Ta3#MiJM;R4Ao4cO1v{;GGU96`qT~EB*n9q8F5W2OW{Hfoh?HqFF?9 zpg_@bq6gstMO%o9fnRTO+!3M@*s16|Q7N2KgpLgfbK#Pr6rzW`VD4rF_9J{4oQevG z9)UbX^NAjX@rpJRJqC{}dV^>ltXFh_=y5o#=s!gB;X_67i5n8=IYW+m%kad1C3wNx zh~pFgAZ(<$iOn1VdNMJw32jU4)P(jY<~qv!ac?H}cP#YNCyB!yPx$G_#Csi!`~*o; z9Q1HAOceDNd(v#j62Gx^(j$(gej1eIfhYZRSJG0)GC$2qTIE>orv+6@nyEFt0*2hn zdSgwmfC7VLO|OI*ig-=0gi__nYkCz_D&jT03TlKdBTrWaoKnQIRRQINe1^-&vsD2n z6+P*t>8gNh3VFIJz&Xiq<>^`jrzac4)1^bR`wZggs)V76c)HfY97Q}`>maYl@Z{O5 zf-*%sTkGMdqCrVs4?F{>6!LUE3y<7y1oCukfWwLwB&~I9gsVaoupwzf!X}8C#-0`M z8qsr*t>{yt=b=E+FGSTaM^R+*hJ?*fuBcP;25-U^*sE{^8MneIMINFW&QAwz-N~C1 zw;4dRK6yvtc0awCd?0a$pN=OVPTc9I&ywpCclqh( zH5p#@8}nR=NdX$;%F_aLzbn0oZIP>E6RL1^OQK(t<*2vparI3);-_P-AxX7<`oc9f z=_t@QaX#uTS6qcj#|d zPCFfsg6rWT@V>{y^>7g?ml(wLa1l-`;(E9UX4wQUBiF-4a4VvE@Frb?t4|t%To8YU zoMi@aL0pEpint*D0gDxJJ$wcEPZ^$E4`0J-MO+Wx!bgg@9{vptint!WgVp6m9M^;Q zdpM(TLdsgl4-mG3jTP`{%7%m=p^c(-L_fh$MLwdRVVa`95&Z(o6osa4Nca_M6m=!K z3MUm!BKi#)6wN34oi5o*o{IiT^dGoe(T_ye;SoiVX&Vy$gi1vn zhyV{Nx`PPujG`Gt8V1P*ur%&l^JFk#75!?O=H=%@3%+Dnq|hx`tLVwJMafqDSkbz) z6+{g}3t?NDo*aZf$tJQC4yLtmw!}94YZ)!2+O$5-Slp@Tt+dL>WIUNINhp6W<X#~ClUhU0CDE@m7j8mj0! z>UIH6RrCjqumI;MvSz;J8i7wKip>0!s8UEq4ou4Eah&Tp=e^}8KP1}JTqf)r6Qi0vAABy82vch z=zU90FQXrahlPyMkHgP}c=YE|?!nS`*wYyOcpP|I;$%M?j|B$F=*Qy>MLhcPSgMEz zI008G;sH*;^{2f?QmRC_7vtWQq|%vtFM$4GaOOPP~l29|$h&{sl-6@4#s`eVapakFQKvj(LL_59SJY@vd41`QV4sc5X> z`5D{1OJSB^-WP`J!-lJ(RYG4HB*iuZ|EX-7#db~6ZlNjXjVyISrxaZfGXKr6wP?lN zE-=Uo-36aDP@Q6nay3qIP|-~BbT=4j76{Ez^t8~Eina^wS9DzHs-nLLm0kckmV)<+ zpz}*XI(@V@1M>{By<*uOISa=LEwpuwI}$YurzqPs%lmP&ae=bk9+zyNjmwm6wQZ5f zgIknsMBLj!9{i~rpW!lo5jL4#YuDx&G}hZ}d(a#_t&oimqPeFslI=l^5~_f{^!2|O zJ1EL0D!~Hf$#JC^*DDZLif%=0n~Q~c0oz=hBg8qq^b!Nh6>`#taj$aaz(;Ud-$39a zxLy(49>uWR1GY!eDP(l?G3=>`bI!x@%9G&j=Yw z7vMLFIH?z#4K_SEt_-gz8cVZQhF6=|7UKG0ft(9*r;w4;`vjg;$VnIBCFROV7vtgK zfxyLhN)g+Z;Kn-xwk5b%$Vj>rPbuP@PvRBj$#Ki@;HW^{GB2J~$j0SZdUwFM92W~2 zNuR=MMV$0$tW%yGSB{lq199b8qlj%QaP@?MZ3R{f897&?w^ku1U4>Vs8Lk|-8tbM9 z0$1Z1MQp3Uuvr0H1v-U{q-(IJBF?Gfc;(4)m6$U-5Lb!$UWII2i&Gv97}sK{kdbs9 zu2#fJt8l;aH(+}PuL>DCpT#J8fk#ILaMBH!{gC0xfgACf zA}*+n*zDneZ4-8o@5+~vZJRJp$VmDej#tDvpU3Z32I8vm@G65it{P9RlKY>rDQw2t zH38#hJS}7--GWyXanh}5(*sFs@Qfl(T7wNuY}@d|b%C7Q@RE>`b2~zn-2aTx??5ME z;|{eGuPEZAJMn50+b;a(*+9}=cumMix*Ov*u+7N12Xlms0q#Y5TSbR4YkRQ`lUHqt zFJR^K0pkl;BV;7qhjog0^eTM>8k5ROuw9CsL~Cv4cTg zxgorYrF#R$S8=hBk@PjJR>Vnhq_w#0g+N>_u2;miqgX4iz>Gm0#nVDY&SQ8* zQ3@wLj@Mo_(r{oMI^;W^5m<*+c^Q~}XmtvP1a%4v(_nUVSeOZ(YaSM6h8-j=@HlC# zaLgPQ76i+vZG*KWgP|rGplV$!%s^k&(N@?BuT@RV!d6uct?U$)3tNaui$j;LUeTWB=|Gh5j`D) zV_ei;Z%K<@sCA5KEA7tF724e~xg=-B^og#)Z_N!@0c&E$MpwZ4n1`aD(VnY%x-)j^ zuf;Ah<;u6NNhJRfnJeG2_9E-|;`71(F&|WtH7-bqcsHh2thJ)AfXvt`b2hf~E+_j1 zZA0v)xC`3O*j;g_@lfpHxRWAlfUTo|A1&DWPTVNqM~Tm|KK26ne-Qf*Y9EUICayyJ zH1@~1o}h>Q7Iz6Zhb=N)qFVWn`GWQ%`JASKOonerE{Q`Ew=Za+al0r(Oef`MLi~O0Si+(}6L~)oE-or~hHS1ZgCzp3TG2_J$0J&1Bgi65NuZD!4CBY}t?{=GGT&WNvM$ zdblrkZVPQggD*i|TNBAbX_twtZo7vxb<%DS>1=1J`lK(qybbL*1lmhrd(K%XvP@*P z$U2b?BAp%n2gyfdgGgsb)>MmZ5LwtsG$Ngy#b0EDNN2WKMK*Zlqp*vpL^``lfXD`s z&Te8A*&wnoM>Haxx#BOfL8P<0SVcC7EbJi~kqxKjtEPE4JW`e5o4smoK> zq;5^EO}&u%P3j-1=CshXn6%8a4pqPP!!F(~X#jKKX1N@@lm3TReMnww)sJMSgn=Z3 zvkFK?h)fWfDYC1`+p|WIHNQ#w4$<71HJz+9d6*a>{*KJb+iTo+f!Bt1?Z4blSfVGDvDLi~dVt zRh!$fzxPl2Ln;jrBgv+b)abQjG_}nn=|3J~EVZp9HL#(b+QB3>2tob>u27O1gwdbK zAcT|DAOe%A9Z6Dycyv)afusfwOr>@rNez-Po!ZGHHE?<{lfXq%gA{Bqwr}hYv z8jQq&)V`CX2BUBgweKRS(Oa7#)E+}pgU9d=YR@C7(YKD_)SgdLg9SLkOyI5hegG~^ zEO)I)X-N53O5ap-8Q%q)9`#kL24brBRGM9WD>pZ>ol5&iW4uvE+Zr7~EY$IST5KdY zoBEwgYxiIB)zNK_Z+TYoZIQ$6i)nq>FO=KVVSwSS5B1E)HL?As6iuBp_kq&B&rHl9@C@LT@Itgd#?o3Afg+A@B@N^ z8j2K&7#$=CK|t9&q$s+gxGDzWMO+)!Wf9qT&bgPF$nL(+`}57`!^!=g_PgcW`}@r= zq4;`G@y|hPpKbgq0tA74ZoOOf;^-z-?;;Ffu0ybx%Usb$GEN8ys3JcnX2(yqpMLbu1c6`=M<_iCptJz1E&-IaDxb6;GmW99aQxkvWZG=KMVAf9 z=D48D?qJGDqlP)a{ZBAr%pLKTas0s!hR0lh0Y;tKi2+^=*nt14HZZ_u+zM~y-4Hax zZ|-Aw`UM#tOUmtNcJp4e?7!0`D)bL7#zjjjZ$;<}4c(44&cPt>jm8%nDn0!y#`y3D z{*eAw_~C{w#~QaZCPg*>gG+7H-aB2avBMj>$XL$DrUa7m9|@T>?o|6QOneL>s3-y; zq#yc-P#!LZEHs^rXnp41fU%(*_5OMf+zy@z>RzEY%+w4|Fh|d_8 zTHA56_g3q5oTRKhC#h*a46(v!($S7vy;&W*v1LX!Th?b&`klV?AxP;(gi=dJyvu9u zT+9J0x^ckE-6&P1fw^{k$wm(rqM0}XeNAPh2YG*0$z z>akC+k9Se8wkDqs*HbIw=_#$e%lj<5y@HE+_3?W8O%9+@elf5J6KNyqHR{ei7Lj|q z$6jyI;Oqd}FqOmY_`3J);nM=}4WrGyc0B4Gbnoy0JYiIfx8t9UBjewp?w98OYxiIB zb-%}bYJ)5^j!X+R!V7wOyH6OXx+N-ac){uhC?3-$Pgkm9?~o}!X{-0hv|XyX%NsU> zcZc`*gX7h>cNu?w-wv{+}yU%dU-{XGC1d3%&cqBEG{GD2v_l{fLy3mO4m-f z70c31$74uNXK{)kliAHOqY-I4yL{T5C|{EtjPWm7jUn5ksY?~F#gaU_J0_gNa_CTi zpro8}ri=)0#das6)i}N*4HKyAwy>$Y>123bh%pAe5Q;7u zT8uG=S}DfD7w*Rl7n8-Tc0K1rY9$BRZXf^V8+QJi<10w_V#3UFc zJ2R3*85|j`X66)fpy(`-7PC9SI7@*J4r~W>IwEk>O^yngCggPQJC+D^4!T zW_Gh|xE9PgPu}6cD;AP7PqZoAiHOLEjCkn;&1A;z43fik^UZ~9(UH++cZ%WOolR@Q zt7qla^YASAW;B6Psa2H8p|a7n5=lwN@bYmco?Mv@zq{yzB7<(lcI4sQc9#M3wDZj5 z_}xWMQ-3QqQ-*)rUqn6I*iyg}vpk zv$jUdy-sXz3?|u;j1#c4@y_1NrdgEIUsPFARIKw&K?_-8R;i-OG6q)KJS~aMZkAot z-r#1=*D~{dn>&`Z=SACEB3L$DM&_LTcQ~kJd``4&C5)xM5I1u?kKJL+xECNRXO?K& zO9)FH!p)qaci1w|K9VLQg!@e==?e2GwzGWFxUP_@k=c>t)s*&OQ7mCrhP%=ip zjnQY5(fDnQKAUvgZ)5b?q;Gy3EosH}Ok={nY1mB;$6P)fgPQQR?k%TdH;VSJb2m91 zS?614bvm+2tuwd&!|9kyCbOGm!|7ty)1@7Jr(-vnscv#QikrXZx!iH@b5-3D`^wqa zEZlcC_Lm~=;a3b`g^}}WC=Qa=IBE@%)*@;Rlhzh$jgZz6YK@}f)wb^Cc;mNM+u=B) zl{d3#U+SlSCi+Unv(7gYm!;xarDme9QR%gL`V*VoEE^7*IpZ`xh@&}4l3*m(GHU^ zmJP$0bB-&Ae4mGkQ)lxC(Xwn9$E?q0zk>=>XY(j>kW({C&gM~u^R7!AbLh7*`fM^$ejB6DCbQwU^2TA58x&Od5m$X1X@1YmPSh-F zLLxLcDf>a?Ne?VR!G-1sGSdwsDDJ5+`f`^RTiBX3+lmq?Sy)k5GBj?~Fh4y22Q?}j z#!-1_462T6+JQ7d!R}W4!{Tmd6jiUVwBpKsq64YXp-bah2Ot+_zyyV1HBj*+R zgWWf)!T)Ynqm{P7vFf8Cr>!LmCYQI-fx!wc~Sjj-q)YAk-kmcTuX2#g4lElQ1G zcRSJqlOoo5<&F6EyvZU0r7Gk>D1-VM!kW%x5TLH)M(J}x#oc@($@ZV)jE+Zlo9La- z=SSl)#C!c{Dq;w|%@`mu!B}xTs|9`a56X;cV+LAadcOn_puVYv1Qo7{p-Umzg9`U@ z(`;Nm-hsZ$$GZJk zat;$BD!bLS?A_AR+fyr*!7>}Q*@a)Dj*`D z=y&g}x2Co3c7dK1Qc z=OU7Eu!{Pa3jEjUmgXe_)OXx?~CUi;YI_wZi3+1>l+$}UrC<TZ@TAa>Lfi0+ke$8*ti)aT4v{Auh6^6T_rCcu^>{DJT5_>x9|~nN3%Oh6*(@)e9{YvYY0-w zgu0l16uOrlrdHx$)33OkX6+`ub#Xwx>ALaIjR(A4Z=7oEiHUE{kG%4!4NQt}ZKX3v zQ^)umtJz1rar!Mg)CN9Eaa5i1sSR97aa4hto{b-DrApGY&l8_- zrTWl#I)09oDniqx_+l$9vnI23u$7iXQ=~QDN^_~HrFD*#hOMcGwb;rB4u5I`Cs{XI z`H7N0wSlv&74#IPKDB|%t)6{WeiOx?+CalvV~tio^s@CGI$71HHt@LhyfxlOpIhs! z{Mvy(wSm7{uUZoo5Ls=1x4L|kVnbVsk8*5HZFH{6r#7&k&DP1*%!l{eTG*QVXpSx0 z*1|_CZT)PmeYBzc^+wp-^NMXI+yzIStS^BhHaF1;MV7a1MYe3XsOb~i45F)w;9J`g zTMk&HlO^z*Z4FVpP(5-zbb(Y&Tn}C0D%}wP>XGZA8)V3E>an+n7PdP~)yM^r3v)Gb zLF7RP8EZXqLG*xmnz$f(!hTI$5WV1nrhQZoz2T%xN#6Spdsc5-%pLGxn)x`BM7@pF^ z^)LjsXrg-XSck(&S(JL@f*1wyZB!aAh%qo#6BopIn5T&g;yzeQ_iLU~E{KV6K@$~( zZ4x-zD;w9t{m?=a*TXcJNAJNnj_biQ15Rk%U>jwd1<~}>Qd14l!*E5@XGD*9AmA=_!CQp$!Ko?1zByq5 zTZk6JK}`pVmcR#^&J)qIhJ0!RLmb~Fc!0ml)2B8t z&hZzRXAK97F7n`DmYGf_=G<4m+mU zR{#taMQz{*jyd*~K4ZOOfxW~>0f}yS+(+SwCH7T5%1B&ef5JyO<$D_IJ^d66n813q zr=NnMieyi(h6gqAo?Z>}v?uTBHLzY2@98zLL#Q5ky2{|BCZ4S_C@tVC)FaPU8Jy76 z(?io$1~)bGbd`Z~l5*wgS_fw)E8^)gAnblcJYDNypeCNK4KP;|PuE7so2oo{w#uPc z6VKKrIHD;a(c^}v;iN{Mu4iDu11gZGYcm|wl#{r@z6GuemBHx5%?Zy!^mO(tgNKQp zgASV36Fm<@HN8Sq0dqCIL$no2HGP}7*^{shDm8{BZBEz@CpBdf?cn_Mp`$x#tK$U) zL?e=RId=N!!K7ClyL_}T>7Zk`k2WUNI`;UeD(Rf#MIU{bbkX72>%(7?zH(Ih$my(g zyyT-C=Q+ndA5CyxbiC}N#m=uBRX*D3JQMYbkE)!%IlMlqbp|HB=A-k@ris=5jdRU8 z8D94pe{(t#{S@iSGx;gmmDa%4-PN`M4Rqa=c*vJ!nyW|RVIMu}8jx7yqfM@{iAR9G z&GV-=aJ#D@@u&i#L#~;L$9;6lRh0OakLq1+__L3GaFy6=ePl^qWB)H7#g{ja&|B;@ ze7%tMYKxtQYl>uxoq>==VzclTI|I>*UtNdd@_B0=qSGL3{=)ma7YLL3|EpG;u*(f(Sb4cobX@ zmx0ecCa#CeuzsZ?u7}HTMibY=WeAW%upYS{E<=VUss~Tv6}bMm3gm+LZ^&Myhzp_~ z9@fMK@g=O##P#qM^m|fyay@(vYc+8_d<*9_aXowwb(**yuEE+;70319`2o&pj8EQR z{}IBUVq+O}NZy?A6SUAYjOb?=sA&$-FECxxGep0_DowRSe}^5KejvIICp6hpHYfZ8 z>NI5&-Jm5~tu8o{@Hen)dWh&Ibk($)=yw>SX&=!oSfJ@0qJP4AO}4XqhFq{CEsTdBWtpDzOYrTVm^k%@oNKbSKQ#w#jKTAsdHla;Le8@-;0cTMj;= z=?SvsV6mo+Wb2I2Xxd4(&bUJn97tOq)dg>QwDAsi(cMlcw3!(cYM+X@2^A z*WEZy(~9)RiKb{OOJD2igG)6%m%fc?m8QMa?Y_8;$io*rKqKsnmD+ebz0%bWYc;)- zUPE+FNR7TfUVT$KDx>d@0dnK21s;8W%n;(y|Jij9o|D^HE%4|E;5E68snHL>n@k?M zJg>z7jFr2Z8vOutYWgI7LGnQCtm$g{V?@0*@iGm<37UAB2H|u~zof599*mD^GB?{q zRH`YW+1BJCxKqeeVzD*z5>{y=Pt8y~rHN-|D1IQMMn4QMob-==82&7zMn4SW-)0++ z{z&q0tUAS{Mn3|VpJq~{AAzNcJTm$bxKp7N;s~tL#3LMur!?^hN8$%UsxzZ-kfrZlY{WxnvuM!!->g+c?bEG}c4L@%V_w`^h*Si#74l zl8?`5;-e)WcW9bTarfaHn&wm7eRxvSvS#yL6YvX7Ynwez^o@|3wTYO0?)I#CX2L`q zDX6AxA}$c(Y5O?208hT}pSDT(53p< zY}uNo5_u+Jg~ml<47jM0ZV}4U^tMo`reB0URHQF)QQOodu4zhd&V$JRT;#!Z^oHW$P1_S@#7Q%L1}2)o|xVPhF^(n8GFt{hl|*?s(h zMc7Xh+vef1{(jp$JSU`*K8)XJ;+&6Q*geXVB^Ji9>-%d{Be)tIZbR^h2gXPwpHj9QaPW%u0kF)`X@18yK>;4 zFnf+a@K4xJ6WdC0%0qrzDb5p8NuR>Cnz*B@u}XV#+!`z`^vA8iEs8uc`n7oVVZU)L zUKdhH%P{&8wyBP;!wy1f)(pIw}4A(e9j=4(r8Qu+&`a<-|_KZi~sHTviAswPhQJYH{LtH5ub@#n0-n?fq*R*c_#JEv!J z!ZyqnR7tlZy@aBVnzrrOLKBaE2d;nKZ`*-8gjCWO@R%kZ{Z6dYo*cIeD=PePyRb?V z**vftS8VqicjI~?m2?kQY2u_W;yLZfN%vxQM^SMiwk#Z8*n zw!bgdRQZkj@r;m4`Wjx<#7Pg}&DWJD2Ueq9zQ?K2S7Ui`Gwe`(E(Jq^%fquU8RwL@ z&%)-W>e%wRSr}VhoP|L?5%wR{SY3W33*-L1wLy4vbu9hq27DaHzuvz>(hT3k$#tqb zx4;FKA)c79m>H%GF$ZvlX-iB@%p^DzV~?4ECt_UG-V~S`v&{5OOiO9Ek0~=n#paOA zh|P`Jf!_wyVHpgH9UD^yBVr$kdD=9#96Msi-bZ4Wn{(t_#w3zoM&-!2ib`aCB|hKi z_kjIcvc?4ok!NFT#9AZzGWa64d|^jy)xUS#a`PqA=(uO&FPZL-+Y^5V3*!#PpAfkN z*g6vUv4X9q<3|ENMtq9P;x3W@Q*mEXyD;vX_%hS_@*g^4T>3szouPhDhHpr&j7KxK zFPUm7^(E7LT9&u!gt0OFd~y@{N#rK-BZrlI7gvw%gx$<>F8U456>!lVZCG$C_^r|M z)K*{)DXso22j31hfwO#D4@`DexY(;sBqVd&DKbyBQ_8ROz&_ytX}<+sfmD$NX<1O- zxhIacRy1S(V>~am>qI)cidAHt$bxS1qUy%d*Z{jSrl zyONhAuT6e2`Saw^lolyHQ~IWiOqrT8E9K#ol9cCDPNck>axvx0l7Q+$OmbKAbdulNGD+@l-k#(Uk+mY<7kNqKwdQw`^`{2y>!P{U zJeTyrnSDuyXL5$P%%LR7-$Osv!x)k(%$a!~wKFrPl2oq$npAb7wIs?B*;AzIRzGPE z&g4su&Ex@0$(%!SR_6Rv6Qt20gOEbkxX#xkPQ9F^O36eb6jKE3K1TJh&?PQWBpg#epb}C5|WMNBcw;*YPme`uwtw@@n zHMXU88_Y84^mHNUi`@wN zku*Vn%%%1{Buy{?dr*5INfW&o=|%0qBuy{`@22)pk|r32eW^X1qzOh~e`=2;X@XHW zfZC%;nqUDAqV}UCO|TG$PZ|9lqy{@f*Wnb>GJ? zPIVc-emcE6d<}-Wshs;Z@D&g5`7fG^x^aVj&pv$^E;ESUz5xm;@@2RfjD4qR8DKC8ew@Q(6a8D<%7Ny?)RH-XI zwfnIDemXqYf3dsw*IgSAzmW6m`Vni6n4%v~oT*ad#>VE&f8emY_p?7m4qDMMWz@Ch ziMpvO=(1X-=ejM*Yi@1O!8T01O;5Qs5bu%RCU3i&TJhU-?(do!FE^{08n~Ior^l>* zEjs&k_UqF3wZ5<0U5T_9)VNFI?oFO;(pd9s(!|s8&%KGe#SWS|`D>N(^^&iZ8xwRl zoBp3sCe`RYpMT6YX_Sf?HF=cL{GoV%%>Ye&o-ywlrFM_nQ&;&?dq7{_vx%oUZH!7EvviEhhL74e z+)a!3`%OQ6p|7LQw@I^RG#8Cg#be587G)0pJSZ?YwDugF)EmFh)^=%(x;5sueOHbX z^QQga9x|^8R4W5l1sd7&OxmA;>J>S*Axx=Ks? zt{(BI4pcV-Z`IGX@|YT=rUgw8QcpR?^)R)wH$Uc)9Hdf$mIT#~>&&+C$O}^IgEj=| zr(fvy>aHNQH)vm7M=$Yd@hO{Xo~<;GX=By&u`|XRTMv|`eQImXHIHRu)$*|`jGBI< zR|kv7ma(dI?AEdRoNnE1zmHW>!83wux3#z&mZczA6$Tg8Rca5*axhpO3O-yv+sg85 zu(}+4r7l~0RF=pP6%`U4V(iQb#%e4@7J>*7RwrA~rV?x#B&?%wDBplhtEsH|c;?Sf} z=XtQ0`r4aYTXI5GZs@wYW=FQ2r94#a2;CW~SHC#&<&&Z6d}u{o#|W46U?~ez+rqYo z8AE;Lavm&a!qnNYb76XH_b<(VhN=IB{iXla{d3!;Z&dX+e|}TDiRQBW+QDztp>Gd= zYgB5NU%U3Ly8i8r`q@@mOt_jHJ|*1fbu4sSZBe*d9G+A^`=pi=u5!cIIkPsccKILE z%EQ%;@SSzdj^%HooeWo}!cW&_9n1fub~9Yv3cp=H+fkbqp{7U7h%hG6!?B`TN`zVx zky=07PFo+LHbiWUa4x@AyZo)R-4SX}#1D1Nj^%$`I~$?SMVyb&XZ9Rvz8j(b7x9-~ z-Sa`eQ{So6-<|o+7|(UJwco!}e|-0+{^U!adnAlgiR0#v(-U6$%oaIbO&cFSzIKxa zF00+(@_2P+{MEWj?P@oeJV8yFFm-~_@5r`luy}$>nvh(Vt-aVAT0SKT+jRESRWYVw-~# z)uD-pC+dDLcel;9sRUb!t#%u$%Q0AgvZ=kceRY-EW3XPdsY|wB>t|b8|F)?bTVy1& zvOoWX>vOY0gknNgC3*<34at=mX#kCO8HoAj|? zcYfAWWKKuPnST`8Tkn#&7bU;lFATD8(b76MT2ySb#9_`c9EG;lRb*C2ONOJ+(Xm|b z)DBWgYHPHV-QUDfXm34E=0vodjMo2nC2YVgqTi$CkNa(bE{_ds^(0X@C&?|$IdFu_ zlfxPtBPuRN;$!rUy{Br~L^&~%8>7G4C&I5}vZx)C1K) zey&fHcARL|RGB?hAJw;wRykGFwW)G_sy@H(R4sNIYdcM{rs?hbE!R?~iz=Ef#nbge z{l;rQ%@9>FLn>$J{{3y*ftjLi&y+he_4EA)X(wihikvM`v-K{oMrc{HMID?iRkQOp zzWR`8*>gnAm@6~q>W2sP*Y?JWs*IJYSiSAQ4n30NM6HaIRhWIwOxJTC{BxY_cc$Du zO;%~@U;BmAM)Ry7Ul}J=ar*Ru{k77K2-A(FvlaCdjk|z0cqdwnCyU2~vtVPDdltQ_{@8ll?%< zp52<78(pJvJwa~VZ|E#O{#|NYG|x6PX^rM4av>&49Og1)5Alib;qBkq+u#1xX>xzi z{UIy=nHsI9FF#QV5=Ac>{D@aSzJ+@5)4fv{T8HQt20yJ;&~h(PeoNFJdF|;Y!=)+p z=;u4JyH1__pC6(Rf31_PY`&;p=F3IQF?TPMpY-r)(b@jPfPCG0+kZ5#!UbF+3#1rx zHa4_XY3q{ReC=0OK``U|@rP9|cn^ew1 z$;F(5w6GVNd+j8%YoYA^N1>h9IWp%LN`C;}1wXFrR7fAtTAJyKnYq6-^i)9aHPnov3i#Pc$UF9UHQ;X%aYo!yV z-hBtjU6S_}%Wuw_#T5TQ{mH~9F=Ud=!;F#gl03M0lVn4Zp7KV#t(?-1B-!uMaW0ud zOqL4FF_)hoFy?Zb)SYCx>sm49GABjU+!Tq$>|0q(%gm0sywl+Q?v~G(u-53gMvrNd zLBpC9$*k>bxOY8_arcutkS+&ZE5^82NM22sYw7ygw_Ey7TPkY$Qkj7nyUl@fm&&@O`XleG zu$2*QTPk~98g4EVb!(a2#vJ3$(Ts5?FBdgsxlG0CD#o}=NTx2AG-u6Xx}rHwL8KTL zXCbAc3&H8-a%QXo80R>~U8F=Q@(wz4JHW)Z34 zm9p8jVoc^R$s;S}sIz7<&9FKq^PMr5n^bPCl-te*`&{%@9-`*0l7vySyPx8a7A? zNp*JEC$q&uP?{lIGxRn8&gpu9=wODNap{N#|`z- z@`(yEr7%;^8rs_T5YgdGIpW-kq1H*J=rV9vvK%UjDmyH++} z_7sntNhar5ZsjC*td*VhYtBP=J5Rb|tyHenj}B|?8<{OCDqEs4W7iq*nrz9;)|f(Y1o#-w@;3gW6rUs7!N16BP5UJ$g%o0W9(a`Z|BIJ9R1RJt$pKiMaAce zju~SY!bQ1KoU6ARKFjtK(cWCy=h9HIj@RNksluFN&oLfGZg)xETPMHOuNh;<=dp-+ zG7qcW(qcMU|KaGCLoGK?);U`|?PuZu!NEK^l&AOlPo(Vv(Jy&&(b-{dxW1kbf%Q_2 zIcJn$Jd50-H*lG4kQmIRX3Qvs^pXvdYE(@Y(Flu2=*ssz|Gt-Nm~+%L z(z|07m;3EC`pBS;}2W=eovHNC;JZlTz>pr%+NH|t-06x1zlGdI{~(J}k*_9@RO5jC?!W?{}5 zt*|(s8>VEEDJ8O`L~k;pnU+sfP$GpT`m-Zi`yL@WS|Z1s+u3&&wS{-(7MZj~4;V44 z+dQI#Es}^CW34XbHBl;SFy~lV##_r&M6$S4HkazpjcleJB|26r$4m7$N4D_2OLVVP zesgYTA8X-OQH!?9;;nkj$mn62L|I#9EoO|hsZ7-OWs;9M$0{&hN~YZ;_ms&G^=rmT zUm*QUnOrQ>Klr%C6EWLFP2MI`Fk{y%;Z@sYwKL_;Z5nUYV@LYwTRt8#tblakHYsx1 zplmy@@9nZ3bIxUp@lrA!CV6DL9Ian7=5mwtt?hDqyZ+x#+WN+p^Nmw3@tAWi?#1xt zaw#d#TlL997F)#gO0`0ND`hUhr=S}682$rN{4dBm_yr`ewX0HYcEPRjhmi?>0q=<1 z;WzMp=mGds+#i|Y2s{Y!LN=G+OS>wYvJf06_yK9~LoXd5k0sb;12L^cszOvuEdX^r{O>FYV-`;xF?f99pQHPqv%<A{a+72K9pD@M-8}cqN{KUV)48^{6*| z0N;)Jz}_z_RR#BjJHjndKX@?S1NDa|;qReW;cfU5Gypzr1AayW32x(;(IB|NE8K2q zFx(n{7`+B}$Nz<1hu_5qqc`9H{8RKMJQ*L4-hxx`1oSq%315ref%oA%kZlOTCEzT2 z7k2Bd)bH@W;YVO^G!*WFKZSr^39-)xX(bPW)XiWHf4?__yYZxLK(gqeFY!J51_B%JNN}O3hq0I zTMq@mIv$Kh!$0C1(HPh=SgEUUpuHb{0tLat@ORNzI1K;7#;;(4wfJ-t0-wXTqEOiF zHEuIF3~mp5qi^70cn|a~yb+H;;c&;-mAYh);rHNP=sP$F{}PRZr{j@mJZwt`7NQ9R zh4?x&5k83TK{og*UWp>%MsFzf7aRq*h95)Ga1q`EO@jC0KcE=+5`G3vh97v7YYUzN zw}YF#$@!m3@FGE1Gz~t8zl)~Bzu=W<1}twWbq}5iKMFTNv*7;tGiWwE93P72z^1oZ zS$Hn|Anb!;;pgynC=P!8Z5#JCK|Dby{sGeAsdx;U2X}gh2N9eA_lNtSM0f-~6wQan z;eluYycC~_7Q!3xJhTY@e27x};Kgt_9EOtY%Nq|&L&@-3JRPOL`|!v2Cu=B(Q)_?UWiV>7eD0wuOc`}5cQE#zrm;Ad2k#$ z4d>v?&>8qAduy*8&$%Ycq*!bcjHCqg8lh_8#s=B zq2Mu+FIaRDPQo8Tm*8wX6a5PB!AsC(_!52sU4a{Z%+n3N3b%xP(KR>&e->Sbi}3<< z13rfTXyaEk!9DyEx(T=VgwH8-3w{RgfNsMZ@t4pYco$xd?!s00F?0_$eM%kv4So*x YLBGR&@mG*2t{LQpo+Z%deslK!0EW+_G5`Po delta 8599 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 diff --git a/samples/client/petstore/csharp/SwaggerClientTest/obj/Debug/SwaggerClientTest.dll b/samples/client/petstore/csharp/SwaggerClientTest/obj/Debug/SwaggerClientTest.dll index dbeb4f0ebadc6185dbb278cebe2f41412981ff71..1cc6bc94f0c97cc2eb0e3c881f9499928d0f3982 100755 GIT binary patch delta 15330 zcmdU$d3Y36*6`1%UeZZevL~H%lJ2Zc*dai|8U!IMLO=vTkbnePgvKPeA#{*M(6EFG z1O+re*b%`-K?x9iF`}Y_jtinPK^O){opBeH!S9??H{Ai|`~G_W`RaK%eSc@GdvBe4 ztGYUr{bVh>YF)jl`9TD*f*iv>sMtNa1$=-ogt-C1W~y*S=_z<`$f%dd&q>;Y`cv2% zU(sK|Ongm0k0}`)D1eWA`lo>f^1=~n>i`Tbz}_zbD%w?rzl2$Offk0>^-092Nf50*h5V5>5;A!8#UH{~Ob7>r4NvD9- z{(#LKAYw~nK!vX~Bicj(PqpHJms?T5I)A`x93bLIV?dQJt#!VM=51EH62y)Ah4v2I zlHk3ig_x9H-)t-jV>da-4C4qGa7DE&@<`Vge_B0{MpBi`jRbuZ(9 z#l1M-#a@(ZpN@ST_@bWF=Uu9>Z~AP!rNUiYQR_3NnleYl?5>Ca4Q=UX&jVdE8?*KdH&n?Ko1qx^Dc2`14(QrDS2Yq`Fh_w)aaI|d|`zvo1l11ojlD@mHCEG`B7PYN2l&Enmc^Wrt|9X zotSZtG437u88iMst9!2D9#;1D<+o&xZkE$PAIiB z_a&M~kIh%IzKaDn>$^5h&etq%joh^sX17^BEp97)wy@^fIHHAhKJ8QH7C{Pw=I0V> zEo|;!@eX!VVOp~Qd|Njy*06={t{#~J5ZNIZq9~q^sK%q@KXmr8P86S|FRQM>Fdg@$ zV}!o&K(v0QroWZCsJUbHrTem4hEdYc2z0kZ2r+rW^yB+7lUUb0!sO22flZ{unwwRT z<_I&pbl4K_jvzL9SaSD5y1T@SIXBYZBnN%Ki*4!j)mvgRI7PDv?RpHIJ%K|*?her; zQ7-K{U`@^)N2t$vAxpPz{RQK7+#TO6wk6E*{EPabxgD&~d)0(ul0K*=9i6&|WQq)G zH)+%KS8DFVR(kxltd{X~uE40`WmK&5kE(~pqhggYs(2bzR7{L$9jvuPSk#<2^w+n! zlSLU65oAot+jQ5V9!e;U~Bz&7_lUN%Z5$ukXDNWKlZ+9n)GBhI89YxCAu>r?s z5zS1VB>l1N@nKF5Y#!0v9W8-Qy=Hr!SClOyT8c9FjLfa*!Xm;<9&VL)rTM%b!_q@@ z9Fn_7oKnbS@~~`rg_v`ny2-&qx6+W@QqiW7Lu7bFxI0cdL9;q#hdWuckr9z@J9|>u z(db1N6%l3fr0IKhmngEXZN?8Zr@q zYsl!ohBDfKjnQwDVFhfAewz#+U}N+|(A>(7Bi#%byV8!c8hgtQnb){O>Sg;Zc)M(n zbcbzn*?Y@nXPy7D8yh66jLY6zHpo0;lZR!~DPmSrq#R^}>@6E4r?_=~BqY$?Jm3Bo z=^mReyJKdUe|H?rU2oPmpcpEO2?510QaG_d)K3T0BSo<-pcusp{kH?5*3s0V@-F(3 znznkkmpb7+`iz&dTIQ27unh8LK3M0UkBd_9tTN^!UzWi!(GDi9$-}bgtT5+py2-&P z>L*1zRKi#`4P(xodXs|@Rv_A862{W)ZE}}lMQ;0>Jd8NnD`*K*H1(2Y)6+5MUX}U} zI2d7Higu)gv1}T~oO@#OO&&&^u~UzdIF?Q0nAJ`la4^D*otm$X+@_5C%xHc5L3gq! z`8E|5*r-J(x2e(k)`K}zJG>hC0^M3|aw!7U#^_&FGT#9kqu(ZT8n7|?Z8C8I8>1(J z%34;VOi#eb=ns@B2-q0?w$b{5mt%0We(L4h@>`Q3#H!63O%FUJiImvWmNeGlPq?T% zO7q{`>_*KJdeE_k1|{drFg)qjXALSgg_Ai_f3G&~_FklD9^5n;JziUbi$}0aUuwp# zXhB7i9uvH!B$>_?X|{%&JzdCP4f0S`S*{4Sl|`Qq*<+Z#~k79O*_6H;azEMh`Q+YxDnC7mD|PWuefODBkaIBPMtqywIS z7oCJpM&C*sPgXoX2Idq$LqfiI%D2uCs|Ps)nP3=2Ni>J@Nzl1sfqZR`^5KFqd?u5Dx0AZv{9eCHE z{`7f<_#1ux51pfbqiaz||2mSEb_%GV&kyxCe&~qBzF&WMAH8Ry2Zn~g_adD!A88?w zF0zlv;V}mzLSTu=Pw*ox33kWS#U#NOBxB(FnApe^=n^|PHU-9soGx;n$V!qSa3Gd* z){%^bWz@$M_(SyF5?Q|?B7;B9X05cY!f)u+KnVPykNtUrw z0JIj`Av6?v3GERY1_OoOhW!*b8YT$+03Q&I0ebOCIjLTdX^v1=94fX)(S%{JnO^WN z!EsRL73>zoI1!!@8ci=bmS8a~6`CdVFf0@LOz0^n7YYex&(*L}=q{nHutumxKR<^g29?Uhd7<5Ki+kJSWC^LSI0&(3?U(K#kA^p{uZ6D4p)XORyR478)TG ziF<|0o3YJ}`-OH1wZ)f&J`l>oSJ338(|;>C01t~XsyPRa#af|`LKE?r&^V!Dd|l`v zp@;FL(0-w(@RZOyLaXp?p&x{{;Cn(2dMH_fJMavVHw;D!zJ?!)ah}j|{8(te&55=k99-!WGjN+&=<*2v3O>zACjgNZEmvO`FR7G;sTYmJ$ zjki;6C=9dDwo^4I%CMK&=@Ki-w-2+^|}J;DH@Q+Dq@JHJfhquz4XUTbfB(N}Nz$^IVg(Z*44vBrO7kMmPne1o0e zckoef=@Ea$o@4;gz45==U4EJtkMXH~S`gndo_-&Zqu#P2KE7*wrXP34w~24%CtrL{ zd>cQ#9iJcH-cRSM*4nU@_m}vY&<&0|S-%vt1P{?kgKRAlO5$_iydr19bfPN;L8pZI z@ws4=PA-MKgjGawLYI;2p$DWX;(F)_S5oK%a2dHCdVyPpa~YR=>B9DgB86NKePE6v zE{HtHma$$&E{MKRs)!5XHaMt=3!)#KRrDj(Lw`6WlX4lk9&QJl+c-Vf!vM%vlyCPA zvk!y^6mmi2!}u)2l?!4JY*fSrF&I8q#04>go(&C8E{LHJ*4Cg?_I>s{pg2 zf{334iJc7_*Ta3#MiJM;R4Ao4cO1v{;GGU96`qT~EB*n9q8F5W2OW{Hfoh?HqFF?9 zpg_@bq6gstMO%o9fnRTO+!3M@*s16|Q7N2KgpLgfbK#Pr6rzW`VD4rF_9J{4oQevG z9)UbX^NAjX@rpJRJqC{}dV^>ltXFh_=y5o#=s!gB;X_67i5n8=IYW+m%kad1C3wNx zh~pFgAZ(<$iOn1VdNMJw32jU4)P(jY<~qv!ac?H}cP#YNCyB!yPx$G_#Csi!`~*o; z9Q1HAOceDNd(v#j62Gx^(j$(gej1eIfhYZRSJG0)GC$2qTIE>orv+6@nyEFt0*2hn zdSgwmfC7VLO|OI*ig-=0gi__nYkCz_D&jT03TlKdBTrWaoKnQIRRQINe1^-&vsD2n z6+P*t>8gNh3VFIJz&Xiq<>^`jrzac4)1^bR`wZggs)V76c)HfY97Q}`>maYl@Z{O5 zf-*%sTkGMdqCrVs4?F{>6!LUE3y<7y1oCukfWwLwB&~I9gsVaoupwzf!X}8C#-0`M z8qsr*t>{yt=b=E+FGSTaM^R+*hJ?*fuBcP;25-U^*sE{^8MneIMINFW&QAwz-N~C1 zw;4dRK6yvtc0awCd?0a$pN=OVPTc9I&ywpCclqh( zH5p#@8}nR=NdX$;%F_aLzbn0oZIP>E6RL1^OQK(t<*2vparI3);-_P-AxX7<`oc9f z=_t@QaX#uTS6qcj#|d zPCFfsg6rWT@V>{y^>7g?ml(wLa1l-`;(E9UX4wQUBiF-4a4VvE@Frb?t4|t%To8YU zoMi@aL0pEpint*D0gDxJJ$wcEPZ^$E4`0J-MO+Wx!bgg@9{vptint!WgVp6m9M^;Q zdpM(TLdsgl4-mG3jTP`{%7%m=p^c(-L_fh$MLwdRVVa`95&Z(o6osa4Nca_M6m=!K z3MUm!BKi#)6wN34oi5o*o{IiT^dGoe(T_ye;SoiVX&Vy$gi1vn zhyV{Nx`PPujG`Gt8V1P*ur%&l^JFk#75!?O=H=%@3%+Dnq|hx`tLVwJMafqDSkbz) z6+{g}3t?NDo*aZf$tJQC4yLtmw!}94YZ)!2+O$5-Slp@Tt+dL>WIUNINhp6W<X#~ClUhU0CDE@m7j8mj0! z>UIH6RrCjqumI;MvSz;J8i7wKip>0!s8UEq4ou4Eah&Tp=e^}8KP1}JTqf)r6Qi0vAABy82vch z=zU90FQXrahlPyMkHgP}c=YE|?!nS`*wYyOcpP|I;$%M?j|B$F=*Qy>MLhcPSgMEz zI008G;sH*;^{2f?QmRC_7vtWQq|%vtFM$4GaOOPP~l29|$h&{sl-6@4#s`eVapakFQKvj(LL_59SJY@vd41`QV4sc5X> z`5D{1OJSB^-WP`J!-lJ(RYG4HB*iuZ|EX-7#db~6ZlNjXjVyISrxaZfGXKr6wP?lN zE-=Uo-36aDP@Q6nay3qIP|-~BbT=4j76{Ez^t8~Eina^wS9DzHs-nLLm0kckmV)<+ zpz}*XI(@V@1M>{By<*uOISa=LEwpuwI}$YurzqPs%lmP&ae=bk9+zyNjmwm6wQZ5f zgIknsMBLj!9{i~rpW!lo5jL4#YuDx&G}hZ}d(a#_t&oimqPeFslI=l^5~_f{^!2|O zJ1EL0D!~Hf$#JC^*DDZLif%=0n~Q~c0oz=hBg8qq^b!Nh6>`#taj$aaz(;Ud-$39a zxLy(49>uWR1GY!eDP(l?G3=>`bI!x@%9G&j=Yw z7vMLFIH?z#4K_SEt_-gz8cVZQhF6=|7UKG0ft(9*r;w4;`vjg;$VnIBCFROV7vtgK zfxyLhN)g+Z;Kn-xwk5b%$Vj>rPbuP@PvRBj$#Ki@;HW^{GB2J~$j0SZdUwFM92W~2 zNuR=MMV$0$tW%yGSB{lq199b8qlj%QaP@?MZ3R{f897&?w^ku1U4>Vs8Lk|-8tbM9 z0$1Z1MQp3Uuvr0H1v-U{q-(IJBF?Gfc;(4)m6$U-5Lb!$UWII2i&Gv97}sK{kdbs9 zu2#fJt8l;aH(+}PuL>DCpT#J8fk#ILaMBH!{gC0xfgACf zA}*+n*zDneZ4-8o@5+~vZJRJp$VmDej#tDvpU3Z32I8vm@G65it{P9RlKY>rDQw2t zH38#hJS}7--GWyXanh}5(*sFs@Qfl(T7wNuY}@d|b%C7Q@RE>`b2~zn-2aTx??5ME z;|{eGuPEZAJMn50+b;a(*+9}=cumMix*Ov*u+7N12Xlms0q#Y5TSbR4YkRQ`lUHqt zFJR^K0pkl;BV;7qhjog0^eTM>8k5ROuw9CsL~Cv4cTg zxgorYrF#R$S8=hBk@PjJR>Vnhq_w#0g+N>_u2;miqgX4iz>Gm0#nVDY&SQ8* zQ3@wLj@Mo_(r{oMI^;W^5m<*+c^Q~}XmtvP1a%4v(_nUVSeOZ(YaSM6h8-j=@HlC# zaLgPQ76i+vZG*KWgP|rGplV$!%s^k&(N@?BuT@RV!d6uct?U$)3tNaui$j;LUeTWB=|Gh5j`D) zV_ei;Z%K<@sCA5KEA7tF724e~xg=-B^og#)Z_N!@0c&E$MpwZ4n1`aD(VnY%x-)j^ zuf;Ah<;u6NNhJRfnJeG2_9E-|;`71(F&|WtH7-bqcsHh2thJ)AfXvt`b2hf~E+_j1 zZA0v)xC`3O*j;g_@lfpHxRWAlfUTo|A1&DWPTVNqM~Tm|KK26ne-Qf*Y9EUICayyJ zH1@~1o}h>Q7Iz6Zhb=N)qFVWn`GWQ%`JASKOonerE{Q`Ew=Za+al0r(Oef`MLi~O0Si+(}6L~)oE-or~hHS1ZgCzp3TG2_J$0J&1Bgi65NuZD!4CBY}t?{=GGT&WNvM$ zdblrkZVPQggD*i|TNBAbX_twtZo7vxb<%DS>1=1J`lK(qybbL*1lmhrd(K%XvP@*P z$U2b?BAp%n2gyfdgGgsb)>MmZ5LwtsG$Ngy#b0EDNN2WKMK*Zlqp*vpL^``lfXD`s z&Te8A*&wnoM>Haxx#BOfL8P<0SVcC7EbJi~kqxKjtEPE4JW`e5o4smoK> zq;5^EO}&u%P3j-1=CshXn6%8a4pqPP!!F(~X#jKKX1N@@lm3TReMnww)sJMSgn=Z3 zvkFK?h)fWfDYC1`+p|WIHNQ#w4$<71HJz+9d6*a>{*KJb+iTo+f!Bt1?Z4blSfVGDvDLi~dVt zRh!$fzxPl2Ln;jrBgv+b)abQjG_}nn=|3J~EVZp9HL#(b+QB3>2tob>u27O1gwdbK zAcT|DAOe%A9Z6Dycyv)afusfwOr>@rNez-Po!ZGHHE?<{lfXq%gA{Bqwr}hYv z8jQq&)V`CX2BUBgweKRS(Oa7#)E+}pgU9d=YR@C7(YKD_)SgdLg9SLkOyI5hegG~^ zEO)I)X-N53O5ap-8Q%q)9`#kL24brBRGM9WD>pZ>ol5&iW4uvE+Zr7~EY$IST5KdY zoBEwgYxiIB)zNK_Z+TYoZIQ$6i)nq>FO=KVVSwSS5B1E)HL?As6iuBp_kq&B&rHl9@C@LT@Itgd#?o3Afg+A@B@N^ z8j2K&7#$=CK|t9&q$s+gxGDzWMO+)!Wf9qT&bgPF$nL(+`}57`!^!=g_PgcW`}@r= zq4;`G@y|hPpKbgq0tA74ZoOOf;^-z-?;;Ffu0ybx%Usb$GEN8ys3JcnX2(yqpMLbu1c6`=M<_iCptJz1E&-IaDxb6;GmW99aQxkvWZG=KMVAf9 z=D48D?qJGDqlP)a{ZBAr%pLKTas0s!hR0lh0Y;tKi2+^=*nt14HZZ_u+zM~y-4Hax zZ|-Aw`UM#tOUmtNcJp4e?7!0`D)bL7#zjjjZ$;<}4c(44&cPt>jm8%nDn0!y#`y3D z{*eAw_~C{w#~QaZCPg*>gG+7H-aB2avBMj>$XL$DrUa7m9|@T>?o|6QOneL>s3-y; zq#yc-P#!LZEHs^rXnp41fU%(*_5OMf+zy@z>RzEY%+w4|Fh|d_8 zTHA56_g3q5oTRKhC#h*a46(v!($S7vy;&W*v1LX!Th?b&`klV?AxP;(gi=dJyvu9u zT+9J0x^ckE-6&P1fw^{k$wm(rqM0}XeNAPh2YG*0$z z>akC+k9Se8wkDqs*HbIw=_#$e%lj<5y@HE+_3?W8O%9+@elf5J6KNyqHR{ei7Lj|q z$6jyI;Oqd}FqOmY_`3J);nM=}4WrGyc0B4Gbnoy0JYiIfx8t9UBjewp?w98OYxiIB zb-%}bYJ)5^j!X+R!V7wOyH6OXx+N-ac){uhC?3-$Pgkm9?~o}!X{-0hv|XyX%NsU> zcZc`*gX7h>cNu?w-wv{+}yU%dU-{XGC1d3%&cqBEG{GD2v_l{fLy3mO4m-f z70c31$74uNXK{)kliAHOqY-I4yL{T5C|{EtjPWm7jUn5ksY?~F#gaU_J0_gNa_CTi zpro8}ri=)0#das6)i}N*4HKyAwy>$Y>123bh%pAe5Q;7u zT8uG=S}DfD7w*Rl7n8-Tc0K1rY9$BRZXf^V8+QJi<10w_V#3UFc zJ2R3*85|j`X66)fpy(`-7PC9SI7@*J4r~W>IwEk>O^yngCggPQJC+D^4!T zW_Gh|xE9PgPu}6cD;AP7PqZoAiHOLEjCkn;&1A;z43fik^UZ~9(UH++cZ%WOolR@Q zt7qla^YASAW;B6Psa2H8p|a7n5=lwN@bYmco?Mv@zq{yzB7<(lcI4sQc9#M3wDZj5 z_}xWMQ-3QqQ-*)rUqn6I*iyg}vpk zv$jUdy-sXz3?|u;j1#c4@y_1NrdgEIUsPFARIKw&K?_-8R;i-OG6q)KJS~aMZkAot z-r#1=*D~{dn>&`Z=SACEB3L$DM&_LTcQ~kJd``4&C5)xM5I1u?kKJL+xECNRXO?K& zO9)FH!p)qaci1w|K9VLQg!@e==?e2GwzGWFxUP_@k=c>t)s*&OQ7mCrhP%=ip zjnQY5(fDnQKAUvgZ)5b?q;Gy3EosH}Ok={nY1mB;$6P)fgPQQR?k%TdH;VSJb2m91 zS?614bvm+2tuwd&!|9kyCbOGm!|7ty)1@7Jr(-vnscv#QikrXZx!iH@b5-3D`^wqa zEZlcC_Lm~=;a3b`g^}}WC=Qa=IBE@%)*@;Rlhzh$jgZz6YK@}f)wb^Cc;mNM+u=B) zl{d3#U+SlSCi+Unv(7gYm!;xarDme9QR%gL`V*VoEE^7*IpZ`xh@&}4l3*m(GHU^ zmJP$0bB-&Ae4mGkQ)lxC(Xwn9$E?q0zk>=>XY(j>kW({C&gM~u^R7!AbLh7*`fM^$ejB6DCbQwU^2TA58x&Od5m$X1X@1YmPSh-F zLLxLcDf>a?Ne?VR!G-1sGSdwsDDJ5+`f`^RTiBX3+lmq?Sy)k5GBj?~Fh4y22Q?}j z#!-1_462T6+JQ7d!R}W4!{Tmd6jiUVwBpKsq64YXp-bah2Ot+_zyyV1HBj*+R zgWWf)!T)Ynqm{P7vFf8Cr>!LmCYQI-fx!wc~Sjj-q)YAk-kmcTuX2#g4lElQ1G zcRSJqlOoo5<&F6EyvZU0r7Gk>D1-VM!kW%x5TLH)M(J}x#oc@($@ZV)jE+Zlo9La- z=SSl)#C!c{Dq;w|%@`mu!B}xTs|9`a56X;cV+LAadcOn_puVYv1Qo7{p-Umzg9`U@ z(`;Nm-hsZ$$GZJk zat;$BD!bLS?A_AR+fyr*!7>}Q*@a)Dj*`D z=y&g}x2Co3c7dK1Qc z=OU7Eu!{Pa3jEjUmgXe_)OXx?~CUi;YI_wZi3+1>l+$}UrC<TZ@TAa>Lfi0+ke$8*ti)aT4v{Auh6^6T_rCcu^>{DJT5_>x9|~nN3%Oh6*(@)e9{YvYY0-w zgu0l16uOrlrdHx$)33OkX6+`ub#Xwx>ALaIjR(A4Z=7oEiHUE{kG%4!4NQt}ZKX3v zQ^)umtJz1rar!Mg)CN9Eaa5i1sSR97aa4hto{b-DrApGY&l8_- zrTWl#I)09oDniqx_+l$9vnI23u$7iXQ=~QDN^_~HrFD*#hOMcGwb;rB4u5I`Cs{XI z`H7N0wSlv&74#IPKDB|%t)6{WeiOx?+CalvV~tio^s@CGI$71HHt@LhyfxlOpIhs! z{Mvy(wSm7{uUZoo5Ls=1x4L|kVnbVsk8*5HZFH{6r#7&k&DP1*%!l{eTG*QVXpSx0 z*1|_CZT)PmeYBzc^+wp-^NMXI+yzIStS^BhHaF1;MV7a1MYe3XsOb~i45F)w;9J`g zTMk&HlO^z*Z4FVpP(5-zbb(Y&Tn}C0D%}wP>XGZA8)V3E>an+n7PdP~)yM^r3v)Gb zLF7RP8EZXqLG*xmnz$f(!hTI$5WV1nrhQZoz2T%xN#6Spdsc5-%pLGxn)x`BM7@pF^ z^)LjsXrg-XSck(&S(JL@f*1wyZB!aAh%qo#6BopIn5T&g;yzeQ_iLU~E{KV6K@$~( zZ4x-zD;w9t{m?=a*TXcJNAJNnj_biQ15Rk%U>jwd1<~}>Qd14l!*E5@XGD*9AmA=_!CQp$!Ko?1zByq5 zTZk6JK}`pVmcR#^&J)qIhJ0!RLmb~Fc!0ml)2B8t z&hZzRXAK97F7n`DmYGf_=G<4m+mU zR{#taMQz{*jyd*~K4ZOOfxW~>0f}yS+(+SwCH7T5%1B&ef5JyO<$D_IJ^d66n813q zr=NnMieyi(h6gqAo?Z>}v?uTBHLzY2@98zLL#Q5ky2{|BCZ4S_C@tVC)FaPU8Jy76 z(?io$1~)bGbd`Z~l5*wgS_fw)E8^)gAnblcJYDNypeCNK4KP;|PuE7so2oo{w#uPc z6VKKrIHD;a(c^}v;iN{Mu4iDu11gZGYcm|wl#{r@z6GuemBHx5%?Zy!^mO(tgNKQp zgASV36Fm<@HN8Sq0dqCIL$no2HGP}7*^{shDm8{BZBEz@CpBdf?cn_Mp`$x#tK$U) zL?e=RId=N!!K7ClyL_}T>7Zk`k2WUNI`;UeD(Rf#MIU{bbkX72>%(7?zH(Ih$my(g zyyT-C=Q+ndA5CyxbiC}N#m=uBRX*D3JQMYbkE)!%IlMlqbp|HB=A-k@ris=5jdRU8 z8D94pe{(t#{S@iSGx;gmmDa%4-PN`M4Rqa=c*vJ!nyW|RVIMu}8jx7yqfM@{iAR9G z&GV-=aJ#D@@u&i#L#~;L$9;6lRh0OakLq1+__L3GaFy6=ePl^qWB)H7#g{ja&|B;@ ze7%tMYKxtQYl>uxoq>==VzclTI|I>*UtNdd@_B0=qSGL3{=)ma7YLL3|EpG;u*(f(Sb4cobX@ zmx0ecCa#CeuzsZ?u7}HTMibY=WeAW%upYS{E<=VUss~Tv6}bMm3gm+LZ^&Myhzp_~ z9@fMK@g=O##P#qM^m|fyay@(vYc+8_d<*9_aXowwb(**yuEE+;70319`2o&pj8EQR z{}IBUVq+O}NZy?A6SUAYjOb?=sA&$-FECxxGep0_DowRSe}^5KejvIICp6hpHYfZ8 z>NI5&-Jm5~tu8o{@Hen)dWh&Ibk($)=yw>SX&=!oSfJ@0qJP4AO}4XqhFq{CEsTdBWtpDzOYrTVm^k%@oNKbSKQ#w#jKTAsdHla;Le8@-;0cTMj;= z=?SvsV6mo+Wb2I2Xxd4(&bUJn97tOq)dg>QwDAsi(cMlcw3!(cYM+X@2^A z*WEZy(~9)RiKb{OOJD2igG)6%m%fc?m8QMa?Y_8;$io*rKqKsnmD+ebz0%bWYc;)- zUPE+FNR7TfUVT$KDx>d@0dnK21s;8W%n;(y|Jij9o|D^HE%4|E;5E68snHL>n@k?M zJg>z7jFr2Z8vOutYWgI7LGnQCtm$g{V?@0*@iGm<37UAB2H|u~zof599*mD^GB?{q zRH`YW+1BJCxKqeeVzD*z5>{y=Pt8y~rHN-|D1IQMMn4QMob-==82&7zMn4SW-)0++ z{z&q0tUAS{Mn3|VpJq~{AAzNcJTm$bxKp7N;s~tL#3LMur!?^hN8$%UsxzZ-kfrZlY{WxnvuM!!->g+c?bEG}c4L@%V_w`^h*Si#74l zl8?`5;-e)WcW9bTarfaHn&wm7eRxvSvS#yL6YvX7Ynwez^o@|3wTYO0?)I#CX2L`q zDX6AxA}$c(Y5O?208hT}pSDT(53p< zY}uNo5_u+Jg~ml<47jM0ZV}4U^tMo`reB0URHQF)QQOodu4zhd&V$JRT;#!Z^oHW$P1_S@#7Q%L1}2)o|xVPhF^(n8GFt{hl|*?s(h zMc7Xh+vef1{(jp$JSU`*K8)XJ;+&6Q*geXVB^Ji9>-%d{Be)tIZbR^h2gXPwpHj9QaPW%u0kF)`X@18yK>;4 zFnf+a@K4xJ6WdC0%0qrzDb5p8NuR>Cnz*B@u}XV#+!`z`^vA8iEs8uc`n7oVVZU)L zUKdhH%P{&8wyBP;!wy1f)(pIw}4A(e9j=4(r8Qu+&`a<-|_KZi~sHTviAswPhQJYH{LtH5ub@#n0-n?fq*R*c_#JEv!J z!ZyqnR7tlZy@aBVnzrrOLKBaE2d;nKZ`*-8gjCWO@R%kZ{Z6dYo*cIeD=PePyRb?V z**vftS8VqicjI~?m2?kQY2u_W;yLZfN%vxQM^SMiwk#Z8*n zw!bgdRQZkj@r;m4`Wjx<#7Pg}&DWJD2Ueq9zQ?K2S7Ui`Gwe`(E(Jq^%fquU8RwL@ z&%)-W>e%wRSr}VhoP|L?5%wR{SY3W33*-L1wLy4vbu9hq27DaHzuvz>(hT3k$#tqb zx4;FKA)c79m>H%GF$ZvlX-iB@%p^DzV~?4ECt_UG-V~S`v&{5OOiO9Ek0~=n#paOA zh|P`Jf!_wyVHpgH9UD^yBVr$kdD=9#96Msi-bZ4Wn{(t_#w3zoM&-!2ib`aCB|hKi z_kjIcvc?4ok!NFT#9AZzGWa64d|^jy)xUS#a`PqA=(uO&FPZL-+Y^5V3*!#PpAfkN z*g6vUv4X9q<3|ENMtq9P;x3W@Q*mEXyD;vX_%hS_@*g^4T>3szouPhDhHpr&j7KxK zFPUm7^(E7LT9&u!gt0OFd~y@{N#rK-BZrlI7gvw%gx$<>F8U456>!lVZCG$C_^r|M z)K*{)DXso22j31hfwO#D4@`DexY(;sBqVd&DKbyBQ_8ROz&_ytX}<+sfmD$NX<1O- zxhIacRy1S(V>~am>qI)cidAHt$bxS1qUy%d*Z{jSrl zyONhAuT6e2`Saw^lolyHQ~IWiOqrT8E9K#ol9cCDPNck>axvx0l7Q+$OmbKAbdulNGD+@l-k#(Uk+mY<7kNqKwdQw`^`{2y>!P{U zJeTyrnSDuyXL5$P%%LR7-$Osv!x)k(%$a!~wKFrPl2oq$npAb7wIs?B*;AzIRzGPE z&g4su&Ex@0$(%!SR_6Rv6Qt20gOEbkxX#xkPQ9F^O36eb6jKE3K1TJh&?PQWBpg#epb}C5|WMNBcw;*YPme`uwtw@@n zHMXU88_Y84^mHNUi`@wN zku*Vn%%%1{Buy{?dr*5INfW&o=|%0qBuy{`@22)pk|r32eW^X1qzOh~e`=2;X@XHW zfZC%;nqUDAqV}UCO|TG$PZ|9lqy{@f*Wnb>GJ? zPIVc-emcE6d<}-Wshs;Z@D&g5`7fG^x^aVj&pv$^E;ESUz5xm;@@2RfjD4qR8DKC8ew@Q(6a8D<%7Ny?)RH-XI zwfnIDemXqYf3dsw*IgSAzmW6m`Vni6n4%v~oT*ad#>VE&f8emY_p?7m4qDMMWz@Ch ziMpvO=(1X-=ejM*Yi@1O!8T01O;5Qs5bu%RCU3i&TJhU-?(do!FE^{08n~Ior^l>* zEjs&k_UqF3wZ5<0U5T_9)VNFI?oFO;(pd9s(!|s8&%KGe#SWS|`D>N(^^&iZ8xwRl zoBp3sCe`RYpMT6YX_Sf?HF=cL{GoV%%>Ye&o-ywlrFM_nQ&;&?dq7{_vx%oUZH!7EvviEhhL74e z+)a!3`%OQ6p|7LQw@I^RG#8Cg#be587G)0pJSZ?YwDugF)EmFh)^=%(x;5sueOHbX z^QQga9x|^8R4W5l1sd7&OxmA;>J>S*Axx=Ks? zt{(BI4pcV-Z`IGX@|YT=rUgw8QcpR?^)R)wH$Uc)9Hdf$mIT#~>&&+C$O}^IgEj=| zr(fvy>aHNQH)vm7M=$Yd@hO{Xo~<;GX=By&u`|XRTMv|`eQImXHIHRu)$*|`jGBI< zR|kv7ma(dI?AEdRoNnE1zmHW>!83wux3#z&mZczA6$Tg8Rca5*axhpO3O-yv+sg85 zu(}+4r7l~0RF=pP6%`U4V(iQb#%e4@7J>*7RwrA~rV?x#B&?%wDBplhtEsH|c;?Sf} z=XtQ0`r4aYTXI5GZs@wYW=FQ2r94#a2;CW~SHC#&<&&Z6d}u{o#|W46U?~ez+rqYo z8AE;Lavm&a!qnNYb76XH_b<(VhN=IB{iXla{d3!;Z&dX+e|}TDiRQBW+QDztp>Gd= zYgB5NU%U3Ly8i8r`q@@mOt_jHJ|*1fbu4sSZBe*d9G+A^`=pi=u5!cIIkPsccKILE z%EQ%;@SSzdj^%HooeWo}!cW&_9n1fub~9Yv3cp=H+fkbqp{7U7h%hG6!?B`TN`zVx zky=07PFo+LHbiWUa4x@AyZo)R-4SX}#1D1Nj^%$`I~$?SMVyb&XZ9Rvz8j(b7x9-~ z-Sa`eQ{So6-<|o+7|(UJwco!}e|-0+{^U!adnAlgiR0#v(-U6$%oaIbO&cFSzIKxa zF00+(@_2P+{MEWj?P@oeJV8yFFm-~_@5r`luy}$>nvh(Vt-aVAT0SKT+jRESRWYVw-~# z)uD-pC+dDLcel;9sRUb!t#%u$%Q0AgvZ=kceRY-EW3XPdsY|wB>t|b8|F)?bTVy1& zvOoWX>vOY0gknNgC3*<34at=mX#kCO8HoAj|? zcYfAWWKKuPnST`8Tkn#&7bU;lFATD8(b76MT2ySb#9_`c9EG;lRb*C2ONOJ+(Xm|b z)DBWgYHPHV-QUDfXm34E=0vodjMo2nC2YVgqTi$CkNa(bE{_ds^(0X@C&?|$IdFu_ zlfxPtBPuRN;$!rUy{Br~L^&~%8>7G4C&I5}vZx)C1K) zey&fHcARL|RGB?hAJw;wRykGFwW)G_sy@H(R4sNIYdcM{rs?hbE!R?~iz=Ef#nbge z{l;rQ%@9>FLn>$J{{3y*ftjLi&y+he_4EA)X(wihikvM`v-K{oMrc{HMID?iRkQOp zzWR`8*>gnAm@6~q>W2sP*Y?JWs*IJYSiSAQ4n30NM6HaIRhWIwOxJTC{BxY_cc$Du zO;%~@U;BmAM)Ry7Ul}J=ar*Ru{k77K2-A(FvlaCdjk|z0cqdwnCyU2~vtVPDdltQ_{@8ll?%< zp52<78(pJvJwa~VZ|E#O{#|NYG|x6PX^rM4av>&49Og1)5Alib;qBkq+u#1xX>xzi z{UIy=nHsI9FF#QV5=Ac>{D@aSzJ+@5)4fv{T8HQt20yJ;&~h(PeoNFJdF|;Y!=)+p z=;u4JyH1__pC6(Rf31_PY`&;p=F3IQF?TPMpY-r)(b@jPfPCG0+kZ5#!UbF+3#1rx zHa4_XY3q{ReC=0OK``U|@rP9|cn^ew1 z$;F(5w6GVNd+j8%YoYA^N1>h9IWp%LN`C;}1wXFrR7fAtTAJyKnYq6-^i)9aHPnov3i#Pc$UF9UHQ;X%aYo!yV z-hBtjU6S_}%Wuw_#T5TQ{mH~9F=Ud=!;F#gl03M0lVn4Zp7KV#t(?-1B-!uMaW0ud zOqL4FF_)hoFy?Zb)SYCx>sm49GABjU+!Tq$>|0q(%gm0sywl+Q?v~G(u-53gMvrNd zLBpC9$*k>bxOY8_arcutkS+&ZE5^82NM22sYw7ygw_Ey7TPkY$Qkj7nyUl@fm&&@O`XleG zu$2*QTPk~98g4EVb!(a2#vJ3$(Ts5?FBdgsxlG0CD#o}=NTx2AG-u6Xx}rHwL8KTL zXCbAc3&H8-a%QXo80R>~U8F=Q@(wz4JHW)Z34 zm9p8jVoc^R$s;S}sIz7<&9FKq^PMr5n^bPCl-te*`&{%@9-`*0l7vySyPx8a7A? zNp*JEC$q&uP?{lIGxRn8&gpu9=wODNap{N#|`z- z@`(yEr7%;^8rs_T5YgdGIpW-kq1H*J=rV9vvK%UjDmyH++} z_7sntNhar5ZsjC*td*VhYtBP=J5Rb|tyHenj}B|?8<{OCDqEs4W7iq*nrz9;)|f(Y1o#-w@;3gW6rUs7!N16BP5UJ$g%o0W9(a`Z|BIJ9R1RJt$pKiMaAce zju~SY!bQ1KoU6ARKFjtK(cWCy=h9HIj@RNksluFN&oLfGZg)xETPMHOuNh;<=dp-+ zG7qcW(qcMU|KaGCLoGK?);U`|?PuZu!NEK^l&AOlPo(Vv(Jy&&(b-{dxW1kbf%Q_2 zIcJn$Jd50-H*lG4kQmIRX3Qvs^pXvdYE(@Y(Flu2=*ssz|Gt-Nm~+%L z(z|07m;3EC`pBS;}2W=eovHNC;JZlTz>pr%+NH|t-06x1zlGdI{~(J}k*_9@RO5jC?!W?{}5 zt*|(s8>VEEDJ8O`L~k;pnU+sfP$GpT`m-Zi`yL@WS|Z1s+u3&&wS{-(7MZj~4;V44 z+dQI#Es}^CW34XbHBl;SFy~lV##_r&M6$S4HkazpjcleJB|26r$4m7$N4D_2OLVVP zesgYTA8X-OQH!?9;;nkj$mn62L|I#9EoO|hsZ7-OWs;9M$0{&hN~YZ;_ms&G^=rmT zUm*QUnOrQ>Klr%C6EWLFP2MI`Fk{y%;Z@sYwKL_;Z5nUYV@LYwTRt8#tblakHYsx1 zplmy@@9nZ3bIxUp@lrA!CV6DL9Ian7=5mwtt?hDqyZ+x#+WN+p^Nmw3@tAWi?#1xt zaw#d#TlL997F)#gO0`0ND`hUhr=S}682$rN{4dBm_yr`ewX0HYcEPRjhmi?>0q=<1 z;WzMp=mGds+#i|Y2s{Y!LN=G+OS>wYvJf06_yK9~LoXd5k0sb;12L^cszOvuEdX^r{O>FYV-`;xF?f99pQHPqv%<A{a+72K9pD@M-8}cqN{KUV)48^{6*| z0N;)Jz}_z_RR#BjJHjndKX@?S1NDa|;qReW;cfU5Gypzr1AayW32x(;(IB|NE8K2q zFx(n{7`+B}$Nz<1hu_5qqc`9H{8RKMJQ*L4-hxx`1oSq%315ref%oA%kZlOTCEzT2 z7k2Bd)bH@W;YVO^G!*WFKZSr^39-)xX(bPW)XiWHf4?__yYZxLK(gqeFY!J51_B%JNN}O3hq0I zTMq@mIv$Kh!$0C1(HPh=SgEUUpuHb{0tLat@ORNzI1K;7#;;(4wfJ-t0-wXTqEOiF zHEuIF3~mp5qi^70cn|a~yb+H;;c&;-mAYh);rHNP=sP$F{}PRZr{j@mJZwt`7NQ9R zh4?x&5k83TK{og*UWp>%MsFzf7aRq*h95)Ga1q`EO@jC0KcE=+5`G3vh97v7YYUzN zw}YF#$@!m3@FGE1Gz~t8zl)~Bzu=W<1}twWbq}5iKMFTNv*7;tGiWwE93P72z^1oZ zS$Hn|Anb!;;pgynC=P!8Z5#JCK|Dby{sGeAsdx;U2X}gh2N9eA_lNtSM0f-~6wQan z;eluYycC~_7Q!3xJhTY@e27x};Kgt_9EOtY%Nq|&L&@-3JRPOL`|!v2Cu=B(Q)_?UWiV>7eD0wuOc`}5cQE#zrm;Ad2k#$ z4d>v?&>8qAduy*8&$%Ycq*!bcjHCqg8lh_8#s=B zq2Mu+FIaRDPQo8Tm*8wX6a5PB!AsC(_!52sU4a{Z%+n3N3b%xP(KR>&e->Sbi}3<< z13rfTXyaEk!9DyEx(T=VgwH8-3w{RgfNsMZ@t4pYco$xd?!s00F?0_$eM%kv4So*x YLBGR&@mG*2t{LQpo+Z%deslK!0EW+_G5`Po delta 8599 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 From fbf4d0e41922fdb26f92f35039f3f4032656f725 Mon Sep 17 00:00:00 2001 From: Artyom Date: Tue, 15 Dec 2015 10:51:04 +0200 Subject: [PATCH 189/211] Fixed ArgumentOutOfRangeException If the list is empty you get the ArgumentOutOfRangeException when calling flattenString.Remove(flattenString.Length - 1). Also using a StringBuilder is the prefered way to concatenate strings in a loop. --- .../src/main/resources/csharp/ApiClient.mustache | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/modules/swagger-codegen/src/main/resources/csharp/ApiClient.mustache b/modules/swagger-codegen/src/main/resources/csharp/ApiClient.mustache index 707ce9eb560..1ab3c939e4c 100644 --- a/modules/swagger-codegen/src/main/resources/csharp/ApiClient.mustache +++ b/modules/swagger-codegen/src/main/resources/csharp/ApiClient.mustache @@ -163,13 +163,14 @@ namespace {{packageName}}.Client return ((DateTime)obj).ToString (Configuration.DateTimeFormat); else if (obj is IList) { - string flattenString = ""; - string separator = ","; + var flattenedString = new StringBuilder(); foreach (var param in (IList)obj) { - flattenString += param.ToString() + separator; + if (flattenedString.Length > 0) + flattenedString.Append(","); + flattenedString.Append(param); } - return flattenString.Remove(flattenString.Length - 1);; + return flattenedString.ToString(); } else return Convert.ToString (obj); From 3f3e444ab19b46ff404da4a09831ba445184c09e Mon Sep 17 00:00:00 2001 From: xhh Date: Tue, 15 Dec 2015 19:38:04 +0800 Subject: [PATCH 190/211] Some clean-ups for the Javascript client codegen --- .../languages/JavascriptClientCodegen.java | 108 +++--------------- .../main/resources/Javascript/api.mustache | 4 - .../Javascript/generatedAnnotation.mustache | 1 - .../javascript/src/scripts/rest/api/PetApi.js | 4 - .../src/scripts/rest/api/StoreApi.js | 4 - .../src/scripts/rest/api/UserApi.js | 4 - .../javascript/src/scripts/rest/model/Pet.js | 2 +- 7 files changed, 14 insertions(+), 113 deletions(-) delete mode 100644 modules/swagger-codegen/src/main/resources/Javascript/generatedAnnotation.mustache diff --git a/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/JavascriptClientCodegen.java b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/JavascriptClientCodegen.java index 51ef135ae0d..c17b466866c 100644 --- a/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/JavascriptClientCodegen.java +++ b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/JavascriptClientCodegen.java @@ -34,15 +34,8 @@ import org.slf4j.LoggerFactory; public class JavascriptClientCodegen extends DefaultCodegen implements CodegenConfig { private static final Logger LOGGER = LoggerFactory.getLogger(JavascriptClientCodegen.class); - protected String invokerPackage = "io.swagger.client"; - protected String groupId = "io.swagger"; - protected String artifactId = "swagger-java-client"; - protected String artifactVersion = "1.0.0"; protected String sourceFolder = "src"; protected String localVariablePrefix = ""; - protected boolean fullJavaUtil = false; - protected String javaUtilPrefix = ""; - protected Boolean serializableModel = false; public JavascriptClientCodegen() { super(); @@ -80,14 +73,8 @@ public class JavascriptClientCodegen extends DefaultCodegen implements CodegenCo instantiationTypes.put("map", "HashMap"); cliOptions.add(new CliOption(CodegenConstants.INVOKER_PACKAGE, CodegenConstants.INVOKER_PACKAGE_DESC)); - cliOptions.add(new CliOption(CodegenConstants.GROUP_ID, CodegenConstants.GROUP_ID_DESC)); - cliOptions.add(new CliOption(CodegenConstants.ARTIFACT_ID, CodegenConstants.ARTIFACT_ID_DESC)); - cliOptions.add(new CliOption(CodegenConstants.ARTIFACT_VERSION, CodegenConstants.ARTIFACT_VERSION_DESC)); cliOptions.add(new CliOption(CodegenConstants.SOURCE_FOLDER, CodegenConstants.SOURCE_FOLDER_DESC)); cliOptions.add(new CliOption(CodegenConstants.LOCAL_VARIABLE_PREFIX, CodegenConstants.LOCAL_VARIABLE_PREFIX_DESC)); - cliOptions.add(new CliOption(CodegenConstants.SERIALIZABLE_MODEL, CodegenConstants.SERIALIZABLE_MODEL_DESC)); - cliOptions.add(new CliOption("fullJavaUtil", "whether to use fully qualified name for classes under java.util (default to false)")); - } @Override @@ -108,9 +95,7 @@ public class JavascriptClientCodegen extends DefaultCodegen implements CodegenCo @Override public void processOpts() { super.processOpts(); - - typeMapping.put("array", "Array"); - + typeMapping.put("array", "Array"); } @Override @@ -198,84 +183,42 @@ public class JavascriptClientCodegen extends DefaultCodegen implements CodegenCo @Override public String toDefaultValue(Property p) { if (p instanceof ArrayProperty) { - final ArrayProperty ap = (ArrayProperty) p; - final String pattern; - //if (fullJavaUtil) { - // pattern = "new ArrayList()"; - //} else { - // pattern = "new ArrayList<%s>()"; - //} - - pattern = "new Array()"; - return String.format(pattern, getTypeDeclaration(ap.getItems())); + return "[]"; } else if (p instanceof MapProperty) { - final MapProperty ap = (MapProperty) p; - final String pattern; - if (fullJavaUtil) { - pattern = "new java.util.HashMap()"; - } else { - pattern = "new HashMap()"; - } - return String.format(pattern, getTypeDeclaration(ap.getAdditionalProperties())); - + return "{}"; } else if (p instanceof LongProperty) { LongProperty dp = (LongProperty) p; if (dp.getDefault() != null) { return dp.getDefault().toString()+"l"; } return "null"; - + // added for Javascript } else if (p instanceof RefProperty) { RefProperty rp = (RefProperty)p; - System.out.println("rp: " + rp.getName() + rp.getAccess() + rp.getDescription() + rp.getExample() + rp.getFormat() + rp.getSimpleRef() + rp.getTitle() + rp.getType()); - - return "new " +rp.getSimpleRef() + "()"; + return "new " +rp.getSimpleRef() + "()"; } - - System.out.println("property: " + p); - + return super.toDefaultValue(p); } - + @Override public String toDefaultValueWithParam(String name, Property p) { if (p instanceof ArrayProperty) { - final ArrayProperty ap = (ArrayProperty) p; - final String pattern; -// if (fullJavaUtil) { -// pattern = "new java.util.ArrayList<%s>()"; -// } else { -// pattern = "new ArrayList<%s>()" ; -// } - pattern = " = new Array()" ; - - return String.format(pattern, getTypeDeclaration(ap.getItems()))+ ";"; + return " = new Array();"; } else if (p instanceof MapProperty) { - final MapProperty ap = (MapProperty) p; - final String pattern; - if (fullJavaUtil) { - pattern = " = new java.util.HashMap()"; - } else { - pattern = "new HashMap()"; - } - return String.format(pattern, getTypeDeclaration(ap.getAdditionalProperties()))+ ";"; - + return " = {}"; } else if (p instanceof LongProperty) { LongProperty dp = (LongProperty) p; return " = data." + name + ";"; - + // added for Javascript } else if (p instanceof RefProperty) { RefProperty rp = (RefProperty)p; - System.out.println("rp: " + rp.getName() + rp.getAccess() + rp.getDescription() + rp.getExample() + rp.getFormat() + rp.getSimpleRef() + rp.getTitle() + rp.getType()); - - return ".constructFromObject(data." + name + ");"; + return ".constructFromObject(data." + name + ");"; } - - System.out.println("property: " + p); - + return super.toDefaultValueWithParam(name, p); } @@ -449,7 +392,7 @@ public class JavascriptClientCodegen extends DefaultCodegen implements CodegenCo } } } - + if(removedChildEnum) { // If we removed an entry from this model's vars, we need to ensure hasMore is updated int count = 0, numVars = codegenProperties.size(); @@ -464,22 +407,6 @@ public class JavascriptClientCodegen extends DefaultCodegen implements CodegenCo return codegenModel; } - public void setInvokerPackage(String invokerPackage) { - this.invokerPackage = invokerPackage; - } - - public void setGroupId(String groupId) { - this.groupId = groupId; - } - - public void setArtifactId(String artifactId) { - this.artifactId = artifactId; - } - - public void setArtifactVersion(String artifactVersion) { - this.artifactVersion = artifactVersion; - } - public void setSourceFolder(String sourceFolder) { this.sourceFolder = sourceFolder; } @@ -488,15 +415,6 @@ public class JavascriptClientCodegen extends DefaultCodegen implements CodegenCo this.localVariablePrefix = localVariablePrefix; } - - public Boolean getSerializableModel() { - return serializableModel; - } - - public void setSerializableModel(Boolean serializableModel) { - this.serializableModel = serializableModel; - } - private String sanitizePackageName(String packageName) { packageName = packageName.trim(); packageName = packageName.replaceAll("[^a-zA-Z0-9_\\.]", "_"); diff --git a/modules/swagger-codegen/src/main/resources/Javascript/api.mustache b/modules/swagger-codegen/src/main/resources/Javascript/api.mustache index f7bc498ff18..dd115aaa45c 100644 --- a/modules/swagger-codegen/src/main/resources/Javascript/api.mustache +++ b/modules/swagger-codegen/src/main/resources/Javascript/api.mustache @@ -1,7 +1,3 @@ -/* - * {{>generatedAnnotation}} - */ - //export module if ( typeof define === "function" && define.amd ) { define(['jquery'], function($) { diff --git a/modules/swagger-codegen/src/main/resources/Javascript/generatedAnnotation.mustache b/modules/swagger-codegen/src/main/resources/Javascript/generatedAnnotation.mustache deleted file mode 100644 index 49110fc1ad9..00000000000 --- a/modules/swagger-codegen/src/main/resources/Javascript/generatedAnnotation.mustache +++ /dev/null @@ -1 +0,0 @@ -@javax.annotation.Generated(value = "{{generatorClass}}", date = "{{generatedDate}}") \ No newline at end of file diff --git a/samples/client/petstore/javascript/src/scripts/rest/api/PetApi.js b/samples/client/petstore/javascript/src/scripts/rest/api/PetApi.js index bf35463dc1a..5b4f6523413 100644 --- a/samples/client/petstore/javascript/src/scripts/rest/api/PetApi.js +++ b/samples/client/petstore/javascript/src/scripts/rest/api/PetApi.js @@ -1,7 +1,3 @@ -/* - * @javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavascriptClientCodegen", date = "2015-12-09T16:07:21.000+07:00") - */ - //export module if ( typeof define === "function" && define.amd ) { define(['jquery'], function($) { diff --git a/samples/client/petstore/javascript/src/scripts/rest/api/StoreApi.js b/samples/client/petstore/javascript/src/scripts/rest/api/StoreApi.js index 5487b1c386e..e27494c7924 100644 --- a/samples/client/petstore/javascript/src/scripts/rest/api/StoreApi.js +++ b/samples/client/petstore/javascript/src/scripts/rest/api/StoreApi.js @@ -1,7 +1,3 @@ -/* - * @javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavascriptClientCodegen", date = "2015-12-09T16:07:21.000+07:00") - */ - //export module if ( typeof define === "function" && define.amd ) { define(['jquery'], function($) { diff --git a/samples/client/petstore/javascript/src/scripts/rest/api/UserApi.js b/samples/client/petstore/javascript/src/scripts/rest/api/UserApi.js index 30c797cf25f..ecd9707fa91 100644 --- a/samples/client/petstore/javascript/src/scripts/rest/api/UserApi.js +++ b/samples/client/petstore/javascript/src/scripts/rest/api/UserApi.js @@ -1,7 +1,3 @@ -/* - * @javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavascriptClientCodegen", date = "2015-12-09T16:07:21.000+07:00") - */ - //export module if ( typeof define === "function" && define.amd ) { define(['jquery'], function($) { diff --git a/samples/client/petstore/javascript/src/scripts/rest/model/Pet.js b/samples/client/petstore/javascript/src/scripts/rest/model/Pet.js index b97907396f1..25985733450 100644 --- a/samples/client/petstore/javascript/src/scripts/rest/model/Pet.js +++ b/samples/client/petstore/javascript/src/scripts/rest/model/Pet.js @@ -66,7 +66,7 @@ var Pet = function Pet(photoUrls, name) { /** * datatype: Array **/ - self.tags = new Array(); + self.tags = []; /** * pet status in the store From 322e7a4b4bd20eb431b4b09d06eaf0d88eda97ff Mon Sep 17 00:00:00 2001 From: hacki11 Date: Tue, 15 Dec 2015 23:33:48 +0100 Subject: [PATCH 191/211] [C#] fix filename and Content-Disposition parsing on FileStream --- .../src/main/resources/csharp/ApiClient.mustache | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/modules/swagger-codegen/src/main/resources/csharp/ApiClient.mustache b/modules/swagger-codegen/src/main/resources/csharp/ApiClient.mustache index db865e2b27d..1b49d9b5347 100644 --- a/modules/swagger-codegen/src/main/resources/csharp/ApiClient.mustache +++ b/modules/swagger-codegen/src/main/resources/csharp/ApiClient.mustache @@ -233,12 +233,15 @@ namespace {{packageName}}.Client ? Path.GetTempPath() : Configuration.TempFolderPath; var regex = new Regex(@"Content-Disposition:.*filename=['""]?([^'""\s]+)['""]?$"); - var match = regex.Match(headers.ToString()); - if (match.Success) + foreach (var header in headers) { - string fileName = filePath + match.Value.Replace("\"", "").Replace("'", ""); - File.WriteAllBytes(fileName, data); - return new FileStream(fileName, FileMode.Open); + var match = regex.Match(header.ToString()); + if (match.Success) + { + string fileName = filePath + match.Groups[1].Value.Replace("\"", "").Replace("'", ""); + File.WriteAllBytes(fileName, data); + return new FileStream(fileName, FileMode.Open); + } } } var stream = new MemoryStream(data); From 199c4f70adf5e0c800f4f02f0455daeaf68d1521 Mon Sep 17 00:00:00 2001 From: xhh Date: Tue, 15 Dec 2015 22:57:02 +0800 Subject: [PATCH 192/211] Add some config options to Javascript client codegen --- .../io/swagger/codegen/DefaultCodegen.java | 10 +++ .../languages/ClojureClientCodegen.java | 4 -- .../languages/JavascriptClientCodegen.java | 72 ++++++++++++++++++- samples/client/petstore/javascript/.gitignore | 1 + 4 files changed, 81 insertions(+), 6 deletions(-) create mode 100644 samples/client/petstore/javascript/.gitignore diff --git a/modules/swagger-codegen/src/main/java/io/swagger/codegen/DefaultCodegen.java b/modules/swagger-codegen/src/main/java/io/swagger/codegen/DefaultCodegen.java index 53c0e6350b0..cbc1f80fc0b 100644 --- a/modules/swagger-codegen/src/main/java/io/swagger/codegen/DefaultCodegen.java +++ b/modules/swagger-codegen/src/main/java/io/swagger/codegen/DefaultCodegen.java @@ -1823,6 +1823,16 @@ public class DefaultCodegen { return word; } + /** + * Dashize the given word. + * + * @param word The word + * @return The dashized version of the word, e.g. "my-name" + */ + protected String dashize(String word) { + return underscore(word).replaceAll("[_ ]", "-"); + } + /** * Generate the next name for the given name, i.e. append "2" to the base name if not ending with a number, * otherwise increase the number by 1. For example: diff --git a/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/ClojureClientCodegen.java b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/ClojureClientCodegen.java index a850785a7db..c8b581b3d3a 100644 --- a/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/ClojureClientCodegen.java +++ b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/ClojureClientCodegen.java @@ -199,8 +199,4 @@ public class ClojureClientCodegen extends DefaultCodegen implements CodegenConfi protected String namespaceToFolder(String ns) { return ns.replace(".", File.separator).replace("-", "_"); } - - protected String dashize(String s) { - return underscore(s).replaceAll("[_ ]", "-"); - } } diff --git a/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/JavascriptClientCodegen.java b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/JavascriptClientCodegen.java index c17b466866c..840cf88fbd8 100644 --- a/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/JavascriptClientCodegen.java +++ b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/JavascriptClientCodegen.java @@ -11,7 +11,7 @@ import io.swagger.codegen.CodegenProperty; import io.swagger.codegen.CodegenType; import io.swagger.codegen.DefaultCodegen; import io.swagger.codegen.SupportingFile; -import io.swagger.models.Model; +import io.swagger.models.*; import io.swagger.models.properties.ArrayProperty; import io.swagger.models.properties.LongProperty; import io.swagger.models.properties.MapProperty; @@ -34,6 +34,15 @@ import org.slf4j.LoggerFactory; public class JavascriptClientCodegen extends DefaultCodegen implements CodegenConfig { private static final Logger LOGGER = LoggerFactory.getLogger(JavascriptClientCodegen.class); + private static final String PROJECT_NAME = "projectName"; + private static final String PROJECT_DESCRIPTION = "projectDescription"; + private static final String PROJECT_VERSION = "projectVersion"; + private static final String PROJECT_LICENSE_NAME = "projectLicenseName"; + + protected String projectName = null; + protected String projectDescription = null; + protected String projectVersion = null; + protected String sourceFolder = "src"; protected String localVariablePrefix = ""; @@ -72,9 +81,16 @@ public class JavascriptClientCodegen extends DefaultCodegen implements CodegenCo instantiationTypes.put("array", "Array"); instantiationTypes.put("map", "HashMap"); - cliOptions.add(new CliOption(CodegenConstants.INVOKER_PACKAGE, CodegenConstants.INVOKER_PACKAGE_DESC)); cliOptions.add(new CliOption(CodegenConstants.SOURCE_FOLDER, CodegenConstants.SOURCE_FOLDER_DESC)); cliOptions.add(new CliOption(CodegenConstants.LOCAL_VARIABLE_PREFIX, CodegenConstants.LOCAL_VARIABLE_PREFIX_DESC)); + cliOptions.add(new CliOption(PROJECT_NAME, + "name of the project (Default: generated from info.title or \"swagger-js-client\")")); + cliOptions.add(new CliOption(PROJECT_DESCRIPTION, + "description of the project (Default: using info.description or \"Client library of \")")); + cliOptions.add(new CliOption(PROJECT_VERSION, + "version of the project (Default: using info.version or \"1.0.0\")")); + cliOptions.add(new CliOption(PROJECT_LICENSE_NAME, + "name of the license the project uses (Default: using info.license.name)")); } @Override @@ -98,6 +114,58 @@ public class JavascriptClientCodegen extends DefaultCodegen implements CodegenCo typeMapping.put("array", "Array"); } + @Override + public void preprocessSwagger(Swagger swagger) { + super.preprocessSwagger(swagger); + + if (additionalProperties.containsKey(PROJECT_NAME)) { + projectName = ((String) additionalProperties.get(PROJECT_NAME)); + } + if (additionalProperties.containsKey(PROJECT_DESCRIPTION)) { + projectDescription = ((String) additionalProperties.get(PROJECT_DESCRIPTION)); + } + if (additionalProperties.containsKey(PROJECT_VERSION)) { + projectVersion = ((String) additionalProperties.get(PROJECT_VERSION)); + } + + if (swagger.getInfo() != null) { + Info info = swagger.getInfo(); + if (projectName == null && info.getTitle() != null) { + // when projectName is not specified, generate it from info.title + projectName = dashize(info.getTitle()); + } + if (projectVersion == null) { + // when projectVersion is not specified, use info.version + projectVersion = info.getVersion(); + } + if (projectDescription == null) { + // when projectDescription is not specified, use info.description + projectDescription = info.getDescription(); + } + if (info.getLicense() != null) { + License license = info.getLicense(); + if (additionalProperties.get(PROJECT_LICENSE_NAME) == null) { + additionalProperties.put(PROJECT_LICENSE_NAME, license.getName()); + } + } + } + + // default values + if (projectName == null) { + projectName = "swagger-js-client"; + } + if (projectVersion == null) { + projectVersion = "1.0.0"; + } + if (projectDescription == null) { + projectDescription = "Client library of " + projectName; + } + + additionalProperties.put(PROJECT_NAME, projectName); + additionalProperties.put(PROJECT_DESCRIPTION, escapeText(projectDescription)); + additionalProperties.put(PROJECT_VERSION, projectVersion); + } + @Override public String escapeReservedWord(String name) { return "_" + name; diff --git a/samples/client/petstore/javascript/.gitignore b/samples/client/petstore/javascript/.gitignore new file mode 100644 index 00000000000..2ccbe4656c6 --- /dev/null +++ b/samples/client/petstore/javascript/.gitignore @@ -0,0 +1 @@ +/node_modules/ From 625e712d7b75608c17b01cc0f2eed8085f2be131 Mon Sep 17 00:00:00 2001 From: xhh Date: Tue, 15 Dec 2015 22:58:15 +0800 Subject: [PATCH 193/211] Javascript: add package.json --- .../src/main/resources/Javascript/package.mustache | 13 +++++++++++++ 1 file changed, 13 insertions(+) create mode 100644 modules/swagger-codegen/src/main/resources/Javascript/package.mustache diff --git a/modules/swagger-codegen/src/main/resources/Javascript/package.mustache b/modules/swagger-codegen/src/main/resources/Javascript/package.mustache new file mode 100644 index 00000000000..7c9d45a3e6d --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/Javascript/package.mustache @@ -0,0 +1,13 @@ +{ + "name": "{{{projectName}}}", + "version": "{{{projectVersion}}}", + "description": "{{{projectDescription}}}",{{#projectLicenseName}} + "license": "{{{projectLicenseName}}}",{{/projectLicenseName}} + "main": "index.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "dependencies": { + "jquery": "^2.1.4" + } +} From 10885790f8f7f62caf890cba415e872a99019aac Mon Sep 17 00:00:00 2001 From: Tomek Cejner Date: Wed, 16 Dec 2015 14:56:37 +0100 Subject: [PATCH 194/211] Bumped alamofire to 3.1.x --- .../swagger-codegen/src/main/resources/swift/Podspec.mustache | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/swagger-codegen/src/main/resources/swift/Podspec.mustache b/modules/swagger-codegen/src/main/resources/swift/Podspec.mustache index 5cf337ad6f2..d156ef14417 100644 --- a/modules/swagger-codegen/src/main/resources/swift/Podspec.mustache +++ b/modules/swagger-codegen/src/main/resources/swift/Podspec.mustache @@ -16,5 +16,5 @@ Pod::Spec.new do |s| s.documentation_url = '{{podDocumentationURL}}'{{/podDocumentationURL}} s.source_files = '{{projectName}}/Classes/Swaggers/**/*.swift'{{#usePromiseKit}} s.dependency 'PromiseKit', '~> 2.1'{{/usePromiseKit}} - s.dependency 'Alamofire', '~> 3.0.0' + s.dependency 'Alamofire', '~> 3.1.0' end From 2c1d8b19d287dc3fcca033dc8c1efacc180ae749 Mon Sep 17 00:00:00 2001 From: xhh Date: Wed, 16 Dec 2015 23:51:48 +0800 Subject: [PATCH 195/211] Make Javascript client a Node.js (NPM) module --- .../languages/JavascriptClientCodegen.java | 118 ++++++++++++------ .../main/resources/Javascript/api.mustache | 17 ++- .../main/resources/Javascript/index.mustache | 10 ++ .../main/resources/Javascript/model.mustache | 16 ++- .../resources/Javascript/package.mustache | 2 +- .../client/petstore/javascript/package.json | 13 ++ .../src/{scripts/rest => }/api/PetApi.js | 22 +++- .../src/{scripts/rest => }/api/StoreApi.js | 25 ++-- .../src/{scripts/rest => }/api/UserApi.js | 16 ++- .../client/petstore/javascript/src/index.js | 22 ++++ .../src/{scripts/rest => }/model/Category.js | 20 ++- .../src/{scripts/rest => }/model/Order.js | 28 +++-- .../src/{scripts/rest => }/model/Pet.js | 22 +++- .../src/{scripts/rest => }/model/Tag.js | 20 ++- .../src/{scripts/rest => }/model/User.js | 20 ++- 15 files changed, 286 insertions(+), 85 deletions(-) create mode 100644 modules/swagger-codegen/src/main/resources/Javascript/index.mustache create mode 100644 samples/client/petstore/javascript/package.json rename samples/client/petstore/javascript/src/{scripts/rest => }/api/PetApi.js (96%) rename samples/client/petstore/javascript/src/{scripts/rest => }/api/StoreApi.js (93%) rename samples/client/petstore/javascript/src/{scripts/rest => }/api/UserApi.js (97%) create mode 100644 samples/client/petstore/javascript/src/index.js rename samples/client/petstore/javascript/src/{scripts/rest => }/model/Category.js (69%) rename samples/client/petstore/javascript/src/{scripts/rest => }/model/Order.js (85%) rename samples/client/petstore/javascript/src/{scripts/rest => }/model/Pet.js (85%) rename samples/client/petstore/javascript/src/{scripts/rest => }/model/Tag.js (69%) rename samples/client/petstore/javascript/src/{scripts/rest => }/model/User.js (89%) diff --git a/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/JavascriptClientCodegen.java b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/JavascriptClientCodegen.java index 840cf88fbd8..62bc42bf21d 100644 --- a/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/JavascriptClientCodegen.java +++ b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/JavascriptClientCodegen.java @@ -35,11 +35,13 @@ public class JavascriptClientCodegen extends DefaultCodegen implements CodegenCo private static final Logger LOGGER = LoggerFactory.getLogger(JavascriptClientCodegen.class); private static final String PROJECT_NAME = "projectName"; + private static final String MODULE_NAME = "moduleName"; private static final String PROJECT_DESCRIPTION = "projectDescription"; private static final String PROJECT_VERSION = "projectVersion"; private static final String PROJECT_LICENSE_NAME = "projectLicenseName"; protected String projectName = null; + protected String moduleName = null; protected String projectDescription = null; protected String projectVersion = null; @@ -52,41 +54,44 @@ public class JavascriptClientCodegen extends DefaultCodegen implements CodegenCo modelTemplateFiles.put("model.mustache", ".js"); apiTemplateFiles.put("api.mustache", ".js"); templateDir = "Javascript"; - apiPackage = "scripts/rest/api"; - modelPackage = "scripts/rest/model"; + apiPackage = "api"; + modelPackage = "model"; + // reference: http://www.w3schools.com/js/js_reserved.asp reservedWords = new HashSet( Arrays.asList( - "abstract", "continue", "for", "new", "switch", "assert", - "default", "if", "package", "synchronized", "boolean", "do", "goto", "private", - "this", "break", "double", "implements", "protected", "throw", "byte", "else", - "import", "public", "throws", "case", "enum", "instanceof", "return", "transient", - "catch", "extends", "int", "short", "try", "char", "final", "interface", "static", - "void", "class", "finally", "long", "strictfp", "volatile", "const", "float", - "native", "super", "while") + "abstract", "arguments", "boolean", "break", "byte", + "case", "catch", "char", "class", "const", + "continue", "debugger", "default", "delete", "do", + "double", "else", "enum", "eval", "export", + "extends", "false", "final", "finally", "float", + "for", "function", "goto", "if", "implements", + "import", "in", "instanceof", "int", "interface", + "let", "long", "native", "new", "null", + "package", "private", "protected", "public", "return", + "short", "static", "super", "switch", "synchronized", + "this", "throw", "throws", "transient", "true", + "try", "typeof", "var", "void", "volatile", + "while", "with", "yield", + "Array", "Date", "eval", "function", "hasOwnProperty", + "Infinity", "isFinite", "isNaN", "isPrototypeOf", + "Math", "NaN", "Number", "Object", + "prototype", "String", "toString", "undefined", "valueOf") ); languageSpecificPrimitives = new HashSet( - Arrays.asList( - "String", - "boolean", - "Boolean", - "Double", - "Integer", - "Long", - "Float", - "Object", - "byte[]") + Arrays.asList("String", "Boolean", "Integer", "Number", "Array", "Object", "Date", "File") ); - instantiationTypes.put("array", "Array"); - instantiationTypes.put("map", "HashMap"); + defaultIncludes = new HashSet(languageSpecificPrimitives); - cliOptions.add(new CliOption(CodegenConstants.SOURCE_FOLDER, CodegenConstants.SOURCE_FOLDER_DESC)); + cliOptions.add(new CliOption(CodegenConstants.SOURCE_FOLDER, CodegenConstants.SOURCE_FOLDER_DESC).defaultValue("src")); cliOptions.add(new CliOption(CodegenConstants.LOCAL_VARIABLE_PREFIX, CodegenConstants.LOCAL_VARIABLE_PREFIX_DESC)); cliOptions.add(new CliOption(PROJECT_NAME, "name of the project (Default: generated from info.title or \"swagger-js-client\")")); + cliOptions.add(new CliOption(MODULE_NAME, + "module name for AMD, Node or globals (Default: generated from )")); cliOptions.add(new CliOption(PROJECT_DESCRIPTION, - "description of the project (Default: using info.description or \"Client library of \")")); + "description of the project (Default: using info.description or \"Client library of \")")); cliOptions.add(new CliOption(PROJECT_VERSION, "version of the project (Default: using info.version or \"1.0.0\")")); cliOptions.add(new CliOption(PROJECT_LICENSE_NAME, @@ -111,7 +116,25 @@ public class JavascriptClientCodegen extends DefaultCodegen implements CodegenCo @Override public void processOpts() { super.processOpts(); + + typeMapping = new HashMap(); typeMapping.put("array", "Array"); + typeMapping.put("List", "Array"); + typeMapping.put("map", "Object"); + typeMapping.put("object", "Object"); + typeMapping.put("boolean", "Boolean"); + typeMapping.put("char", "String"); + typeMapping.put("string", "String"); + typeMapping.put("short", "Integer"); + typeMapping.put("int", "Integer"); + typeMapping.put("integer", "Integer"); + typeMapping.put("long", "Integer"); + typeMapping.put("float", "Number"); + typeMapping.put("double", "Number"); + typeMapping.put("number", "Number"); + typeMapping.put("DateTime", "Date"); + + importMapping.clear(); } @Override @@ -121,12 +144,21 @@ public class JavascriptClientCodegen extends DefaultCodegen implements CodegenCo if (additionalProperties.containsKey(PROJECT_NAME)) { projectName = ((String) additionalProperties.get(PROJECT_NAME)); } + if (additionalProperties.containsKey(MODULE_NAME)) { + moduleName = ((String) additionalProperties.get(MODULE_NAME)); + } if (additionalProperties.containsKey(PROJECT_DESCRIPTION)) { projectDescription = ((String) additionalProperties.get(PROJECT_DESCRIPTION)); } if (additionalProperties.containsKey(PROJECT_VERSION)) { projectVersion = ((String) additionalProperties.get(PROJECT_VERSION)); } + if (additionalProperties.containsKey(CodegenConstants.LOCAL_VARIABLE_PREFIX)) { + localVariablePrefix = (String) additionalProperties.get(CodegenConstants.LOCAL_VARIABLE_PREFIX); + } + if (additionalProperties.containsKey(CodegenConstants.SOURCE_FOLDER)) { + sourceFolder = (String) additionalProperties.get(CodegenConstants.SOURCE_FOLDER); + } if (swagger.getInfo() != null) { Info info = swagger.getInfo(); @@ -154,6 +186,9 @@ public class JavascriptClientCodegen extends DefaultCodegen implements CodegenCo if (projectName == null) { projectName = "swagger-js-client"; } + if (moduleName == null) { + moduleName = camelize(underscore(projectName)); + } if (projectVersion == null) { projectVersion = "1.0.0"; } @@ -162,8 +197,14 @@ public class JavascriptClientCodegen extends DefaultCodegen implements CodegenCo } additionalProperties.put(PROJECT_NAME, projectName); + additionalProperties.put(MODULE_NAME, moduleName); additionalProperties.put(PROJECT_DESCRIPTION, escapeText(projectDescription)); additionalProperties.put(PROJECT_VERSION, projectVersion); + additionalProperties.put(CodegenConstants.LOCAL_VARIABLE_PREFIX, localVariablePrefix); + additionalProperties.put(CodegenConstants.SOURCE_FOLDER, sourceFolder); + + supportingFiles.add(new SupportingFile("package.mustache", "", "package.json")); + supportingFiles.add(new SupportingFile("index.mustache", sourceFolder, "index.js")); } @Override @@ -233,6 +274,16 @@ public class JavascriptClientCodegen extends DefaultCodegen implements CodegenCo return toModelName(name); } + @Override + public String toModelImport(String name) { + return name; + } + + @Override + public String toApiImport(String name) { + return name; + } + @Override public String getTypeDeclaration(Property p) { if (p instanceof ArrayProperty) { @@ -263,8 +314,8 @@ public class JavascriptClientCodegen extends DefaultCodegen implements CodegenCo // added for Javascript } else if (p instanceof RefProperty) { - RefProperty rp = (RefProperty)p; - return "new " +rp.getSimpleRef() + "()"; + RefProperty rp = (RefProperty)p; + return "new " +rp.getSimpleRef() + "()"; } return super.toDefaultValue(p); @@ -283,8 +334,8 @@ public class JavascriptClientCodegen extends DefaultCodegen implements CodegenCo // added for Javascript } else if (p instanceof RefProperty) { - RefProperty rp = (RefProperty)p; - return ".constructFromObject(data." + name + ");"; + RefProperty rp = (RefProperty)p; + return ".constructFromObject(data." + name + ");"; } return super.toDefaultValueWithParam(name, p); @@ -297,7 +348,7 @@ public class JavascriptClientCodegen extends DefaultCodegen implements CodegenCo String type = null; if (typeMapping.containsKey(swaggerType)) { type = typeMapping.get(swaggerType); - if (languageSpecificPrimitives.contains(type) || type.indexOf(".") >= 0) { + if (!needToImport(type)) { return type; } } else { @@ -408,7 +459,8 @@ public class JavascriptClientCodegen extends DefaultCodegen implements CodegenCo } protected boolean needToImport(String type) { - return super.needToImport(type) && type.indexOf(".") < 0; + return !defaultIncludes.contains(type) + && !languageSpecificPrimitives.contains(type); } private String findCommonPrefixOfVars(List vars) { @@ -475,14 +527,6 @@ public class JavascriptClientCodegen extends DefaultCodegen implements CodegenCo return codegenModel; } - public void setSourceFolder(String sourceFolder) { - this.sourceFolder = sourceFolder; - } - - public void setLocalVariablePrefix(String localVariablePrefix) { - this.localVariablePrefix = localVariablePrefix; - } - private String sanitizePackageName(String packageName) { packageName = packageName.trim(); packageName = packageName.replaceAll("[^a-zA-Z0-9_\\.]", "_"); diff --git a/modules/swagger-codegen/src/main/resources/Javascript/api.mustache b/modules/swagger-codegen/src/main/resources/Javascript/api.mustache index dd115aaa45c..cce87ee2f7b 100644 --- a/modules/swagger-codegen/src/main/resources/Javascript/api.mustache +++ b/modules/swagger-codegen/src/main/resources/Javascript/api.mustache @@ -1,6 +1,14 @@ -//export module +// require files in Node.js environment +{{#imports}} +var {{import}};{{/imports}} +if (typeof module === 'object' && module.exports) { + {{#imports}} + {{import}} = require('./{{import}}.js');{{/imports}} +} + +// export module for AMD if ( typeof define === "function" && define.amd ) { - define(['jquery'], function($) { + define(['jquery'{{#imports}}, '{{import}}'{{/imports}}], function(${{#imports}}, {{import}}{{/imports}}) { return {{classname}}; }); } @@ -124,3 +132,8 @@ var {{classname}} = function {{classname}}() { return queryString; } } + +// export module for Node.js +if (typeof module === 'object' && module.exports) { + module.exports = {{classname}}; +} \ No newline at end of file diff --git a/modules/swagger-codegen/src/main/resources/Javascript/index.mustache b/modules/swagger-codegen/src/main/resources/Javascript/index.mustache new file mode 100644 index 00000000000..a0207a6cc91 --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/Javascript/index.mustache @@ -0,0 +1,10 @@ +if (typeof module === 'object' && module.exports) { + var {{moduleName}} = {}; + {{#models}} + {{moduleName}}.{{importPath}} = require('./model/{{importPath}}.js'); + {{/models}} + {{#apiInfo}}{{#apis}} + {{moduleName}}.{{importPath}} = require('./api/{{importPath}}.js'); + {{/apis}}{{/apiInfo}} + module.exports = {{moduleName}}; +} \ No newline at end of file diff --git a/modules/swagger-codegen/src/main/resources/Javascript/model.mustache b/modules/swagger-codegen/src/main/resources/Javascript/model.mustache index acf0bcffc19..8b021a3badd 100644 --- a/modules/swagger-codegen/src/main/resources/Javascript/model.mustache +++ b/modules/swagger-codegen/src/main/resources/Javascript/model.mustache @@ -1,10 +1,18 @@ +// require files in Node.js environment +{{#imports}} +var {{import}};{{/imports}} +if (typeof module === 'object' && module.exports) { + {{#imports}} + {{import}} = require('./{{import}}.js');{{/imports}} +} + {{#models}}{{#model}} {{#vars}}{{#isEnum}}{{>enumClass}}{{/isEnum}}{{#items.isEnum}}{{#items}} {{>enumClass}}{{/items}}*/{{/items.isEnum}}{{/vars}} //export module -if ( typeof define === "function" && define.amd ) { - define('{{classname}}', ['jquery'{{#vars}}{{^isPrimitiveType}}{{^-last}}, {{/-last}}'{{datatypeWithEnum}}'{{/isPrimitiveType}}{{/vars}}], +if ( typeof define === "function" && define.amd ) { + define('{{classname}}', ['jquery'{{#vars}}{{^isPrimitiveType}}{{^-last}}, {{/-last}}'{{datatypeWithEnum}}'{{/isPrimitiveType}}{{/vars}}], function(${{#vars}}{{^isPrimitiveType}}{{^-last}}, {{/-last}}{{datatypeWithEnum}}{{/isPrimitiveType}}{{/vars}}) { return {{classname}}; }); @@ -56,5 +64,9 @@ var {{classname}} = function {{classname}}({{#mandatory}}{{this}}{{^-last}}, {{/ return JSON.stringify(self); } } + +if (typeof module === 'object' && module.exports) { + module.exports = {{classname}}; +} {{/model}} {{/models}} diff --git a/modules/swagger-codegen/src/main/resources/Javascript/package.mustache b/modules/swagger-codegen/src/main/resources/Javascript/package.mustache index 7c9d45a3e6d..d39136cafdd 100644 --- a/modules/swagger-codegen/src/main/resources/Javascript/package.mustache +++ b/modules/swagger-codegen/src/main/resources/Javascript/package.mustache @@ -3,7 +3,7 @@ "version": "{{{projectVersion}}}", "description": "{{{projectDescription}}}",{{#projectLicenseName}} "license": "{{{projectLicenseName}}}",{{/projectLicenseName}} - "main": "index.js", + "main": "{{sourceFolder}}/index.js", "scripts": { "test": "echo \"Error: no test specified\" && exit 1" }, diff --git a/samples/client/petstore/javascript/package.json b/samples/client/petstore/javascript/package.json new file mode 100644 index 00000000000..926778d3015 --- /dev/null +++ b/samples/client/petstore/javascript/package.json @@ -0,0 +1,13 @@ +{ + "name": "swagger-petstore", + "version": "1.0.0", + "description": "This is a sample server Petstore server. You can find out more about Swagger at http://swagger.io or on irc.freenode.net, #swagger. For this sample, you can use the api key \"special-key\" to test the authorization filters", + "license": "Apache 2.0", + "main": "src/index.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "dependencies": { + "jquery": "^2.1.4" + } +} diff --git a/samples/client/petstore/javascript/src/scripts/rest/api/PetApi.js b/samples/client/petstore/javascript/src/api/PetApi.js similarity index 96% rename from samples/client/petstore/javascript/src/scripts/rest/api/PetApi.js rename to samples/client/petstore/javascript/src/api/PetApi.js index 5b4f6523413..58ee6a1c9f7 100644 --- a/samples/client/petstore/javascript/src/scripts/rest/api/PetApi.js +++ b/samples/client/petstore/javascript/src/api/PetApi.js @@ -1,6 +1,13 @@ -//export module +// require files in Node.js environment +var Pet; +if (typeof module === 'object' && module.exports) { + + Pet = require('./Pet.js'); +} + +// export module for AMD if ( typeof define === "function" && define.amd ) { - define(['jquery'], function($) { + define(['jquery', 'Pet'], function($, Pet) { return PetApi; }); } @@ -243,7 +250,7 @@ var PetApi = function PetApi() { /** * Find pet by ID * Returns a pet when ID < 10. ID > 10 or nonintegers will simulate API error conditions - * @param {Long} petId ID of pet that needs to be fetched + * @param {Integer} petId ID of pet that needs to be fetched * @param {function} callback the callback function * @return Pet */ @@ -379,7 +386,7 @@ var PetApi = function PetApi() { /** * Deletes a pet * - * @param {Long} petId Pet id to delete + * @param {Integer} petId Pet id to delete * @param {String} apiKey * @param {function} callback the callback function * @return void @@ -437,7 +444,7 @@ var PetApi = function PetApi() { /** * uploads an image * - * @param {Long} petId ID of pet to update + * @param {Integer} petId ID of pet to update * @param {String} additionalMetadata Additional data to pass to server * @param {File} file file to upload * @param {function} callback the callback function @@ -522,3 +529,8 @@ var PetApi = function PetApi() { return queryString; } } + +// export module for Node.js +if (typeof module === 'object' && module.exports) { + module.exports = PetApi; +} \ No newline at end of file diff --git a/samples/client/petstore/javascript/src/scripts/rest/api/StoreApi.js b/samples/client/petstore/javascript/src/api/StoreApi.js similarity index 93% rename from samples/client/petstore/javascript/src/scripts/rest/api/StoreApi.js rename to samples/client/petstore/javascript/src/api/StoreApi.js index e27494c7924..4cc55ae6cc1 100644 --- a/samples/client/petstore/javascript/src/scripts/rest/api/StoreApi.js +++ b/samples/client/petstore/javascript/src/api/StoreApi.js @@ -1,6 +1,13 @@ -//export module +// require files in Node.js environment +var Order; +if (typeof module === 'object' && module.exports) { + + Order = require('./Order.js'); +} + +// export module for AMD if ( typeof define === "function" && define.amd ) { - define(['jquery'], function($) { + define(['jquery', 'Order'], function($, Order) { return StoreApi; }); } @@ -12,7 +19,7 @@ var StoreApi = function StoreApi() { * Returns pet inventories by status * Returns a map of status codes to quantities * @param {function} callback the callback function - * @return Map + * @return Object */ self.getInventory = function(callback) { @@ -47,7 +54,7 @@ var StoreApi = function StoreApi() { - //TypeRef returnType = new TypeRef>() {}; + //TypeRef returnType = new TypeRef>() {}; //return apiClient.invokeAPI(path, "GET", queryParams, postBody, postBinaryBody, headerParams, formParams, accept, contentType, authNames, returnType); var options = {type: "GET", async: true, contentType: "application/json", dataType: "json", data: postBody}; @@ -59,11 +66,10 @@ var StoreApi = function StoreApi() { request.done(function(response, textStatus, jqXHR){ /** - * @returns Map + * @returns Object */ + var myResponse = response; - var myResponse = new Map(); - myResponse.constructFromObject(response); callback(myResponse, textStatus, jqXHR); }); @@ -298,3 +304,8 @@ var StoreApi = function StoreApi() { return queryString; } } + +// export module for Node.js +if (typeof module === 'object' && module.exports) { + module.exports = StoreApi; +} \ No newline at end of file diff --git a/samples/client/petstore/javascript/src/scripts/rest/api/UserApi.js b/samples/client/petstore/javascript/src/api/UserApi.js similarity index 97% rename from samples/client/petstore/javascript/src/scripts/rest/api/UserApi.js rename to samples/client/petstore/javascript/src/api/UserApi.js index ecd9707fa91..49883023ae7 100644 --- a/samples/client/petstore/javascript/src/scripts/rest/api/UserApi.js +++ b/samples/client/petstore/javascript/src/api/UserApi.js @@ -1,6 +1,13 @@ -//export module +// require files in Node.js environment +var User; +if (typeof module === 'object' && module.exports) { + + User = require('./User.js'); +} + +// export module for AMD if ( typeof define === "function" && define.amd ) { - define(['jquery'], function($) { + define(['jquery', 'User'], function($, User) { return UserApi; }); } @@ -479,3 +486,8 @@ var UserApi = function UserApi() { return queryString; } } + +// export module for Node.js +if (typeof module === 'object' && module.exports) { + module.exports = UserApi; +} \ No newline at end of file diff --git a/samples/client/petstore/javascript/src/index.js b/samples/client/petstore/javascript/src/index.js new file mode 100644 index 00000000000..f34b7e01432 --- /dev/null +++ b/samples/client/petstore/javascript/src/index.js @@ -0,0 +1,22 @@ +if (typeof module === 'object' && module.exports) { + var SwaggerPetstore = {}; + + SwaggerPetstore.User = require('./model/User.js'); + + SwaggerPetstore.Category = require('./model/Category.js'); + + SwaggerPetstore.Pet = require('./model/Pet.js'); + + SwaggerPetstore.Tag = require('./model/Tag.js'); + + SwaggerPetstore.Order = require('./model/Order.js'); + + + SwaggerPetstore.User = require('./api/User.js'); + + SwaggerPetstore.Store = require('./api/Store.js'); + + SwaggerPetstore.Pet = require('./api/Pet.js'); + + module.exports = SwaggerPetstore; +} \ No newline at end of file diff --git a/samples/client/petstore/javascript/src/scripts/rest/model/Category.js b/samples/client/petstore/javascript/src/model/Category.js similarity index 69% rename from samples/client/petstore/javascript/src/scripts/rest/model/Category.js rename to samples/client/petstore/javascript/src/model/Category.js index aec80bf3635..a87f91354a8 100644 --- a/samples/client/petstore/javascript/src/scripts/rest/model/Category.js +++ b/samples/client/petstore/javascript/src/model/Category.js @@ -1,9 +1,15 @@ +// require files in Node.js environment + +if (typeof module === 'object' && module.exports) { + +} + //export module -if ( typeof define === "function" && define.amd ) { - define('Category', ['jquery'], +if ( typeof define === "function" && define.amd ) { + define('Category', ['jquery'], function($) { return Category; }); @@ -14,7 +20,7 @@ var Category = function Category() { var self = this; /** - * datatype: Long + * datatype: Integer **/ self.id = null; @@ -34,14 +40,14 @@ var Category = function Category() { /** - * @return {Long} + * @return {Integer} **/ self.getId = function() { return self.id; } /** - * @param {Long} id + * @param {Integer} id **/ self.setId = function (id) { self.id = id; @@ -66,3 +72,7 @@ var Category = function Category() { return JSON.stringify(self); } } + +if (typeof module === 'object' && module.exports) { + module.exports = Category; +} diff --git a/samples/client/petstore/javascript/src/scripts/rest/model/Order.js b/samples/client/petstore/javascript/src/model/Order.js similarity index 85% rename from samples/client/petstore/javascript/src/scripts/rest/model/Order.js rename to samples/client/petstore/javascript/src/model/Order.js index 73618cef888..61120e577d6 100644 --- a/samples/client/petstore/javascript/src/scripts/rest/model/Order.js +++ b/samples/client/petstore/javascript/src/model/Order.js @@ -1,3 +1,9 @@ +// require files in Node.js environment + +if (typeof module === 'object' && module.exports) { + +} + //export module @@ -30,9 +36,9 @@ var StatusEnum = function StatusEnum() { //export module -if ( typeof define === "function" && define.amd ) { - define('Order', ['jquery', 'Date'], - function($, Date) { +if ( typeof define === "function" && define.amd ) { + define('Order', ['jquery'], + function($) { return Order; }); } @@ -42,12 +48,12 @@ var Order = function Order() { var self = this; /** - * datatype: Long + * datatype: Integer **/ self.id = null; /** - * datatype: Long + * datatype: Integer **/ self.petId = null; @@ -91,28 +97,28 @@ var Order = function Order() { /** - * @return {Long} + * @return {Integer} **/ self.getId = function() { return self.id; } /** - * @param {Long} id + * @param {Integer} id **/ self.setId = function (id) { self.id = id; } /** - * @return {Long} + * @return {Integer} **/ self.getPetId = function() { return self.petId; } /** - * @param {Long} petId + * @param {Integer} petId **/ self.setPetId = function (petId) { self.petId = petId; @@ -181,3 +187,7 @@ var Order = function Order() { return JSON.stringify(self); } } + +if (typeof module === 'object' && module.exports) { + module.exports = Order; +} diff --git a/samples/client/petstore/javascript/src/scripts/rest/model/Pet.js b/samples/client/petstore/javascript/src/model/Pet.js similarity index 85% rename from samples/client/petstore/javascript/src/scripts/rest/model/Pet.js rename to samples/client/petstore/javascript/src/model/Pet.js index 25985733450..7a25a1d5fdd 100644 --- a/samples/client/petstore/javascript/src/scripts/rest/model/Pet.js +++ b/samples/client/petstore/javascript/src/model/Pet.js @@ -1,3 +1,11 @@ +// require files in Node.js environment +var Category;var Tag; +if (typeof module === 'object' && module.exports) { + + Category = require('./Category.js'); + Tag = require('./Tag.js'); +} + //export module @@ -30,8 +38,8 @@ var StatusEnum = function StatusEnum() { //export module -if ( typeof define === "function" && define.amd ) { - define('Pet', ['jquery', 'Category', 'Array'], +if ( typeof define === "function" && define.amd ) { + define('Pet', ['jquery', 'Category', 'Array'], function($, Category, Array) { return Pet; }); @@ -42,7 +50,7 @@ var Pet = function Pet(photoUrls, name) { var self = this; /** - * datatype: Long + * datatype: Integer **/ self.id = null; @@ -93,14 +101,14 @@ var Pet = function Pet(photoUrls, name) { /** - * @return {Long} + * @return {Integer} **/ self.getId = function() { return self.id; } /** - * @param {Long} id + * @param {Integer} id **/ self.setId = function (id) { self.id = id; @@ -183,3 +191,7 @@ var Pet = function Pet(photoUrls, name) { return JSON.stringify(self); } } + +if (typeof module === 'object' && module.exports) { + module.exports = Pet; +} diff --git a/samples/client/petstore/javascript/src/scripts/rest/model/Tag.js b/samples/client/petstore/javascript/src/model/Tag.js similarity index 69% rename from samples/client/petstore/javascript/src/scripts/rest/model/Tag.js rename to samples/client/petstore/javascript/src/model/Tag.js index 07994ec3dc9..4801da71e41 100644 --- a/samples/client/petstore/javascript/src/scripts/rest/model/Tag.js +++ b/samples/client/petstore/javascript/src/model/Tag.js @@ -1,9 +1,15 @@ +// require files in Node.js environment + +if (typeof module === 'object' && module.exports) { + +} + //export module -if ( typeof define === "function" && define.amd ) { - define('Tag', ['jquery'], +if ( typeof define === "function" && define.amd ) { + define('Tag', ['jquery'], function($) { return Tag; }); @@ -14,7 +20,7 @@ var Tag = function Tag() { var self = this; /** - * datatype: Long + * datatype: Integer **/ self.id = null; @@ -34,14 +40,14 @@ var Tag = function Tag() { /** - * @return {Long} + * @return {Integer} **/ self.getId = function() { return self.id; } /** - * @param {Long} id + * @param {Integer} id **/ self.setId = function (id) { self.id = id; @@ -66,3 +72,7 @@ var Tag = function Tag() { return JSON.stringify(self); } } + +if (typeof module === 'object' && module.exports) { + module.exports = Tag; +} diff --git a/samples/client/petstore/javascript/src/scripts/rest/model/User.js b/samples/client/petstore/javascript/src/model/User.js similarity index 89% rename from samples/client/petstore/javascript/src/scripts/rest/model/User.js rename to samples/client/petstore/javascript/src/model/User.js index 19afab44ee6..6d32676a921 100644 --- a/samples/client/petstore/javascript/src/scripts/rest/model/User.js +++ b/samples/client/petstore/javascript/src/model/User.js @@ -1,9 +1,15 @@ +// require files in Node.js environment + +if (typeof module === 'object' && module.exports) { + +} + //export module -if ( typeof define === "function" && define.amd ) { - define('User', ['jquery'], +if ( typeof define === "function" && define.amd ) { + define('User', ['jquery'], function($) { return User; }); @@ -14,7 +20,7 @@ var User = function User() { var self = this; /** - * datatype: Long + * datatype: Integer **/ self.id = null; @@ -77,14 +83,14 @@ var User = function User() { /** - * @return {Long} + * @return {Integer} **/ self.getId = function() { return self.id; } /** - * @param {Long} id + * @param {Integer} id **/ self.setId = function (id) { self.id = id; @@ -195,3 +201,7 @@ var User = function User() { return JSON.stringify(self); } } + +if (typeof module === 'object' && module.exports) { + module.exports = User; +} From cc408a0dd7164a61529653585a5c251d4f44317a Mon Sep 17 00:00:00 2001 From: xhh Date: Thu, 17 Dec 2015 00:32:50 +0800 Subject: [PATCH 196/211] Add unit tests to Javascript Petstore sample --- .../languages/JavascriptClientCodegen.java | 2 +- .../main/resources/Javascript/api.mustache | 7 +++--- .../resources/Javascript/package.mustache | 7 +++++- .../client/petstore/javascript/package.json | 7 +++++- .../petstore/javascript/src/api/PetApi.js | 6 ++--- .../petstore/javascript/src/api/StoreApi.js | 6 ++--- .../petstore/javascript/src/api/UserApi.js | 6 ++--- .../client/petstore/javascript/src/index.js | 6 ++--- .../client/petstore/javascript/test/test.js | 22 +++++++++++++++++++ 9 files changed, 50 insertions(+), 19 deletions(-) create mode 100644 samples/client/petstore/javascript/test/test.js diff --git a/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/JavascriptClientCodegen.java b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/JavascriptClientCodegen.java index 62bc42bf21d..55b847668c0 100644 --- a/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/JavascriptClientCodegen.java +++ b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/JavascriptClientCodegen.java @@ -281,7 +281,7 @@ public class JavascriptClientCodegen extends DefaultCodegen implements CodegenCo @Override public String toApiImport(String name) { - return name; + return toApiName(name); } @Override diff --git a/modules/swagger-codegen/src/main/resources/Javascript/api.mustache b/modules/swagger-codegen/src/main/resources/Javascript/api.mustache index cce87ee2f7b..2a0c74ce560 100644 --- a/modules/swagger-codegen/src/main/resources/Javascript/api.mustache +++ b/modules/swagger-codegen/src/main/resources/Javascript/api.mustache @@ -1,9 +1,8 @@ // require files in Node.js environment -{{#imports}} -var {{import}};{{/imports}} +var ${{#imports}}, {{import}}{{/imports}}; if (typeof module === 'object' && module.exports) { - {{#imports}} - {{import}} = require('./{{import}}.js');{{/imports}} + $ = require('jquery');{{#imports}} + {{import}} = require('../model/{{import}}.js');{{/imports}} } // export module for AMD diff --git a/modules/swagger-codegen/src/main/resources/Javascript/package.mustache b/modules/swagger-codegen/src/main/resources/Javascript/package.mustache index d39136cafdd..85603bd364b 100644 --- a/modules/swagger-codegen/src/main/resources/Javascript/package.mustache +++ b/modules/swagger-codegen/src/main/resources/Javascript/package.mustache @@ -5,9 +5,14 @@ "license": "{{{projectLicenseName}}}",{{/projectLicenseName}} "main": "{{sourceFolder}}/index.js", "scripts": { - "test": "echo \"Error: no test specified\" && exit 1" + "test": "./node_modules/mocha/bin/mocha" }, "dependencies": { "jquery": "^2.1.4" + }, + "devDependencies": { + "mocha": "^2.3.4", + "mockrequire": "0.0.5", + "najax": "0.3.1" } } diff --git a/samples/client/petstore/javascript/package.json b/samples/client/petstore/javascript/package.json index 926778d3015..c5f1afde698 100644 --- a/samples/client/petstore/javascript/package.json +++ b/samples/client/petstore/javascript/package.json @@ -5,9 +5,14 @@ "license": "Apache 2.0", "main": "src/index.js", "scripts": { - "test": "echo \"Error: no test specified\" && exit 1" + "test": "./node_modules/mocha/bin/mocha" }, "dependencies": { "jquery": "^2.1.4" + }, + "devDependencies": { + "mocha": "^2.3.4", + "mockrequire": "0.0.5", + "najax": "0.3.1" } } diff --git a/samples/client/petstore/javascript/src/api/PetApi.js b/samples/client/petstore/javascript/src/api/PetApi.js index 58ee6a1c9f7..d9e10256b1c 100644 --- a/samples/client/petstore/javascript/src/api/PetApi.js +++ b/samples/client/petstore/javascript/src/api/PetApi.js @@ -1,8 +1,8 @@ // require files in Node.js environment -var Pet; +var $, Pet; if (typeof module === 'object' && module.exports) { - - Pet = require('./Pet.js'); + $ = require('jquery'); + Pet = require('../model/Pet.js'); } // export module for AMD diff --git a/samples/client/petstore/javascript/src/api/StoreApi.js b/samples/client/petstore/javascript/src/api/StoreApi.js index 4cc55ae6cc1..7a20d8841a3 100644 --- a/samples/client/petstore/javascript/src/api/StoreApi.js +++ b/samples/client/petstore/javascript/src/api/StoreApi.js @@ -1,8 +1,8 @@ // require files in Node.js environment -var Order; +var $, Order; if (typeof module === 'object' && module.exports) { - - Order = require('./Order.js'); + $ = require('jquery'); + Order = require('../model/Order.js'); } // export module for AMD diff --git a/samples/client/petstore/javascript/src/api/UserApi.js b/samples/client/petstore/javascript/src/api/UserApi.js index 49883023ae7..72dc3f3d198 100644 --- a/samples/client/petstore/javascript/src/api/UserApi.js +++ b/samples/client/petstore/javascript/src/api/UserApi.js @@ -1,8 +1,8 @@ // require files in Node.js environment -var User; +var $, User; if (typeof module === 'object' && module.exports) { - - User = require('./User.js'); + $ = require('jquery'); + User = require('../model/User.js'); } // export module for AMD diff --git a/samples/client/petstore/javascript/src/index.js b/samples/client/petstore/javascript/src/index.js index f34b7e01432..b772f6024dc 100644 --- a/samples/client/petstore/javascript/src/index.js +++ b/samples/client/petstore/javascript/src/index.js @@ -12,11 +12,11 @@ if (typeof module === 'object' && module.exports) { SwaggerPetstore.Order = require('./model/Order.js'); - SwaggerPetstore.User = require('./api/User.js'); + SwaggerPetstore.UserApi = require('./api/UserApi.js'); - SwaggerPetstore.Store = require('./api/Store.js'); + SwaggerPetstore.StoreApi = require('./api/StoreApi.js'); - SwaggerPetstore.Pet = require('./api/Pet.js'); + SwaggerPetstore.PetApi = require('./api/PetApi.js'); module.exports = SwaggerPetstore; } \ No newline at end of file diff --git a/samples/client/petstore/javascript/test/test.js b/samples/client/petstore/javascript/test/test.js new file mode 100644 index 00000000000..c7d84917f8a --- /dev/null +++ b/samples/client/petstore/javascript/test/test.js @@ -0,0 +1,22 @@ +var assert = require('assert'); +var mockrequire = require('mockrequire'); +var najax = require('najax'); + +var PetApi = mockrequire('../src/api/PetApi', { + 'jquery': { + 'ajax': najax + } +}); + +describe('PetApi', function() { + describe('#getPetById', function () { + it('should work', function (done) { + var api = new PetApi(); + api.getPetById(1, function(pet, textStatus, jqXHR) { + assert.equal('success', textStatus); + assert.equal(1, pet.id); + done(); + }); + }); + }); +}); From 5a1c6e6c17bcbfc72abad3856401cdbb17dfde9b Mon Sep 17 00:00:00 2001 From: Tomek Cejner Date: Wed, 16 Dec 2015 21:55:31 +0100 Subject: [PATCH 197/211] Updated samples, and cartfile --- .../swagger-codegen/src/main/resources/swift/Cartfile.mustache | 2 +- samples/client/petstore/swift/Cartfile | 2 +- samples/client/petstore/swift/PetstoreClient.podspec | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/modules/swagger-codegen/src/main/resources/swift/Cartfile.mustache b/modules/swagger-codegen/src/main/resources/swift/Cartfile.mustache index c27fd0c14d1..a0906ba5969 100644 --- a/modules/swagger-codegen/src/main/resources/swift/Cartfile.mustache +++ b/modules/swagger-codegen/src/main/resources/swift/Cartfile.mustache @@ -1,2 +1,2 @@ -github "Alamofire/Alamofire" >= 3.0.0{{#usePromiseKit}} +github "Alamofire/Alamofire" >= 3.1.0{{#usePromiseKit}} github "mxcl/PromiseKit" >=1.5.3{{/usePromiseKit}} diff --git a/samples/client/petstore/swift/Cartfile b/samples/client/petstore/swift/Cartfile index 745e00376a8..5e4bd352eef 100644 --- a/samples/client/petstore/swift/Cartfile +++ b/samples/client/petstore/swift/Cartfile @@ -1,2 +1,2 @@ -github "Alamofire/Alamofire" >= 3.0.0 +github "Alamofire/Alamofire" >= 3.1.0 github "mxcl/PromiseKit" >=1.5.3 diff --git a/samples/client/petstore/swift/PetstoreClient.podspec b/samples/client/petstore/swift/PetstoreClient.podspec index 3caf12083de..ed41db4bfb1 100644 --- a/samples/client/petstore/swift/PetstoreClient.podspec +++ b/samples/client/petstore/swift/PetstoreClient.podspec @@ -7,5 +7,5 @@ Pod::Spec.new do |s| s.license = 'Apache License, Version 2.0' s.source_files = 'PetstoreClient/Classes/Swaggers/**/*.swift' s.dependency 'PromiseKit', '~> 2.1' - s.dependency 'Alamofire', '~> 3.0.0' + s.dependency 'Alamofire', '~> 3.1.0' end From 5f13484157ef0da835252dea8d1c750dcfc6830b Mon Sep 17 00:00:00 2001 From: hacki11 Date: Thu, 17 Dec 2015 00:14:21 +0100 Subject: [PATCH 198/211] - add downloadImage to Petstore - fixed equal instead of ':' after Content-Disposition - added definition of file (swagger-maven-plugin generates them) --- .../main/resources/csharp/ApiClient.mustache | 2 +- .../src/test/resources/2_0/petstore.json | 76 ++++++++ .../src/main/csharp/IO/Swagger/Api/PetApi.cs | 162 ++++++++++++++++++ .../main/csharp/IO/Swagger/Api/StoreApi.cs | 1 + .../src/main/csharp/IO/Swagger/Api/UserApi.cs | 1 + .../csharp/IO/Swagger/Client/ApiClient.cs | 24 +-- .../csharp/IO/Swagger/Client/Configuration.cs | 27 ++- .../main/csharp/IO/Swagger/Model/Category.cs | 4 + .../src/main/csharp/IO/Swagger/Model/Order.cs | 4 + .../src/main/csharp/IO/Swagger/Model/Pet.cs | 4 + .../src/main/csharp/IO/Swagger/Model/Tag.cs | 4 + .../src/main/csharp/IO/Swagger/Model/User.cs | 4 + 12 files changed, 287 insertions(+), 26 deletions(-) diff --git a/modules/swagger-codegen/src/main/resources/csharp/ApiClient.mustache b/modules/swagger-codegen/src/main/resources/csharp/ApiClient.mustache index 1b49d9b5347..142b2e6bbb9 100644 --- a/modules/swagger-codegen/src/main/resources/csharp/ApiClient.mustache +++ b/modules/swagger-codegen/src/main/resources/csharp/ApiClient.mustache @@ -232,7 +232,7 @@ namespace {{packageName}}.Client var filePath = String.IsNullOrEmpty(Configuration.TempFolderPath) ? Path.GetTempPath() : Configuration.TempFolderPath; - var regex = new Regex(@"Content-Disposition:.*filename=['""]?([^'""\s]+)['""]?$"); + var regex = new Regex(@"Content-Disposition=.*filename=['""]?([^'""\s]+)['""]?$"); foreach (var header in headers) { var match = regex.Match(header.ToString()); diff --git a/modules/swagger-codegen/src/test/resources/2_0/petstore.json b/modules/swagger-codegen/src/test/resources/2_0/petstore.json index 66762d74b2b..ad9cbead5e9 100644 --- a/modules/swagger-codegen/src/test/resources/2_0/petstore.json +++ b/modules/swagger-codegen/src/test/resources/2_0/petstore.json @@ -402,6 +402,23 @@ ] } }, + "/pet/{petId}/downloadImage" : { + "get" : { + "tags" : [ "pet" ], + "summary" : "downloads an image", + "description" : "", + "operationId" : "downloadFile", + "produces" : [ "application/octet-stream" ], + "responses" : { + "200" : { + "description" : "successful operation", + "schema" : { + "$ref" : "#/definitions/File" + } + } + } + } + }, "/store/inventory": { "get": { "tags": [ @@ -972,6 +989,65 @@ "xml": { "name": "Order" } + }, + "definitions" : { + "File": { + "type": "object", + "properties": { + "path": { + "type": "string" + }, + "name": { + "type": "string" + }, + "canonicalPath": { + "type": "string" + }, + "parent": { + "type": "string" + }, + "absolute": { + "type": "boolean", + "default": false + }, + "absoluteFile": { + "$ref": "#/definitions/File" + }, + "absolutePath": { + "type": "string" + }, + "canonicalFile": { + "$ref": "#/definitions/File" + }, + "freeSpace": { + "type": "integer", + "format": "int64" + }, + "parentFile": { + "$ref": "#/definitions/File" + }, + "totalSpace": { + "type": "integer", + "format": "int64" + }, + "usableSpace": { + "type": "integer", + "format": "int64" + }, + "directory": { + "type": "boolean", + "default": false + }, + "file": { + "type": "boolean", + "default": false + }, + "hidden": { + "type": "boolean", + "default": false + } + } + } } } } diff --git a/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Api/PetApi.cs b/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Api/PetApi.cs index ba58eeac9e0..4537144f930 100644 --- a/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Api/PetApi.cs +++ b/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Api/PetApi.cs @@ -6,6 +6,7 @@ using RestSharp; using IO.Swagger.Client; using IO.Swagger.Model; + namespace IO.Swagger.Api { @@ -307,6 +308,42 @@ namespace IO.Swagger.Api /// Task of ApiResponse System.Threading.Tasks.Task> DeletePetAsyncWithHttpInfo (long? petId, string apiKey = null); + /// + /// downloads an image + /// + /// + /// + /// + /// Stream + Stream DownloadFile (); + + /// + /// downloads an image + /// + /// + /// + /// + /// ApiResponse of Stream + ApiResponse DownloadFileWithHttpInfo (); + + /// + /// downloads an image + /// + /// + /// + /// + /// Task of Stream + System.Threading.Tasks.Task DownloadFileAsync (); + + /// + /// downloads an image + /// + /// + /// + /// + /// Task of ApiResponse (Stream) + System.Threading.Tasks.Task> DownloadFileAsyncWithHttpInfo (); + /// /// uploads an image /// @@ -1487,6 +1524,131 @@ namespace IO.Swagger.Api null); } + /// + /// downloads an image + /// + /// Stream + public Stream DownloadFile () + { + ApiResponse response = DownloadFileWithHttpInfo(); + return response.Data; + } + + /// + /// downloads an image + /// + /// ApiResponse of Stream + public ApiResponse< Stream > DownloadFileWithHttpInfo () + { + + + var path_ = "/pet/{petId}/downloadImage"; + + var pathParams = new Dictionary(); + var queryParams = new Dictionary(); + var headerParams = new Dictionary(Configuration.DefaultHeader); + var formParams = new Dictionary(); + var fileParams = new Dictionary(); + String postBody = null; + + // to determine the Accept header + String[] http_header_accepts = new String[] { + "application/octet-stream" + }; + String http_header_accept = Configuration.ApiClient.SelectHeaderAccept(http_header_accepts); + if (http_header_accept != null) + headerParams.Add("Accept", Configuration.ApiClient.SelectHeaderAccept(http_header_accepts)); + + // set "format" to json by default + // e.g. /pet/{petId}.{format} becomes /pet/{petId}.json + pathParams.Add("format", "json"); + + + + + + + + + // make the HTTP request + IRestResponse response = (IRestResponse) Configuration.ApiClient.CallApi(path_, Method.GET, queryParams, postBody, headerParams, formParams, fileParams, pathParams); + + int statusCode = (int) response.StatusCode; + + if (statusCode >= 400) + throw new ApiException (statusCode, "Error calling DownloadFile: " + response.Content, response.Content); + else if (statusCode == 0) + throw new ApiException (statusCode, "Error calling DownloadFile: " + response.ErrorMessage, response.ErrorMessage); + + return new ApiResponse(statusCode, + response.Headers.ToDictionary(x => x.Name, x => x.Value.ToString()), + (Stream) Configuration.ApiClient.Deserialize(response, typeof(Stream))); + + } + + /// + /// downloads an image + /// + /// Task of Stream + public async System.Threading.Tasks.Task DownloadFileAsync () + { + ApiResponse response = await DownloadFileAsyncWithHttpInfo(); + return response.Data; + + } + + /// + /// downloads an image + /// + /// Task of ApiResponse (Stream) + public async System.Threading.Tasks.Task> DownloadFileAsyncWithHttpInfo () + { + + + var path_ = "/pet/{petId}/downloadImage"; + + var pathParams = new Dictionary(); + var queryParams = new Dictionary(); + var headerParams = new Dictionary(); + var formParams = new Dictionary(); + var fileParams = new Dictionary(); + String postBody = null; + + // to determine the Accept header + String[] http_header_accepts = new String[] { + "application/octet-stream" + }; + String http_header_accept = Configuration.ApiClient.SelectHeaderAccept(http_header_accepts); + if (http_header_accept != null) + headerParams.Add("Accept", Configuration.ApiClient.SelectHeaderAccept(http_header_accepts)); + + // set "format" to json by default + // e.g. /pet/{petId}.{format} becomes /pet/{petId}.json + pathParams.Add("format", "json"); + + + + + + + + + // make the HTTP request + IRestResponse response = (IRestResponse) await Configuration.ApiClient.CallApiAsync(path_, Method.GET, queryParams, postBody, headerParams, formParams, fileParams, pathParams); + + int statusCode = (int) response.StatusCode; + + if (statusCode >= 400) + throw new ApiException (statusCode, "Error calling DownloadFile: " + response.Content, response.Content); + else if (statusCode == 0) + throw new ApiException (statusCode, "Error calling DownloadFile: " + response.ErrorMessage, response.ErrorMessage); + + return new ApiResponse(statusCode, + response.Headers.ToDictionary(x => x.Name, x => x.Value.ToString()), + (Stream) Configuration.ApiClient.Deserialize(response, typeof(Stream))); + + } + /// /// uploads an image /// diff --git a/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Api/StoreApi.cs b/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Api/StoreApi.cs index a9e9d6e9b74..db82bf8e644 100644 --- a/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Api/StoreApi.cs +++ b/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Api/StoreApi.cs @@ -6,6 +6,7 @@ using RestSharp; using IO.Swagger.Client; using IO.Swagger.Model; + namespace IO.Swagger.Api { diff --git a/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Api/UserApi.cs b/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Api/UserApi.cs index 5502fe15da1..ac4f138c568 100644 --- a/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Api/UserApi.cs +++ b/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Api/UserApi.cs @@ -6,6 +6,7 @@ using RestSharp; using IO.Swagger.Client; using IO.Swagger.Model; + namespace IO.Swagger.Api { diff --git a/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Client/ApiClient.cs b/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Client/ApiClient.cs index 58ade063718..7e6807f16a4 100644 --- a/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Client/ApiClient.cs +++ b/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Client/ApiClient.cs @@ -196,13 +196,14 @@ namespace IO.Swagger.Client return ((DateTime)obj).ToString (Configuration.DateTimeFormat); else if (obj is IList) { - string flattenString = ""; - string separator = ","; + var flattenedString = new StringBuilder(); foreach (var param in (IList)obj) { - flattenString += param.ToString() + separator; + if (flattenedString.Length > 0) + flattenedString.Append(","); + flattenedString.Append(param); } - return flattenString.Remove(flattenString.Length - 1);; + return flattenedString.ToString(); } else return Convert.ToString (obj); @@ -231,13 +232,16 @@ namespace IO.Swagger.Client var filePath = String.IsNullOrEmpty(Configuration.TempFolderPath) ? Path.GetTempPath() : Configuration.TempFolderPath; - var regex = new Regex(@"Content-Disposition:.*filename=['""]?([^'""\s]+)['""]?$"); - var match = regex.Match(headers.ToString()); - if (match.Success) + var regex = new Regex(@"Content-Disposition=.*filename=['""]?([^'""\s]+)['""]?$"); + foreach (var header in headers) { - string fileName = filePath + match.Value.Replace("\"", "").Replace("'", ""); - File.WriteAllBytes(fileName, data); - return new FileStream(fileName, FileMode.Open); + var match = regex.Match(header.ToString()); + if (match.Success) + { + string fileName = filePath + match.Groups[1].Value.Replace("\"", "").Replace("'", ""); + File.WriteAllBytes(fileName, data); + return new FileStream(fileName, FileMode.Open); + } } } var stream = new MemoryStream(data); diff --git a/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Client/Configuration.cs b/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Client/Configuration.cs index bfbb9d7479d..13d16c9ce57 100644 --- a/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Client/Configuration.cs +++ b/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Client/Configuration.cs @@ -24,15 +24,15 @@ namespace IO.Swagger.Client /// Dictionary of API key prefix /// Temp folder path /// DateTime format string - public Configuration(ApiClient apiClient = null, - Dictionary defaultHeader = null, - string username = null, - string password = null, - string accessToken = null, - Dictionary apiKey = null, - Dictionary apiKeyPrefix = null, - string tempFolderPath = null, - string dateTimeFormat = null + public Configuration(ApiClient apiClient, + Dictionary defaultHeader, + string username, + string password, + string accessToken, + Dictionary apiKey, + Dictionary apiKeyPrefix, + string tempFolderPath, + string dateTimeFormat ) { if (apiClient == null) @@ -43,11 +43,8 @@ namespace IO.Swagger.Client Username = username; Password = password; AccessToken = accessToken; - - if (apiKey != null) - ApiKey = apiKey; - if (apiKeyPrefix != null) - ApiKeyPrefix = apiKeyPrefix; + ApiKey = apiKey; + ApiKeyPrefix = apiKeyPrefix; TempFolderPath = tempFolderPath; DateTimeFormat = dateTimeFormat; @@ -58,7 +55,7 @@ namespace IO.Swagger.Client /// Initializes a new instance of the Configuration class. /// /// Api client. - public Configuration(ApiClient apiClient) + public Configuration(ApiClient apiClient=null) { if (apiClient == null) ApiClient = ApiClient.Default; diff --git a/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Model/Category.cs b/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Model/Category.cs index d9cb6b21005..03551f9492b 100644 --- a/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Model/Category.cs +++ b/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Model/Category.cs @@ -7,6 +7,8 @@ using System.Collections.Generic; using System.Runtime.Serialization; using Newtonsoft.Json; + + namespace IO.Swagger.Model { @@ -122,4 +124,6 @@ namespace IO.Swagger.Model } } + + } diff --git a/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Model/Order.cs b/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Model/Order.cs index 2191707bd09..1d214430ec8 100644 --- a/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Model/Order.cs +++ b/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Model/Order.cs @@ -7,6 +7,8 @@ using System.Collections.Generic; using System.Runtime.Serialization; using Newtonsoft.Json; + + namespace IO.Swagger.Model { @@ -187,4 +189,6 @@ namespace IO.Swagger.Model } } + + } diff --git a/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Model/Pet.cs b/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Model/Pet.cs index 10c44fb46a7..ab60577e85a 100644 --- a/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Model/Pet.cs +++ b/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Model/Pet.cs @@ -7,6 +7,8 @@ using System.Collections.Generic; using System.Runtime.Serialization; using Newtonsoft.Json; + + namespace IO.Swagger.Model { @@ -187,4 +189,6 @@ namespace IO.Swagger.Model } } + + } diff --git a/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Model/Tag.cs b/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Model/Tag.cs index 93210505bf0..cf77c2470b2 100644 --- a/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Model/Tag.cs +++ b/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Model/Tag.cs @@ -7,6 +7,8 @@ using System.Collections.Generic; using System.Runtime.Serialization; using Newtonsoft.Json; + + namespace IO.Swagger.Model { @@ -122,4 +124,6 @@ namespace IO.Swagger.Model } } + + } diff --git a/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Model/User.cs b/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Model/User.cs index 1fbd17da993..eca977c3b18 100644 --- a/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Model/User.cs +++ b/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Model/User.cs @@ -7,6 +7,8 @@ using System.Collections.Generic; using System.Runtime.Serialization; using Newtonsoft.Json; + + namespace IO.Swagger.Model { @@ -219,4 +221,6 @@ namespace IO.Swagger.Model } } + + } From 146b4a481366321304d6197c85cd73c85877f020 Mon Sep 17 00:00:00 2001 From: xhh Date: Thu, 17 Dec 2015 17:59:57 +0800 Subject: [PATCH 199/211] Use a more real jquery mocking in test --- .../main/resources/Javascript/package.mustache | 9 +++++---- samples/client/petstore/javascript/package.json | 9 +++++---- .../client/petstore/javascript/test/mocha.opts | 1 + samples/client/petstore/javascript/test/test.js | 15 +++++++++++---- 4 files changed, 22 insertions(+), 12 deletions(-) create mode 100644 samples/client/petstore/javascript/test/mocha.opts diff --git a/modules/swagger-codegen/src/main/resources/Javascript/package.mustache b/modules/swagger-codegen/src/main/resources/Javascript/package.mustache index 85603bd364b..e86b1a17aee 100644 --- a/modules/swagger-codegen/src/main/resources/Javascript/package.mustache +++ b/modules/swagger-codegen/src/main/resources/Javascript/package.mustache @@ -8,11 +8,12 @@ "test": "./node_modules/mocha/bin/mocha" }, "dependencies": { - "jquery": "^2.1.4" + "jquery": "~2.1.4" }, "devDependencies": { - "mocha": "^2.3.4", - "mockrequire": "0.0.5", - "najax": "0.3.1" + "mocha": "~2.3.4", + "mockrequire": "~0.0.5", + "domino": "~1.0.20", + "xmlhttprequest": "~1.8.0" } } diff --git a/samples/client/petstore/javascript/package.json b/samples/client/petstore/javascript/package.json index c5f1afde698..a7bc83e4ae2 100644 --- a/samples/client/petstore/javascript/package.json +++ b/samples/client/petstore/javascript/package.json @@ -8,11 +8,12 @@ "test": "./node_modules/mocha/bin/mocha" }, "dependencies": { - "jquery": "^2.1.4" + "jquery": "~2.1.4" }, "devDependencies": { - "mocha": "^2.3.4", - "mockrequire": "0.0.5", - "najax": "0.3.1" + "mocha": "~2.3.4", + "mockrequire": "~0.0.5", + "domino": "~1.0.20", + "xmlhttprequest": "~1.8.0" } } diff --git a/samples/client/petstore/javascript/test/mocha.opts b/samples/client/petstore/javascript/test/mocha.opts new file mode 100644 index 00000000000..cf80ee74bca --- /dev/null +++ b/samples/client/petstore/javascript/test/mocha.opts @@ -0,0 +1 @@ +--timeout 5000 diff --git a/samples/client/petstore/javascript/test/test.js b/samples/client/petstore/javascript/test/test.js index c7d84917f8a..8b4f3953e6d 100644 --- a/samples/client/petstore/javascript/test/test.js +++ b/samples/client/petstore/javascript/test/test.js @@ -1,11 +1,18 @@ var assert = require('assert'); var mockrequire = require('mockrequire'); -var najax = require('najax'); + +var jquery = require('jquery'); +var domino = require('domino'); +var XMLHttpRequest = require('xmlhttprequest').XMLHttpRequest; +var window = domino.createWindow(); +var $ = jquery(window); +$.support.cors = true; +$.ajaxSettings.xhr = function() { + return new XMLHttpRequest(); +}; var PetApi = mockrequire('../src/api/PetApi', { - 'jquery': { - 'ajax': najax - } + 'jquery': $ }); describe('PetApi', function() { From dcfe40fc444b854b5796260488e4319ca97f2fec Mon Sep 17 00:00:00 2001 From: xhh Date: Thu, 17 Dec 2015 18:51:12 +0800 Subject: [PATCH 200/211] Configure Javascript tests to allow running in browser --- .../resources/Javascript/package.mustache | 1 + .../client/petstore/javascript/package.json | 1 + .../client/petstore/javascript/test/helper.js | 19 +++++++++++ .../petstore/javascript/test/run_tests.html | 33 +++++++++++++++++++ .../client/petstore/javascript/test/test.js | 25 ++++---------- 5 files changed, 61 insertions(+), 18 deletions(-) create mode 100644 samples/client/petstore/javascript/test/helper.js create mode 100644 samples/client/petstore/javascript/test/run_tests.html diff --git a/modules/swagger-codegen/src/main/resources/Javascript/package.mustache b/modules/swagger-codegen/src/main/resources/Javascript/package.mustache index e86b1a17aee..53bbed30be9 100644 --- a/modules/swagger-codegen/src/main/resources/Javascript/package.mustache +++ b/modules/swagger-codegen/src/main/resources/Javascript/package.mustache @@ -12,6 +12,7 @@ }, "devDependencies": { "mocha": "~2.3.4", + "expect.js": "~0.3.1", "mockrequire": "~0.0.5", "domino": "~1.0.20", "xmlhttprequest": "~1.8.0" diff --git a/samples/client/petstore/javascript/package.json b/samples/client/petstore/javascript/package.json index a7bc83e4ae2..156300cf760 100644 --- a/samples/client/petstore/javascript/package.json +++ b/samples/client/petstore/javascript/package.json @@ -12,6 +12,7 @@ }, "devDependencies": { "mocha": "~2.3.4", + "expect.js": "~0.3.1", "mockrequire": "~0.0.5", "domino": "~1.0.20", "xmlhttprequest": "~1.8.0" diff --git a/samples/client/petstore/javascript/test/helper.js b/samples/client/petstore/javascript/test/helper.js new file mode 100644 index 00000000000..a1b798f325f --- /dev/null +++ b/samples/client/petstore/javascript/test/helper.js @@ -0,0 +1,19 @@ +var mockrequire = require('mockrequire'); + +var jquery = require('jquery'); +var domino = require('domino'); +var XMLHttpRequest = require('xmlhttprequest').XMLHttpRequest; +var window = domino.createWindow(); +var $ = jquery(window); +$.support.cors = true; +$.ajaxSettings.xhr = function() { + return new XMLHttpRequest(); +}; + +var requireWithMocks = function(path) { + return mockrequire(path, { + 'jquery': $ + }); +}; + +exports.requireWithMocks = requireWithMocks; diff --git a/samples/client/petstore/javascript/test/run_tests.html b/samples/client/petstore/javascript/test/run_tests.html new file mode 100644 index 00000000000..9f2d78ad0b8 --- /dev/null +++ b/samples/client/petstore/javascript/test/run_tests.html @@ -0,0 +1,33 @@ + + + + Mocha Tests + + + +
+ + + + + + + + + + + + + + + + diff --git a/samples/client/petstore/javascript/test/test.js b/samples/client/petstore/javascript/test/test.js index 8b4f3953e6d..3c437d0cd5a 100644 --- a/samples/client/petstore/javascript/test/test.js +++ b/samples/client/petstore/javascript/test/test.js @@ -1,27 +1,16 @@ -var assert = require('assert'); -var mockrequire = require('mockrequire'); - -var jquery = require('jquery'); -var domino = require('domino'); -var XMLHttpRequest = require('xmlhttprequest').XMLHttpRequest; -var window = domino.createWindow(); -var $ = jquery(window); -$.support.cors = true; -$.ajaxSettings.xhr = function() { - return new XMLHttpRequest(); -}; - -var PetApi = mockrequire('../src/api/PetApi', { - 'jquery': $ -}); +if (typeof module === 'object' && module.exports) { + var expect = require('expect.js'); + var requireWithMocks = require('./helper.js').requireWithMocks; + var PetApi = requireWithMocks('../src/api/PetApi'); +} describe('PetApi', function() { describe('#getPetById', function () { it('should work', function (done) { var api = new PetApi(); api.getPetById(1, function(pet, textStatus, jqXHR) { - assert.equal('success', textStatus); - assert.equal(1, pet.id); + expect(textStatus).to.be('success'); + expect(pet.id).to.be(1); done(); }); }); From 794783a4bb6c35ac771954d067a74620d2fa5539 Mon Sep 17 00:00:00 2001 From: xhh Date: Thu, 17 Dec 2015 20:05:00 +0800 Subject: [PATCH 201/211] Javascript: bug fixes, clean-ups, tests - Fix the "apiClient.escapeString" issue - Remove unused code in api.mustache - Add test case for creating and getting Pet --- .../main/resources/Javascript/api.mustache | 66 ++-- .../petstore/javascript/src/api/PetApi.js | 309 ++++++++---------- .../petstore/javascript/src/api/StoreApi.js | 179 ++++------ .../petstore/javascript/src/api/UserApi.js | 289 +++++++--------- .../javascript/test/api/PetApiTest.js | 183 +++++++++++ .../client/petstore/javascript/test/helper.js | 6 +- .../petstore/javascript/test/run_tests.html | 14 +- .../client/petstore/javascript/test/test.js | 18 - 8 files changed, 541 insertions(+), 523 deletions(-) create mode 100644 samples/client/petstore/javascript/test/api/PetApiTest.js delete mode 100644 samples/client/petstore/javascript/test/test.js diff --git a/modules/swagger-codegen/src/main/resources/Javascript/api.mustache b/modules/swagger-codegen/src/main/resources/Javascript/api.mustache index 2a0c74ce560..3da5ff00aa1 100644 --- a/modules/swagger-codegen/src/main/resources/Javascript/api.mustache +++ b/modules/swagger-codegen/src/main/resources/Javascript/api.mustache @@ -14,7 +14,7 @@ if ( typeof define === "function" && define.amd ) { var {{classname}} = function {{classname}}() { var self = this; -{{#operations}} + {{#operations}} {{#operation}} /** * {{summary}} @@ -24,7 +24,6 @@ var {{classname}} = function {{classname}}() { * @return {{#returnType}}{{{returnType}}}{{/returnType}}{{^returnType}}void{{/returnType}} */ self.{{nickname}} = function({{#allParams}}{{paramName}}{{#hasMore}}, {{/hasMore}}{{/allParams}}{{#hasParams}}, {{/hasParams}}callback) { - var {{localVariablePrefix}}postBody = {{#bodyParam}}{{^isBinary}}JSON.stringify({{paramName}}){{/isBinary}}{{#isBinary}}null{{/isBinary}}{{/bodyParam}}{{^bodyParam}}null{{/bodyParam}}; var {{localVariablePrefix}}postBinaryBody = {{#bodyParam}}{{#isBinary}}{{paramName}}{{/isBinary}}{{^isBinary}}null{{/isBinary}}{{/bodyParam}}{{^bodyParam}}null{{/bodyParam}}; {{#allParams}}{{#required}} @@ -42,8 +41,8 @@ var {{classname}} = function {{classname}}() { basePath = basePath.substring(0, basePath.length-1); } - var {{localVariablePrefix}}path = basePath + replaceAll(replaceAll("{{{path}}}", "\\{format\\}","json"){{#pathParams}} -, "\\{" + "{{baseName}}" + "\\}", {{localVariablePrefix}}apiClient.escapeString({{{paramName}}}.toString()){{/pathParams}}); + var {{localVariablePrefix}}path = basePath + replaceAll(replaceAll("{{{path}}}", "\\{format\\}","json"){{#pathParams}} +, "\\{" + "{{baseName}}" + "\\}", {{localVariablePrefix}}{{{paramName}}}.toString(){{/pathParams}}); var queryParams = {}; var headerParams = {}; @@ -59,52 +58,35 @@ var {{classname}} = function {{classname}}() { {{localVariablePrefix}}formParams.put("{{baseName}}", {{paramName}}); {{/formParams}} - path += createQueryString(queryParams); + path += createQueryString(queryParams); - //if (console) { - //console.log('path: ' + path); - //console.log('queryParams: ' + queryParams); - //} - - {{#isResponseBinary}} - byte[] {{localVariablePrefix}}response = null; - {{localVariablePrefix}}response = {{localVariablePrefix}}apiClient.invokeBinaryAPI({{localVariablePrefix}}path, "{{httpMethod}}", {{localVariablePrefix}}queryParams,{{localVariablePrefix}} postBody, {{localVariablePrefix}}postBinaryBody, {{localVariablePrefix}}headerParams, {{localVariablePrefix}}formParams, {{localVariablePrefix}}accept, {{localVariablePrefix}}contentType, {{localVariablePrefix}}authNames); - return {{localVariablePrefix}}response; - {{/isResponseBinary}} - - {{^isResponseBinary}} - {{#returnType}} - //TypeRef {{localVariablePrefix}}returnType = new TypeRef<{{{returnType}}}>() {}; - //return {{localVariablePrefix}}apiClient.invokeAPI({{localVariablePrefix}}path, "{{httpMethod}}", {{localVariablePrefix}}queryParams, {{localVariablePrefix}}postBody, {{localVariablePrefix}}postBinaryBody, {{localVariablePrefix}}headerParams, {{localVariablePrefix}}formParams, {{localVariablePrefix}}accept, {{localVariablePrefix}}contentType, {{localVariablePrefix}}authNames, {{localVariablePrefix}}returnType); - - var options = {type: "{{httpMethod}}", async: true, contentType: "application/json", dataType: "json", data: postBody}; + var options = {type: "{{httpMethod}}", async: true, contentType: "application/json", dataType: "json", data: postBody}; var request = $.ajax(path, options); //request.fail(function(jqXHR, textStatus, errorThrown){ // errorHandler(jqXHR, textStatus, errorThrown); //}); - request.done(function(response, textStatus, jqXHR){ - /** - * @returns {{{returnType}}} - */ - {{#returnTypeIsPrimitive}} var myResponse = response;{{/returnTypeIsPrimitive}} - {{^returnTypeIsPrimitive}} var myResponse = new {{{returnType}}}(); - myResponse.constructFromObject(response);{{/returnTypeIsPrimitive}} - - callback(myResponse, textStatus, jqXHR); - }); - - {{/returnType}}{{^returnType}} - {{localVariablePrefix}}apiClient.invokeAPI({{localVariablePrefix}}path, "{{httpMethod}}", {{localVariablePrefix}}queryParams, {{localVariablePrefix}}postBody, {{localVariablePrefix}}postBinaryBody, {{localVariablePrefix}}headerParams, {{localVariablePrefix}}formParams, {{localVariablePrefix}}accept, {{localVariablePrefix}}contentType, {{localVariablePrefix}}authNames, null); - {{/returnType}} - {{/isResponseBinary}} - - + request.done(function(response, textStatus, jqXHR){ + {{#returnType}} + /** + * @returns {{{returnType}}} + */ + {{#returnTypeIsPrimitive}}var myResponse = response;{{/returnTypeIsPrimitive}} + {{^returnTypeIsPrimitive}}var myResponse = new {{{returnType}}}(); + myResponse.constructFromObject(response);{{/returnTypeIsPrimitive}} + if (callback) { + callback(myResponse, textStatus, jqXHR); + } + {{/returnType}}{{^returnType}} + if (callback) { + callback(response, textStatus, jqXHR); + } + {{/returnType}} + }); } {{/operation}} - -{{/operations}} + {{/operations}} function replaceAll (haystack, needle, replace) { var result= haystack; @@ -135,4 +117,4 @@ var {{classname}} = function {{classname}}() { // export module for Node.js if (typeof module === 'object' && module.exports) { module.exports = {{classname}}; -} \ No newline at end of file +} diff --git a/samples/client/petstore/javascript/src/api/PetApi.js b/samples/client/petstore/javascript/src/api/PetApi.js index d9e10256b1c..4f77c603b23 100644 --- a/samples/client/petstore/javascript/src/api/PetApi.js +++ b/samples/client/petstore/javascript/src/api/PetApi.js @@ -15,6 +15,7 @@ if ( typeof define === "function" && define.amd ) { var PetApi = function PetApi() { var self = this; + /** * Update an existing pet * @@ -23,7 +24,6 @@ var PetApi = function PetApi() { * @return void */ self.updatePet = function(body, callback) { - var postBody = JSON.stringify(body); var postBinaryBody = null; @@ -34,7 +34,7 @@ var PetApi = function PetApi() { basePath = basePath.substring(0, basePath.length-1); } - var path = basePath + replaceAll(replaceAll("/pet", "\\{format\\}","json")); + var path = basePath + replaceAll(replaceAll("/pet", "\\{format\\}","json")); var queryParams = {}; var headerParams = {}; @@ -44,22 +44,22 @@ var PetApi = function PetApi() { - path += createQueryString(queryParams); - - //if (console) { - //console.log('path: ' + path); - //console.log('queryParams: ' + queryParams); - //} + path += createQueryString(queryParams); + var options = {type: "PUT", async: true, contentType: "application/json", dataType: "json", data: postBody}; + var request = $.ajax(path, options); + //request.fail(function(jqXHR, textStatus, errorThrown){ + // errorHandler(jqXHR, textStatus, errorThrown); + //}); - - - - apiClient.invokeAPI(path, "PUT", queryParams, postBody, postBinaryBody, headerParams, formParams, accept, contentType, authNames, null); - - - - + + request.done(function(response, textStatus, jqXHR){ + + if (callback) { + callback(response, textStatus, jqXHR); + } + + }); } /** @@ -70,7 +70,6 @@ var PetApi = function PetApi() { * @return void */ self.addPet = function(body, callback) { - var postBody = JSON.stringify(body); var postBinaryBody = null; @@ -81,7 +80,7 @@ var PetApi = function PetApi() { basePath = basePath.substring(0, basePath.length-1); } - var path = basePath + replaceAll(replaceAll("/pet", "\\{format\\}","json")); + var path = basePath + replaceAll(replaceAll("/pet", "\\{format\\}","json")); var queryParams = {}; var headerParams = {}; @@ -91,22 +90,22 @@ var PetApi = function PetApi() { - path += createQueryString(queryParams); - - //if (console) { - //console.log('path: ' + path); - //console.log('queryParams: ' + queryParams); - //} + path += createQueryString(queryParams); + var options = {type: "POST", async: true, contentType: "application/json", dataType: "json", data: postBody}; + var request = $.ajax(path, options); + //request.fail(function(jqXHR, textStatus, errorThrown){ + // errorHandler(jqXHR, textStatus, errorThrown); + //}); - - - - apiClient.invokeAPI(path, "POST", queryParams, postBody, postBinaryBody, headerParams, formParams, accept, contentType, authNames, null); - - - - + + request.done(function(response, textStatus, jqXHR){ + + if (callback) { + callback(response, textStatus, jqXHR); + } + + }); } /** @@ -117,7 +116,6 @@ var PetApi = function PetApi() { * @return Array */ self.findPetsByStatus = function(status, callback) { - var postBody = null; var postBinaryBody = null; @@ -128,7 +126,7 @@ var PetApi = function PetApi() { basePath = basePath.substring(0, basePath.length-1); } - var path = basePath + replaceAll(replaceAll("/pet/findByStatus", "\\{format\\}","json")); + var path = basePath + replaceAll(replaceAll("/pet/findByStatus", "\\{format\\}","json")); var queryParams = {}; var headerParams = {}; @@ -140,42 +138,28 @@ var PetApi = function PetApi() { - path += createQueryString(queryParams); + path += createQueryString(queryParams); - //if (console) { - //console.log('path: ' + path); - //console.log('queryParams: ' + queryParams); - //} - - - - - - //TypeRef returnType = new TypeRef() {}; - //return apiClient.invokeAPI(path, "GET", queryParams, postBody, postBinaryBody, headerParams, formParams, accept, contentType, authNames, returnType); - - var options = {type: "GET", async: true, contentType: "application/json", dataType: "json", data: postBody}; + var options = {type: "GET", async: true, contentType: "application/json", dataType: "json", data: postBody}; var request = $.ajax(path, options); //request.fail(function(jqXHR, textStatus, errorThrown){ // errorHandler(jqXHR, textStatus, errorThrown); //}); - request.done(function(response, textStatus, jqXHR){ - /** - * @returns Array - */ - - var myResponse = new Array(); - myResponse.constructFromObject(response); - - callback(myResponse, textStatus, jqXHR); - }); - - - - - + request.done(function(response, textStatus, jqXHR){ + + /** + * @returns Array + */ + + var myResponse = new Array(); + myResponse.constructFromObject(response); + if (callback) { + callback(myResponse, textStatus, jqXHR); + } + + }); } /** @@ -186,7 +170,6 @@ var PetApi = function PetApi() { * @return Array */ self.findPetsByTags = function(tags, callback) { - var postBody = null; var postBinaryBody = null; @@ -197,7 +180,7 @@ var PetApi = function PetApi() { basePath = basePath.substring(0, basePath.length-1); } - var path = basePath + replaceAll(replaceAll("/pet/findByTags", "\\{format\\}","json")); + var path = basePath + replaceAll(replaceAll("/pet/findByTags", "\\{format\\}","json")); var queryParams = {}; var headerParams = {}; @@ -209,42 +192,28 @@ var PetApi = function PetApi() { - path += createQueryString(queryParams); + path += createQueryString(queryParams); - //if (console) { - //console.log('path: ' + path); - //console.log('queryParams: ' + queryParams); - //} - - - - - - //TypeRef returnType = new TypeRef() {}; - //return apiClient.invokeAPI(path, "GET", queryParams, postBody, postBinaryBody, headerParams, formParams, accept, contentType, authNames, returnType); - - var options = {type: "GET", async: true, contentType: "application/json", dataType: "json", data: postBody}; + var options = {type: "GET", async: true, contentType: "application/json", dataType: "json", data: postBody}; var request = $.ajax(path, options); //request.fail(function(jqXHR, textStatus, errorThrown){ // errorHandler(jqXHR, textStatus, errorThrown); //}); - request.done(function(response, textStatus, jqXHR){ - /** - * @returns Array - */ - - var myResponse = new Array(); - myResponse.constructFromObject(response); - - callback(myResponse, textStatus, jqXHR); - }); - - - - - + request.done(function(response, textStatus, jqXHR){ + + /** + * @returns Array + */ + + var myResponse = new Array(); + myResponse.constructFromObject(response); + if (callback) { + callback(myResponse, textStatus, jqXHR); + } + + }); } /** @@ -255,7 +224,6 @@ var PetApi = function PetApi() { * @return Pet */ self.getPetById = function(petId, callback) { - var postBody = null; var postBinaryBody = null; @@ -273,8 +241,8 @@ var PetApi = function PetApi() { basePath = basePath.substring(0, basePath.length-1); } - var path = basePath + replaceAll(replaceAll("/pet/{petId}", "\\{format\\}","json") -, "\\{" + "petId" + "\\}", apiClient.escapeString(petId.toString())); + var path = basePath + replaceAll(replaceAll("/pet/{petId}", "\\{format\\}","json") +, "\\{" + "petId" + "\\}", petId.toString()); var queryParams = {}; var headerParams = {}; @@ -284,42 +252,28 @@ var PetApi = function PetApi() { - path += createQueryString(queryParams); + path += createQueryString(queryParams); - //if (console) { - //console.log('path: ' + path); - //console.log('queryParams: ' + queryParams); - //} - - - - - - //TypeRef returnType = new TypeRef() {}; - //return apiClient.invokeAPI(path, "GET", queryParams, postBody, postBinaryBody, headerParams, formParams, accept, contentType, authNames, returnType); - - var options = {type: "GET", async: true, contentType: "application/json", dataType: "json", data: postBody}; + var options = {type: "GET", async: true, contentType: "application/json", dataType: "json", data: postBody}; var request = $.ajax(path, options); //request.fail(function(jqXHR, textStatus, errorThrown){ // errorHandler(jqXHR, textStatus, errorThrown); //}); - request.done(function(response, textStatus, jqXHR){ - /** - * @returns Pet - */ - - var myResponse = new Pet(); - myResponse.constructFromObject(response); - - callback(myResponse, textStatus, jqXHR); - }); - - - - - + request.done(function(response, textStatus, jqXHR){ + + /** + * @returns Pet + */ + + var myResponse = new Pet(); + myResponse.constructFromObject(response); + if (callback) { + callback(myResponse, textStatus, jqXHR); + } + + }); } /** @@ -332,7 +286,6 @@ var PetApi = function PetApi() { * @return void */ self.updatePetWithForm = function(petId, name, status, callback) { - var postBody = null; var postBinaryBody = null; @@ -350,8 +303,8 @@ var PetApi = function PetApi() { basePath = basePath.substring(0, basePath.length-1); } - var path = basePath + replaceAll(replaceAll("/pet/{petId}", "\\{format\\}","json") -, "\\{" + "petId" + "\\}", apiClient.escapeString(petId.toString())); + var path = basePath + replaceAll(replaceAll("/pet/{petId}", "\\{format\\}","json") +, "\\{" + "petId" + "\\}", petId.toString()); var queryParams = {}; var headerParams = {}; @@ -365,22 +318,22 @@ var PetApi = function PetApi() { formParams.put("status", status); - path += createQueryString(queryParams); - - //if (console) { - //console.log('path: ' + path); - //console.log('queryParams: ' + queryParams); - //} + path += createQueryString(queryParams); + var options = {type: "POST", async: true, contentType: "application/json", dataType: "json", data: postBody}; + var request = $.ajax(path, options); + //request.fail(function(jqXHR, textStatus, errorThrown){ + // errorHandler(jqXHR, textStatus, errorThrown); + //}); - - - - apiClient.invokeAPI(path, "POST", queryParams, postBody, postBinaryBody, headerParams, formParams, accept, contentType, authNames, null); - - - - + + request.done(function(response, textStatus, jqXHR){ + + if (callback) { + callback(response, textStatus, jqXHR); + } + + }); } /** @@ -392,7 +345,6 @@ var PetApi = function PetApi() { * @return void */ self.deletePet = function(petId, apiKey, callback) { - var postBody = null; var postBinaryBody = null; @@ -410,8 +362,8 @@ var PetApi = function PetApi() { basePath = basePath.substring(0, basePath.length-1); } - var path = basePath + replaceAll(replaceAll("/pet/{petId}", "\\{format\\}","json") -, "\\{" + "petId" + "\\}", apiClient.escapeString(petId.toString())); + var path = basePath + replaceAll(replaceAll("/pet/{petId}", "\\{format\\}","json") +, "\\{" + "petId" + "\\}", petId.toString()); var queryParams = {}; var headerParams = {}; @@ -423,22 +375,22 @@ var PetApi = function PetApi() { - path += createQueryString(queryParams); - - //if (console) { - //console.log('path: ' + path); - //console.log('queryParams: ' + queryParams); - //} + path += createQueryString(queryParams); + var options = {type: "DELETE", async: true, contentType: "application/json", dataType: "json", data: postBody}; + var request = $.ajax(path, options); + //request.fail(function(jqXHR, textStatus, errorThrown){ + // errorHandler(jqXHR, textStatus, errorThrown); + //}); - - - - apiClient.invokeAPI(path, "DELETE", queryParams, postBody, postBinaryBody, headerParams, formParams, accept, contentType, authNames, null); - - - - + + request.done(function(response, textStatus, jqXHR){ + + if (callback) { + callback(response, textStatus, jqXHR); + } + + }); } /** @@ -451,7 +403,6 @@ var PetApi = function PetApi() { * @return void */ self.uploadFile = function(petId, additionalMetadata, file, callback) { - var postBody = null; var postBinaryBody = null; @@ -469,8 +420,8 @@ var PetApi = function PetApi() { basePath = basePath.substring(0, basePath.length-1); } - var path = basePath + replaceAll(replaceAll("/pet/{petId}/uploadImage", "\\{format\\}","json") -, "\\{" + "petId" + "\\}", apiClient.escapeString(petId.toString())); + var path = basePath + replaceAll(replaceAll("/pet/{petId}/uploadImage", "\\{format\\}","json") +, "\\{" + "petId" + "\\}", petId.toString()); var queryParams = {}; var headerParams = {}; @@ -484,25 +435,25 @@ var PetApi = function PetApi() { formParams.put("file", file); - path += createQueryString(queryParams); - - //if (console) { - //console.log('path: ' + path); - //console.log('queryParams: ' + queryParams); - //} + path += createQueryString(queryParams); + var options = {type: "POST", async: true, contentType: "application/json", dataType: "json", data: postBody}; + var request = $.ajax(path, options); + //request.fail(function(jqXHR, textStatus, errorThrown){ + // errorHandler(jqXHR, textStatus, errorThrown); + //}); - - - - apiClient.invokeAPI(path, "POST", queryParams, postBody, postBinaryBody, headerParams, formParams, accept, contentType, authNames, null); - - - - + + request.done(function(response, textStatus, jqXHR){ + + if (callback) { + callback(response, textStatus, jqXHR); + } + + }); } - + function replaceAll (haystack, needle, replace) { var result= haystack; @@ -533,4 +484,4 @@ var PetApi = function PetApi() { // export module for Node.js if (typeof module === 'object' && module.exports) { module.exports = PetApi; -} \ No newline at end of file +} diff --git a/samples/client/petstore/javascript/src/api/StoreApi.js b/samples/client/petstore/javascript/src/api/StoreApi.js index 7a20d8841a3..6cfa53744ba 100644 --- a/samples/client/petstore/javascript/src/api/StoreApi.js +++ b/samples/client/petstore/javascript/src/api/StoreApi.js @@ -15,6 +15,7 @@ if ( typeof define === "function" && define.amd ) { var StoreApi = function StoreApi() { var self = this; + /** * Returns pet inventories by status * Returns a map of status codes to quantities @@ -22,7 +23,6 @@ var StoreApi = function StoreApi() { * @return Object */ self.getInventory = function(callback) { - var postBody = null; var postBinaryBody = null; @@ -33,7 +33,7 @@ var StoreApi = function StoreApi() { basePath = basePath.substring(0, basePath.length-1); } - var path = basePath + replaceAll(replaceAll("/store/inventory", "\\{format\\}","json")); + var path = basePath + replaceAll(replaceAll("/store/inventory", "\\{format\\}","json")); var queryParams = {}; var headerParams = {}; @@ -43,41 +43,27 @@ var StoreApi = function StoreApi() { - path += createQueryString(queryParams); + path += createQueryString(queryParams); - //if (console) { - //console.log('path: ' + path); - //console.log('queryParams: ' + queryParams); - //} - - - - - - //TypeRef returnType = new TypeRef>() {}; - //return apiClient.invokeAPI(path, "GET", queryParams, postBody, postBinaryBody, headerParams, formParams, accept, contentType, authNames, returnType); - - var options = {type: "GET", async: true, contentType: "application/json", dataType: "json", data: postBody}; + var options = {type: "GET", async: true, contentType: "application/json", dataType: "json", data: postBody}; var request = $.ajax(path, options); //request.fail(function(jqXHR, textStatus, errorThrown){ // errorHandler(jqXHR, textStatus, errorThrown); //}); - request.done(function(response, textStatus, jqXHR){ - /** - * @returns Object - */ - var myResponse = response; - - - callback(myResponse, textStatus, jqXHR); - }); - - - - - + request.done(function(response, textStatus, jqXHR){ + + /** + * @returns Object + */ + var myResponse = response; + + if (callback) { + callback(myResponse, textStatus, jqXHR); + } + + }); } /** @@ -88,7 +74,6 @@ var StoreApi = function StoreApi() { * @return Order */ self.placeOrder = function(body, callback) { - var postBody = JSON.stringify(body); var postBinaryBody = null; @@ -99,7 +84,7 @@ var StoreApi = function StoreApi() { basePath = basePath.substring(0, basePath.length-1); } - var path = basePath + replaceAll(replaceAll("/store/order", "\\{format\\}","json")); + var path = basePath + replaceAll(replaceAll("/store/order", "\\{format\\}","json")); var queryParams = {}; var headerParams = {}; @@ -109,42 +94,28 @@ var StoreApi = function StoreApi() { - path += createQueryString(queryParams); + path += createQueryString(queryParams); - //if (console) { - //console.log('path: ' + path); - //console.log('queryParams: ' + queryParams); - //} - - - - - - //TypeRef returnType = new TypeRef() {}; - //return apiClient.invokeAPI(path, "POST", queryParams, postBody, postBinaryBody, headerParams, formParams, accept, contentType, authNames, returnType); - - var options = {type: "POST", async: true, contentType: "application/json", dataType: "json", data: postBody}; + var options = {type: "POST", async: true, contentType: "application/json", dataType: "json", data: postBody}; var request = $.ajax(path, options); //request.fail(function(jqXHR, textStatus, errorThrown){ // errorHandler(jqXHR, textStatus, errorThrown); //}); - request.done(function(response, textStatus, jqXHR){ - /** - * @returns Order - */ - - var myResponse = new Order(); - myResponse.constructFromObject(response); - - callback(myResponse, textStatus, jqXHR); - }); - - - - - + request.done(function(response, textStatus, jqXHR){ + + /** + * @returns Order + */ + + var myResponse = new Order(); + myResponse.constructFromObject(response); + if (callback) { + callback(myResponse, textStatus, jqXHR); + } + + }); } /** @@ -155,7 +126,6 @@ var StoreApi = function StoreApi() { * @return Order */ self.getOrderById = function(orderId, callback) { - var postBody = null; var postBinaryBody = null; @@ -173,8 +143,8 @@ var StoreApi = function StoreApi() { basePath = basePath.substring(0, basePath.length-1); } - var path = basePath + replaceAll(replaceAll("/store/order/{orderId}", "\\{format\\}","json") -, "\\{" + "orderId" + "\\}", apiClient.escapeString(orderId.toString())); + var path = basePath + replaceAll(replaceAll("/store/order/{orderId}", "\\{format\\}","json") +, "\\{" + "orderId" + "\\}", orderId.toString()); var queryParams = {}; var headerParams = {}; @@ -184,42 +154,28 @@ var StoreApi = function StoreApi() { - path += createQueryString(queryParams); + path += createQueryString(queryParams); - //if (console) { - //console.log('path: ' + path); - //console.log('queryParams: ' + queryParams); - //} - - - - - - //TypeRef returnType = new TypeRef() {}; - //return apiClient.invokeAPI(path, "GET", queryParams, postBody, postBinaryBody, headerParams, formParams, accept, contentType, authNames, returnType); - - var options = {type: "GET", async: true, contentType: "application/json", dataType: "json", data: postBody}; + var options = {type: "GET", async: true, contentType: "application/json", dataType: "json", data: postBody}; var request = $.ajax(path, options); //request.fail(function(jqXHR, textStatus, errorThrown){ // errorHandler(jqXHR, textStatus, errorThrown); //}); - request.done(function(response, textStatus, jqXHR){ - /** - * @returns Order - */ - - var myResponse = new Order(); - myResponse.constructFromObject(response); - - callback(myResponse, textStatus, jqXHR); - }); - - - - - + request.done(function(response, textStatus, jqXHR){ + + /** + * @returns Order + */ + + var myResponse = new Order(); + myResponse.constructFromObject(response); + if (callback) { + callback(myResponse, textStatus, jqXHR); + } + + }); } /** @@ -230,7 +186,6 @@ var StoreApi = function StoreApi() { * @return void */ self.deleteOrder = function(orderId, callback) { - var postBody = null; var postBinaryBody = null; @@ -248,8 +203,8 @@ var StoreApi = function StoreApi() { basePath = basePath.substring(0, basePath.length-1); } - var path = basePath + replaceAll(replaceAll("/store/order/{orderId}", "\\{format\\}","json") -, "\\{" + "orderId" + "\\}", apiClient.escapeString(orderId.toString())); + var path = basePath + replaceAll(replaceAll("/store/order/{orderId}", "\\{format\\}","json") +, "\\{" + "orderId" + "\\}", orderId.toString()); var queryParams = {}; var headerParams = {}; @@ -259,25 +214,25 @@ var StoreApi = function StoreApi() { - path += createQueryString(queryParams); - - //if (console) { - //console.log('path: ' + path); - //console.log('queryParams: ' + queryParams); - //} + path += createQueryString(queryParams); + var options = {type: "DELETE", async: true, contentType: "application/json", dataType: "json", data: postBody}; + var request = $.ajax(path, options); + //request.fail(function(jqXHR, textStatus, errorThrown){ + // errorHandler(jqXHR, textStatus, errorThrown); + //}); - - - - apiClient.invokeAPI(path, "DELETE", queryParams, postBody, postBinaryBody, headerParams, formParams, accept, contentType, authNames, null); - - - - + + request.done(function(response, textStatus, jqXHR){ + + if (callback) { + callback(response, textStatus, jqXHR); + } + + }); } - + function replaceAll (haystack, needle, replace) { var result= haystack; @@ -308,4 +263,4 @@ var StoreApi = function StoreApi() { // export module for Node.js if (typeof module === 'object' && module.exports) { module.exports = StoreApi; -} \ No newline at end of file +} diff --git a/samples/client/petstore/javascript/src/api/UserApi.js b/samples/client/petstore/javascript/src/api/UserApi.js index 72dc3f3d198..bfa1b1c16c8 100644 --- a/samples/client/petstore/javascript/src/api/UserApi.js +++ b/samples/client/petstore/javascript/src/api/UserApi.js @@ -15,6 +15,7 @@ if ( typeof define === "function" && define.amd ) { var UserApi = function UserApi() { var self = this; + /** * Create user * This can only be done by the logged in user. @@ -23,7 +24,6 @@ var UserApi = function UserApi() { * @return void */ self.createUser = function(body, callback) { - var postBody = JSON.stringify(body); var postBinaryBody = null; @@ -34,7 +34,7 @@ var UserApi = function UserApi() { basePath = basePath.substring(0, basePath.length-1); } - var path = basePath + replaceAll(replaceAll("/user", "\\{format\\}","json")); + var path = basePath + replaceAll(replaceAll("/user", "\\{format\\}","json")); var queryParams = {}; var headerParams = {}; @@ -44,22 +44,22 @@ var UserApi = function UserApi() { - path += createQueryString(queryParams); - - //if (console) { - //console.log('path: ' + path); - //console.log('queryParams: ' + queryParams); - //} + path += createQueryString(queryParams); + var options = {type: "POST", async: true, contentType: "application/json", dataType: "json", data: postBody}; + var request = $.ajax(path, options); + //request.fail(function(jqXHR, textStatus, errorThrown){ + // errorHandler(jqXHR, textStatus, errorThrown); + //}); - - - - apiClient.invokeAPI(path, "POST", queryParams, postBody, postBinaryBody, headerParams, formParams, accept, contentType, authNames, null); - - - - + + request.done(function(response, textStatus, jqXHR){ + + if (callback) { + callback(response, textStatus, jqXHR); + } + + }); } /** @@ -70,7 +70,6 @@ var UserApi = function UserApi() { * @return void */ self.createUsersWithArrayInput = function(body, callback) { - var postBody = JSON.stringify(body); var postBinaryBody = null; @@ -81,7 +80,7 @@ var UserApi = function UserApi() { basePath = basePath.substring(0, basePath.length-1); } - var path = basePath + replaceAll(replaceAll("/user/createWithArray", "\\{format\\}","json")); + var path = basePath + replaceAll(replaceAll("/user/createWithArray", "\\{format\\}","json")); var queryParams = {}; var headerParams = {}; @@ -91,22 +90,22 @@ var UserApi = function UserApi() { - path += createQueryString(queryParams); - - //if (console) { - //console.log('path: ' + path); - //console.log('queryParams: ' + queryParams); - //} + path += createQueryString(queryParams); + var options = {type: "POST", async: true, contentType: "application/json", dataType: "json", data: postBody}; + var request = $.ajax(path, options); + //request.fail(function(jqXHR, textStatus, errorThrown){ + // errorHandler(jqXHR, textStatus, errorThrown); + //}); - - - - apiClient.invokeAPI(path, "POST", queryParams, postBody, postBinaryBody, headerParams, formParams, accept, contentType, authNames, null); - - - - + + request.done(function(response, textStatus, jqXHR){ + + if (callback) { + callback(response, textStatus, jqXHR); + } + + }); } /** @@ -117,7 +116,6 @@ var UserApi = function UserApi() { * @return void */ self.createUsersWithListInput = function(body, callback) { - var postBody = JSON.stringify(body); var postBinaryBody = null; @@ -128,7 +126,7 @@ var UserApi = function UserApi() { basePath = basePath.substring(0, basePath.length-1); } - var path = basePath + replaceAll(replaceAll("/user/createWithList", "\\{format\\}","json")); + var path = basePath + replaceAll(replaceAll("/user/createWithList", "\\{format\\}","json")); var queryParams = {}; var headerParams = {}; @@ -138,22 +136,22 @@ var UserApi = function UserApi() { - path += createQueryString(queryParams); - - //if (console) { - //console.log('path: ' + path); - //console.log('queryParams: ' + queryParams); - //} + path += createQueryString(queryParams); + var options = {type: "POST", async: true, contentType: "application/json", dataType: "json", data: postBody}; + var request = $.ajax(path, options); + //request.fail(function(jqXHR, textStatus, errorThrown){ + // errorHandler(jqXHR, textStatus, errorThrown); + //}); - - - - apiClient.invokeAPI(path, "POST", queryParams, postBody, postBinaryBody, headerParams, formParams, accept, contentType, authNames, null); - - - - + + request.done(function(response, textStatus, jqXHR){ + + if (callback) { + callback(response, textStatus, jqXHR); + } + + }); } /** @@ -165,7 +163,6 @@ var UserApi = function UserApi() { * @return String */ self.loginUser = function(username, password, callback) { - var postBody = null; var postBinaryBody = null; @@ -176,7 +173,7 @@ var UserApi = function UserApi() { basePath = basePath.substring(0, basePath.length-1); } - var path = basePath + replaceAll(replaceAll("/user/login", "\\{format\\}","json")); + var path = basePath + replaceAll(replaceAll("/user/login", "\\{format\\}","json")); var queryParams = {}; var headerParams = {}; @@ -190,41 +187,27 @@ var UserApi = function UserApi() { - path += createQueryString(queryParams); + path += createQueryString(queryParams); - //if (console) { - //console.log('path: ' + path); - //console.log('queryParams: ' + queryParams); - //} - - - - - - //TypeRef returnType = new TypeRef() {}; - //return apiClient.invokeAPI(path, "GET", queryParams, postBody, postBinaryBody, headerParams, formParams, accept, contentType, authNames, returnType); - - var options = {type: "GET", async: true, contentType: "application/json", dataType: "json", data: postBody}; + var options = {type: "GET", async: true, contentType: "application/json", dataType: "json", data: postBody}; var request = $.ajax(path, options); //request.fail(function(jqXHR, textStatus, errorThrown){ // errorHandler(jqXHR, textStatus, errorThrown); //}); - request.done(function(response, textStatus, jqXHR){ - /** - * @returns String - */ - var myResponse = response; - - - callback(myResponse, textStatus, jqXHR); - }); - - - - - + request.done(function(response, textStatus, jqXHR){ + + /** + * @returns String + */ + var myResponse = response; + + if (callback) { + callback(myResponse, textStatus, jqXHR); + } + + }); } /** @@ -234,7 +217,6 @@ var UserApi = function UserApi() { * @return void */ self.logoutUser = function(callback) { - var postBody = null; var postBinaryBody = null; @@ -245,7 +227,7 @@ var UserApi = function UserApi() { basePath = basePath.substring(0, basePath.length-1); } - var path = basePath + replaceAll(replaceAll("/user/logout", "\\{format\\}","json")); + var path = basePath + replaceAll(replaceAll("/user/logout", "\\{format\\}","json")); var queryParams = {}; var headerParams = {}; @@ -255,22 +237,22 @@ var UserApi = function UserApi() { - path += createQueryString(queryParams); - - //if (console) { - //console.log('path: ' + path); - //console.log('queryParams: ' + queryParams); - //} + path += createQueryString(queryParams); + var options = {type: "GET", async: true, contentType: "application/json", dataType: "json", data: postBody}; + var request = $.ajax(path, options); + //request.fail(function(jqXHR, textStatus, errorThrown){ + // errorHandler(jqXHR, textStatus, errorThrown); + //}); - - - - apiClient.invokeAPI(path, "GET", queryParams, postBody, postBinaryBody, headerParams, formParams, accept, contentType, authNames, null); - - - - + + request.done(function(response, textStatus, jqXHR){ + + if (callback) { + callback(response, textStatus, jqXHR); + } + + }); } /** @@ -281,7 +263,6 @@ var UserApi = function UserApi() { * @return User */ self.getUserByName = function(username, callback) { - var postBody = null; var postBinaryBody = null; @@ -299,8 +280,8 @@ var UserApi = function UserApi() { basePath = basePath.substring(0, basePath.length-1); } - var path = basePath + replaceAll(replaceAll("/user/{username}", "\\{format\\}","json") -, "\\{" + "username" + "\\}", apiClient.escapeString(username.toString())); + var path = basePath + replaceAll(replaceAll("/user/{username}", "\\{format\\}","json") +, "\\{" + "username" + "\\}", username.toString()); var queryParams = {}; var headerParams = {}; @@ -310,42 +291,28 @@ var UserApi = function UserApi() { - path += createQueryString(queryParams); + path += createQueryString(queryParams); - //if (console) { - //console.log('path: ' + path); - //console.log('queryParams: ' + queryParams); - //} - - - - - - //TypeRef returnType = new TypeRef() {}; - //return apiClient.invokeAPI(path, "GET", queryParams, postBody, postBinaryBody, headerParams, formParams, accept, contentType, authNames, returnType); - - var options = {type: "GET", async: true, contentType: "application/json", dataType: "json", data: postBody}; + var options = {type: "GET", async: true, contentType: "application/json", dataType: "json", data: postBody}; var request = $.ajax(path, options); //request.fail(function(jqXHR, textStatus, errorThrown){ // errorHandler(jqXHR, textStatus, errorThrown); //}); - request.done(function(response, textStatus, jqXHR){ - /** - * @returns User - */ - - var myResponse = new User(); - myResponse.constructFromObject(response); - - callback(myResponse, textStatus, jqXHR); - }); - - - - - + request.done(function(response, textStatus, jqXHR){ + + /** + * @returns User + */ + + var myResponse = new User(); + myResponse.constructFromObject(response); + if (callback) { + callback(myResponse, textStatus, jqXHR); + } + + }); } /** @@ -357,7 +324,6 @@ var UserApi = function UserApi() { * @return void */ self.updateUser = function(username, body, callback) { - var postBody = JSON.stringify(body); var postBinaryBody = null; @@ -375,8 +341,8 @@ var UserApi = function UserApi() { basePath = basePath.substring(0, basePath.length-1); } - var path = basePath + replaceAll(replaceAll("/user/{username}", "\\{format\\}","json") -, "\\{" + "username" + "\\}", apiClient.escapeString(username.toString())); + var path = basePath + replaceAll(replaceAll("/user/{username}", "\\{format\\}","json") +, "\\{" + "username" + "\\}", username.toString()); var queryParams = {}; var headerParams = {}; @@ -386,22 +352,22 @@ var UserApi = function UserApi() { - path += createQueryString(queryParams); - - //if (console) { - //console.log('path: ' + path); - //console.log('queryParams: ' + queryParams); - //} + path += createQueryString(queryParams); + var options = {type: "PUT", async: true, contentType: "application/json", dataType: "json", data: postBody}; + var request = $.ajax(path, options); + //request.fail(function(jqXHR, textStatus, errorThrown){ + // errorHandler(jqXHR, textStatus, errorThrown); + //}); - - - - apiClient.invokeAPI(path, "PUT", queryParams, postBody, postBinaryBody, headerParams, formParams, accept, contentType, authNames, null); - - - - + + request.done(function(response, textStatus, jqXHR){ + + if (callback) { + callback(response, textStatus, jqXHR); + } + + }); } /** @@ -412,7 +378,6 @@ var UserApi = function UserApi() { * @return void */ self.deleteUser = function(username, callback) { - var postBody = null; var postBinaryBody = null; @@ -430,8 +395,8 @@ var UserApi = function UserApi() { basePath = basePath.substring(0, basePath.length-1); } - var path = basePath + replaceAll(replaceAll("/user/{username}", "\\{format\\}","json") -, "\\{" + "username" + "\\}", apiClient.escapeString(username.toString())); + var path = basePath + replaceAll(replaceAll("/user/{username}", "\\{format\\}","json") +, "\\{" + "username" + "\\}", username.toString()); var queryParams = {}; var headerParams = {}; @@ -441,25 +406,25 @@ var UserApi = function UserApi() { - path += createQueryString(queryParams); - - //if (console) { - //console.log('path: ' + path); - //console.log('queryParams: ' + queryParams); - //} + path += createQueryString(queryParams); + var options = {type: "DELETE", async: true, contentType: "application/json", dataType: "json", data: postBody}; + var request = $.ajax(path, options); + //request.fail(function(jqXHR, textStatus, errorThrown){ + // errorHandler(jqXHR, textStatus, errorThrown); + //}); - - - - apiClient.invokeAPI(path, "DELETE", queryParams, postBody, postBinaryBody, headerParams, formParams, accept, contentType, authNames, null); - - - - + + request.done(function(response, textStatus, jqXHR){ + + if (callback) { + callback(response, textStatus, jqXHR); + } + + }); } - + function replaceAll (haystack, needle, replace) { var result= haystack; @@ -490,4 +455,4 @@ var UserApi = function UserApi() { // export module for Node.js if (typeof module === 'object' && module.exports) { module.exports = UserApi; -} \ No newline at end of file +} diff --git a/samples/client/petstore/javascript/test/api/PetApiTest.js b/samples/client/petstore/javascript/test/api/PetApiTest.js new file mode 100644 index 00000000000..122dde3982f --- /dev/null +++ b/samples/client/petstore/javascript/test/api/PetApiTest.js @@ -0,0 +1,183 @@ +if (typeof module === 'object' && module.exports) { + var expect = require('expect.js'); + var requireApiWithMocks = require('../helper.js').requireApiWithMocks; + var PetApi = requireApiWithMocks('PetApi'); + var Pet = require('../../src/model/Pet'); + var Category = require('../../src/model/Category'); + var Tag = require('../../src/model/Tag'); +} + +var api; + +beforeEach(function() { + api = new PetApi(); +}); + +var createRandomPet = function() { + var id = new Date().getTime(); + var pet = new Pet(); + pet.setId(id); + pet.setName("gorilla" + id); + + var category = new Category(); + category.setName("really-happy"); + pet.setCategory(category); + + pet.setStatus('available'); + var photos = ["http://foo.bar.com/1", "http://foo.bar.com/2"]; + pet.setPhotoUrls(photos); + + return pet; +}; + +describe('PetApi', function() { + it('should create and get pet', function (done) { + var pet = createRandomPet(); + api.addPet(pet); + + api.getPetById(pet.id, function(fetched, textStatus, jqXHR) { + expect(textStatus).to.be('success'); + expect(fetched).to.be.ok(); + expect(fetched.id).to.be(pet.id); + expect(fetched.getCategory()).to.be.ok(); + expect(fetched.getCategory().getName()).to.be(pet.getCategory().getName()); + done(); + }); + }); +}); + +/* + @Test + public void testUpdatePet() throws Exception { + Pet pet = createRandomPet(); + pet.setName("programmer"); + + api.updatePet(pet); + + Pet fetched = api.getPetById(pet.getId()); + assertNotNull(fetched); + assertEquals(pet.getId(), fetched.getId()); + assertNotNull(fetched.getCategory()); + assertEquals(fetched.getCategory().getName(), pet.getCategory().getName()); + } + + @Test + public void testFindPetsByStatus() throws Exception { + Pet pet = createRandomPet(); + pet.setName("programmer"); + pet.setStatus(Pet.StatusEnum.AVAILABLE); + + api.updatePet(pet); + + List pets = api.findPetsByStatus(Arrays.asList(new String[]{"available"})); + assertNotNull(pets); + + boolean found = false; + for (Pet fetched : pets) { + if (fetched.getId().equals(pet.getId())) { + found = true; + break; + } + } + + assertTrue(found); + } + + @Test + public void testFindPetsByTags() throws Exception { + Pet pet = createRandomPet(); + pet.setName("monster"); + pet.setStatus(Pet.StatusEnum.AVAILABLE); + + List tags = new ArrayList(); + Tag tag1 = new Tag(); + tag1.setName("friendly"); + tags.add(tag1); + pet.setTags(tags); + + api.updatePet(pet); + + List pets = api.findPetsByTags(Arrays.asList(new String[]{"friendly"})); + assertNotNull(pets); + + boolean found = false; + for (Pet fetched : pets) { + if (fetched.getId().equals(pet.getId())) { + found = true; + break; + } + } + assertTrue(found); + } + + @Test + public void testUpdatePetWithForm() throws Exception { + Pet pet = createRandomPet(); + pet.setName("frank"); + api.addPet(pet); + + Pet fetched = api.getPetById(pet.getId()); + + api.updatePetWithForm(String.valueOf(fetched.getId()), "furt", null); + Pet updated = api.getPetById(fetched.getId()); + + assertEquals(updated.getName(), "furt"); + } + + @Test + public void testDeletePet() throws Exception { + Pet pet = createRandomPet(); + api.addPet(pet); + + Pet fetched = api.getPetById(pet.getId()); + api.deletePet(fetched.getId(), null); + + try { + fetched = api.getPetById(fetched.getId()); + fail("expected an error"); + } catch (ApiException e) { + assertEquals(404, e.getCode()); + } + } + + @Test + public void testUploadFile() throws Exception { + Pet pet = createRandomPet(); + api.addPet(pet); + + File file = new File("hello.txt"); + BufferedWriter writer = new BufferedWriter(new FileWriter(file)); + writer.write("Hello world!"); + writer.close(); + + api.uploadFile(pet.getId(), "a test file", new File(file.getAbsolutePath())); + } + + @Test + public void testEqualsAndHashCode() { + Pet pet1 = new Pet(); + Pet pet2 = new Pet(); + assertTrue(pet1.equals(pet2)); + assertTrue(pet2.equals(pet1)); + assertTrue(pet1.hashCode() == pet2.hashCode()); + assertTrue(pet1.equals(pet1)); + assertTrue(pet1.hashCode() == pet1.hashCode()); + + pet2.setName("really-happy"); + pet2.setPhotoUrls(Arrays.asList(new String[]{"http://foo.bar.com/1", "http://foo.bar.com/2"})); + assertFalse(pet1.equals(pet2)); + assertFalse(pet2.equals(pet1)); + assertFalse(pet1.hashCode() == (pet2.hashCode())); + assertTrue(pet2.equals(pet2)); + assertTrue(pet2.hashCode() == pet2.hashCode()); + + pet1.setName("really-happy"); + pet1.setPhotoUrls(Arrays.asList(new String[]{"http://foo.bar.com/1", "http://foo.bar.com/2"})); + assertTrue(pet1.equals(pet2)); + assertTrue(pet2.equals(pet1)); + assertTrue(pet1.hashCode() == pet2.hashCode()); + assertTrue(pet1.equals(pet1)); + assertTrue(pet1.hashCode() == pet1.hashCode()); + } +} +*/ diff --git a/samples/client/petstore/javascript/test/helper.js b/samples/client/petstore/javascript/test/helper.js index a1b798f325f..018b6428af6 100644 --- a/samples/client/petstore/javascript/test/helper.js +++ b/samples/client/petstore/javascript/test/helper.js @@ -10,10 +10,10 @@ $.ajaxSettings.xhr = function() { return new XMLHttpRequest(); }; -var requireWithMocks = function(path) { - return mockrequire(path, { +var requireApiWithMocks = function(path) { + return mockrequire('../src/api/' + path, { 'jquery': $ }); }; -exports.requireWithMocks = requireWithMocks; +exports.requireApiWithMocks = requireApiWithMocks; diff --git a/samples/client/petstore/javascript/test/run_tests.html b/samples/client/petstore/javascript/test/run_tests.html index 9f2d78ad0b8..d4b9e6c9f65 100644 --- a/samples/client/petstore/javascript/test/run_tests.html +++ b/samples/client/petstore/javascript/test/run_tests.html @@ -11,19 +11,19 @@ - - - - - - - + + + + + + + From a58f755a6a596261857b807d8ddddb9fed9df282 Mon Sep 17 00:00:00 2001 From: xhh Date: Thu, 17 Dec 2015 21:19:28 +0800 Subject: [PATCH 203/211] Escape path parameters with encodeURIComponent and tweak the test command --- .../src/main/resources/Javascript/api.mustache | 2 +- .../src/main/resources/Javascript/package.mustache | 2 +- samples/client/petstore/javascript/package.json | 2 +- samples/client/petstore/javascript/pom.xml | 4 ++-- samples/client/petstore/javascript/src/api/PetApi.js | 8 ++++---- samples/client/petstore/javascript/src/api/StoreApi.js | 4 ++-- samples/client/petstore/javascript/src/api/UserApi.js | 6 +++--- 7 files changed, 14 insertions(+), 14 deletions(-) diff --git a/modules/swagger-codegen/src/main/resources/Javascript/api.mustache b/modules/swagger-codegen/src/main/resources/Javascript/api.mustache index 21734396695..0236f6a61be 100644 --- a/modules/swagger-codegen/src/main/resources/Javascript/api.mustache +++ b/modules/swagger-codegen/src/main/resources/Javascript/api.mustache @@ -42,7 +42,7 @@ var {{classname}} = function {{classname}}() { } var {{localVariablePrefix}}path = basePath + replaceAll(replaceAll("{{{path}}}", "\\{format\\}","json"){{#pathParams}} -, "\\{" + "{{baseName}}" + "\\}", {{localVariablePrefix}}{{{paramName}}}.toString(){{/pathParams}}); +, "\\{" + "{{baseName}}" + "\\}", encodeURIComponent({{localVariablePrefix}}{{{paramName}}}.toString()){{/pathParams}}); var queryParams = {}; var headerParams = {}; diff --git a/modules/swagger-codegen/src/main/resources/Javascript/package.mustache b/modules/swagger-codegen/src/main/resources/Javascript/package.mustache index 53bbed30be9..c77ee835709 100644 --- a/modules/swagger-codegen/src/main/resources/Javascript/package.mustache +++ b/modules/swagger-codegen/src/main/resources/Javascript/package.mustache @@ -5,7 +5,7 @@ "license": "{{{projectLicenseName}}}",{{/projectLicenseName}} "main": "{{sourceFolder}}/index.js", "scripts": { - "test": "./node_modules/mocha/bin/mocha" + "test": "./node_modules/mocha/bin/mocha --recursive" }, "dependencies": { "jquery": "~2.1.4" diff --git a/samples/client/petstore/javascript/package.json b/samples/client/petstore/javascript/package.json index 156300cf760..6810fd633de 100644 --- a/samples/client/petstore/javascript/package.json +++ b/samples/client/petstore/javascript/package.json @@ -5,7 +5,7 @@ "license": "Apache 2.0", "main": "src/index.js", "scripts": { - "test": "./node_modules/mocha/bin/mocha" + "test": "./node_modules/mocha/bin/mocha --recursive" }, "dependencies": { "jquery": "~2.1.4" diff --git a/samples/client/petstore/javascript/pom.xml b/samples/client/petstore/javascript/pom.xml index 82d13ff17ca..b7a17c92b79 100644 --- a/samples/client/petstore/javascript/pom.xml +++ b/samples/client/petstore/javascript/pom.xml @@ -32,9 +32,9 @@ exec - mocha + npm - --recursive + test diff --git a/samples/client/petstore/javascript/src/api/PetApi.js b/samples/client/petstore/javascript/src/api/PetApi.js index fcc769d2f26..3d5eb1dc9e5 100644 --- a/samples/client/petstore/javascript/src/api/PetApi.js +++ b/samples/client/petstore/javascript/src/api/PetApi.js @@ -262,7 +262,7 @@ var PetApi = function PetApi() { } var path = basePath + replaceAll(replaceAll("/pet/{petId}", "\\{format\\}","json") -, "\\{" + "petId" + "\\}", petId.toString()); +, "\\{" + "petId" + "\\}", encodeURIComponent(petId.toString())); var queryParams = {}; var headerParams = {}; @@ -329,7 +329,7 @@ var PetApi = function PetApi() { } var path = basePath + replaceAll(replaceAll("/pet/{petId}", "\\{format\\}","json") -, "\\{" + "petId" + "\\}", petId.toString()); +, "\\{" + "petId" + "\\}", encodeURIComponent(petId.toString())); var queryParams = {}; var headerParams = {}; @@ -393,7 +393,7 @@ var PetApi = function PetApi() { } var path = basePath + replaceAll(replaceAll("/pet/{petId}", "\\{format\\}","json") -, "\\{" + "petId" + "\\}", petId.toString()); +, "\\{" + "petId" + "\\}", encodeURIComponent(petId.toString())); var queryParams = {}; var headerParams = {}; @@ -456,7 +456,7 @@ var PetApi = function PetApi() { } var path = basePath + replaceAll(replaceAll("/pet/{petId}/uploadImage", "\\{format\\}","json") -, "\\{" + "petId" + "\\}", petId.toString()); +, "\\{" + "petId" + "\\}", encodeURIComponent(petId.toString())); var queryParams = {}; var headerParams = {}; diff --git a/samples/client/petstore/javascript/src/api/StoreApi.js b/samples/client/petstore/javascript/src/api/StoreApi.js index a05bf10f179..e52a3105964 100644 --- a/samples/client/petstore/javascript/src/api/StoreApi.js +++ b/samples/client/petstore/javascript/src/api/StoreApi.js @@ -154,7 +154,7 @@ var StoreApi = function StoreApi() { } var path = basePath + replaceAll(replaceAll("/store/order/{orderId}", "\\{format\\}","json") -, "\\{" + "orderId" + "\\}", orderId.toString()); +, "\\{" + "orderId" + "\\}", encodeURIComponent(orderId.toString())); var queryParams = {}; var headerParams = {}; @@ -219,7 +219,7 @@ var StoreApi = function StoreApi() { } var path = basePath + replaceAll(replaceAll("/store/order/{orderId}", "\\{format\\}","json") -, "\\{" + "orderId" + "\\}", orderId.toString()); +, "\\{" + "orderId" + "\\}", encodeURIComponent(orderId.toString())); var queryParams = {}; var headerParams = {}; diff --git a/samples/client/petstore/javascript/src/api/UserApi.js b/samples/client/petstore/javascript/src/api/UserApi.js index 32dcafbfc7a..148e6171ed4 100644 --- a/samples/client/petstore/javascript/src/api/UserApi.js +++ b/samples/client/petstore/javascript/src/api/UserApi.js @@ -306,7 +306,7 @@ var UserApi = function UserApi() { } var path = basePath + replaceAll(replaceAll("/user/{username}", "\\{format\\}","json") -, "\\{" + "username" + "\\}", username.toString()); +, "\\{" + "username" + "\\}", encodeURIComponent(username.toString())); var queryParams = {}; var headerParams = {}; @@ -372,7 +372,7 @@ var UserApi = function UserApi() { } var path = basePath + replaceAll(replaceAll("/user/{username}", "\\{format\\}","json") -, "\\{" + "username" + "\\}", username.toString()); +, "\\{" + "username" + "\\}", encodeURIComponent(username.toString())); var queryParams = {}; var headerParams = {}; @@ -431,7 +431,7 @@ var UserApi = function UserApi() { } var path = basePath + replaceAll(replaceAll("/user/{username}", "\\{format\\}","json") -, "\\{" + "username" + "\\}", username.toString()); +, "\\{" + "username" + "\\}", encodeURIComponent(username.toString())); var queryParams = {}; var headerParams = {}; From 1b0294dac0258bc7c179883d1f41174a7ef628fc Mon Sep 17 00:00:00 2001 From: xhh Date: Thu, 17 Dec 2015 21:29:05 +0800 Subject: [PATCH 204/211] Javascript: fix the constructFromObject issue Closes #1721 Also fixed indentations in models --- .../main/resources/Javascript/model.mustache | 49 +++--- .../petstore/javascript/src/model/Category.js | 55 ++++--- .../petstore/javascript/src/model/Order.js | 121 +++++++------- .../petstore/javascript/src/model/Pet.js | 125 +++++++------- .../petstore/javascript/src/model/Tag.js | 55 ++++--- .../petstore/javascript/src/model/User.js | 153 +++++++++--------- 6 files changed, 288 insertions(+), 270 deletions(-) diff --git a/modules/swagger-codegen/src/main/resources/Javascript/model.mustache b/modules/swagger-codegen/src/main/resources/Javascript/model.mustache index 8b021a3badd..0588d03a8c1 100644 --- a/modules/swagger-codegen/src/main/resources/Javascript/model.mustache +++ b/modules/swagger-codegen/src/main/resources/Javascript/model.mustache @@ -12,34 +12,37 @@ if (typeof module === 'object' && module.exports) { //export module if ( typeof define === "function" && define.amd ) { - define('{{classname}}', ['jquery'{{#vars}}{{^isPrimitiveType}}{{^-last}}, {{/-last}}'{{datatypeWithEnum}}'{{/isPrimitiveType}}{{/vars}}], - function(${{#vars}}{{^isPrimitiveType}}{{^-last}}, {{/-last}}{{datatypeWithEnum}}{{/isPrimitiveType}}{{/vars}}) { - return {{classname}}; - }); + define('{{classname}}', ['jquery'{{#vars}}{{^isPrimitiveType}}{{^-last}}, {{/-last}}'{{datatypeWithEnum}}'{{/isPrimitiveType}}{{/vars}}], + function(${{#vars}}{{^isPrimitiveType}}{{^-last}}, {{/-last}}{{datatypeWithEnum}}{{/isPrimitiveType}}{{/vars}}) { + return {{classname}}; + }); } {{#description}}/** * {{description}} **/{{/description}} var {{classname}} = function {{classname}}({{#mandatory}}{{this}}{{^-last}}, {{/-last}}{{/mandatory}}) { {{#parent}}/* extends {{{parent}}}*/{{/parent}} - var self = this; - {{#vars}} - /**{{#description}} - * {{{description}}}{{/description}} - * datatype: {{{datatypeWithEnum}}}{{#required}} - * required{{/required}}{{#minimum}} - * minimum: {{minimum}}{{/minimum}}{{#maximum}} - * maximum: {{maximum}}{{/maximum}} - **/ - self.{{name}} = {{#required}}{{name}}{{/required}}{{^required}}{{{defaultValue}}}{{/required}}; - {{/vars}} - - self.constructFromObject = function(data) { - {{#vars}} - self.{{name}}{{{defaultValueWithParam}}} - {{/vars}} - } + var self = this; + {{#vars}} + /**{{#description}} + * {{{description}}}{{/description}} + * datatype: {{{datatypeWithEnum}}}{{#required}} + * required{{/required}}{{#minimum}} + * minimum: {{minimum}}{{/minimum}}{{#maximum}} + * maximum: {{maximum}}{{/maximum}} + **/ + self.{{name}} = {{#required}}{{name}}{{/required}}{{^required}}{{{defaultValue}}}{{/required}}; + {{/vars}} + self.constructFromObject = function(data) { + if (!data) { + return; + } + {{#vars}} + self.{{name}}{{{defaultValueWithParam}}} + {{/vars}} + } + {{#vars}} /**{{#description}} * get {{{description}}}{{/description}}{{#minimum}} @@ -50,7 +53,7 @@ var {{classname}} = function {{classname}}({{#mandatory}}{{this}}{{^-last}}, {{/ self.{{getter}} = function() { return self.{{name}}; } - + /**{{#description}} * set {{{description}}}{{/description}} * @param {{=<% %>=}}{<% datatypeWithEnum %>}<%={{ }}=%> {{name}} @@ -61,7 +64,7 @@ var {{classname}} = function {{classname}}({{#mandatory}}{{this}}{{^-last}}, {{/ {{/vars}} self.toJson = function () { - return JSON.stringify(self); + return JSON.stringify(self); } } diff --git a/samples/client/petstore/javascript/src/model/Category.js b/samples/client/petstore/javascript/src/model/Category.js index a87f91354a8..ff40497a61a 100644 --- a/samples/client/petstore/javascript/src/model/Category.js +++ b/samples/client/petstore/javascript/src/model/Category.js @@ -9,35 +9,38 @@ if (typeof module === 'object' && module.exports) { //export module if ( typeof define === "function" && define.amd ) { - define('Category', ['jquery'], - function($) { - return Category; - }); + define('Category', ['jquery'], + function($) { + return Category; + }); } var Category = function Category() { - var self = this; - - /** - * datatype: Integer - **/ - self.id = null; - - /** - * datatype: String - **/ - self.name = null; - + var self = this; - self.constructFromObject = function(data) { - - self.id = data.id; - - self.name = data.name; - - } + /** + * datatype: Integer + **/ + self.id = null; + /** + * datatype: String + **/ + self.name = null; + + + self.constructFromObject = function(data) { + if (!data) { + return; + } + + self.id = data.id; + + self.name = data.name; + + } + /** * @return {Integer} @@ -45,7 +48,7 @@ var Category = function Category() { self.getId = function() { return self.id; } - + /** * @param {Integer} id **/ @@ -59,7 +62,7 @@ var Category = function Category() { self.getName = function() { return self.name; } - + /** * @param {String} name **/ @@ -69,7 +72,7 @@ var Category = function Category() { self.toJson = function () { - return JSON.stringify(self); + return JSON.stringify(self); } } diff --git a/samples/client/petstore/javascript/src/model/Order.js b/samples/client/petstore/javascript/src/model/Order.js index 61120e577d6..3cf2335b535 100644 --- a/samples/client/petstore/javascript/src/model/Order.js +++ b/samples/client/petstore/javascript/src/model/Order.js @@ -37,64 +37,67 @@ var StatusEnum = function StatusEnum() { //export module if ( typeof define === "function" && define.amd ) { - define('Order', ['jquery'], - function($) { - return Order; - }); + define('Order', ['jquery'], + function($) { + return Order; + }); } var Order = function Order() { - var self = this; - - /** - * datatype: Integer - **/ - self.id = null; - - /** - * datatype: Integer - **/ - self.petId = null; - - /** - * datatype: Integer - **/ - self.quantity = null; - - /** - * datatype: Date - **/ - self.shipDate = null; - - /** - * Order Status - * datatype: StatusEnum - **/ - self.status = null; - - /** - * datatype: Boolean - **/ - self.complete = null; - + var self = this; - self.constructFromObject = function(data) { - - self.id = data.id; - - self.petId = data.petId; - - self.quantity = data.quantity; - - self.shipDate = data.shipDate; - - self.status = data.status; - - self.complete = data.complete; - - } + /** + * datatype: Integer + **/ + self.id = null; + /** + * datatype: Integer + **/ + self.petId = null; + + /** + * datatype: Integer + **/ + self.quantity = null; + + /** + * datatype: Date + **/ + self.shipDate = null; + + /** + * Order Status + * datatype: StatusEnum + **/ + self.status = null; + + /** + * datatype: Boolean + **/ + self.complete = null; + + + self.constructFromObject = function(data) { + if (!data) { + return; + } + + self.id = data.id; + + self.petId = data.petId; + + self.quantity = data.quantity; + + self.shipDate = data.shipDate; + + self.status = data.status; + + self.complete = data.complete; + + } + /** * @return {Integer} @@ -102,7 +105,7 @@ var Order = function Order() { self.getId = function() { return self.id; } - + /** * @param {Integer} id **/ @@ -116,7 +119,7 @@ var Order = function Order() { self.getPetId = function() { return self.petId; } - + /** * @param {Integer} petId **/ @@ -130,7 +133,7 @@ var Order = function Order() { self.getQuantity = function() { return self.quantity; } - + /** * @param {Integer} quantity **/ @@ -144,7 +147,7 @@ var Order = function Order() { self.getShipDate = function() { return self.shipDate; } - + /** * @param {Date} shipDate **/ @@ -159,7 +162,7 @@ var Order = function Order() { self.getStatus = function() { return self.status; } - + /** * set Order Status * @param {StatusEnum} status @@ -174,7 +177,7 @@ var Order = function Order() { self.getComplete = function() { return self.complete; } - + /** * @param {Boolean} complete **/ @@ -184,7 +187,7 @@ var Order = function Order() { self.toJson = function () { - return JSON.stringify(self); + return JSON.stringify(self); } } diff --git a/samples/client/petstore/javascript/src/model/Pet.js b/samples/client/petstore/javascript/src/model/Pet.js index 7a25a1d5fdd..25ae2e951c8 100644 --- a/samples/client/petstore/javascript/src/model/Pet.js +++ b/samples/client/petstore/javascript/src/model/Pet.js @@ -39,66 +39,69 @@ var StatusEnum = function StatusEnum() { //export module if ( typeof define === "function" && define.amd ) { - define('Pet', ['jquery', 'Category', 'Array'], - function($, Category, Array) { - return Pet; - }); + define('Pet', ['jquery', 'Category', 'Array'], + function($, Category, Array) { + return Pet; + }); } var Pet = function Pet(photoUrls, name) { - var self = this; - - /** - * datatype: Integer - **/ - self.id = null; - - /** - * datatype: Category - **/ - self.category = new Category(); - - /** - * datatype: String - * required - **/ - self.name = name; - - /** - * datatype: Array - * required - **/ - self.photoUrls = photoUrls; - - /** - * datatype: Array - **/ - self.tags = []; - - /** - * pet status in the store - * datatype: StatusEnum - **/ - self.status = null; - + var self = this; - self.constructFromObject = function(data) { - - self.id = data.id; - - self.category.constructFromObject(data.category); - - self.name = data.name; - - self.photoUrls = new Array(); - - self.tags = new Array(); - - self.status = data.status; - - } + /** + * datatype: Integer + **/ + self.id = null; + /** + * datatype: Category + **/ + self.category = new Category(); + + /** + * datatype: String + * required + **/ + self.name = name; + + /** + * datatype: Array + * required + **/ + self.photoUrls = photoUrls; + + /** + * datatype: Array + **/ + self.tags = []; + + /** + * pet status in the store + * datatype: StatusEnum + **/ + self.status = null; + + + self.constructFromObject = function(data) { + if (!data) { + return; + } + + self.id = data.id; + + self.category.constructFromObject(data.category); + + self.name = data.name; + + self.photoUrls = new Array(); + + self.tags = new Array(); + + self.status = data.status; + + } + /** * @return {Integer} @@ -106,7 +109,7 @@ var Pet = function Pet(photoUrls, name) { self.getId = function() { return self.id; } - + /** * @param {Integer} id **/ @@ -120,7 +123,7 @@ var Pet = function Pet(photoUrls, name) { self.getCategory = function() { return self.category; } - + /** * @param {Category} category **/ @@ -134,7 +137,7 @@ var Pet = function Pet(photoUrls, name) { self.getName = function() { return self.name; } - + /** * @param {String} name **/ @@ -148,7 +151,7 @@ var Pet = function Pet(photoUrls, name) { self.getPhotoUrls = function() { return self.photoUrls; } - + /** * @param {Array} photoUrls **/ @@ -162,7 +165,7 @@ var Pet = function Pet(photoUrls, name) { self.getTags = function() { return self.tags; } - + /** * @param {Array} tags **/ @@ -177,7 +180,7 @@ var Pet = function Pet(photoUrls, name) { self.getStatus = function() { return self.status; } - + /** * set pet status in the store * @param {StatusEnum} status @@ -188,7 +191,7 @@ var Pet = function Pet(photoUrls, name) { self.toJson = function () { - return JSON.stringify(self); + return JSON.stringify(self); } } diff --git a/samples/client/petstore/javascript/src/model/Tag.js b/samples/client/petstore/javascript/src/model/Tag.js index 4801da71e41..0fa97bd8c78 100644 --- a/samples/client/petstore/javascript/src/model/Tag.js +++ b/samples/client/petstore/javascript/src/model/Tag.js @@ -9,35 +9,38 @@ if (typeof module === 'object' && module.exports) { //export module if ( typeof define === "function" && define.amd ) { - define('Tag', ['jquery'], - function($) { - return Tag; - }); + define('Tag', ['jquery'], + function($) { + return Tag; + }); } var Tag = function Tag() { - var self = this; - - /** - * datatype: Integer - **/ - self.id = null; - - /** - * datatype: String - **/ - self.name = null; - + var self = this; - self.constructFromObject = function(data) { - - self.id = data.id; - - self.name = data.name; - - } + /** + * datatype: Integer + **/ + self.id = null; + /** + * datatype: String + **/ + self.name = null; + + + self.constructFromObject = function(data) { + if (!data) { + return; + } + + self.id = data.id; + + self.name = data.name; + + } + /** * @return {Integer} @@ -45,7 +48,7 @@ var Tag = function Tag() { self.getId = function() { return self.id; } - + /** * @param {Integer} id **/ @@ -59,7 +62,7 @@ var Tag = function Tag() { self.getName = function() { return self.name; } - + /** * @param {String} name **/ @@ -69,7 +72,7 @@ var Tag = function Tag() { self.toJson = function () { - return JSON.stringify(self); + return JSON.stringify(self); } } diff --git a/samples/client/petstore/javascript/src/model/User.js b/samples/client/petstore/javascript/src/model/User.js index 6d32676a921..632208a523c 100644 --- a/samples/client/petstore/javascript/src/model/User.js +++ b/samples/client/petstore/javascript/src/model/User.js @@ -9,78 +9,81 @@ if (typeof module === 'object' && module.exports) { //export module if ( typeof define === "function" && define.amd ) { - define('User', ['jquery'], - function($) { - return User; - }); + define('User', ['jquery'], + function($) { + return User; + }); } var User = function User() { - var self = this; - - /** - * datatype: Integer - **/ - self.id = null; - - /** - * datatype: String - **/ - self.username = null; - - /** - * datatype: String - **/ - self.firstName = null; - - /** - * datatype: String - **/ - self.lastName = null; - - /** - * datatype: String - **/ - self.email = null; - - /** - * datatype: String - **/ - self.password = null; - - /** - * datatype: String - **/ - self.phone = null; - - /** - * User Status - * datatype: Integer - **/ - self.userStatus = null; - + var self = this; - self.constructFromObject = function(data) { - - self.id = data.id; - - self.username = data.username; - - self.firstName = data.firstName; - - self.lastName = data.lastName; - - self.email = data.email; - - self.password = data.password; - - self.phone = data.phone; - - self.userStatus = data.userStatus; - - } + /** + * datatype: Integer + **/ + self.id = null; + /** + * datatype: String + **/ + self.username = null; + + /** + * datatype: String + **/ + self.firstName = null; + + /** + * datatype: String + **/ + self.lastName = null; + + /** + * datatype: String + **/ + self.email = null; + + /** + * datatype: String + **/ + self.password = null; + + /** + * datatype: String + **/ + self.phone = null; + + /** + * User Status + * datatype: Integer + **/ + self.userStatus = null; + + + self.constructFromObject = function(data) { + if (!data) { + return; + } + + self.id = data.id; + + self.username = data.username; + + self.firstName = data.firstName; + + self.lastName = data.lastName; + + self.email = data.email; + + self.password = data.password; + + self.phone = data.phone; + + self.userStatus = data.userStatus; + + } + /** * @return {Integer} @@ -88,7 +91,7 @@ var User = function User() { self.getId = function() { return self.id; } - + /** * @param {Integer} id **/ @@ -102,7 +105,7 @@ var User = function User() { self.getUsername = function() { return self.username; } - + /** * @param {String} username **/ @@ -116,7 +119,7 @@ var User = function User() { self.getFirstName = function() { return self.firstName; } - + /** * @param {String} firstName **/ @@ -130,7 +133,7 @@ var User = function User() { self.getLastName = function() { return self.lastName; } - + /** * @param {String} lastName **/ @@ -144,7 +147,7 @@ var User = function User() { self.getEmail = function() { return self.email; } - + /** * @param {String} email **/ @@ -158,7 +161,7 @@ var User = function User() { self.getPassword = function() { return self.password; } - + /** * @param {String} password **/ @@ -172,7 +175,7 @@ var User = function User() { self.getPhone = function() { return self.phone; } - + /** * @param {String} phone **/ @@ -187,7 +190,7 @@ var User = function User() { self.getUserStatus = function() { return self.userStatus; } - + /** * set User Status * @param {Integer} userStatus @@ -198,7 +201,7 @@ var User = function User() { self.toJson = function () { - return JSON.stringify(self); + return JSON.stringify(self); } } From 1777124e62d45ad30b635ffd39a92337e6f850b8 Mon Sep 17 00:00:00 2001 From: xhh Date: Thu, 17 Dec 2015 21:37:04 +0800 Subject: [PATCH 205/211] Javascript: remove call to `apiClietn.parameterToString` --- .../src/main/resources/Javascript/api.mustache | 4 ++-- samples/client/petstore/javascript/src/api/PetApi.js | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/modules/swagger-codegen/src/main/resources/Javascript/api.mustache b/modules/swagger-codegen/src/main/resources/Javascript/api.mustache index 0236f6a61be..9957fc4e2c5 100644 --- a/modules/swagger-codegen/src/main/resources/Javascript/api.mustache +++ b/modules/swagger-codegen/src/main/resources/Javascript/api.mustache @@ -42,7 +42,7 @@ var {{classname}} = function {{classname}}() { } var {{localVariablePrefix}}path = basePath + replaceAll(replaceAll("{{{path}}}", "\\{format\\}","json"){{#pathParams}} -, "\\{" + "{{baseName}}" + "\\}", encodeURIComponent({{localVariablePrefix}}{{{paramName}}}.toString()){{/pathParams}}); +, "\\{" + "{{baseName}}" + "\\}", encodeURIComponent({{{paramName}}}.toString()){{/pathParams}}); var queryParams = {}; var headerParams = {}; @@ -52,7 +52,7 @@ var {{classname}} = function {{classname}}() { queryParams.{{baseName}} = {{paramName}}; {{/queryParams}} {{#headerParams}}if ({{paramName}} != null) - {{localVariablePrefix}}headerParams.put("{{baseName}}", {{localVariablePrefix}}apiClient.parameterToString({{paramName}})); + {{localVariablePrefix}}headerParams.put("{{baseName}}", {{paramName}}); {{/headerParams}} {{#formParams}}if ({{paramName}} != null) {{localVariablePrefix}}formParams.put("{{baseName}}", {{paramName}}); diff --git a/samples/client/petstore/javascript/src/api/PetApi.js b/samples/client/petstore/javascript/src/api/PetApi.js index 3d5eb1dc9e5..3b6d9c5b4c6 100644 --- a/samples/client/petstore/javascript/src/api/PetApi.js +++ b/samples/client/petstore/javascript/src/api/PetApi.js @@ -401,7 +401,7 @@ var PetApi = function PetApi() { if (apiKey != null) - headerParams.put("api_key", apiClient.parameterToString(apiKey)); + headerParams.put("api_key", apiKey); From 5b0b759e4ec0ab20933787cba675884ed80abbf1 Mon Sep 17 00:00:00 2001 From: Tony Tam Date: Fri, 18 Dec 2015 08:12:15 -0500 Subject: [PATCH 206/211] added enum class support --- .../java/io/swagger/codegen/CodegenModel.java | 5 +- .../io/swagger/codegen/DefaultCodegen.java | 4 ++ .../resources/Java/enumOuterClass.mustache | 3 + .../src/main/resources/Java/model.mustache | 58 +------------------ .../src/main/resources/Java/pojo.mustache | 56 ++++++++++++++++++ 5 files changed, 68 insertions(+), 58 deletions(-) create mode 100644 modules/swagger-codegen/src/main/resources/Java/enumOuterClass.mustache create mode 100644 modules/swagger-codegen/src/main/resources/Java/pojo.mustache diff --git a/modules/swagger-codegen/src/main/java/io/swagger/codegen/CodegenModel.java b/modules/swagger-codegen/src/main/java/io/swagger/codegen/CodegenModel.java index 3e2ad6afb2c..76d88e0eafe 100644 --- a/modules/swagger-codegen/src/main/java/io/swagger/codegen/CodegenModel.java +++ b/modules/swagger-codegen/src/main/java/io/swagger/codegen/CodegenModel.java @@ -13,11 +13,12 @@ public class CodegenModel { public String unescapedDescription; public String defaultValue; public List vars = new ArrayList(); - + public List allowableValues; + // list of all required parameters public Set mandatory = new HashSet(); public Set imports = new HashSet(); - public Boolean hasVars, emptyVars, hasMoreModels, hasEnums; + public Boolean hasVars, emptyVars, hasMoreModels, hasEnums, isEnum; public ExternalDocs externalDocs; } diff --git a/modules/swagger-codegen/src/main/java/io/swagger/codegen/DefaultCodegen.java b/modules/swagger-codegen/src/main/java/io/swagger/codegen/DefaultCodegen.java index d0af0316811..e11e38691ef 100644 --- a/modules/swagger-codegen/src/main/java/io/swagger/codegen/DefaultCodegen.java +++ b/modules/swagger-codegen/src/main/java/io/swagger/codegen/DefaultCodegen.java @@ -837,6 +837,10 @@ public class DefaultCodegen { addVars(m, properties, required); } else { ModelImpl impl = (ModelImpl) model; + if(impl.getEnum() != null && impl.getEnum().size() > 0) { + m.isEnum = true; + m.allowableValues = impl.getEnum(); + } if (impl.getAdditionalProperties() != null) { MapProperty mapProperty = new MapProperty(impl.getAdditionalProperties()); addParentContainer(m, name, mapProperty); diff --git a/modules/swagger-codegen/src/main/resources/Java/enumOuterClass.mustache b/modules/swagger-codegen/src/main/resources/Java/enumOuterClass.mustache new file mode 100644 index 00000000000..7aea7b92f22 --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/Java/enumOuterClass.mustache @@ -0,0 +1,3 @@ +public enum {{classname}} { + {{#allowableValues}}{{.}}{{^-last}}, {{/-last}}{{/allowableValues}} +} \ No newline at end of file diff --git a/modules/swagger-codegen/src/main/resources/Java/model.mustache b/modules/swagger-codegen/src/main/resources/Java/model.mustache index ac27bca08de..b62cb983281 100644 --- a/modules/swagger-codegen/src/main/resources/Java/model.mustache +++ b/modules/swagger-codegen/src/main/resources/Java/model.mustache @@ -16,61 +16,7 @@ import com.fasterxml.jackson.annotation.*; /** * {{description}} **/{{/description}} -@ApiModel(description = "{{{description}}}") -{{>generatedAnnotation}} -public class {{classname}} {{#parent}}extends {{{parent}}}{{/parent}} {{#serializableModel}}implements Serializable{{/serializableModel}} { - {{#vars}}{{#isEnum}} - -{{>enumClass}}{{/isEnum}}{{#items.isEnum}}{{#items}} - -{{>enumClass}}{{/items}}{{/items.isEnum}} - private {{{datatypeWithEnum}}} {{name}} = {{{defaultValue}}};{{/vars}} - - {{#vars}} - /**{{#description}} - * {{{description}}}{{/description}}{{#minimum}} - * minimum: {{minimum}}{{/minimum}}{{#maximum}} - * maximum: {{maximum}}{{/maximum}} - **/ - @ApiModelProperty({{#required}}required = {{required}}, {{/required}}value = "{{{description}}}") - @JsonProperty("{{baseName}}") - public {{{datatypeWithEnum}}} {{getter}}() { - return {{name}}; - } - public void {{setter}}({{{datatypeWithEnum}}} {{name}}) { - this.{{name}} = {{name}}; - } - - {{/vars}} - - @Override - public boolean equals(Object o) { - if (this == o) { - return true; - } - if (o == null || getClass() != o.getClass()) { - return false; - } - {{classname}} {{classVarName}} = ({{classname}}) o;{{#hasVars}} - return {{#vars}}Objects.equals({{name}}, {{classVarName}}.{{name}}){{#hasMore}} && - {{/hasMore}}{{^hasMore}};{{/hasMore}}{{/vars}}{{/hasVars}}{{^hasVars}} - return true;{{/hasVars}} - } - - @Override - public int hashCode() { - return Objects.hash({{#vars}}{{name}}{{#hasMore}}, {{/hasMore}}{{/vars}}); - } - - @Override - public String toString() { - StringBuilder sb = new StringBuilder(); - sb.append("class {{classname}} {\n"); - {{#parent}}sb.append(" ").append(StringUtil.toIndentedString(super.toString())).append("\n");{{/parent}} - {{#vars}}sb.append(" {{name}}: ").append(StringUtil.toIndentedString({{name}})).append("\n"); - {{/vars}}sb.append("}"); - return sb.toString(); - } -} +{{#isEnum}}{{>enumOuterClass}}{{/isEnum}} +{{^isEnum}}{{>pojo}}{{/isEnum}} {{/model}} {{/models}} diff --git a/modules/swagger-codegen/src/main/resources/Java/pojo.mustache b/modules/swagger-codegen/src/main/resources/Java/pojo.mustache new file mode 100644 index 00000000000..2e9facfb14d --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/Java/pojo.mustache @@ -0,0 +1,56 @@ +@ApiModel(description = "{{{description}}}") +{{>generatedAnnotation}} +public class {{classname}} {{#parent}}extends {{{parent}}}{{/parent}} {{#serializableModel}}implements Serializable{{/serializableModel}} { + {{#vars}}{{#isEnum}} + +{{>enumClass}}{{/isEnum}}{{#items.isEnum}}{{#items}} + +{{>enumClass}}{{/items}}{{/items.isEnum}} + private {{{datatypeWithEnum}}} {{name}} = {{{defaultValue}}};{{/vars}} + + {{#vars}} + /**{{#description}} + * {{{description}}}{{/description}}{{#minimum}} + * minimum: {{minimum}}{{/minimum}}{{#maximum}} + * maximum: {{maximum}}{{/maximum}} + **/ + @ApiModelProperty({{#required}}required = {{required}}, {{/required}}value = "{{{description}}}") + @JsonProperty("{{baseName}}") + public {{{datatypeWithEnum}}} {{getter}}() { + return {{name}}; + } + public void {{setter}}({{{datatypeWithEnum}}} {{name}}) { + this.{{name}} = {{name}}; + } + + {{/vars}} + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + {{classname}} {{classVarName}} = ({{classname}}) o;{{#hasVars}} + return {{#vars}}Objects.equals({{name}}, {{classVarName}}.{{name}}){{#hasMore}} && + {{/hasMore}}{{^hasMore}};{{/hasMore}}{{/vars}}{{/hasVars}}{{^hasVars}} + return true;{{/hasVars}} + } + + @Override + public int hashCode() { + return Objects.hash({{#vars}}{{name}}{{#hasMore}}, {{/hasMore}}{{/vars}}); + } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append("class {{classname}} {\n"); + {{#parent}}sb.append(" ").append(StringUtil.toIndentedString(super.toString())).append("\n");{{/parent}} + {{#vars}}sb.append(" {{name}}: ").append(StringUtil.toIndentedString({{name}})).append("\n"); + {{/vars}}sb.append("}"); + return sb.toString(); + } +} \ No newline at end of file From 5814cd47bcb921ceafe5e11f4121887a1bb9cdfe Mon Sep 17 00:00:00 2001 From: Tony Tam Date: Fri, 18 Dec 2015 08:12:31 -0500 Subject: [PATCH 207/211] updated parser for #1357 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 43df2b04be0..112b277b18c 100644 --- a/pom.xml +++ b/pom.xml @@ -543,7 +543,7 @@ - 1.0.12 + 1.0.14-SNAPSHOT 2.11.1 2.3.4 1.5.5-SNAPSHOT From 968c943c448aad78748ae1a0f77f01e4cc3eb5bd Mon Sep 17 00:00:00 2001 From: Tony Tam Date: Fri, 18 Dec 2015 10:58:30 -0800 Subject: [PATCH 208/211] more enum support --- .../src/main/java/io/swagger/codegen/CodegenModel.java | 2 +- .../src/main/java/io/swagger/codegen/DefaultCodegen.java | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/modules/swagger-codegen/src/main/java/io/swagger/codegen/CodegenModel.java b/modules/swagger-codegen/src/main/java/io/swagger/codegen/CodegenModel.java index 76d88e0eafe..d5702b5c50a 100644 --- a/modules/swagger-codegen/src/main/java/io/swagger/codegen/CodegenModel.java +++ b/modules/swagger-codegen/src/main/java/io/swagger/codegen/CodegenModel.java @@ -9,7 +9,7 @@ import java.util.Set; public class CodegenModel { public String parent; - public String name, classname, description, classVarName, modelJson; + public String name, classname, description, classVarName, modelJson, dataType; public String unescapedDescription; public String defaultValue; public List vars = new ArrayList(); diff --git a/modules/swagger-codegen/src/main/java/io/swagger/codegen/DefaultCodegen.java b/modules/swagger-codegen/src/main/java/io/swagger/codegen/DefaultCodegen.java index b2894e8b2e9..11472fec4ff 100644 --- a/modules/swagger-codegen/src/main/java/io/swagger/codegen/DefaultCodegen.java +++ b/modules/swagger-codegen/src/main/java/io/swagger/codegen/DefaultCodegen.java @@ -841,6 +841,8 @@ public class DefaultCodegen { if(impl.getEnum() != null && impl.getEnum().size() > 0) { m.isEnum = true; m.allowableValues = impl.getEnum(); + Property p = PropertyBuilder.build(impl.getType(), impl.getFormat(), null); + m.dataType = getSwaggerType(p); } if (impl.getAdditionalProperties() != null) { MapProperty mapProperty = new MapProperty(impl.getAdditionalProperties()); From 0aa4d2fb8ed8138883cf2f3f79a8e7ba320cc7c1 Mon Sep 17 00:00:00 2001 From: wing328 Date: Sat, 19 Dec 2015 22:55:52 +0800 Subject: [PATCH 209/211] csharp add timeout, fix default constructor --- .../resources/csharp/Configuration.mustache | 55 +++++++++++++----- .../src/main/csharp/IO/Swagger/Api/PetApi.cs | 1 - .../main/csharp/IO/Swagger/Api/StoreApi.cs | 1 - .../src/main/csharp/IO/Swagger/Api/UserApi.cs | 1 - .../csharp/IO/Swagger/Client/Configuration.cs | 55 +++++++++++++----- .../main/csharp/IO/Swagger/Model/Category.cs | 4 -- .../src/main/csharp/IO/Swagger/Model/Order.cs | 4 -- .../src/main/csharp/IO/Swagger/Model/Pet.cs | 4 -- .../src/main/csharp/IO/Swagger/Model/Tag.cs | 4 -- .../src/main/csharp/IO/Swagger/Model/User.cs | 4 -- .../SwaggerClientTest/TestConfiguration.cs | 15 +++++ .../bin/Debug/SwaggerClientTest.dll | Bin 113664 -> 117248 bytes .../bin/Debug/SwaggerClientTest.dll.mdb | Bin 30764 -> 31881 bytes ...ClientTest.csproj.FilesWrittenAbsolute.txt | 6 +- .../obj/Debug/SwaggerClientTest.dll | Bin 113664 -> 117248 bytes .../obj/Debug/SwaggerClientTest.dll.mdb | Bin 30764 -> 31881 bytes 16 files changed, 98 insertions(+), 56 deletions(-) diff --git a/modules/swagger-codegen/src/main/resources/csharp/Configuration.mustache b/modules/swagger-codegen/src/main/resources/csharp/Configuration.mustache index b5ebd08ba87..1bd34f844b8 100644 --- a/modules/swagger-codegen/src/main/resources/csharp/Configuration.mustache +++ b/modules/swagger-codegen/src/main/resources/csharp/Configuration.mustache @@ -24,15 +24,16 @@ namespace {{packageName}}.Client /// Dictionary of API key prefix /// Temp folder path /// DateTime format string - public Configuration(ApiClient apiClient, - Dictionary defaultHeader, - string username, - string password, - string accessToken, - Dictionary apiKey, - Dictionary apiKeyPrefix, - string tempFolderPath, - string dateTimeFormat + public Configuration(ApiClient apiClient = null, + Dictionary defaultHeader = null, + string username = null, + string password = null, + string accessToken = null, + Dictionary apiKey = null, + Dictionary apiKeyPrefix = null, + string tempFolderPath = null, + string dateTimeFormat = null, + int timeout = 100 ) { if (apiClient == null) @@ -43,19 +44,24 @@ namespace {{packageName}}.Client Username = username; Password = password; AccessToken = accessToken; - ApiKey = apiKey; - ApiKeyPrefix = apiKeyPrefix; + + if (defaultHeader != null) + DefaultHeader = defaultHeader; + if (apiKey != null) + ApiKey = apiKey; + if (apiKeyPrefix != null) + ApiKeyPrefix = apiKeyPrefix; TempFolderPath = tempFolderPath; DateTimeFormat = dateTimeFormat; - + Timeout = timeout; } /// /// Initializes a new instance of the Configuration class. /// /// Api client. - public Configuration(ApiClient apiClient=null) + public Configuration(ApiClient apiClient) { if (apiClient == null) ApiClient = ApiClient.Default; @@ -75,20 +81,39 @@ namespace {{packageName}}.Client /// Configuration. public static Configuration Default = new Configuration(); + /// + /// Gets or sets the timeout value of ApiClient. Default to 100 seconds. + /// + /// Timeout. + public int Timeout + { + get { return ApiClient.RestClient.Timeout; } + + set + { + ApiClient.RestClient.Timeout = value; + } + } + /// /// Gets or sets the default API client for making HTTP calls. /// /// The API client. public ApiClient ApiClient; - private readonly Dictionary _defaultHeaderMap = new Dictionary(); + private Dictionary _defaultHeaderMap = new Dictionary(); /// - /// Gets the default header. + /// Gets or sets the default header. /// public Dictionary DefaultHeader { get { return _defaultHeaderMap; } + + set + { + _defaultHeaderMap = value; + } } /// diff --git a/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Api/PetApi.cs b/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Api/PetApi.cs index 4537144f930..e7334aa160b 100644 --- a/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Api/PetApi.cs +++ b/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Api/PetApi.cs @@ -6,7 +6,6 @@ using RestSharp; using IO.Swagger.Client; using IO.Swagger.Model; - namespace IO.Swagger.Api { diff --git a/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Api/StoreApi.cs b/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Api/StoreApi.cs index db82bf8e644..a9e9d6e9b74 100644 --- a/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Api/StoreApi.cs +++ b/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Api/StoreApi.cs @@ -6,7 +6,6 @@ using RestSharp; using IO.Swagger.Client; using IO.Swagger.Model; - namespace IO.Swagger.Api { diff --git a/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Api/UserApi.cs b/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Api/UserApi.cs index ac4f138c568..5502fe15da1 100644 --- a/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Api/UserApi.cs +++ b/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Api/UserApi.cs @@ -6,7 +6,6 @@ using RestSharp; using IO.Swagger.Client; using IO.Swagger.Model; - namespace IO.Swagger.Api { diff --git a/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Client/Configuration.cs b/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Client/Configuration.cs index 13d16c9ce57..c6c2e455949 100644 --- a/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Client/Configuration.cs +++ b/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Client/Configuration.cs @@ -24,15 +24,16 @@ namespace IO.Swagger.Client /// Dictionary of API key prefix /// Temp folder path /// DateTime format string - public Configuration(ApiClient apiClient, - Dictionary defaultHeader, - string username, - string password, - string accessToken, - Dictionary apiKey, - Dictionary apiKeyPrefix, - string tempFolderPath, - string dateTimeFormat + public Configuration(ApiClient apiClient = null, + Dictionary defaultHeader = null, + string username = null, + string password = null, + string accessToken = null, + Dictionary apiKey = null, + Dictionary apiKeyPrefix = null, + string tempFolderPath = null, + string dateTimeFormat = null, + int timeout = 100 ) { if (apiClient == null) @@ -43,19 +44,24 @@ namespace IO.Swagger.Client Username = username; Password = password; AccessToken = accessToken; - ApiKey = apiKey; - ApiKeyPrefix = apiKeyPrefix; + + if (defaultHeader != null) + DefaultHeader = defaultHeader; + if (apiKey != null) + ApiKey = apiKey; + if (apiKeyPrefix != null) + ApiKeyPrefix = apiKeyPrefix; TempFolderPath = tempFolderPath; DateTimeFormat = dateTimeFormat; - + Timeout = timeout; } /// /// Initializes a new instance of the Configuration class. /// /// Api client. - public Configuration(ApiClient apiClient=null) + public Configuration(ApiClient apiClient) { if (apiClient == null) ApiClient = ApiClient.Default; @@ -75,20 +81,39 @@ namespace IO.Swagger.Client /// Configuration. public static Configuration Default = new Configuration(); + /// + /// Gets or sets the timeout value of ApiClient. Default to 100 seconds. + /// + /// Timeout. + public int Timeout + { + get { return ApiClient.RestClient.Timeout; } + + set + { + ApiClient.RestClient.Timeout = value; + } + } + /// /// Gets or sets the default API client for making HTTP calls. /// /// The API client. public ApiClient ApiClient; - private readonly Dictionary _defaultHeaderMap = new Dictionary(); + private Dictionary _defaultHeaderMap = new Dictionary(); /// - /// Gets the default header. + /// Gets or sets the default header. /// public Dictionary DefaultHeader { get { return _defaultHeaderMap; } + + set + { + _defaultHeaderMap = value; + } } /// diff --git a/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Model/Category.cs b/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Model/Category.cs index 03551f9492b..d9cb6b21005 100644 --- a/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Model/Category.cs +++ b/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Model/Category.cs @@ -7,8 +7,6 @@ using System.Collections.Generic; using System.Runtime.Serialization; using Newtonsoft.Json; - - namespace IO.Swagger.Model { @@ -124,6 +122,4 @@ namespace IO.Swagger.Model } } - - } diff --git a/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Model/Order.cs b/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Model/Order.cs index 1d214430ec8..2191707bd09 100644 --- a/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Model/Order.cs +++ b/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Model/Order.cs @@ -7,8 +7,6 @@ using System.Collections.Generic; using System.Runtime.Serialization; using Newtonsoft.Json; - - namespace IO.Swagger.Model { @@ -189,6 +187,4 @@ namespace IO.Swagger.Model } } - - } diff --git a/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Model/Pet.cs b/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Model/Pet.cs index ab60577e85a..10c44fb46a7 100644 --- a/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Model/Pet.cs +++ b/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Model/Pet.cs @@ -7,8 +7,6 @@ using System.Collections.Generic; using System.Runtime.Serialization; using Newtonsoft.Json; - - namespace IO.Swagger.Model { @@ -189,6 +187,4 @@ namespace IO.Swagger.Model } } - - } diff --git a/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Model/Tag.cs b/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Model/Tag.cs index cf77c2470b2..93210505bf0 100644 --- a/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Model/Tag.cs +++ b/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Model/Tag.cs @@ -7,8 +7,6 @@ using System.Collections.Generic; using System.Runtime.Serialization; using Newtonsoft.Json; - - namespace IO.Swagger.Model { @@ -124,6 +122,4 @@ namespace IO.Swagger.Model } } - - } diff --git a/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Model/User.cs b/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Model/User.cs index eca977c3b18..1fbd17da993 100644 --- a/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Model/User.cs +++ b/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Model/User.cs @@ -7,8 +7,6 @@ using System.Collections.Generic; using System.Runtime.Serialization; using Newtonsoft.Json; - - namespace IO.Swagger.Model { @@ -221,6 +219,4 @@ namespace IO.Swagger.Model } } - - } diff --git a/samples/client/petstore/csharp/SwaggerClientTest/TestConfiguration.cs b/samples/client/petstore/csharp/SwaggerClientTest/TestConfiguration.cs index a72e1a5ed1d..4e29c5a2522 100644 --- a/samples/client/petstore/csharp/SwaggerClientTest/TestConfiguration.cs +++ b/samples/client/petstore/csharp/SwaggerClientTest/TestConfiguration.cs @@ -107,5 +107,20 @@ namespace SwaggerClientTest.TestConfiguration Assert.AreSame (p4.Configuration.ApiClient, a1); } + [Test ()] + public void TestTimeout () + { + Configuration c1 = new Configuration(); + Assert.AreEqual(c1.Timeout, 100); // default vaue + + c1.Timeout = 10; + Assert.AreEqual(c1.Timeout, 10); + + Configuration c2 = new Configuration(timeout: 20); + Assert.AreEqual(c2.Timeout, 20); + + + + } } } \ No newline at end of file diff --git a/samples/client/petstore/csharp/SwaggerClientTest/bin/Debug/SwaggerClientTest.dll b/samples/client/petstore/csharp/SwaggerClientTest/bin/Debug/SwaggerClientTest.dll index 1cc6bc94f0c97cc2eb0e3c881f9499928d0f3982..22cef5104c54181889d4b74bd7f493df286d7160 100755 GIT binary patch literal 117248 zcmeFa2Y3`!+de*-O*YAP7i zGW}H*VG5$$_~-GZszihc{j*3_CrDCO{%`nNRES7>F8fIhI4ny+-o+3S39=Nb$^I=b zL6WEj`oAEG*VSW^RD4K}5kn{*y;rLj>Z+C7BStEni#t*s-H0H{rd9ZJk~RISDoIs~ zJ9_lDlOUIs%FJmUN+(y{q{hLYsQ&nevdL0_bUDsXI(tx(Jemz}O47{YEb>B5Pgx;V znQ zbd)u2Ds_urffz>!=`Jl0>nH|4D$rEFh(P;qlv`9#L{M@rDrc~x5y_+%um@A3fsR*+ z>F7fa$4z1u`>#mGsud~{&2J->l)RKErJ4%G>3Y(37NBC;>{LYRHlxL@aX}H*;0XVS zfI$0wN^?jU)gdZ4BG^s=Ta+!rmN0|bqDlg#8)0+2M`;p|`oX3kJuRFnQwd&+u%&p5 zWig2%>=7d^vJRV@y3)T`MD#OjGs-zNf=Hu5V!E69P%xY8Opurk>r0GIjUtVx5H^yC z5HbmDD>e$pURY|#gvn>r}U)a(x4m;t&7AUXuwnX^A`eQZy2|}N3X`;}F2Yo7z zW=m|#vP5<%5fl)XS(I{Abeq-w5}BGX`9OhL-_cm0u@B7h``2NXC7H@A1vv^((M+gg zu|KBTm{3h16jkGY0%0+K%j`;1QC)-0?Ew|nT}w#)|nu=;jr16 znj|9l6p?c(^jNUjpOE|zL{oE9)POh-z7h1YO--SMfN#^-SK>+7HJ!swc(5rdNTQO5 z7-oEl>pTGnxlpMuY*yo$jLO0r9j63Dxe8DEK>*$a{3~wV?!AR?6JXJVd6Q%<(I zU6c@Pb`SfCLc*@S9CpHk%~3%Tv3T*q(MV1Ib4~vXp`Qr-FNHol=u=q}m158@MNf18 z0Hr$Bg_a$>?nofpq{%~sB$iFWBzIE-|9eeRJlWG5qhW{syu^v{cht0a*{i=H65tW> znI8lgBEr!Bqxr$#o0c}F(!Rj_Koc|UI@oO2SQxQg(;yS3`>JlbAi3Eg%M?snr)cXR zklb)GoR-3FtC0!Q!iVklED1(R{;qTE2e{6&FS{n8iM>kj)0&spzs*a;8mQCYP)YjN1MQd=`?w(G1OyUq}E-=dcO_Zs-$ z!d!oz=L%>wL9@x!{{cJB{R@?3kX;!c=J~t(huFZgxmnFgxl@klb)G zwc}*6J6e#l-8~>d*zrU5W!EG2h5gb>fp|`Mus6!k+kTNwjFt{CNn zclL#>89u@@-OXA0VkV-AQH$xDJ_!5n<`CWqE9j(K0Z49k=t(P>opmNiZa8crrcpyn zAzC&1nI7SYroK#h8cQMG>nTiqMxaDCB)hVRzAiyhuB@W3;i0do1c?gm%;?W<=;hG# zatpoE(2Ey(@SsP9OH|52PkUxJrowxk*~x#3Z5OF&HEe4h@V8Cne|szOZ(?BtSYhr(8;WXV7M%+a= zVvyYI&@)*uyXs7k+;B1kL25D2^E@ZpqQyniAjYqP><73Cu`jzwpXdS)3v<{B4>n49 zd*dOV=QLgzSBtW&zpEVk0j~1w%dQmm1uj@kKsTdZMCP6$+$X$=!C0Opm<7d$i{LqGVjp~rmWBuH8HIsxI(%TNf%5b z@RvfgY=wNFQkghuG%O@9x>AM6)D@B+Jq_qYQ?k3H>1#_0p1c~XUhfru5x{F6om}cCfxq`8Nv!wyoz34$o9ikVhMh_PJ1FoMT^S?%a z7=j669HGH2N?k~b=L6)Z%_IKqv%?!(hEuW_gYbxC^yM&>gc!ITx6`g^d2rM9K|LHerjNlo0j87M;h}3S<>+7%QvXXsXDGTTSH#Q@O2Fl-PtVuTxZZ z!u7%y^p@h-XJRtZ!*==@CIe|#T#{jkrXN* z&Y{y408*wMXM>*}gt$Pd#so(%RR$oW^E41b!^X%ex1`GLq;gZL+=?nUpo(gkKxhd? zWhY!O5JDHqd`2snGS+g5X+5YfHEAypS_*Mlh38s`aI{M!AtpfRUC>pyW)MQ$fwOQ~ zWl<9d>2VJTK~@7HUo{g5v6>l#AgiUGmCV+?jN%MJi*%d;iRte5Jxn?a)n-2+F`Ypu zy?G(SOwZPRWBhR1*Db2;$GS7vgX!zuzKk5W2LCl5Tqg*XY3nA;dyGGsf zKbi~ep>zdat)gTxhT$7y*bA>#5KC5I&bes~N9wyTG-E*cx7~HG=Dm;CdtYAqN?+ zHXs=7+6XTbyxIhwtbRtCyMnX*B)mG3|xMsXU+(Fntc*UaOR6)L} zXo`FA3bGnr`Kp=lijy(p6=b#47_W9vobl>?9g;wDv$NB~T&^=ga>LQ^O79ZwF@X$U z6t9eS^~NiM{-St=zWGP-Di6;&KBHtYhT$7y*bA=++^9Wwk*ib%UbUnybL|7s30G-F zanHgY$;f;rFPO6Ok_oR^{1vG0hMWr5UV!2uX#}8Ry^HykkxG!#hS;9@l|c_w+7dmZ z`PE)Z)1tHkSInI&be>mvgFwALg2|-+4-f;vS%v31iEy+_BOxY` z?G)%LTr;vE&X;avl|@a+rpGO0Ria_m zfc~lN>LA1|B z%FSzkYAv-NWk~DAd&B~s!8hti*W;wLHyO{=Z;8V%da$87j2lZDj$J0chGSQZ;8i1d z%?N(SLB_G~5sY^I05209yAGbL-XYJ7V;~D0`w;>vTn)#Nm4;)PYH2uzvijl}*Huf3 z`2xaxlR}G_r)D>d0-%E8E>yZ=L&~gm(?^T1N2Sw(lvztJOZsUbS3cF42KtD4O#^kF zHXlJJ(%u>On#z5ma<{46V=8x+iY76Eq$a{#J{2B z1<4@1FA^J<+B6J&iVBJC``?Y=A4c$*5q!=;#y~nZfxXj?T&5UEFI{1H;F6OW13?xT zXn}wVR|76&rD0&ES{eqTtiBj%)LEO$v5){l-}KNtzH>Ph_p;1I5mPl^RY;j}P3Nb_ zHLj2e*L*}nsC)EDpw8294IPtRR=FosZfBLdLgijixdT+x(1dF?w5SuV7p}odWWHJ^ zn6i?`z%`ck!Zms&5giB56@YNGOCupBaLo$33fGKlh&ym)PgYsfgll@-15l9FaLrc@ zIHutmt08Vy(^6+#3#DWj*S6}=1(KT`dW%vp>D0<|gB48BGsiWfxx8`Bpl5(Wynbl*>PaYZmEK8rAt2*CHrcjD7gV*so9gw0YzJ*KpZPX$UOqL`~H|kl}kMdqgLUbO0TaKEJ z*^FR}5sc*^0~ozx48zV2&-?15D+g$@iko+4-~w3yS5641a5c0*78-D6s-*!J%IFJR z>GMLRXa&f%P`QjMS3~6*s9bmzNtp(J9*W9NxL$)F%_lo?XHYO@h0Msa0%U2g!Jij` zvI@`j62j3gjf9vO{JB6^;hG0O;tpKKlvNfr4SqfD8O4y*2EVVGY4Ed}dGJG4OPvRQ zK8o|;-=U9hklgI#_b_+rOpx4gc<`rhc4V080Sd>0O_CMQ;H?IMUP_h_5@Qv})9%FYFMlkgJ>8AT82#B6< zg5dcOL**dzLphwpqIW_1(!<01U65^5P+I=cyC65on0(#^(R2CR-wM&|o!PfSd<7V% z(tj%iV#bE~U%UgVrVg8ftx^cR)2UeaO&DpT=;B2=TlFnvMF4hsk6rySUj1 zlA9gs62Y9JGeL605t9wWWFl;sW0>EiM>Mq`^`ZAWpoOWQ3sE29{gLW45a|AUe-d)l z;II=O?!;3!Cn^KQ^nvf}Lr>B4nhQNU^jZi#c+jJy6P3Zbo_Kejboo8y(ZaAC#MTW9 z-wjzrc12Tpva8zEy8lYM;&EwwgT}C)zxQ%RXIRf)e@sRbGpr}$H!Wj5210vJn)QI> zW+%?WoTf8Da>GeyJ;A3!=^1M}qd+v39+BqPkJt`Mk{u+n9avm#x$kAytHK_Jz#iHQ zdw>UfAd^W{hUxYo-a#&^>G#(3`w4w&RGX{6(1!q_?@^n*In)f4tCV zo0}l?;X$9wTeCU-zR~Mc74dzeWn@?Wl#bUs>r<$8|6AMtOZ|O{s+;G^g(tR1rV>d5r{XSXi_bH;^=>bbuQboVRL%$O&dB0Z% ztfR#TzgIRx(_bj`$=YqMcZEJY=#z>5-+hk^?=N6Kk=l&TQEO6@U=0o5SVPw*zP_J` z$%o>m?zF##wyZ@_*$G!sDel=%L;^C;N(58Jx9jx%L>6~Jy&B|HxMJSwy`N~L5`--E z{X~NvsEi^yAx8%LiI@{vl+l8Z{lsjvo+!ojY)LHC6TVT;S%ed5_r-o9X3DPG#MU+f z>KMVgMzEd{tj|H-2xx#{w5uV!Ob&$`fhVh&kr|UgSp`{a1T=<#3Rl|*KvvpDK&D#S zMgYp{yAfc@%b07sns6>~y)LJ4UgE?9JpEk4H)FI9ZB256s9ar@TSVo?P`Mpcl*Y8E zZbebq3D;{;jh>L5n2rjjtPlctwkBEHYf;@Ag0c$F)fC}qmqtQNEUKGuTV0)S~#Syn?Z83)5gO*tTRD! z!(oUt^_;esfpTWLZ17oq8|@mbjHNPqw&V?ZkTOmT5wG?4c^U>k(jNh)lpyY3pmQt= zP2T?V`zaP_52ah0$6^Oc7Gn{v}jni<$!?I5ATwe!Np8+nXWf|NH%+|z6ZJy3a*=o#I+L*5pJ zR)%ON;0_?A4A*r4u~1j|MqLL3cfKGYI>*3D%GHV38t!y9f?bSYS0mVsgN!@f5sY^A zfR_pG^aPLI(Id}{J0J_(=>-85u7*3vO2eH@wKUv8S<~Z=uU2o867NxQLDLrowWqB* zuCB^5D%V%#s;XQ|6?vIZWgtcAy+CrkPzCKQJFzGcOj)7loCj4{+6z_e5TrM0$#eBV zINGI=5EH1<7jzY_8C4K>VEISyw?fo}Dtg=l50KSR#aGRQDy(Kk707C-GpY=tIHSr5 z9XLR8vqL5&m?w26NNzY9s`&N`GR$;2>4Pdpy9O(?h}DOOK@U=<@c=OI>1`tuKR|yb zOhMOJl<8uu{AcGKW=t7I$zq(rH^!M4rVJsLtYTRL_|PzAIEYTTUYLSpWGB`sf+^z@ z9Xh74IAcmGBviN=VTzH8H>Mc$%rOOddtpjGn#%}GnMf?u6~0l|CBPIv5~3}5tes4E z-;5Qt?7))RHIn!m+`MK4RU_y$f-Vj++_({>*EZp00ym?R%gri*=2{C~|<3Ly8nlT7*2X+Hw zl|@Y$q{lrN1X&G(eAP@C#A;>?f~=N0W6&EEXAJsEhZ&IE?7Zn=p3#{gx#4IS*JntR+g?rC~DlbHRQd|Sq*x+b5_%LCXkQUIqPrK zX5yT65wTD&_(r`LZ_bhs;mr)azCh;}AdCLgSGJ>;>;M*KzyqSYwv}-QB zOz>tNc=U!Id1kx;S>Vk(5K!T2Ac3qjyvbBc!yA+}9p0d>T2jmxc;lNCq`dIPR{%{y zH@vtFRIZ`Qji7S$6486G5H;bA9{1o4WHr3;RWsoYtC{fzvRdklH)Lf3 zZ_ewG0+O4Zr5@%5oe7c~4&zOR$CE~Lc^^+2bkFgm*ZPPqkW0tCaRg2Nzji*kjqoAk z^GR?#=aVeudp`Lw3H;6TNkTBM^GU?holhd&bmx;Gdd??#8+Hc~wBIan)0~9&VI5V; zYJAR%^wj?LIiy~{%+4Ww1$aECKZn%CjPoL$Wc_>RMGaqUi&YcTM*!{i8`dA8f0>hT zS6KZ8YD;n22$Gwfcn|ZU&IHK~$7J=U&(Z1UL4*suN4ks*7w3xavoF5gwVcCFc-SK? zM-ZaKifOv8Pej(=sOf(s^m&hUi_nJ${qoSKEn)4q2llX0;0)2QiLw9XHnIN2Y(f+J zE1O90bbFfK?I5|?$>U*O(wQK+;rxY7P)Bi}ZrA#Bhv-w@ci$=c6dw9CDI=R8BI_U4 z^p6RBwu$3HA0G6Ry=~(23~WLU{_n<#qEx>ZIO5a9{>moudb<5vz1u-@vy;!mysR@p za>Mxxo1l*3K0U4V=~tpp*(T12K81%qP07e6h{*a^H2v>{KHJ3iLLVOVE9f>MiEj?Z zkxxY2L-1D)QPJs!%M8L1&qV}a2<>r56(QrGZ^QrFo-3Z;m6$_ClNJ4eVmcufU*rvP ztn`*JPZ$lozj=oI>5CbdCiYhbmfvGTS9BW!$<0my5A&+d1j!AD4a`(~`fe)SR4{)x z712~WLNs4oz*!*KozA?8~mZ>??G(Xmj1;uoE8ah|D2TnT_X-W=BY; zvX;(Mmi2f2&c5t=&c5~d1W20LU)c-YMiLX3Yr08*9p-=PS^ws_A7DdW=6YLJuDFC~5Oqu(-EUjr8!lHm9hd1V8i096azt zbD>~qAK5~6$e8b~RHl~H?icK(;J<9P>$$g*IV%0nZRpyI*^nmoS2m=0%;bCBOh9t8 zL%k|&=m(t%k{eD2m_vD)FH0es`VRG`X>#nje^7&M#o~I2?L&6u7B({<7!faQ1|DpN z%qme?2#g>b^XS*q^z&-^#fAR6(5H9vfHCl(Pv(`Vya#>pUHY%6F8Fja+tyYO&X{d0 zKIFf~w!~2oejiSMH2%#WdRst^@d9%wP3*7CjoMvU)OFpWKytG~H;e@HN1X|h8&1ZM z#rA+_Pc6+J%5vY+caGVYUFF#q7?#9gCp_2%L5eqqA)VS)*Q<)hP6Z3`rCFD?=*kv6UOTt$^fa zhprq6L%OLmL2|>%*pNK9Qb+6mCR)EY75&b0@n)jm;i2CNg1qeq_oC`*`Ykp6&O)E< zri;*r2YoVG^RrO=rX`uo-~KMxe{!z(|8za?35aikL{T4#J|Hys2ft(P{T=ht7;d-52AQ_qWk_1!6w|hNj7c5QlY}46=A@6;5 zVbK5V>;ijMUS}70k2E*zR;8yY*9*Q;FFF+0-y_A&q-!P0D_(?OWdv6n!8Jy3EeC^u zyXz2)cCCk($pOWO;K?d>%8Un|tb!~KC^kSqg{z$^AS>;FB2z8xfC6RpJ)lUR7k2B! z{R=K=dI8j)?q6_qRhCh?zA9H$LX4IsJM`P9RtJr8Zm79=+u6Ttgit1z0&`z*qsXLuHo!F!}= z@_*tig6=Pwzn#B}k_9fnH^z?_E?~ouzK2Jy@|lhcyFqlq^}+=tBRjF5D3~%ny5YeE zmiER4L*5$~4Emqp0`kcO7fuih^@4BI%Zv-yop$X(Nd+$KHG-cRL0SoV1U}~=)lz3%_=4h$3qR;X zA0#(BUwW9=btXt|IGN*u(OllRV9;L_7trMY3%Kw#C5!O`-xxn$xPVP#Sv^gzazMw0 zZ$Nay^}+=tBRjFDESUT|R~}qoX>VLGzAfHTdfx3|E1>dNb85eLu;W~?w z3S2m61nG?0L!}dGPw*lK85hzJjCNgumkBO>3!bcE$J~qyAPZcehYvL?Tn!hHm4*wM zYH7HDvZlucUoCoqX}G`zOxBzwXW5Cv z0Kt@%1_my$v==V?2toRE8hNg(2uHg#5@G@uu7R$?HRA%}4jik{*TNub!Ua9%92bn{^2P;&{-U^mCjWUSoCo+cBy6jl_Nlh#h6e345AaRvV`KE z8{SAv=AC}Ql<|2R{Wd0xFM~QYC8Z2koEW7cNBvthMk+xHl|{e8YS06fysMn90FW|Wf>M9?(c<&3bXt%yX{E0h8j`MRa?7dQE-E*j%B`kygQ+OC34Ubi z8`%lh3x3dLGN1hjri|Y-@LbhoX)pM(K%Bl>MxN^r%7FSsBOxZ>=NafKTr>P2?!ciN zebfu0Civ0g9{7Q*20y-PCir1BGyFhSOP%3|epFh(54D%JA_2+GPJo9=?W8e5a>HTx zN#E?qFw;XkpLLDVuEEMm(^xa;LCPvImdy9XEi_yr=#Mt1qy!p<^!ryhm$N9Vh3tQ_ zH-vS~GD9V1m z0)s+~V5kucGlJn9WDLrJV6=;VGB;BUiU5y3T1B22gFqG-6bS(pu7*L#O2eQ`wKNPu zS$#1meO{;>;R4r2<+7?=9hGaMawSwGWx|Cxipoy7Ubui}l$|&u6igYvTH@KpU}-O0 z$PPhSh3ASwn7%D0NQenshz3E0YsLk{9XMQ-RTeejf*$wa0%SE@@KrP60;`#E0kT@^ zj0-s^&eIZtPHpIeIYZtSWh1!aoin^2 zLenCuYYAeZuJDbzE&?}y-w(sWkn);z z_zIv&2wb=gRIZ`Qji7SY zR*O7WQG}yi8VNB0F2z7s;hMn(aR*M_WtBxu;G)Mp-~w3;$p5psVI*fJ=RyLc4lR*zsKH>pm zo^$+2`18mcgI=agEy@-#w*Ip@hxwbt$&@U{C46IC^4e&shC$_tMPGws7YD}5*ZTY; z1wBPXz?@&Hap@fqoL`$T$GFj;VNONjYnW5X2v#I~^9APkCIu-k%<&bd1%Y450z~!F zR{?ECKTFDuq;eCe+)64pkjibNq68*TYCuuh3D*mh&~Y-~AP`I$zYpb^@vyWPC^dw* ztip5EMwq^SAV`P_P^trh3fBxuh&ymMLsnVT1WJ0`14@w9K*?9l1WK%C1|`U9sWT`w zqBw(+zwE&sklgGv_AqJbqk$4gZaA6Gc#P)qp79uT&y2^6HJ529-1WwqdX&vSHs7Ho zmA1ZVPRU|C!Z*evO;U{CC2dM9S#3hDa$ZN779cv|dZ7%Gk)6$SrmVCyP==+wQO1z> zMj39~wF@kN3 zU|S9{&a^`?+Vv{DOmL<>c(U4=JTuOKEO4d+1XQ>hI3OzxXEN2&a0X>fhcl?FmK5^^ z&iEz;DKDJy6+n~FyJ*}7D%ViuMo_u_Dpy@a1|}HkMp4-b*9%6_FS4_X&Xn;JNgfzs zX)hS*4ng`^X!2Yg5sr3gB*X-abOK$4YlacT9k`hzt1N1Q5k2mK5y)yV;;UwY5mqz9 z2xPU?8Af_goMFVKBLzrqc6xf4AvzNzH=N92#Aq&W7%}J`81Y&+?Iu${?u{d8@_zzH zrpYL+O_JSZa5d>3A%pA~N9~-tmB`A^6fg3%CL?Yrnj}4MrTw`Ue|aW3gs{l58wt}r zK-+7w#mK;vqId_5I#;6V(%R-_DwOAb48Eg@xFJKEcUb@U$RJ*X&b0$1I9Nk{``3wN)#zS zi=ni0+IJKAq7)v$Nk#c5XlTuRg@}7q!lF63baNBinIbnTAy)RLB44Pd8ZX<-$!y$ zwxp`4p-uT5v0!Utu(F>*b~*;IdBO)x;X|hIVF(@}ry%JcB|qgOy%B8BV(2pqT6>23 zCugBttPV1iLE-*6L?>8HH+N}+kjf!Tky4r3{IlN_?kJU>=?Slt%22OR8bp5}l~Me( za8jqp4EPg3K|j^nuNrHU~d*_ zAO)L}UZiAk^`gNSNf6eX{Qy@V_QU;MeMKO^)lUShuKpqr=o%mbL9T%ukX?h>SB_Iw zE(eF5@NhAY)(DBpNn+4iAL|h`44E?7vGNSXx#+%)MC-{2$$w~3l1k1?ae9;H z50djA0*d_T@gjEBZ@1a0&h zp>mf5?Xk3`Q%+NYAxYE09$FldBPb}P(gkN*sAL%elKl)tXpm4KTCvyLBaNO@F7W)6kEy>7z+v<;Xjm8@GB4%kQ|6;fEa~Ac3P59 z5s;8YxxirxN`btGB1;XVs*@$?Q@#A9L)3^g&82$TFOsOu!u#?e7JF8Th4L>QidR;Y zG$JI^M1WEXOPWP$rccES<|8nJlD~zgHAyx!i4B_MNXjJ&B?0zK>?nUn9;$6BsoA0e zs2wgN5STQa#OUqTD~MUCb`e&tnEfgUK@marYZOQ(`$J1m^gD{i+P^2){sTFV$&{#L zI@<9%qBFgs{Pin*cGs%>NZg3v?5Q`%4@)ET<7~O9U1(}pT122|;y?}Ptf@CiI*Pu$ z8bs1PZE&VQtc5c@qMiq|fJi}<~Su|89pn%fTrr+>@*!Z-S5 zOQ7sw$1f9wCaw`=8~psSV0hb-C?P3Y?7nH~2AYzkF(CHh{iN(Uq$s3?@n3_KPy)#^ ztxpO}Fxr+>k~|9o79Nx~ zQC)%nW9=OBsVxbkQ!ub4M?|=IAA;r$c9{}Ocs7dO8e@4`u@J$Q)Scu6Gp=2#KaoOW zLX*lvTTp}AvXT;jvd9E9RtiM<2S)gF0vi4h?jZd(p;C}gtFn`80F?1`Uv-`;rIP7e zM-#&FT*D^$QD?THGSlaQsCBVsfp4r?P^UD37P1QLr;l*4i-!n(_K96QKj?c|?BdBG zt9We4DxMkqgmT#t7YXpQiausV6nh{Q+8#uXYX}6KaFt++dv>r<7?~e1f+;Ih*u=EP zXdg{H1nPqzr^5C5p;9A(ASIL}J)74CJx~cFx~ESidK4e{NuVlC_9uPp&PuFO52{IU(Z4oDgG$c29j|5QmH`ZG}nD zKW$A|ju=`n#RyhFkOACP5kW^TGC)^lrcyuKv=_l-H~QaImK<#=%wZ}vRnRJj`zsOb z2PjeG`!lRk6{-2G;Z}aU$l+EO@(mBvqJb{XnY4GZ5nENAc^s|sj@{vK@S0>p<264z(aGyhJhcfb`(?-ABK`cw8WT)=3 z6=Y%v?PN01kBP~Vq!Q@JL*`&rqDd;0JKm~K6}b+07@>SrLzs`J?wn^&;_*L=m?{Vm zv#^~d5wg-WhUO7Ae#BT{1h#?}3xiT@TTHraZZZg4Rp27E36f8W;V{#u5LEjq*-3&~ zY%iwyBkdiU$}@-ZvQg6~N1#9^Blj3HghjsuNQ+2Bv{eDByv-VtV=6rb>7f%yPa8)+ zqAe{Dr{tiVmlnwGa3QYbq?pa>7()@|B?{Yfk>jpHsq(s-*w)nCL>dhe)A3u!iTFw5 zM0*}60CzbtB`-xOt?fvQo~{W0YJ|=0Z{y!gK$W6B|Khu+5<*%>mk|}h7>XnQtFSYB zK1$g^i;qD{e&j(Wgo!Yr6pwUKfAMY%jXSc-s+5Q!WpN?yYjf3nWDtjpEDfR5JHR%0 zmQ1y1MmdY8kJT~M6Q<`nl~?>&%Q;UQc%;S|Qt>3kWNsvnz}p^yf?^u!d6^aY(^OZp z%~++7slMQ4BOcm>ENdvWG5yjHCGV*!@gTFC{Em>Zu!+Xll0GDgC~pX@psCepUX9X+ z(h3@}(vd_iNR^;Cyk~xielaO%W}y{EOJ>lMJL#k-|44t42sgpA7%ELpdtpi}nT9Co zq23ldT<)}#JUTTwN)HMFdl6Ej925Ow$<=Fvy3ia$qD;yB;|tT;4~0e*xG*`0XN^y8 zC&*M6tq_TnS{o8Z-aK%G5O;*&(F~S!rC`H^Jh&$8r@D`AAa2-?kfGV8myIEA$aJPM z(*cH$4C01N7nY&vqE|YI8!~<@Q`<)daYLpn%h3GND;>lkBTMu!^S0*&hVhy0nQSdH zd;Y|uAuH6ynMoZtq^O;(QwaKU@@mn`^sgII#UNEFLn)fzi!n!EAttHxBPiAoD2ZeU z2{Xv-pBQHZw)<~;oTnC78Z8eQ+db(2LEEq_ePCS;5kd0`xpvWK#2D0d7 zbB4=V2wfW$OuI@&X`ET?9JSHb5uyYn!3y;%;_w8JhzwaUBr=2<$!(3aLL);(GHfu< zV%Th`0Jh{ZECefw3X2R=iWALZ=V*9jI7h1%qRMEj6f1>e`B_U8vKku+!Bc312KbU9 z3c?9wiOj+YB%k8eU|QD5tRi`~$!9TanOu-HECfTe*x{NX4e{hReFPZNlJO*=@7<#O z5s?uHQ299;85zk@YOn~U6p9+jp1HwTFe);N8N6$xr4=0+Es|lQe-^{0k8);=p)?7S zXzk^}P>*?XzZ)2;*{KhP!VYw+%t_S|SPC*M(?^=S7`8~wX-hW5nNCKj^({pipt;du zg6LS2IMc}twI1+@b3mJiYK8aYIJr)yPK%amdKh6KXcE zIZa6qd=~VY(omxTy@AYml!*3u9q3tbp zxE1m+ydao-OAiX39rMEEGfYKiSnP1ku!VT?M?L}qwiYoJU1YJt)iOdbd8`jlq1k9+ za(||x&n$Mhng)WrB`PZhPoeo!qBcoHCtB=q%|%08nn+XpFg(;U&$9X|M` z^@|T;apM`7f~bxu+(HHqQJu$aVek;ud0cCQhp5iusu?^)HQry%NogO*Yy2bbJN}#a z$RIApf4VizEYDE$9{&xfK$(nx)0(Ccik)tF{}W>`9OIxlCGRu#GF#K2yvEo=>_x^N zD5YZ}zsVux!sSHv}QH3Tv?SH@zWH4XC1U`+#Z`ZW#bW!Mj*FK9n> zGT~)Ei2K@4GanhmePx>a$RO@3Lnk<1c_HpA)6z!8LEMn(%+F40 zaj)_q4jEaZf$RNTT$k~iW<#Wh2qZH5BR4S`oP6v!T-FNQi~ zC{WB0=#-&A9Ydf?h61k|0^LX;leJrBL!8_4MfWXe?@d;EQzkxRoUZ>#y{W&9^;BtI z;h^n}F^<@ajB&{6WBeLFIzbX+9HDe$d>0F$4=r}M<}r?V^1D6);%PaFspwgY9j;jo z@#LO90zwUMg2)Q`+hT`nRzp0Q=C@t~LM=N}VFeaDT(cVD$(ZTMiXkA>t}+$2VX?zC zt0A7e*GE98iFFSw#$tzSRzqA{_ZR{~4Nn_cfgSP6R4f!Zij}FhP!y{KiWj3PyLsKi zf>;)Sp{;wE#w$~Vd>4utuX|{VSn30N5_?DJ^9*nn&>FCEZYpEJ#m&X*GhR$5@+yfsBZ)eO&aR6z zmJ^yLN>X1}8$v>{jS4*U=e@(eXtPv0gQYL+$tomLY4^isPaz8ZN-Th)G6!cOSd)UO zv~_F^35-wbDb$JQko;VN^gwfYn}-La2*Hil@5v zLtUa%X)fqp8Al7!veRChCQE0I5=~+=l(knOv5-K_xox3Ajvl0`&{`^yn<7X|tSb@E zf%XUzvsuK0cq;681M;+PNECIQLh}tj!HPjU+U)v-L*Z1=0A74NjoE?k--U~$>4Zoq&GN0&dA_2j@jUVJwaq| zcCWT@0(_puV8n=XreB{e-Jfbr$d#D3U6P(cbu0P$5qS1ji;nO)fi&{WJ_Bu3fLIkRX2ALpKs}pVe zSk2_Hz$pLVXhKggaDU8S8cyjBHnp`5(ZDbP(IJGhWl4c9TG(kf1UJNJXyO`WJ&J`% z!6w6mRI17-UE&9jFK zipP$r5BM<|5nwzgDU9YZ9+Xkm2&>nlGQ#?&&&sGkepup?nK>UkE+c}{KQAMKv_sUXtGzI}jhqc zfU!Du6Op@`Y(5z~%tF4Fx9rijbF zm_HVoqZy~(?hb@}r6~U>`esT6qwbFQSgKG3a=01vHn7u`Fe@{)V$g*!E6a)Ma5{wB zc&6y{XYp_f5oHeKiYc_>)#@lJfw-r|qqXcpgM^BL8V2#aJuH~jgIHgLO)_k+Hfbs4 zKf;v1sj(cdP?eNsl%8V+g}AK=MKWk>F~@)q*DQV6(wE0^4oTjjev9&t@K2>F3@<}i z5IApSL$?@FVXeHhBPNZ^*yilPlt_Gc1~+TG&2FQpRS?Al+bCBw-!96d;4H=bX zTKdQ!UPPKoK>J41#&yDMIc!wruzGcC(uScl1%E+Sa@X&vhB2OfNUb(QTG)FI8Q#Uw zL#o!@-nBviW>FTdMv%b8Ad-+SI^&6WiX)-}ksvHrSN=liZ3+q#**UqH6* zWp8&mzNq0_=XzZ__Ug0i7werpc5KJtV^t%!{o4MGS>^Ag4Zrtz(VayT)>MAdsqQPK zZ`?VXYw^|TOULJVDR}h$*?|=gj(hn#|5Wcy?=VhCjqg8ULL#F`rel8@7?)4_u`U+7M{QN z!`67I_S9!t>$W^IKE7dz>@Ted*>R&`E_r|dLpc_8i|@U>L!XjAy!6|g+{fxwv@99j z=F7pa<@T%H>7|Bg13x&Jt@RgiM}9eY?S7Bl)$A9RDZdn~7rZW{jx(pcv=amhK{iyz_cZvkOTWyrH&b~YgPF<;zvgY{gD&bWYyDM#~ z5Zv}e<@bJUpQqlE>3JQ!vrYRXIBvu?N~H4b+6PWt7_#H%>a(k@-;=9S)W}EDw3xMX z%jU9Y-H@e5Oj76=$7bc%1x;(WEqrvz^Fwcby1wkq zTyt|i+UK5%=^=(CjtME~iCht#Iklq=g|rKQI3v+vT903+B)GX|<#7 z-Ch?O?f?68%nG^>gK z&b_Z?x2+p~GvH{$U9p=M4k@$qMEB1t=L~ps?xhc3y%SdMWXPL$%g=l`v9Vw6WeJn> ze%E9Fxn+0j_&NG^>RMq{vs~f*KN!2}!HH*0pQa7i^~dyU?SFr@z`pt~_ubjEZ10Xu zAFkUJms(}Wyvdg~EeL6nW5Y{p2DfcAve)eEO`MgEHh(m;aj&G1VprQ}@4qFYi|?-BHaxzkbEPdB-a?n`Qg_=%CGoZ$(`EWbX1=4;P;b zQs-A5H(=FBjJV_vc+H%W50obb-RJ4#^1dHr%enKfib?`{WMUre)qHnGx&HCz{3&xn32 zS^BZ_<(hGqvTsR|>)x$uac;d9zhT%nRTh`&<==4Sj>v-Hzn0sy?&npju8v)`Eur7p z2E|9EjUV*+^9J4T<~rCYf0f*K!}9O>wfedmM}H|)wCbLQO&%t1&(V6%%{%wI9DVk9 zM!?9py8cTZFFJ9m_00UUS2aDiaen_2!!8${SMHbAam|Lgk36n@?uYvarhVw{U8=ji zM)pG2?uKO#oN{hnjrWe%zSDKlxf!iy9{FQUmR*5~Yo3Q*=sUM+o8~h=uhX`1r@r~y zPi{Uta$4LVzhiM~?3DO2fz8KkkNdgYZ~M1ixUl1C?BG3*JB*5p95}M$6Zf=rT`Qlw z^;-WgziqoawDQFVO8-hv@+=tCe8=fLa~Eda_sWWfwO;x($M@^k4Q&vSbbZg-;3~C} zd$rCI&{ch-W3Okunhr_3lV!{E2=dyC+WNOF4DwS+=6*ehOOq z?dGh9lV_e^HsR#6Q$a~J2Om0U|7^yZ%UA1FnY3v~aHVA(S5KLLVcMjo>qnmIf22$F z@+=$jSLhp3s@K;QavwjrddGXW#+0Ptu=kf@P4;an)?{>{s&^+f8?&iO`7du)?;8`_~_j0FKwH9-G9|L7Hg|ICwd+kRqjG-x7x(IZQ0!# zBkpg0Z{MyTrcQbIW8+Py{od)mFsN#+y=}H#UHk3cd1K~23M#X!^U<-L&$>dI=S+Tg zbiG@Sm8*~CYqRL+4Zk)`2aOx`;jS!;p4}^&boSGT;olq%jOqK}#DlvJ2XxxI`QFJf zquh?z&5aAy3i#>Zz~b{K*FO+qQ~JE!qD9BZX}@lFOc{0l`2Oh$Z3Z@Iebqkn-ozE( zz8lb>T;(xq>jW&z-T1e!Yjv1A&>geLdA)k?n`ak2sC4^>&ps*F?NSTd{pPc`w{O?t z=Ec@6TebLN?4gbGrwkf`1EQ_^w*Cbwmn|x^wjPPDyrGr zm+#i`%c5_dZBgUG4}mi)RjOIJ){r0PziE3fZ|CkYS!N9=yuIAP){jb^yftfSSifOA zfXj`gflBH;f-z=dG>py?!&x@ZV2G_5Quz*vH@gc6-H7&n6x`oByZZ z3zz6Up!=F7H`+bezi(y0mVK>GFOu)9U$d~}$#T8jO^3WPIpXBqMH4>_s#K^^%9=Ct zo@N<$Y5wd_o=-jVcu(MhMYXf-cz&UEsV{nu`{JT&{AVR51azu!ZDdT$+QYZI42mWg zZ!==?&^r?jtxQ?^OToayBkl)B-&(MCamdQUvwxWObouew<;%WvZ`ZEh26nG?a$)qu zZ4Jw98a8X}PlF#enDTX}^4)gzJQeqF>*0WDOR{WvZP>Ss0^jai##yIA=T>!p3H0k$ zu6w63MIJPnm8Xy0<*rh+)`oda#uON^IFEY#$jyMCK5Q~-_E*DG`)8|C{q7)(-^7*! ze`)sR`G94Ox3|dh>%Ot!*111S8&&R|4b!uf`@`?jtIz9{$no2^ZBGRUgw-s3eADrh zrQ@$9w{S1}b$hLI%W{WoS^r1-DdUId?%Al%S8u)k>8Yt9nEscDo;+n--va zS9wo(c#~#xjy28E_2+x*pB8g|dS~RFO|PG5({$d@^HGON4e3z3Qn3z;UrIbbWMuH| zIZJcio^v(vqwv1!oxqjWOVh^Acht{$J-u$KCx?VLK-^)E>!1u)x60dx8p>4|_ha73WyYVtL zXSNnyr_37nU{kM@+CdE>+B`Wtpy|TWa@!L@jT#m^+3eQ_!x#UY%f8{0jw`ASicxA8 zDp`8z?}eg9_4u+vnN_EjYzT}gy3;y8E%0>DyDM5;d_B5@^h@i~*{2TrE@adFqVJEL z*)gU|->g%*U%XxM;0<}^l+@@q+u19u8n?K?!Oc?2j^jUF{c_EfOUXwICltRj{6R`; zux)Raz|R(alG4%AIkL~?zF!@EKBZ`b8|~Lwp5L3B<+BqLhjuReL6=FxazDO)*4BB@ z{&z~O{mAx9|8a{G)VL$H=HweTZ_K+5{`lkCf@n%EW;iG_!cg&eb<^RV?uHtzBxK z@o9aJEf_a;eZgKW>VNh4-kHbwS~YDkr$A8A32kd!UXcci(yK~8;>S`dthp* zd58P0I#T-KfbCrlPyDveM>hsFU0CUAta5PPSG`wu{P^9I)rJiJW^+-?pv(KNpKUau zSD%rcTO4ftr1$;!7Q@|3lX|^9Zq15H0R@tmHA%^qe6XG0H!Y8MtM+VF!QT?T-n#U+ zlTB}3Ts-s0cTEPhslThy$>rCFe=~C2C2Oa9t=o@SQ~YGdksr67wDR$;-@}?07#;>kzR$D$=G=XA)k}3JFK*EH{`*T_snMiVx@KTF|w+`=HUw`smvJig&gycyr*_)jJ&e;HPH?CRJsGsVu2SvLr1%L}`u{Yk zec@&U@(vnusBXV9OMjP7U43_Sw;k&?cDvAZVcmyk&qePFw@t`s>U3H3Ab!B2;fLCtuk~=~OAm77Y&iGf&`$SLW}F%N zZn<^6J8kVzx#iSP!*`83A@{6ubA7Yfy!hZBxJjoJ79k;JHu z_VTd{yOlZHBulM}Ij1+8_xa>ft54N=(E0OmrKWtp{Yl(hJuKLRLjUg$U zi(P0pZ0ek9UzKsm75dFB{qck$Wj5U`SgO}I9}lS3arL7c^9pQg_C>vFjb7SQ;z&Z9 z({s*ETiLMDwZ3ON?rwSdVcR)h-iz~ZP;O(RTs_im-mci{QqskMs$;IpvnuynIcI^p z`5#4Vb}ulXlqJf1;%`>`bwX`*#`ohl$ECh}da12>srQNne%s(yy)wA36+w+%v z>-}cMj(=1om-rTAK-+CI@IVr{UxX`Ih4QDiV)L(n* z<%yj;9IsNQgT3T;$3FisIxwBL<$b>EEq;oXpYWzTQul_#}y-B)i# zFMOlP0or2yWB=eL%|G8}-Li6M*`4+Vi>5Dlyz4~!rjbW0eJ$_o{7$u6yMAmqCFSMX zzgK;C;OLtV`WGA7tMI<+HJ%QfQ?O`i!4J>QUirLCwyS5F9r^q~!iA=@Zb|*uxtg4A zH*e~>*gCTlEae~82%Ql4?icS5@4e~v`VU9G8{D-0#DYJ!Jla2><;HLG%a`fUuY9)F zgNxXEMa)`xVAyMUR?cqMe@C?qtqXoSru&w7kvE=9n42wlWxfhues^HQ&SAmbw=Qksti57?^K-9!l)qH3g)1ND znb*8r^I~CVZWQiWBYe%4J*V472At06e}CKf^AXLLriC3Xo&R?2UNf64UeO}D`lz6Z z%Z4Y|w{3`?vZg?f`pxstT>3$ub7;A{6C*rZJOic8-x3o{9?q7V>^m&Tpk`>Ec~PO4Mwax zcR6n5H?RIOvhnns?N;=XUw$;c@uf!VJ8bLR{6Nf<{;&T$_Q)Sy13!BD=;8FmNyT6L zCHJ}s(cPMj%+=t^oWcj<--;geTGT6FRV&`TWww#F7He81hxT+mD)D=XE2WaswwFHG zVsOVP)_n6qH+I{3cy{r6OWaZKHToqa`QpL8=e9O4^+Bnq+8ek1n& z{PSDGveuk)_T}*%U$5=hsy^P|qVJLtYa&avdRVf^hzjrIow@Q{qkw#GZmRRsj<}zf zUhY?S-u-d;Uu%+(D!<$|zRv99Q`AP2`_9ZL{=N(!$s^+=m>}sz~%ZEOBG_L&F zw???CmM#0~)|*elM|Ie`dUbH>>=vIkZnC&=KDp4$_S?^eUbA+{9oRJTcHbxOcPgM3 zY}8}a(Yc4_cU`k}Sz_@q6;;1(=iZU}R~^!2c)wFO$4BlwQD*eV^BhHnrquW>CADSK z7Pa44bX4l`^Canm>7Pcuxv9zI9shRoN^jT~@%!=hJ2!mXr_oEvAH=P$ z{cXUQro9Tj{!wDiQj;Bxl3MR=L%S6sk8;|CgooH=~Sh>lkVj?e0cY_ z8y~-3;G?%ft99AmZ}`p}j~88^zB~RzuE&-+cgFlM(A{{50-o4 zyneJ~zNp@Lk6Uv#jCWNEEu6BzaZc(pYR$*bv*kz`*4s94MZlp=(VtCN@m#8Z|3ImY zvzI1UNqbgmn=@?w(!4=y_b1ora`Vt9hiY3(t@!AVVz&m}{;)*O=EE<&@m;{jUGCi~ zk$S8{iIpp#p3YuGb^ehY(z*Hftv0w%-a7R|r9-xPGxwaodg)TP0;B!rG<#Am>>Eet z(%-!|b@buf>uN0ze|U1t# zwb9iN?#F(%=d;q&e!I{%-@x$`676GN?iaH^Y*W4sE$1}cTWjQmtCOeiI@l-m%9dbKMBNsMkairApBL_Y#HXzs7bM=dCsh2Zy|3@o_zghde z_M65&yLDQe4ySlo%dUu*`X7<&2-(|Rm?pgBLRB>dxS)G&1hRkd}J5~K`C#R(IFYlaHl?535 z=@fo`xunU3NjaCEi^_le zv8vci?~f^S+ICeK9v=J6J9gU<@u-7`i@bu0Vw^{hAZx}gd2GFBu*EuqyIZ%oecof3 zo%M%JOmVNslJR6MHaV_*J<1^BhSAtHhkQCspH23}st?od zePKuR(yNQtnQPircl6Oc=vvzIb=K_4zI~r1ms~YJ6;w6JF+}06HZGZDkZ7%93Y1iDp zH6k?P##Fd=;<9OA#O^9<>n+V+TFtrAY02W9(Uviy1xbG8P6gF>o962a>^80)tX`w{ z$z_u6V7d9@cf_7s6;?87f#u~5w}wqldHr+g=QoNgLd&nE-ietpRGIb*?s~D$x|1=< z7qWLq|FqDp*6ej|d52FnU+$hizC%_0Y0f#%ZriUdw3^w%XZ!$__Itl9x_SOe+d{5V+r8D0z+xhHyH+|Y|%5lfT^x2_&XW7q>bNcRIqxeoiuK(vkt3R*V zjCu6HC~xbE47dHq)qZ|@n|+pS4#dVqP`}EE!C!%)_x_!7RVAjQqXv@cK zbQa$|WfYTMerwp2jIHIZ_inK)zxgtGbLHFpk#6M$D{MP=`JO{QoY{B0^2g_9&Ohhf zJT7_N>C%hkG|2m>hRfzY`zCFyc)a0ONVgW{H@8+f#u#c;o{bLZ<8}AI#fs}krdh|u zM6K}{pj;C+!uf!`!j*vc(fb$1to8~!8FKOErjV3ysZY5ec-j3fDc*Pbe0e{q<%y~N zgA!YcUHZL}EuQ1At8}&d9hG}uOU#yeIrSTS;90*fW6m}4UGT*8M{mnv*DD5mY}MtU zNE{JqUjDUo+>-^qhkRdq@5^2D%G~qxm7#0aWbB?6qTKaJ<;V7&ItgZ7?~)etIjBeW ziQZ`m8y^?v@4P(dc9#*YvrO7I%dgqB{n74_cO7#jE9{#s4!5md_Mp$_pIsKVT<6qZ z<>KZyMJ12fd05Ghy8}1e5q5uQw^OZh#y68?cGD&Xq_k1iKYiD7;JLP)-;elQ8QxMq z`+HW^_0vZm!=bf%q3g79_UEh5NAw8kVw@FH z!Oi?N8f#95FY=7^RJr!%#@x4t3TgA%yB5gQ4Vs8nbG^)^C-a3X1khPj2;)boW-;_0`@%w7#{))Mu#+?yk@KVC4Hj zVRLIe`>7(o0j}v{^uzrVVN?0*VN^ir;pHtW4jn#qG^nci#iPSoy(~{8eTTK`nDld<>%gE9 zdF9%j{B6#4B+YJAw5%B$z0+4w?yNNYere05m1@H;%o!vNKHTT(-qjDk&#W0f#=X^Q zxa8Km{G?i%j4at$a>8-0lVb6)1BqFe0*LmyO=DX)h~B?`<)+=|j_&#{kt(f9hdZYY zHeYqOV~d-oHZS}vx6p6q`~z+JNH!0Ru|}n@eZ; z_B+`=MN4}?)>ng3)4IG8Z0}h;W&GknF8c!Q-Pd19FWnO6tE}2$Y0gp;uOoXq4tpK3 zUT0Cc`9q;ja^QR>xxpP08 z&$BqUeAb8#L2}j$7w!;!nIF+B<ZK-1;daB_+h?y^?K5`t z*iR>qmc;J(tX`ubbX@@>3g`M2p|6J1zbB<|;Ebn#8G*o0`+_nFi%GDG5oL+8iGb3d2+01iu z{YPu9;4`M z(ps;ks`y}^9&^_y&l{URvd6RY)33U8H{5OZePPv-;y3dRMk(Cw`1sqNz7dvL7mSle zpLo};_hqqG-20c49Q0qMg&!6tFVJXdKYdf@qH1Y}YwtQ_#&yvx-+filcdE(9%`T55 znN8eG2Mp6wY4Kd;G*ChPHF$Cp3?5Z@QK_fepuv_m_lIC3*dZhjKl*O+*?YjDKP0zh2jbesvl?Ga#YdJY{ z#@*2NAAQ!h?$ddFM48X*N21CrS{;}BJJ`l3T>2OlJ7V;ob`FnnGo^EkWUW8NM=u!a z`B>3Pch(ub=~@EgTM8Bv?!0g9Q?g{j&EbwYo2);jd|LZw##W_!;itL>Wp>Z6c#!*X zbLhGB(V@2s<82PE7`w{q_JY=$$v4I(_?#`9`ohuXX!;}dGL?$97mr0wmh`vkC+)KG z%FyKNPrZg7JGB33(c9W-#%h0p`~&5!r9 zx%u$sTO}VA1(8?BV9|$)3oEkJX586*CT(}AUhL(CYMB?B9ebbct-kDQP_#%K@_fs* z4e-0=UTuF;g~E6}VVXx(P;l5mvcKoU)ot}5`S?cNr7dLa>%-n5CS8Q}! zGra8BP3@?#vUQsuCX61M7xVb-sOe)CoC+C~b@1xjN7~2EE}hw{_r2qCi{mD$Z7C@m zmQ(g2^gz?QL*6$T@V5MFt344NRqb*WQ$Ly856mCd%4~0|yP*%16MdffYs_i8f0fCz z6Z5K@%siSn_Vdmc8siMRhG$M2bZ77714$mwF4_#fc)oSJLeFeR)tN2MwO_0>s@VIB z=fGXI<^eT!!PN)5h)35nxp9rQ8)1~t$@S}n)E&oDg9h2;og>|Ig-g=?woKi4-8-h| zOvBlOt6q3I3--=-GPbVSBwjOKGjz*}=MhCuRi;|6=r!=J{(;Xc&J}JmU){RJlUGA4 zDt3PC=COvz0YikjZ^N%UjtP6~8)2Q@{QZMCA4lV@she{J zN%5Pnbzgq=dRh3Zgz8OuZcflh>lfr$^Kh_Th33q*gL~(}<0ATuEfTD|^eA7_HN-?yR&v^&;Y_$6h@v&-FrKOr}-Z- zy0zJ?Owae{v@?~LB1W%&cfv~k>gWE!$4mPpd46 z>^#ow%`E>-=_lJPZT29_(Q|F!#cAh9y*jin`})F1tB#edz1ZT4qM^x~gT>{55_D&_|PaVwJ(A?mX#3=iEdD+e%V*_B{E=<~ZW9_LOddp9ZY&kBw zgLGZ$hOXzW-&$PtzEc#V=`bW!X;13&D=Ar*?hV>=Bvfm{jzhCLSBX}Tuw@MSvAjEq8mA9tj)#NU$#Y9$3NV>BlN~+INu#>qq?fio8&)6 z29Goy;%r*I@=q1G8{6xfY22hAvxG|rd!5-XGq~C(x_K}4%LP6r+EEi$zdyaw?fvA4 z*S&L`v|cTHPjkAyN?AO;e^!p5$^Nl7 zg2*%)MWlo^X2Wd}EdB3cFYL=byCt`nI2Lz*O~i zT@>v$ucDJ|6Z#l8*Z6M!x!>+0`Q0|R74`gTI#m4Ob>^PZq$BC;^&(sn_4@qWvst_O zxmH6n)-Lc}agbz<^?v-dyVBAR1CO^THT)DBpzu87!pAp1zuhZdKOufsuDAc?A5Ggi z_aFN9=?3+ca(V${iK5QR8{w(D%6ETn?UPwk7FIgE`$3Hs)(@YUsf@dFVtyONr3oi{ zN%kKoUA&@KQc0KW76&$N_`D%%inWoMm zovG@6ec!6@85g?3)zdANp3a{~jin1NXN`B=?lJMjw^??9_hMYCFE~AWd8+fli%(|W z*i!g;+R=FP6=QW%T*jZDT-J2Lr9S6}Xj=3(Ge~Tg+o9Sqc+v4cX8VtI6o0=3gW0~k zC*MYI8a`iJWvSz(DeDSvt#o_vYX0q=Ee#Z&FYA0nd-L74qe^vlZ2ctnMRsd^L6Jlv=Er_hDHx25?k>R()V;=@||==U!}G_>w??e7-%X!g~V4zqp2mUTGP zS@ia8qw)Qp`d(%Z;R|j5sm~Y*8d7l+FS2e79!LNWO&U_IWR8}@= zyun*#9}kngYDwi?cD~eF+kSLK)>n1?57(~9Zm+no-bVfCw2y%&<>0i|WAixmU0Y(J zqPDxQd@a8uzU3D$^*-{M3QI>jOgumNS+3gSj*f#Y=f#BF^h<%Cd`X_(>$S@+zx`-? zQTu7^ZrfU`fzhj+7Rn7yaH=uaPwBd@V3);?ON$=7&P?g{euwtG>>lZlbE=M-tv3Af z=dLa5+C90Vf3(LY>qYIm>^k4NLsn{rgT0HPNzONqt!ae{qO;NVSy{HZO^T8(?`S{M zVf7_Ri}gOaw#yYd8C;wH*8AzQe%4hL%m2)*oFqJbIAftu!T8QNVo4U?P- zJ?3J2t28EJW3x*M6DQoNel7_6K5c>BnfH=Bd9UmJvrPs+{x~@xmD<@8^B2>DA{% z+@^q&AKNTQ*}lbEJ9$av58Ee4U%agN8FQ(RGyIz9Skv-1Nea2Wp9HwMhuZG4cl@k4 z`0+RozggLn9d0j*I^1sGu+Cp|Z!VlN`QG3I@9%a?u7O*}uLrFu`sBCZZkK}Bre2#O zdTrERS9m|K;@BnIivD&nRxy=pvtGo!{`mZf+i@-gzl{HH-f zruH@MJ-M{4QG)Mt4P&DdiJ_e*kDXw9KXJh=rO^)$lplNQU(r&&blY6L*oPl>3La(X z`l9p_H(RA9-OV4h2SPzl)De!yz;e|n{%Omwg4=W9Zd%POhJ!7wLWp%$rgB+$8sVe`tY)vH})V0$r7XEBH_^_c%^tIAsYIi>l;M$^FaokrFUN+ zc)K651-=8GHn!{*8z07u;RBCxX!JK*t*i_$J|N$y6MOk3n>)PMiFAbt-t|nH!gL0d zPQc-Taxx#jtKb`cTaPiq(+cc;@Ay0*>nntbeM4yY9SYxsRM;~eJd8jx=|ZYP-qN3d zX9eW~71CLb;Z`}OnIg}yTE1MMMw%)xy&zj%ALzDRzYB4m?veZ%`ZM8fB15qA=I97{gV6WC;(BIVh2}}9}WHs^% zv57X5tpHVsvo`bNjTneHR69yrh0M}sb6lalNn4j3*FFatO%c;{6|tNQ6?tlDk?A6D z1ub$KP=#E9RxNS^WJ7Xa^igC;L^=%Z0kw#m4$}vKtU{7?n4fIKJ%|~)EQYm+S9Muy z1>!qIfgX#eJ>qp*E-)oS^^){V$y`8PvR3b$wgq{j_e0NuG}UKljOd8y4X8pQ^qJ2X zKt0T@1zCss(WXrQvKhlJ_Olh2&^}OhDnw%Mt-z{{t2wqsx6A4WC6B$Vw(xsjcgeFA4L;*X74$&C}8OXp7W>7OER`O z5hY{`Nd{QD5o2Vz$hr|5WNVQ1AnlQDK;}<+BHN5CkOU(;OLl;l0VD?5J8}isK$3zC zo|>eLO+eO`vd9LK=~NEhO_mQ&v}DsEWHz#PN{mU!Tx9)Vlg*|wvJlxwWT|8^vRlZq z$Z}*V%FJ>;$wAf^**cPkOonVTS&i&0vSVaDvPZ~Hk^*D{VKrpa3bF;+IAr(8He{!f zeIUD#RU!LE_8@Bu&*NuPHF^M95Hf9g2w4s?YkCaX0c7^H5ZMP+*3X@uM5fu4vF@}4 zSx008=~-lbk%iFn$i^c}q?eE_LpFw9L3RS!EP4&uU1W1<1u}hjtT>ylp|_DaAuFJF zkqtt2nBGS=1z90|i0lxutMm!72goYuGi3TOLTA(G^cAu;$llR6$Oa%&6nsFIgiJ;7 z3E6UF#)5Ci4j{7-)F8W$%tZii?1c*Xfvl52fXoU;uxuJ2P(;=hS+GEe>^QvfBb!DF zR0SE(Z>@;^AF*VCnt+n-P1snxP$wbifPMeLb>j7D|<8>+72cs$_w^7f@ z?@*&GXAOEwIeWnFa?JBEIcGr5W{g}Xkhxy-<+_5rN3J^{XZgENF1EAi=Mmzch+MR~ z^31=3yfsAYBkvD#fIM5?5%RqO=gSWya-={Wp3)R{E6k7mRDKeX8swP4?GE_+$ zY@(EO0mmR_BCbH(tdz$3qRknlOpx!R%=!GLlnol8uqpJd^*^tH|5$he@}X+BpkaOf ze=nY`@?9bR8sTF2_vW=ru^QysEN%G5S>il5mZfhE{5PH@cr@&PDJstMKa0vo-V~#v z3iY{C2Dvs@>dJCZhs@@m)s?CWt40$QR#$fLT8a9(1T~mT;~DdTZ9$G4MBIv4yEgw? z^PJ^Bi?E^p#&Yz~Wdv40WaKhGiO`JcsBBRs2EpYtmq*RI*|ux9^R#u|&nOsU@U z->prSfm4{J3i&j!|NFK1&vVt#e`9g}>$O=Ud{uA3iSKBWd_-{Nj+#LVwE$)9373cYXlCi&AcmI>9{#iVeG+3Qa(XbcEky#q- zOkoLX@=)H2ctC@lDHNl8U9&YDI-x%^q0xvrZKf~(@YTGUt3XF{E*ds#~Bhxx2G%_$UuVY$9 zmPVF!%+{#25qonR`;;iOGjcU*#t~qBjQow7*Rc?zpayJ=(U1mgrjfJ(D=QG9iK%1TjoOmA93!8MMv!*oIL`#e z@xV@UOsHmj(5OAR%QLa@c3@9<%QnWvMjeO{7k?UYGcE_FkF1)qI_pHNc*g3?l{~Q^ z@TsP(&N>rYOjI>xb=HMQdB*CjD@ouPt1~y^j7hAftj^qtjAyLQx{*CRV|C_1DtN}~ z%#)O2x~nOxGcO{v<>t=ntUKw!GgfEbB$j8a&U%m`EjUY7XFeo{XROY8lG{9Eb=C`B z^2u4UI`btO4jf~3=0^f~#_G(UWb=&GSpdo58LP8Cq!d?LHDz_ym*}_Rys$bOK%_il zbvBsDc*g2%D4E-avt)G^LMnL1>P$k!?1l#9n$=l2@#Gn+vv5-8%(byP3n!{B9AkAB zPTYCM>MWcD@{HBlaI&-=XUXa;nmpkdtFu_rzCCN3M|vCEn#7Y}o{a>SKx9121U8Dy z<=JXriDU=Q4g*Uf=XrJ)n2fyO88xvrNrrzY%gw<8SPHS_nFp}Z#FJ;Cz{ZdWo=pIj zO44|i4{R*Sgec{UJO8f$=0 ziNYMy1t#en0hVK$*MRLc-PwShHa*dRJulZ-m1XZFElN*!}D zlQW%K$K1@6O{dkdfo9sK)9cs>GZWJpbu7~?o@CasMP_!UGwaw^GiTFTb?lf~N7F14 z9>Emc7?MpU)UoYGv&mYH;TST9T;&-XL*|eQj^P+Gm%QT{8$;%j8s3tPA@hi_6z70r z$UI_?teUcXE+BzCWBFV_M3Kz0nzDQ@Aig|f`CLGz@Qmei0V&`a%jZH89L@D(`CLR6 z@{HwkF)8C2%jXjEg=Z|EOG)Vnt{=9zT&lMz)XDpvN_;OhmC(CCp zaf{>nv3#y1X~^c0TV}Q{<8i|bf`rM~!79UEa8kN-P` zDM}PlEbUB7>)Ns{olVcwv0TfJre}#94l3OCcaCsF1!LQd&J$0r4Y$8PND|N3_V))F z!!g|cE|B>=W82>alEYiF?e8Kv!ZWrHzevs_tEQ}8E|UtLv3j{eB5*LOrmSABlC?Zz z^-@Nvc*g3boV?%}tCwqJ%v82e)s)rCb#j1btX?X}N1m~Ixd8(WXUXd2Cdr!4F;*|P z$a$Wzdbv$haY(DCtX}SrRyt}?maJZ$ zlS^|s#_HuI(VxdLRxhu~P@b`Rc}t>r#_HuA(OvU+(>2Jnp4%LlR)**tR4($?f7 z*~7DIz&?>Op1lY5nY`hdnU$@{7oxF{`J6|30sBhqd6oj~8}a2?KCtg3if2cG)sPuH zy8-M6SsUNdq~Zf?4%2W8P@)}q#dCXy*0$zCI*e!6tlI#K zLY7V*S+_S=rsEHx7xKY+x49&-`shSlCi|98?w)iOpnDb864CIGa%xE$9xO zjkOtX;XuWOEV9L98dy5g6UgT2&$U@<(UJ;Iur@ABEoqZFwieoq>)0lX*3_9}!X-8< zM9$QoXX|Y4={VB?Jlkz!AatRL$kK%;ZT4EUrQ^9aSPzFR+EKUS+WA#jxYGiT3H^0f zh`P}~cs5A)o=!LVkZ0vK#YP_VPo6!txohD;l~1A%mLbZ(1|?j3~fE=42}`MW^+Y8w32U=fMriw!!sFJ_M{0o zWKR=LhqhjH7SEPLTQ9l?*RCC4J~0&bD8(0Q#eKrH+yB_OAC;3>%oui;h6AZ zv#%C@^a9VWHB+|qqZK?8sg5B2^c~Oc!2JAa4YCsW9}*)-03Cmt%ThH&7C@IGD;`0=U5J)=l|f^*s>3# zFD_s|95n{gFC4>VA4s(>VjC{|Kx)jhMB4zXL9{K;CfN=I=EgI&jt0{~JY(xbv}=nRhGvP3H;Mp5! zi>8S@`vz^%bUe@4h!R5=^NfusF*J{7^36w(5%dtx)SAZwJIOQs=Khwk^e)euH6I4- z2{JBcBdK#mea=SGKxACbMp79vma`pJarETP`kckn2e+^v)^0rg!ZFgec^HYOCvS5; zJ0W|+GY@3)ce%Fy$fE9XY&0@iCC8>An^DEF9AuR|+ss+s=h}`V8}pE3XE;lqRUtEc zgl&AB791n*vCWxhHOO*!rqzNi1F7bGIw5oAStzm@Jj+6Mg=732Zt`v19A5D3C|ZU- z=6qg4R=~46$d2>u3$iCX)3jr;w0gqzGe@?AXC0A+KIPgxksaq4#G)gJrkHOBcS@cQ;I;wtU-MVTPQHcH`T=>t_mOG#IZl zR8ud_Fp^A-J25ZSv`AGdOs4icV{IukqDy^S3Y8(7N7CW?#ArH~XET6}p*wg>)-RQg z=~~|}mCoQ9Ya2@oyVbXirI(O#KF84)JYzn`Q&kVnlJ%QFpYV*uIe~s@&^D1Kc-Q-! zNYjvUJ}1!}o-v)WPLVQra~8Gb8S|M%dm!U{W>ZoB`hMBeif7E{Y+5#`zHK&rh>VMK4#j_r08ula zbE$YRXUY1_qhEN&*3mpF98%vlpVkbk_c@=chA_tYTtM0XKVppeTu6H$cw)ONt zT7BDkT8fPGxq&|98S_~{$1LJ3S-*|cZ868#df!L`dB)l{QO{-dZJTH?GS25_n!q#W za|@lzTe5yz>44?+{kGC5p0T!VbVzP}+cp}DjPtpj&fppIxq}w)maN}Sny|9I-%gsw zGuF0?%JS>mcF`%wIG?*|9?zK1J+zRwWc~KiwX5s|_^Ld!I=Na>Pgbv^>S-+#y885bR z+tE?#$urh=jLzLw@ADYVL&o_$PLJ@6`7ETjc}v!>h!$+G?^i?*@Qk&cpfz~ujho*I zs=Aw5az2ZxEzg+Gle7miuI5isjXm`~Pf; z$@-n4AByVxouL}=FE0w@|2^D__P^sE)c=a?_wqjSe}@_x0{D%a2HfA?%G>;N&9Md^ z{yXw1oNq;gUjMG<4leI|^l%3;Qh_b$NI(IJRQUI@%B_Xpv&w0H%_{S}hmZXKW^T1q z*>e5wpmi^zU0hYag$DZY9xCX<9BO5oqP10cF+Y~_d3mW)8hVTm-_H~V zKvtnXUWc`ESOKzt+(%8V%=S~yP{Z<2>wz2RKkKl1rn=0A)w4WqBML+vG>YUH>?xFp z5y(Pf3#d%m0jiMhx@?Z0>wHq!YcNgi9)!u9rXdc;UJW(enr*1zmUp{e;~pAXa`J!5 z{@?Y}Fp`FSOZ8d)uL8=ETY!z_VGoYa95$@&|6k8#(I-uaDODvF z@MM$?JmuPgsuM>lf?r?gz@!V49!&6$aNz09OkxO=5lqG~nZRTUlNn56n9O0afXNaj zE10ZdvVo}?OtvsJhp7cjb}-q)%FtvrL9ZcHt$m zm^#7a3R7p8y1>+du)A#VbeF<#klEb_AJD{;-l$it!{xA4%u zFf9El&_t7c3PphTz(X{7j##5mLXDwUC7nn5DZ=lhwOUIKg2uLop$d(iI@I1_f|tcdIv&VgsYmwDCoaFKT>I6O6rvkX6b* zU~jv1U;NY4-sf{5d}k2Yd7&PuUu@M-TFptwDLp)`&b_sa3^RRn)7ZUKRDu zl+~>>tYsa6D@N#w5xQc8o~ZFejVEe+(cTyBgRwOjTZ6H62x^9)W(aB`Fv3`j&=q5d z#Ry$75?74G6(jM)R!`J>qTUnrGW0MWJp`l8c=QmAmceKljFv;NbqMN*pneGIm0^v< z69b4jo|pp`XseR%8auS7P-V@N+F4XbGea(mny6N2n^P0bJD~T{{2||)4uWd|<}^(6 z3Fu=HO*G$Vi?HuP?3;tV2I4j~kWAE65e+2sHAlb`;i~}6>2^(#Xd!x2Ci^w5L~AiW zYcW4-F+UQ@w#R7NRBJNyeWW;DWDeuoTu~~-83ylh_^z=?ln(PU5T?>7treh8(prVM z9`r2Ec~nzjt03KSVbG6?CdFLJ1kG-9*QnOx4!V`ATnT z8|zT|QhNmXO22Av6;Xj$WT`Wcv=ueik&qyfyN;${xTptUyvSc?9vveJ)-e#UCF&q} zq!_Q`BXH75)j7hl0VvTKNKVoyofA52j$x#VjMcfQQ$^Bru7hT(&Mr|j^o@rISq9w6 z8lB0QpL;r^1P65$Wk3@n5eL2Iog7Nywh9a<6Gt3uc=%y%`HweZCdsf(@H* z7_q{+YsxYCtza+A>#d-WM<+vj0ehC&UcjDZwimExnVkjf&Xu!(-J^0Au)9&sq3L3~*njo4ZS|c_`bU%@(LBt}&Q-EsZJh9Z(g5S%rWx0%a1Mwx|TR=7Pfdqlg zN7Q^p{DDX*>!pCGjMx-W6Hy1z0MP`|9MKxFIifqF7os0xZ^VI!LlLEj(TJlEQxVe< zGZE(@E<(&j%tzdaxD|0P;z2|O0j@#Brihw|9T5Exdn5Km9Eg~Un2)#)aU55&ue<%l;B?;utoK0z^fjF^fz0WlqMDq<#LHsUd3R2F_0gr4Rr;w7F?%b zScUiq@hRd<#J7ka5x*k-02IPex2di<9MeC9~t0uN!NMGuJXh!VtbYNz}V?ya)c43zUxUW0NG%Ec&Gq5J^lr_@RLxGoj2 zUUGsp;6Yj7qzvA6EsIoLo3+(omBInvQZAs9A$pj97`SmC$-jt_n3(INt{-6D5pFshF6`QzeW_38O;U zoJWibWe>zq>=g>VM#zVwCJi-dpxGp!ftodl#fX*IS_!Qt3RS3ifJlTmcVRJ!SD-?i zyO7Px9A$Hq-BET&ITY;d+@rY42=aFgLPQa_G?ge<@yIl!35!IGXwDi#3YLcNI63 z-9Qd(l8160$jh4)qFe~_%_d?^wATbbs%|K|fh<)G)ns!_L(D@gM65(4S{M(a8)Bg@ zMyrd_>S3!MMhghh>S45c#bkQZLX-Uk*Vfvl!ch;kvwy)?vzXm40dc4@ew>;|&3W**9UAotZQ zM7a>;`I=%Qv^Odyw=~^Qb^}>oE7Sx zx*--KRw5EpY(-2nW$~n$784&)s2F2F%tI{X(46Tj5s3x%MRY?9<Vz7>byNn1@)1ScypN(H_wa zF%&V4lN~n0aZZ}UIlw%JtAK@wm59WVX~c+bh@psShbyNn1@)1NLpj$h;E3Xh-rvYP zITW!HQS5@Ph?R(;ZBc_LZin`Wm5Ac@*os(*7}^0fh~kcDk64K)?u4y~m58CPs6iBW zMtj6cL~$2vMXW>&?TQ*iu^ZYWRw9bsu@!Nz(J`a*Mz@SqjMa@r#sI%&^p)uc({HB4Owmlw%+ai!Su?SN*h$<$+*Rx)?j;TuXNWV!bHt0p zE5z%?*TlEQ_r*`duf!k3-^2oQ4RZr?2lFuVTjm-TrWUpqZWa+1V=OW(W?SS~?6i1d z@zH`>YFV0DwzKSKnP54~a1bg0^F%mBJ7@oJe;p9!uuUzCq~raO1&nWx$D7siU}|? zq7C;F;GL-ClXYVV*TX;`Xa_eP$RIm;z(|za7z;s;x6=e1gP4w(jhKVD*-i&qw>6M= zqvoKU3FuGQSp%NK)+=_7AanK$N!z+!x9mEB{K(Fu&hmGkTnx|9&j-XGh+I^1_AEkW zdp1XrJzEMhdtbn2_I+&xaQB2|ss*5cjE0O+G6wUuA2LVD0YCwH#qNTT*MI`@1~N$D znXD!t%i&w^6J2NVzo+8ks@Kmln>$ew@#cs_=`dCwP6K>TQDko^G#@SF#G3tvA#0qIZO zK^_1ofH&`YfIJ9L0MAi)fjk6IK!#FpkcR;Z;CTlhkV63lL_&Lk90n*L;nWZ02tWau zK?6X}1QfvUZP|PIW&sLF77YS98*l+#5AU&57vu=W$jy-3CZ{6*M*g$Brb389vEofd zJ0)9TCt;E>Rk&YRA~aIAQJ$f^K>4cjePvA*naWj_S1Mhb98GIX+IH%*KMMks(V}SzTQ*4e1n|^2MlTq ztPLFuJHlUgOK+>?Rs~kyt>n|V`}Or`Z%^Pp8Ld~q`%4*-Z=lJvnFLmU)s+i=*UdmX zr3QWH+nm$>tKABlg^l=2g1hwWZnq-LTdh5l*V?Q@J0`QB_5u^Zwxa_Rdt-?nO!_bx zz+?!M5lqG~nZU%}A7%!V7$$R=EMT&P$qFWGm~3FXYX*}oOwD0x0h1j}_AoiXWYCzQeS0sfXwh?X06C(9-QHSO!;v zmgz{K^uz#HgsWeCL~^XO3-JkX3>qzojFcuix+g>vpFpXM zee+*FL9+NnDO1!5K7EscjkvJQ|hsb#imL|y@8K4RO-MB@4B+R~^HE#WD zfUL)_8tC6gnv@V9mn02sO@fK*FU?&>goJdHgpYuCr+1H*#zqiN>2OJMtclEeh!>Xn!npXdQu`OUtzDNY87{;jp2G%<-~IwXRdbq}coQt2m2AfD0T zEbEfQ)X+90C^bnY9qH&19~&!0b&{jEG)|fr9Zp=?T8)#8Y-G-XlBA^3@reTP))0-+1^^StH$D zdnZfcWYMzJ-vW0Hii%F~gaCePVM-PiaSf75WXVat89-f(Oo){>($%%L$bat>7!@yz z@0%F=yF1_LBpEE8D{KwFH@bF@PE3+DzR13kziaUtDT$74G={j}mltc|Zx%IyWwkaD zjaMvJguh4b^Gi*-LRKZeMHChvkxG&<%R~l?PgrRZ30G5+h=^z`>R3OiOaiqcA;Y6% zr6f#}B*nT42#bOGCXV4Sh>`GLMxRKj3^vvzDI}cqO^hbN@!WqsAOT@X@od$(%izBt zgeA+QFl>!X0Jn*_iNLClsBhvoq&~?|LL;THL2;Hr(!`W#*d$1bBsN(}MnL^{2M>Xg zM2KDnV;es&_lOAMlf)`GAkk}Nf-IE{k>OD2Nf4b6Y$U{o4GJ*fm_u05+7=bd5Cw{PvN+PAG;MWQ9;cKftG}kV}Lqa4Yt->YYQSc_D?#XfC zFk<|oZB4x5l1EAt*=AQemiR`;je;cBuTuCg6m>>Wyq?mqWVVwDl1USSqY~qjBcpyx zqi3`vGA=$z79E}h<4^*uP$}CDC8frNcL|4}n9zz?$)ci@h*el}G#ft%HU~?RMnDZj z#Yc4G)mDKX#3NA(E+E;GL@o`?4E8Aie6Ao87$IT6c4XQl&KXOo)DIRvI<7$#1g9pz z2LEeR{i9`3Y$f=_4Ueyj5H{2V7}P?#goL!>L`-fHaA+EpEKN+UQ$S*)aEPwcI1$(3 zFxb^`XW+G^!(6z4OGr^S*e-yzh5j)A5Y9=61jgY688d6wSOe(W6W2t(nt*j6u1UCU z;f5O$;{G?;WIH>^4;zCTR>xn;0z!v^{%wtcRReXSDRaV_^kf_GFEfCJZ#X{};w_c2 z_0T;req;|xTm+OKzv(e8uYmzEjzy8wEtT6iek~yI*&qY3h8i_*G)%~S!*C$^4Jo9& z-W40Ff1NK_H`3hbeA;oFs3fT$4j;eF1y*3gnZg=`oWRm{OZAEPb%tR1m!?K%1|GQK z6lca2MS}#n|D{B_{W^bWZWs=<)@>ndZfw8(YgEvoaf?QS`^(%sew~{qarKn4vHG`~ z1H)fi8ujkU#$l;sB;iK`pMYQed;LnggVXrYak24|2sWDkx?EuUTVta$1uqRV)*34C z7Y^H4--O2J!EFE1*61u+*AKVd65~fFv2nV7u&o`5>zZ)9gR3uWr@@XRP~b|>N-|m! z4Lht>xc$3x1cm`9ES{jTPg3mxPXs}I-?${naA`nXy&8JJZj2ob*PjmrNoBtf-k>(X z9?=mI(zyD-*-%wGE)(dBar5Ie@xj&ci^>W*gpX)N;E+|C$PQ8<2A{YT*eAkC#;I25Pzce-K0Y*uf754vqn}xyYx5h@jz)-{$cq4(pNb}dW zMt!s+$^5ZCN#GCd;fx0NnRsgVm;LTvn;P{A)m!f&iJ7=3CQ4F$;u4bovLlCd{nwU_ z`iJcOr58JZX~aEb^1n1})H`I=H$E~t?)Sxqoc`L~{w+8vmuKQ4idB z&boI?W!vJfB?f~hl*eCM8}(B+5dR(tjE&p~T-Vg7hq}SF&aCbThmCbO?$$Lm>Y+P- z$W7c6BjIo{uEEC64v+{O3c~>#X>deDY7cEl!=oZne?WxC_uR1&)T}Iu7h&Ll(FGhO z$q08CNZ@1>hp<3NbRrzT^2eg=JODD-fJL$+<>bV~+9PE=SB0aPxiHw>vv$95}q zBQSsbj&lMRtPRFaX*fG2fz!y?SU9ErwLD-HOXRWuyKyAkc>}Q4a1xcsCbqj{uJ}D4 zo+d#?>gF6D7Q>ws5PqlF;35Hk+EROnU3(0T8EBBw1_%DQRKC)HA1VcT1JQSyOyMh}WoONi3X|;}IWREWkMXNF$|VYU2uq**bzI zIaZSBH6{Vvu`3@*b*CM$sv)a>5?Oc@@rLt_1e`}uGG3}c8MR4VWBpQM6P|l{ND^ep ziExN1O<+Slrj6igbB~SXB4ue~7q6h|M#4^oPb!cw*yF%SL2a;oq{I0uE!^1%j*JAV z2@1uBySNdU7@rc&PH5mT7_Tk_$x>q>8GM$#;eYHwM#gg2&Uz-r!@iYEq`!2u3>G|o zxXh8M;YU$tz1ElGqRSQpr}M8`>Dec+rdQR)Hb z%52@qB+-~;e*M&TfK>O4kB%cURt#Qo;qmOG3cd6V?%tlQMJ{2%@$96#tuthb8F;3` z`FwPEgMEB_aw4QUf^Es{>KZE*wgs@Uhc^y_?WPsskZlG`g4yGVsta61$Yw-zjWmY*C|+%2stEN zClbx}e}tugDJNy#lENhkQg%|rCktvhiugg2gObCNxcu?s z0XsQ!XS-`6t-Wvvqbql|&uh4A0dSi%+}E`qO3u4DT+i%+7?athi&~jGvG9STI9c@YXh?BzVk(pZcWmhyod_3a*!5noF|ZF$;!oG> z)pZiCJXVn&aCI~ZMp(XMkQ9nl0xp=IAb7>4L?_0_vAqpf!$Gx|L<17wf`trQcbCgu zQq&dqGK{TyDX%Q2mLgFkBT|2+>d=&AE0JtDqWqIOmDeIAF`@Xc*!eNCL{cCD@{piz zVHYmo0&d{~Ng)&ll7|>b(LDGe1ri_uT)+kV5EL%ppf2D7NgvXF-bk*CZ%(finQ47LZ~L`}F*?^ka_kLl+n4*AJd% zFbeTp1VgZzadriiD>Oaq{oo+19Gm7VN6@&9bOY0XPHY<@k zYDEB68m^ZNYYH~n5G&+nAcfH=^=!N*AgWv0eW*+M>ljz6hn7W`Y=Eib8=UB|6U~8W z1{&N-?ZN_DVpvodzz8^Iftq)2X&XAmCcHYB?SPr(ZzCH44LUOoLa<-cWE%|4(V?|! z#HyMcI1F50n38~Z3%;%*zc`?@Q36bxX(S;Zt~pwyR+;_Xzw$F7zia>@KyBsfw);?l zi3$W9U9oAjL2Km(opbt?#S{j;O<$#N4Z`CbFkwmRa@?9WEC{1IHYj>s7NS8%_%Li2 zTL;Y_fyf38{k9T-4Pe&Rvnbg5ZH9u4osEHDVYWr5h@1^S?U zXL0hPWLX?+@vJ#!VSfB83**Mlv%)Mm6UfSf5x#O3mj#9asut*&lIcr!G?Uaa_9(nb zJjq68=s;}7=Mez3vHPg4=I+8V_)@$H+5{Y3vF4Y_2e_!qMr|mH&9ud`GFsGD8Fd#5 zLh6Df9q{yUG|Oy3fK9v1)nBUdPGF2jrvjfVX@dY)7MKZZWx<)iRu&wFv$D`Ipp}Il zNf(X`MtDgd%`4UlbfKZv9&xZt{L15!fwZYBgO#m158R29jdW!Nv4Aa6=ZaxjwCcmg zy_8J__1IF)ILu}-)7ThUrO7rJmRX9{Di`dSU9RI~9FQ&-@C+cDZEI0Lq206ClS{V2 z&875m zHZO}kJfk@#GMdH=C3azAhe}5o(g*_rQrKJ}EIG3z;YKf?VtBzNY#Y;15>kwA>7^mh z0xcuffpzBLaft*;+{grS6eAx~cs9#G9}Zun7zZ!Q8I7xGfIa&pJ2jW{U^>0#O)bzq!V-ewG zhE^W1dtL3hbISZdo1u|x%U&QYHM=;;rkfRWqCv`BfX4+orWVaZ2TBrJz6t9HaqGw? zK}#w2CdNGT$=EtZ`#uddZi?(7knSRPJ~-^OS>UDL($oqeMVxT|tiq!wq|}}5FrHP{L8rD)ffBKHZ~?#VS3tE22zjX<%jJ$KyxFs^t_gHr zebK8+?YJM*4N%SDx31KoQ@F1RW?iIO5cw9>RX{JIo>`%uQ|F}($4N8XiDn8Evp)77 z)BX{41ub3#^nQiYzqN2S6N>V>z34s zTdm9Rka}*MgER>2icHiP^}2#K%}Z()CCjL36~EU-e{)FJ@y>&`h%?Z|J;*D0Vc&tj@THQlKZn{$#Tt^KxJbP@_*kd8CMrt>gs#TPjz+I8~?j9>{yvxr*w zxh5Rt6(?{Nb*iy;E@TPAdtIa&hQZ=7IMOsrb*z(4PiAW3@MGJ4H|EbCHElFCtFiWa zx#8h^I{657G%Hr6U2X$h&xtMwp&M$zDbPK!ZJmcoo=l>R-6Nt`y5u=Hb-KFGBZWuP zV#gSQ9W||o;F%UG;f*2BJ~O;|p9SyLO=LZf_B3R|c-T@1zvn*a7;rUj)p@y^tpgiw z*P0RaC26B>8*6}5+Y#2e6)m>bDXsp}@1oWIXm)a_Bb`T?^B9gsWZpI+Q{?7-JuP-e zTb{$jy(ZQn9QHd7Bd`TM?uljm>=ep4MZrQZbdoZ!hP50nwBco0f=K=QHmm?C1GloyFjaG)J_L1e&7$De3@;8(lQw)YK=19;ZQ8BnasIyz z$*dfm+vhJ0j4YkIB#+{EDY5THwkB~Ng-CqwH4LtG49Vk|mdxborjvtW^jr^f0kMj= zZaGPgVDkDHmJ?6Qu;4<5uH{;~MqR|fSwg<9o(4@Fzt_Qkoi1cQA(v#W&&l+X9b%V& z!JWqE!JiHuE7>AmCZ3;087E0SRSv6@;trNk%5}BbC7pm=AGKVK^_{?BMMwT%k{?H*MTfBvY59o4C6ycbvt-NTUU0-TZSmwkY+kMY;Rz_G4Ag*3Iaigp~wmmXBLj#BQZ|yOHa{N*VQz*u@~uPSE1oLJQV8Q&bqmL zkamb(j6ai-(sRTb@;SL_H{~%v9(w0xIqhWGBhWv4m6l117mfnC0FBI}PmHAqWRNr$ zfJsT|wH!X%#BoELV=FYomrB>4N+fk;TP!qpXj!@A=OXbUbg^J+lGX>i)}4M08j{v< zhYvAc$FJR#nepdp=klEPvuZ@NLuJ!tu8X4bxf?ZN*g$G~j`Boo2kN{c9*OJ)w8up;ejo!XxeuahFj?sP!xc zd!FOf@EB9-#0U4tBN*qVEp@ZE-$P%pCf;BXcaAPDsp_cN*svPQ;v9r8pk%~z*xq9B z-d2k9Ev;=sdtWPU)^dHyEKKdp&I;Cl-ogHV1~QxIm(#4;K@ZCa6MgJejPUlj=t;~1 zzJHyD70wGiBEz`TTC#KFFmSktTmocS*RjXcaT(gow;DA_Psyz&eXNbh>-aei{Uh$UXABf0pgkz7E z9cFZ2lG%b5V?2isYuT zdS;xGHrK(MUYM&m##}ke(g(8rS5PC%xmIPJi?W8iiZZT&%<58&b(VWr@E0)ZwcPN+ zhw>?OFAM|Ec@sm0rvd7X@r%EHE&0z+ymH{Vlm9gGXaB8=-N|13*6~{^bXN-9wL*7X z?jB5f3US=sJy_iy_3B#%rN~vQI$Hq60VI>bNbm=v+@^%**Uz(f=60&vj^(Q=s$OuY@`Fhk{`|hdZb&YjAazBV~7DZ_IBlt#C@LaG>wKq_; zt(K424rZt<+s7jHDIDU=fOFf@%Cwcx@=bNW4XUCl2k@P)vUEo>T&@=)=DSo>i1D$t zIEF@5^;o5@29py}GF1WbsX{UpgF@~lP}FYU-Crz{#ja>qVK6xt?E?C#!Y+K>E4`!R zilB;1gUQ*b)>kh^72S;kG>~!p_7%IU7rQX~Uo4MCQPjUnb>Vws=h?GQlpt!-7?0G5 z_iY>W&Oto7!)?Di_bE?{?fY~X?i3i7mJAoWhhQ_wL@$hN4q`!!9-G29l$eG^q0Sj; z?L2ZHkJPgS*mRs{7rFz*yj-6y2 zDjZNy1Jm6KimYDWhO7Z2EeavH*Ci>#Q};&da2pxiF<ZfhsB!mb^Q)cB^%>?wPz@57pW;S@duw{`MdNwDY;#U|q=@oVr%1^TPA zP%WL?9D6|DsNUrXe7CMmm6-z&R@$T3VOz!84r2x6xIPu(TRy>ur|cNXaLjGMF|CVd zCnI&F4V#u@6=BCuX%1h0FjCXE#35In`;{u8SdHL!mTpR75+5B zFWo7(Zyk=*SQ~Ec;CUz@j-6{IK7W6tPHc@hR}g$SLD7j^$$uCdHTvS`j4w{+ zb&B2>r2`7?IR*BP77CmZ`gcX!dkeO>dcK^r_RVt3j2GGO_q2bl1EUVd8;57?e;MmpmaO|da$S^jgvE!YLSC=j6 zdLa6eqi+WfjB{$|MbTMqJktmh8Qs&sM{ za5hP3QKl7>hw**LOarDYod!%+Ed7NX*KIzFw?8;`AKE9(a{vm})43BPX)Tg!UdnOt z9jeK!X)i78LS13z7V_6lM(VyT zljll;nVXhmT!698#EhE2xUyKcxl!css?8VNn0d(?is(}_6xqG$P#pD#;%K$`vLk*a z1A5hgz7vkpn-20C%ySaIHPO)bbDTd9sLA5loox@*Yn=ZNa-4rV;#}pz`E#IPfjKGC z{4mFKav0{l#$nA6<3xDKwypdy5?f8c8cvun5Ncr*kNPTjPB8IGT zCFG!?o8{&?y}|cjXC+szmVT16uC%g;uaQ_`F_zrUD7HJJSd{#;oMmMjhPfhRbP1m~ zJDH(-b0suGtayd^txjf`AH?|k16LdXvtBAn3)2C^qPJhz(?32~z+m84bA=`HxF&pjo zpM*2=gNFV2Hm<&#f0agsn2KXv_M$C&5oHW2M7{N5(){Zf&HfwEGa0A%T1B`Z?!p8J zlHnf4kec7c?q)~5i@0fyG*L2vlCEwD(AAwZzs;5WoUGw_rBC}+W{IE!buMJLzulL6 z5G0J^xT1>5a6D9EfDlnA1eKcqh#g1;JBOtCdaQ3XqSnx|p%OllUq~8BqX;vD(>RCF zmzMvh*hC=q)%+<+gzD#-+rLWYUn+=)A!ydEpiOYmO8s~4J%&oCx)5(u#cDN9n*UX8 z{u)@dIBArWN;aZ_{-~J7&KN!0C?SYe?1h(S6mAH?I3V?a5!z6Km_wxxL9UG|_Dmat zrDS7g(x~A-KIorp3{^LF$G0n#?yGJLL(dQ&ZIS!N&_E7ZpCX?s+6EdB_$>SCT?1VV z3Jw$oie*IZhDwzR?iJn{Z>=CuSgA7X;#&G` zv&@+52+uW9rQM$V#(1!nj7g$YI)>=G*`^`pYt#SmJ1F2Ip{pZptI-rb?7{- zfZcLKe-AtlF<=LME#{irM?J0fvcWn=o5v7qNjzZb!8oRWFoEKudd!Y@L!VJCrWVIB zBBENY(hEc^<&VM_4X8?4X9eQ`G2jX4==q2SJa_{l26dN;q5_;G{0Kuq$qMSkRI~A? z$d~2Ls3|yCF!oUosm}tYB}@503gii>A(9F%PbA~pwWmo7CC5;!G}I^e6ZYyse<`7SI)R`oJ_zKqj}(k z$2qvn@bWk>PbOt)y3>0ye(09CYD)5YikDeluJN+at63-G$@pk_dpi+zxfaw&icmTj zEc3F?%d@$l|kJm)g3D9VK%#51>-yLyrd zZPCq*zH$*OQras(i3QoB3g7~ZEljdfz5*JroLR9J6XEEm>F`ldP(WKU1s`(89x@-%N&ITrff zU}jEwcrxr^X6bHAa5PCt`nt5QUco+yJ2Ekl93PtuYsmR>A29VU3&C~SvE6D8yo4|r z2CIAOmD*M+MpJ;DOw{(*;oZ$fa{bMSWUaIRM zhj9%fSm(JX_4R@h)xC33w~`!lSZiVZypcu3QUv zAg^^gF1e#=PQxbmmwVdkB-8ZD?d9%Fn>2=zd2+Cf6E4XCkuN!_rAqqPh(1j1Ngu}! z5XLb{=#0#hD4?bECF2}txDf$c`bUx#V9_*^mD^DOao1p0GO4qGD0{I;WCw7Sj&@VzU8(QrN+zU^y*$wZ+pliCSix3Do+o#StRqcZy4hyU##{`T*GS-E-NrLRC3 z&iGNB%G8fpG}z3V@IqyM6xWbNg?G}VQ>$5u*D;)=iMh;x&x;G2BOK}bej;W9D(yZZ}CgtF} zOZv?hpbEcH{N2FFwlaKIg*f_Lw0Yk};hm2J_|yi^@9HzV3!Vg3;L^& z9DkP%EnP-CDB)F{a9vMj)9rA0TH`$J%C{+2@m2t}qT4ZpztR|?&ovKfoScmg?8##E z$mVC^XF+3I&Q4cemnFid!h9 zXz)UDw?g6n+~>^B%x;pFes90)>hJyjT3UTJp|%G~p#8fph*|wSd<0>$haea^z3xvGj->E)@=-d3 zMP6eX5T+sCuwjdekS}D-S6i;Sp@?)+)FC|MYo~mLBVB`?bcUCh@2rOcK&l!trlObx4pY)>SNxP7GnE z7-^Apm>krVp812!AB{CgJwAv?!$4wm2lXLm)>N4wF*>X-${Zg;8XtTs zLSgc~sIb9;!QPw{f(6k|4N1O~j^ynvS=a_IC($UwC@G8>dVT75rr%Z3@4@xcL%%22 zhX;KsQKO0uve8e6I@5w=s<1`oDCc_p_c!Uv{5Owk|7^_eY=;`;EQPsLGeiP^F! zkX;G{1%zb=iICK2GFmc{sd1C{=9qPx#sZCfV3x_Bobhv0-W>#0nT9B}?4n+#BFY7r#_n_R+tZj(z{*aiX7-@Ssm+O>UFaDhwxMxlQIIlXbyKPnzjz)e$75@xUU~6#CI4hT;NS-&m8V z2jbt5>JV!~@m~j{N|9q|91GsoUQ|FGau^Z_4kFwU)jF7@EZ(#-#A=SO4ylQ-Is}Ih zkU+q7DVQRT(h86-1^t5jbW1@$>sLs{q+1H|u(HPU<4ZwROtV>&1!1QcrNEYg1pVAB z>#Jr7l7l%^KhA8RGC^{{NoKRAM6yIthogwb=cYVE{P|MRpVnu5ok&YgW^=nJA=vC5 z=1UR@+xN1t4IXTc3KE5_f(woYEBZeu`lq>m6!a6hK0N4CS)-)<&@V!>xu=&@mg+*= z4z}-zB-^CLLy*9?P242+QUm{cO_I;-$&FF7Lr=EF3G%d7Hn`ZUrzYa%6meT0cxfWs z(Ep?L!QWe!)}_*Z#`-`J)9l(;Z`aruF}tQg#!a`OYPujfm_wGynT=E?NDeqDE=ysz z6=)2HD0cS?2?h(E_Vdj5vR`1nXursOzTdgT!ZvuYL(157jf(VW&&s*+^?yn|GftOw=ma}t#diF z>Y!O?>i>Wpr~g~)T%+e_*|8$_S9VOZGdI=7s;PqHU=AsBW)qbOk^@evb{s=?M;mfx zch5->cKm|*qWvZFx&6LkVH-Ty8)fKfzep!kNr#RhSUREy$8$ROpg6Z%BMaN$Ass54 zVz&w&S5*ubd-s?>wcA)~S;cPGQ}ADQO!PPHmi8M0Vf0O^NXmxm6_X7jURED37ZDcs zvJeg!Ed^*^`v(mC?*Vl%mFF{nS`nlER*$R@c0Y?EwB|Pag=)hfIhaH11kP-#GC^{{ zNzuTm#hh48dw6E!{>=V7?E%d9vIjC>w5MS{xAn9vY=Z|IrMz8j9atT%q!+?uJ?)v8 z?`6--e9@kj`P}BSv9Jvu(xc+)&lmW4st2VfS_)BUMi;5N&X!q7;wK4B0T2jL6PVIa8EqDIAql8eA@2oTPIlQRaf5k}a3_mP!yO ziNpmLx>SX;Z$m;3FNwC<3^pO-T!SxIh0X+mF3Ymnobn2Rc)vFhk4E2Jq)$4mQ z>ZHf0rN~b5?QKvEc4BXDs|DL>!S-6P0}Ij~)nxC8pxNFDUdqS&_Ripmau4#fQ*}`W znVt39yFfsO8$T{n^V zC!xF8=m}7an>Uv)wvDDF;EfC2M=D43ycKZTO8K!Y&QXv&v27qXT>w+yvMr3E|oGD7QJ#k_S zlXk@xP2Lq-H2R-mOFzmj6>J$zEYu6WR(i!!;aB(7`PCQ6PWOpN+DN3O* zj)p8HE?ybx;~^)*HUVk>wvMGJnd1*dAkX)MU_<{Jdf z_UZ6a!J8T2iSius^mqd@$D5fDkl`wLgRB(1NmWb18V@`KnPtZ z+UBZE5l;-Fk~&deD$*_>G#`SZ49`9bVY6K!A;v*yHs~^3JqRIg#a*Q+GtodYEcP-( z7k7dXWEBu{SJQzIOGXbukX2G+Ahdwu420-mh_b)|$-$h3PUaMq36cX21EJ*Rg$z@@ z`*d3gY3=GO)zFPRjqW4WBYPopT3uZ7Sz2B{X8b-pd~_#du?_EEYK zYz!}>WPw-kwK431S4)T`%8SUAqE)hdrYME$@QR5uyjl!78E#5= zrKRGER~kKayjn_Wrh-@B6AN{PuhmtLSGfJPuOPO9S1YyPDlNEL3$9^7hF5D5G~3s~ zO9ijigD1*c$kXE$$Q-XWKtP78;1#k`@G4a;1+P%nWO%hvO9~aRvODBt1%Q+uuhguP z;}t8A4zJuq{m4F*i@N0XM8gtZv6hrsJISmmW!8!^Yd{&*(BaiKii$S4E_j756m45o zrik++CtfjW7rfdIK~aWh--NK)u86R#kv;FY_Y z4zHM+9Ygbpi(&(Ry zSLmC66t6NdydvacV;H_RhF$P#53xjf7r9bt;8kt1N&9{fZE&SJ6nAdyk&MXhOgU4O zGU)J%iN`^GH{@ivmYfv#OCkW()>m38J`xp0U0-Q*Z>c`fQ(9l`r8Esv1918JY7pUm zW>(iT!~$Ny*XsJ3KtHJo3DL~_19ATJae&BP2iOmgoC0Y-YQckA@Q@Zf%z_Nkjv#2Z zABC3+q#XlKluwhVhcu8mq#cKV3|E0PWTik_s#*%9p{(wZrqwy75ZXXyLhOk_vQnUV z+#eh0%Bnp%u%94FQHCp-s4HS=)tayIFc`CBG7aZ+N$i^B}X3fP^MVU3G%-WF^ zREKOoAxj%v7i2?ci?&3SDdMrF6WN$_87iQ<9Xty`QHEzfiLlwOkPzd@b_#SEt{&MC zXOAL8nThIqdU$ynR8Vp zNQ|x^n|re(!^8mUsFYq$xUIyrcJ-ASQDK~WAdT)LH72^tnN%4XX0_;lnp}iPz79jr z7^EhU{7=uMyaa-3<-GecC5y2RUmNQ!iJvr;9PAq}5=)eSVeWb6ULaR0ubxj`0nrB6 z<$MZBitIj}Ges#QEUGk8<lrU5T6;UReMpQ;Mi5-D>!yd3trcPH?-hQ7GyYf3qiB} zHoR1D>{swa`2l%)90Qr-*c}MSa1|UwRtk=#s-@r<%Ic0|tgcE@jL#v=Jt?$^era}B zD*!6U->M`lHl*}gzqx6#=PSvyAf?w*%aVK<$SNPNZCl+${m7tHuvB@o%G7n9Mp$Mw95k@-an48(bH#ge8f#hbof+f%EK)NxOjM69|ejJo`O_&31)^ z7zfMypv!ReV2QXDPiRD$i3U;y71UGXPSk^}0+#M-Y24Hh*Q+V1Gq8M0$uO{7sNx|= z4(2>_G8d^#kQ{JQKReT!%k}I`qo;6o)|ZCnQ2JkofoSl5=
  • SVtqD(k6U(P00cu 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 D2ea?d literal 30764 zcmdUY2UrwW`~AH;3+%G2x(kS|O0%FS0=w8)Y=9<4V`7hBLqtUpkYYrm0`?lk-mrI6 z>;~eE;w9lbk(g-uKSTop;{3_s-p!jnm>mf0eCpw}Fue z|Mp&fmt8u$W`o7=-`8*M6H~fMUqa&Hy4snLqTuyE5&{#igG9ZI67qc{ArBpeZLm+a z9{cwm|5RW#zeLC^>f0(YDk0JL$LN@t=!jmC-J@c=`G&-GiGn4zo5@(yH}S`aZr!31 zd?I1&78UE87||;}CMwZ4GA24IHpw?WDk(83E+NV{GO>F^LcDJap?C=IZ5frA;0Z(sI#cT)xDu($X0Wd4^{eO>ZQp~n#t7uz+uTXI4~AqUc&|h zE^OftzDwv5l~6$awNp2rTl4b+*9S|RIxjrjYdo3xWu5|b4F%MG#_#r7V>T46(Dw2# ze@%7ndF)HAeanb$1=QYmxMSL$Ru^|JY5MY~_onV$zr0Ra$Q{-#6j1%Yi#6G2J9%19 zv;F)%>C4XlO=AB44=LEVqTp1xU$pg434a}{_P{-Or&Fta6G_5@a<}3ikcD5`MgO5UZyuEx9~YY# zRX_q>PW`dls?v3fq&)5z=HG-gB^duI2;m4(5@JJ$Eg^PiAM zHlyTI1vNVwj7Afow3u2O;Hg*B=f%m3;xCJ{EfMYyR=^zC&LEc171tG4(}^x*lFMWl zp~wi1I_krW#z<^Ktu5&v6so2hUC1Vv&0>KJjyf@)nx1hXXI;*T<{2D?)rUTIAx~VM zS{aRWa0xP`#LyDL9_F(>NZa>P(`hBh^b#{f=PKq5X4O+`_3moAp#<4jVw33H0;j>u zd_{_=>4_5LWQkL7X^2gHL{j&TgxWLyJ|ZEaS0c>4lcN$+#3jz5dsGDa3~^Cu-!(3w zm$+bK-!(cWN?fp2#m6Nk1;=$sA$E@4lak^)3M+Puh-5>UM55AvY$a+{f_P$yy?tU* zL{f4hyZJy>*_}$!TzZ)jE{~(mL1wewXf%g}l>b%VBP1lahp~F+8v4$hox+a75$@Q- z7-lN2UmIfx?b*Bs3gV-7Wkp^4TD|y~xVmZUe(Ub)s?};M)z|8(gt}@=XiNBMy{eVe z>S{MGqt#Y#s`b(8+Qqu)b?p*ev<6QnHGNcqj4(_z@bSlH=(JK~dZ`(uhg% zG}DzVcU^&!Uw+Vkp^uQ-w`~dzdO%=sXCr5? zuqiaTgIIE#w{m~8>qKEsV+&7n4|5Bjj}kpH8K)q!A3FtQsv*@6xRM)gkKN>;5B4BK zJcfG6%M(4wB#+5h&UX?X+vYzB3p~hbk8G6uUpWcyZ2t=-oY{4*H04WMsKf<>cjQ<;e7MGq9ZRB&4Y&tCGNrx|>k=I1T zM>md2X&n)h97XIuT*I0In*8^4tb%Z3RMa^=tad@IzNts>DDlz=3o(Q{ev`l1FZjxE zub?fk4{)#fePykij~3m4+zGUg!)a-s#7>KgFRqOf<;Wl9hgFbI!yGR%*K3}ayu8|r zWP7agX+ZwmZDYPOn{Xefbx|QpG_;eubA zzW39iuin&K>k-(z%10MRmp(WPUHXfi#Cb3Bs$yy-Ipzzz$wKc%-tzJ~Z?fKdgRsnP zv!{-p@;S)!CVRa1!u92!gK3H_I0yUfKb`&6_})SNp9sH4?N(JkioEq8=(0C?S9wSk zInuLzNT$ymA9;DD4_W22T3F`JX)Lop*N1HP*#Xy=ANgI1>xld<&8H(TWj|V=|48=x zH1APU>&7mD`~y*oHV7@ySs(JE>fcr6n9uVg^Zge1$;)f}$XdU3!ZP=Uqk4=60;&d6 z`Th$m%u@Ny{$z{)R?(4#A-b^rj^SvsC`Ak-RhhE;=$D zr1BF?B*Qe(B-DqQrSeNnWSMEX;7}^K&Ge%iO2sY{*=@>`i{!B)`EMx|H%;W0>9$tMgR6tyE+Mkd*SX6_HSmx_#PWMZ{R)$$KSP@hxI?8)wZMT z|JqPw9o zkz!U&GP`DGO?f%1CRtf?6_%~XgsAs8{;95Y#A&O+HQJ;bwczyGO$o{-&E6DkGA+OuN8BWur~mOf&@EpnO<_+c}-9dsv1 z4)D|3o>aDM3#UVxkXe;HxRVe@Ci zwL?7GiVn%b5LvOZ4mnWwU|l(i`|6SX^$ygNmrvItXX>35mJ!u$3b9*L+^$FN)Vpit z5IZ)-`+6j`ep-F$Oze?{7K$15$;|q*tQ^uh>*|yB^*6{a%!}#y?q6}FJ~>+dn3Y3X z=T3ccxBflZbwV1FDAI$;;NT&_QU#bpT4!c3nH4-+baC9(k7seYjlpD7@MgKlgM#L9 zxpTqfeDDRi&|B7nS9n3uMPAVK$fB8bWeHw&gP$ zx#J<^M94|mj45HuPM5nILhgm!m))7xbGqE{P%KD$A8QgeBs64fr@A@wg)m$ZPGFKI-U zHd-buBakaBn`v%SBeJ>C7C683KyD~x4i;Z8{GS8aa{vO_GhGVgsYc|$WAd!=b1df@U~t?@Os{%M!)YIk;keW$WK5H>O}_lNZu!)-s_DZN#%ByM z3cUKu)@|dfc(J1GmzDU?Em(_w{nnwYf4TxJ=0WPzSWf6ZhA*pM)t0^V>d41 zAcK3=l)P^G2F@=%dvonRb#r1B+kb2aJ{lb(iW%RLmEW)WUXI$#W@J{g+0EqT70pOi zvz1u>D0Q%o@fW~*DRVWm-CACL*_ym+{aRQ?T=!rKS^mzP z8`6dhZ8NORmmk+7m^%KKnQPfBd@`^FH4pRJkZnKY{vbzjYg>}jc3WF{`A}POxa}{( zGNO7#x_{u#wKlBPAe*J0#M*jp=yw9e1rWPJF9aH$G+rKwGB zc{o`So@M2b*2xPed&2k1u6xq-CU-fUTnWEw<&f5S6HeZSzmr`rr72D>qaB&pZc;m` z0?Z+;v!WfzYPV8${UuFva{Jnm{p}7|Iiz*2v?EvBT@zhOt^_6}15JU_lQ3GXL915& z-j4jy?oYW)S#jbrKrW`kKfYvUdori}-1b7{l$;SI_2I@K1HLd4o}6)T(V?NkLl|o1 zf%fEJ`$KZs25h#ns`6!f@~Zu7YpY2)sskC_VN3^UyNy}dipsei$h;2ot*t)FjUC9Q z4x3@MC3Xo>c$OtGiBLS~f`?luCopFtu#KI-c4~pu_6q*76Lm{UU8)JXJq#hDgw;wKgZV!cs~yrjs4*LoXiI55J)J#uRce&<^b};J09pD6$MEsWyE_Tw5-LgkI;yIx}#M9BUC-)csXaq-9O%1_OVg+@^dKL9reO*k1{0^rAm0>DXBYBC;_iS^yO@A zdPO8fcIWJPSJQ}IQA(9L@$M!MyXUntt*=Z{`ws%{@q>V)B=i6KHbJC7ApjG zOmSIMmlY31^-z(G*v_3nhHj3AE~OlUjY0f5EvNO;`fGK?Ilvd}V)%jJ^>Pl#J<+NIzuZvnaIFg)*oZ1BgK1!n$VkN0TH~@nWI~@}g z)X6b;lA~jwxKEu?TsbR>tcltkC1uV+Otmx)4K#*#2^4cf+n}UQTS~3G7e($zJ&+5o zN5McNU*@YOW!1`zu4H1@NnNGw?1Wp9tl^JOtz6TUtnIoEPL9}iPVU+@DuGZ%uSBX) z;;eL0a6(lbzN1thOcfZr99kUh>N zbh-+cr&ELQ-?$j_n+U3Y7H| zxIuqbfh+iu!R%E@t;s^!6)_|$W~H^& z%XU``*&UN7Tl=%Jo*GNmo| zGnyiEbF;a5_$(F#wN~q-)w=3*IR0K_Ua$GRq&m;TB_;%*vhBfMV#?(C-XFgQDFZEyA>w|YI6x4RE3_2kQGZRf?3 z`LPRPEw)>RZTAqrU8l$ztcK$Dw6@z~Np9>u6sE*BAu2vDAxSu*i|mNDt}vTam5oN@ z=$OM*=~y? zxpCV?mmTL!&Fl%_VrsSBnK*Jb?wss#W1A{v_biS)k9%Qlb+;QHPe#O#j2Cub$5miu zUF~Malg#)z*4DCi>*C4!_zkd9!kQ!0(~k4Sp#_=)1H;1bVGIij6sMDlYl~@%RrIK$ zE#_U;586d-cQBqDjXx%Dv<}8Ek=UDB>#nvN(VL9yJ*u}1v5>8uN-BtG!$b*E3vQ-GNDm9U$C8j4z+vcrhRZ|kl)Wm7B)rXx9 zcU4v*S(&)X+FD++xt|#4)cizz=byRuDWKZ(mWa%KHEmB8yC7E1J zz9##UEK?_46}bW#B$1-NhAj#SC0g_4RV9PL$K6oHVDKv|etIL*s(J_uYSkaf^4 zu($mAHbKF{i?P0(aWjqSq51{#2TMSHu}QuxG_h2yE`J0FO0Bxrhdk@^M<3y!)fSnl zKJ_E{?Z?wUN**CI)sKH9PkwxAZFN@<=}U(89oAPW%jaM@^^Cq`X5U%X)=KK^zGO|` zwX&7ZOjq^3zGQ#j1J>5E>Wh8JrM{PCE1#K_)X)2p7kyt^TdS%^q>zy*qf(?gnE7l| zXQq%jDRZr@71Zlf$cB`SvX#$FclDtZayaD|YioJ+)f93qPIg3yV6fOG|S9Xzw1YS@Arr7v&zgs z)}~3BC@xr-@@1uvk3ySg@G%%_mSYW|$;}`nr&>L^Kbg{hYX6VZaxd~!ZIzaM9v1MC zzj5R<(#Vpr2K(SufKIJW{fUhDDdQ*Mi0v)X(*D6uX}13teUkm90p!MjoAO32`y~5W z1Ig@xnFFQDS@ucxn+K9D1Gmb)&+e1#PYoo$4Lpq%^S2S`lk7jEPqH67h)f=oIY_9L z#v;U;BZJ7%LC0i|5Ms^ULFC?``_@)>&EJE_`$4Ix2pVhpHA27dshJGRlvFx3pTkSD z3YOKWH2Z^tZve___QP@@l^)FJsHnLL%e7Q`{ey#V20S(IVEH|j{*lk&rO8O6WMUef z1QKh-HwJE+6|iKb(Utie*_%f9eQ*S`=EGBS36{%g^h!R5m*zDrZ_?=74~|A` z4L8lt>6DC5rxQTp&Ur^U%~DvFrPJjf9LxHc(OYVs4W{Jz zVEO_ix>GDVOwITqluQ^xGeDwy2p$2vQw>uY5zsw_&{c z(B1N?rcSNdF_e=1L+No49}x$xC_Df54!efo{12mfAj}5RctTZ?;yc`!=ZWtgmlW43 zAtsSZCVkuzNvHD0>ry9uKEa zSXs)_-xSDKIs0Sv60@-wIpfNxnX6k`az6nEpegVvE-!Ky_;%i6^+spt{U}F_wgfeZI7TULH}Hz7JPkzuq%_^ z7{-5u1?Y|cx_WLEG|CcgUK*vrqastEUE8@MDcLrX=7Ml5D@QM1*b;@X{kxzUKD!b} zMp1HO6uk+u4B3ZDDAdw>kL;ITkY{7r?W#E;J)nm<(1i1)4-?NPe=>3QswH$b!N=w82+O>5o%)ax^6`N7Gjz)I;4dA~7+lSLc`%LLE9r z_loEig_$W#RO0He%=snkW*B#gK{Ki^=M$#9otL%@c7`op7(+?wSeiB#TU34sulOQQ zlW0t~E9_!Gcs(1}6*fybVQRcwA4-jFs3Nd6J6^O2INp9i1~Z!pH#_1AGn%+R`RNso z?ye{1sjJdWSpqL=Ds3EWyc{4ohn3j%sj>7HtARaH#QPJfmab}lnB>dapK$Do_9sdk zc47My8%4a4*vf^C#O_03BT=!!Mxy2mi)ZC9Ygr4w{6i8qgEh-&9Fzvp;DR%>dK@LAex{>;Mtlmt0LEaxlW#a!s-dD`VNwfZP`YZArIA9e z<*~J+<0-j0p56kXb+<~B>1-20odfjgQmcXtDakp^oL5*27Si1hgU>|+DTiHwt-2Opbx8St7scKskL(_QnG#` z-2jr;lxxE8x+V()zjL-<1fz_$lC~CBJ&$!BOr#GBUp2I#RjXsw$&)BqJc%v=iSaLT z4Ep#adO|cQi*Q;o{WmCTIa_T_C)*;A;dwHdKK)R@L> z9lt)knvul{!D`O$9AgRt`|BY@j^9TyWeGoX2zD&&60zq6S0ryLC3mLMyC6Q8MLADQ zO=Dz&KU5hL-I$rj+c@(_~%dKhjc0NbdqJP2i_cZ$cgTslf zQN8Gt>6A>JPN#vyP4SM9qN`!ao=(?%a2VJcC5s+_<=}LBD4(N3(QB|=pH6Rx4i%S% z$CB|)PLc!GQ{$%!euw9e>GV&r0IYQ83`%CrptC{pO!6wlIR#O1W7yixUG(A7UxP=% zqrxLIMj5M*su4U2zZGCl1KDo{Y&GJy0u&3WLvXv%@S0hX+CABi1*q6h4`4pqRqLj8 z$LA-0FW}=}3s{9Zt)4-*@>Rn*Mr{wyq~y>{dKkol#qE@yWuO;fx-^qsw)BW!%G1{{ zzL`niiar&WVPhSaj9Iu3n?)yq*k;+D)E=F@AvORo%YY7 zCoF1vZ8pyQY3LIwLjsHz5j5oFJAsk>}+X z@l{<}MG8xyeDC73B+CCL{w>t;b|!shQTy?8anCoGW`Ou`-H;wtp$lMIIF~N6^hn{# zg>m~_xet~|Dp|5mv2y*1CmmH(aj zNvPxGd2}vcRpDCLF&}-*e7Xz7hwHWUlny-s)5-btl%+=s*FzW|&8Lq=pNjicl|Nkk ztMwxmP%?4>9R*@rXW`0*UbBF%SOrtW^3JDe*79JSx znDJ4=R7if|rRqXjDeE`dS;#EjcjDh?&qF=;ETBg%j^O!1N?t6aFF}0B#z_wx(V>ed z8McTH2gx2OWOHDgyNJ#ceJbvunh#kjm0Iu|xV9~#xnc=oQXuS=^2{hy*$z)R>XaMrJ&KShn7Euw!~9LusLlq_FD zSAh87tdX9%qT67~T|&28dZe(OhVjf2dRFwQxKSEDZ2hFDJ%{JT68cgsz@j#BDJ7GZ z(#atCid@VcXHlEN*8YbStHuY6y)ynE30S_@##yYaUm9PGdM;T?*YedBE|TAtQF3}2 zJpB}h@yqpdJv9(m(a)*2=mI>FK<#euCf(2_Q^seP} zH*XSC>>9=gSbY;){U3rQr5LWv|5%C@^rm;dYZLEzpG1vMEvHv3j%7?1C1bPbI1nGU zC-U3Kb6}dAMdw+1q_Ay)acdUM5q(O9irc5)1K0RNXUV^w`x}a!&Z1|;k_eyTJ#^|y znzqs+*D@6wFqwzV9A}#;r2Xf6%759A71D~yZ^g18S-d~UzZ08*noV3uGx-Yg*`-*w z3ge$ubOVTm2}8lb(zB+DeK77{MGsi}#84@&!+c{Ey(xQD+)<7XmBqM%e|}Q zX*!7QgN152^orFqOEj?nU0^F05+DpiJLMaA7Sg^K5*9q%oG)wm7bk4vU)Y z$;QlkHr)pj12Rk+d@9bscs84!v-U{=c>(jwZ2C&}s<_{TfqDLbOjtun#u_>iBn2b~ zdfOVBE1Fn9uCbN>p;hNI=kp?i_aX}k4*$k!zI@@sa|E?Hx`rOJsOOEfxaVCtV8mxqmw|wnkw$1_4r(o4d0q|bgfu~CCW+YQ|st&7Hi#M zYyBVMV%4*KMl`J761|NY+*wEOTGZ{yddzUFr_VrQEGA0>Ohx(zw7(nZ5RipWibW>O zb2iYql9y9)_k?Rlx`*So!I!&%ZWoIn7Tgu+s~hMwi?v?9Pfd!z3ucKU1+eQr^mhnq3%-Ao^Y#6z4X zT?pKJ7*n^F{U5JZlS`Eqhhm1M3Tc+XCO#Ei^|g!Vdo;^rbEIvc+1jKYfFm zzs39)hoA2~yeHV{(=GIwMRgu*rR3pO`UoT*{(LF-xxZn2zm=xuSox&Gp8@mC96C$( zs<>yu{b-vHT`d2~-ewfpl0&zOC0P`%L*K}uH!W8F`=9PZg+VVH!+l;uS;%$q;k`N5 zR9Xz%__yX>p+>KB=o^c=j?2YucPT(z0yO>KaiA7j!{)T>^OH;Q?`%`g$eB!3FpswR{QY2qLipF6A_L#AqP84^{ z>N08vC8KxHF(C2S7t612%!V;@2c2W>la750%v*QR9NDYlUVd~#$-fqN21U;9py$Mr zY`1AUasR!O4h9LkRdK1Gac@*mC<+;0;7y;x@`Jsb#)6ao&9q6V&E%bQidZRD&t7cF4eWtAcS5R3wQk}T9={VjoBx`!?kO-l5>8T`HA zr|+N(%94K*j*l;#t*AlH9=gqg3klxq2Ga@0TrN&;HQFZ0WVNxa4Dc7^w;2;Kqcr% za4WzYdK`XN*a@f%oe7=^RDoUvUIF+(9|Y$BRiR(vM~M3YzR*hi4?QU02kivb0shc+ zz*PWzCuy5fjF2bL_{zd|B=j% zrGQ${UxTXyfzXrj{|vDM%+QO#^MN4f4dAsvZRlg*-9R1alFo#rIT2D9x)O8+pdNHB zaCM+QbW3nUAQ*aLar`7R5CXjbJQoOsUI)$w8bBWb?*tk`yObbgkP9JSL3=@$1HOi? z0S*8fK{o}50^dM)1BU~Rp$CGKfF{sW!J~n1p;v(y0!^X!gL8oIpf7{*v&iIo=r`a8 zKr`qfC2>0mG>7&AmjYTq*8v9rEuq_h8w0JNW5Hd3*3iSj{ed>nnczvl573*yD*!xY zVtXFE2j~I)9()Jr3GHdXFI59E&}OhN&=-aM@bO-uFzXrbmeuB1j!ZSNQ0PnG0#^doLWiQ^ zxeC1wx+QcoU_Epfa0IXcIt|<#*a$rqjZ;Nn6ZC8_e*2YdhF%F?4s3xw1m4O3eHsl| zZy*QyHuwgx4f-|s1&|BviH5BRupPQF8n%PbJD|g%e*ktu_XKwbc0rE-_XT!CPpF7I z0rH^dfirht@+E1r9)ag57|F&~?GSz#-_c%7om8 zJ`CLhx*PBdbU*Nqz^~9#!NY+g(Aibc4gp7@cYwet-y_dtI+Y_&cHS3N#Fs%b?EKjdB6?m`{2XC zO=#AEyn((2T^w2q+=i|KE(_d&4hGi(?n1Zo!@AJ-peI8Q1nxsG0?!8?K<@^x1s*~_ z0v`n)L8thm-2)y&&o>fM0(b&_1)K*wg;trc9`rM4FKB1rIdmvE0C)kN4ekTHgl-&w z`a{2hj)49Fcn#ej9Ls#r)4?Nvx6nD@#lSo0#DfqwxAo^yExz70@lO?5&P4A36n5&#EX16&nQLVpVm1#F-r z!C`-!7@#|W+W@7Y`+$1^rJ=`w2LolG=YyvMuF#vos{uFY zBjCM&JM>NP1;7LPckna76S`O+VhNOmt^h6rl!Fcen}G7r&B2X;3ea1?T>vlW-@yBT ziqOx%*MUmV9nHuEXm994&_4l{p>KlE09BxW2R{RRpo;~e4nS4t3g9w;FLV&t1o%NW z2R8!zp}T`S0!HY8;AFrAJqbJ-2!LJ=o(EKe-U;3WREItd{uQVJ{SbTus0rPoHtGyr z3px(E6A%bJ8vGMrhJFp61_VJz)WJCiYD4!2#{zYrCxAx)b)lDlGl6>0x#0Ccedv?m zLqIUJzAoAr=n&|t&~88|^fzEL&;WWcxDC({dJlLG@D=oB@NwX4=$GIJKqF}TdbrMj zZ=gNEC4k1zfna~233LnaH^8^hG2lp`DfCeAPr!H3nc&I5_t2ZbtAJ+E$H4o6=Fs=R zSAiDLiu!0jpj$$hg4P4ApaZ~_f!5I9f(x;^x_(4jyF=riDPKu2gU6m2JTC+LaLRe=cT`VG)mLwAPW2OR}O zLN{%QHWIoE^jzq4APU;^E3{qEU7>@&CS(kjyFrhK?h15=&I2z4qM=WNPXaxlUx9A} zJ)uJy;hF+4WN=p?0eTg9B#;Pw z4ZIsjf>t!f^#z>_?FFp|`arh^n}HvpH-b}uzR*>hpzmVK&~2dW0R5oj!QFuV&?CY4 zu`Kcv^nCDiU;uOucr7px`V{yuFbMh)_$H7FUF2Kz70_wW9?-5pI`lTM85j(G6#NS? z1o|HM3NRGfrYZ6YdKh#CXlGzJbS-doU&(vFaf#=xE_!Jodj+NOoSc|9s*2)Ha0{1 z13ekK0dz1h1-c`+6)+XLKR6DU2E7108ki2f5xfqV0UgyG<1gr$(0!qkfmzTQ;1R%V z=vCnPKqmAt@OEGh^bPP;U@r8m7KlIeJm}TXS-^bggWw&&0_a=dbHGAq+m;wRKrezW z30)jm41EA>0+v8u0G|bxLcan(0G2`PTA|+tmP4Ds9>5CdhTsq&3;I2{6R;9m-x~cb zunM{g*b`U{{WUlU$c9b;{{XCk9tute)0lCn-z}p$1Ten4< z47~$78oDd66M85(1=t0>06ZDk4ZRP%4#k)b{bTV`Tun&3ycqp(R zdNp_+Z~*!Qcn5G0`WE;)a0t3nIL;&VVdzBYc;FXk{Ok@H4Ezec5M z0mhH%kYmst+hL3eeH=OgIu1AiJr0}>oP^E-X9B07kAk-Wzd>II<7aWmY3L5^F>ZxE z1Kk@s7B~w%7Mup0gI)oi4V;Jm4V(j9fW8a91zdzq>ws}9^d;y?&=Y{m(AnUHz!m5t z;GMu#=x5-|z%^)PNA!=tb?5;$}k_5phXFQGSrYXh&K4}$jruc2>&&jD|sxk&h--$MIA zI|A>ZL%{U_N{}yr0`SEG2S#0p5}XaA4LBJ_TX1a{?ZCD$s=x=qYVb%n?ZIEcsR7%- z=>XmX)`FX(P!aHLa8d9;6lVKvfWmCQUxV3x8-v+?n}XSXn}OMWTY}ks+kn}A!@z96 f?ZIrnoxu2yMB;<(w=0zNNl diff --git a/samples/client/petstore/csharp/SwaggerClientTest/obj/Debug/SwaggerClientTest.csproj.FilesWrittenAbsolute.txt b/samples/client/petstore/csharp/SwaggerClientTest/obj/Debug/SwaggerClientTest.csproj.FilesWrittenAbsolute.txt index 7d68ff048e5..f115c595d6a 100644 --- a/samples/client/petstore/csharp/SwaggerClientTest/obj/Debug/SwaggerClientTest.csproj.FilesWrittenAbsolute.txt +++ b/samples/client/petstore/csharp/SwaggerClientTest/obj/Debug/SwaggerClientTest.csproj.FilesWrittenAbsolute.txt @@ -1,9 +1,9 @@ /Users/williamcheng/Code/wing328/swagger-codegen/samples/client/petstore/csharp/SwaggerClientTest/obj/Debug/.NETFramework,Version=v4.5.AssemblyAttribute.cs /Users/williamcheng/Code/wing328/swagger-codegen/samples/client/petstore/csharp/SwaggerClientTest/obj/Debug/SwaggerClientTest.swagger-logo.png -/Users/williamcheng/Code/wing328/swagger-codegen/samples/client/petstore/csharp/SwaggerClientTest/bin/Debug/Newtonsoft.Json.dll -/Users/williamcheng/Code/wing328/swagger-codegen/samples/client/petstore/csharp/SwaggerClientTest/bin/Debug/nunit.framework.dll -/Users/williamcheng/Code/wing328/swagger-codegen/samples/client/petstore/csharp/SwaggerClientTest/bin/Debug/RestSharp.dll /Users/williamcheng/Code/wing328/swagger-codegen/samples/client/petstore/csharp/SwaggerClientTest/bin/Debug/SwaggerClientTest.dll.mdb /Users/williamcheng/Code/wing328/swagger-codegen/samples/client/petstore/csharp/SwaggerClientTest/bin/Debug/SwaggerClientTest.dll /Users/williamcheng/Code/wing328/swagger-codegen/samples/client/petstore/csharp/SwaggerClientTest/obj/Debug/SwaggerClientTest.dll /Users/williamcheng/Code/wing328/swagger-codegen/samples/client/petstore/csharp/SwaggerClientTest/obj/Debug/SwaggerClientTest.dll.mdb +/Users/williamcheng/Code/wing328/swagger-codegen/samples/client/petstore/csharp/SwaggerClientTest/bin/Debug/Newtonsoft.Json.dll +/Users/williamcheng/Code/wing328/swagger-codegen/samples/client/petstore/csharp/SwaggerClientTest/bin/Debug/nunit.framework.dll +/Users/williamcheng/Code/wing328/swagger-codegen/samples/client/petstore/csharp/SwaggerClientTest/bin/Debug/RestSharp.dll diff --git a/samples/client/petstore/csharp/SwaggerClientTest/obj/Debug/SwaggerClientTest.dll b/samples/client/petstore/csharp/SwaggerClientTest/obj/Debug/SwaggerClientTest.dll index 1cc6bc94f0c97cc2eb0e3c881f9499928d0f3982..22cef5104c54181889d4b74bd7f493df286d7160 100755 GIT binary patch literal 117248 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
  • SVtqD(k6U(P00cu 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 D2ea?d literal 30764 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 f?ZIrnoxu2yMB;<(w=0zNNl From 2cc5924498ba1dd10064b17e25b8e2e39fe8a37d Mon Sep 17 00:00:00 2001 From: wing328 Date: Sat, 19 Dec 2015 23:15:54 +0800 Subject: [PATCH 210/211] update test case, docstring for timeout --- .../resources/csharp/Configuration.mustache | 4 ++-- .../csharp/IO/Swagger/Client/Configuration.cs | 4 ++-- .../SwaggerClientTest/TestConfiguration.cs | 13 +++++-------- .../csharp/SwaggerClientTest/TestPet.cs | 5 ++++- .../bin/Debug/SwaggerClientTest.dll | Bin 117248 -> 117248 bytes .../bin/Debug/SwaggerClientTest.dll.mdb | Bin 31881 -> 31890 bytes .../obj/Debug/SwaggerClientTest.dll | Bin 117248 -> 117248 bytes .../obj/Debug/SwaggerClientTest.dll.mdb | Bin 31881 -> 31890 bytes 8 files changed, 13 insertions(+), 13 deletions(-) diff --git a/modules/swagger-codegen/src/main/resources/csharp/Configuration.mustache b/modules/swagger-codegen/src/main/resources/csharp/Configuration.mustache index 1bd34f844b8..7062a73c1e1 100644 --- a/modules/swagger-codegen/src/main/resources/csharp/Configuration.mustache +++ b/modules/swagger-codegen/src/main/resources/csharp/Configuration.mustache @@ -33,7 +33,7 @@ namespace {{packageName}}.Client Dictionary apiKeyPrefix = null, string tempFolderPath = null, string dateTimeFormat = null, - int timeout = 100 + int timeout = 100000 ) { if (apiClient == null) @@ -82,7 +82,7 @@ namespace {{packageName}}.Client public static Configuration Default = new Configuration(); /// - /// Gets or sets the timeout value of ApiClient. Default to 100 seconds. + /// Gets or sets the HTTP timeout (milliseconds) of ApiClient. Default to 100000 milliseconds. /// /// Timeout. public int Timeout diff --git a/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Client/Configuration.cs b/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Client/Configuration.cs index c6c2e455949..000b8893cdf 100644 --- a/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Client/Configuration.cs +++ b/samples/client/petstore/csharp/SwaggerClientTest/Lib/SwaggerClient/src/main/csharp/IO/Swagger/Client/Configuration.cs @@ -33,7 +33,7 @@ namespace IO.Swagger.Client Dictionary apiKeyPrefix = null, string tempFolderPath = null, string dateTimeFormat = null, - int timeout = 100 + int timeout = 100000 ) { if (apiClient == null) @@ -82,7 +82,7 @@ namespace IO.Swagger.Client public static Configuration Default = new Configuration(); /// - /// Gets or sets the timeout value of ApiClient. Default to 100 seconds. + /// Gets or sets the HTTP timeout (milliseconds) of ApiClient. Default to 100000 milliseconds. /// /// Timeout. public int Timeout diff --git a/samples/client/petstore/csharp/SwaggerClientTest/TestConfiguration.cs b/samples/client/petstore/csharp/SwaggerClientTest/TestConfiguration.cs index 4e29c5a2522..140fd269834 100644 --- a/samples/client/petstore/csharp/SwaggerClientTest/TestConfiguration.cs +++ b/samples/client/petstore/csharp/SwaggerClientTest/TestConfiguration.cs @@ -111,16 +111,13 @@ namespace SwaggerClientTest.TestConfiguration public void TestTimeout () { Configuration c1 = new Configuration(); - Assert.AreEqual(c1.Timeout, 100); // default vaue - - c1.Timeout = 10; - Assert.AreEqual(c1.Timeout, 10); - - Configuration c2 = new Configuration(timeout: 20); - Assert.AreEqual(c2.Timeout, 20); - + Assert.AreEqual(100000, c1.Timeout); // default vaue + c1.Timeout = 50000; + Assert.AreEqual(50000, c1.Timeout); + Configuration c2 = new Configuration(timeout: 20000); + Assert.AreEqual(20000, c2.Timeout); } } } \ No newline at end of file diff --git a/samples/client/petstore/csharp/SwaggerClientTest/TestPet.cs b/samples/client/petstore/csharp/SwaggerClientTest/TestPet.cs index 7c21f8efeaf..fbbf4494951 100644 --- a/samples/client/petstore/csharp/SwaggerClientTest/TestPet.cs +++ b/samples/client/petstore/csharp/SwaggerClientTest/TestPet.cs @@ -114,7 +114,10 @@ namespace SwaggerClientTest.TestPet [Test ()] public void TestGetPetById () { - PetApi petApi = new PetApi (); + // set timeout to 10 seconds + Configuration c1 = new Configuration (timeout: 10000); + + PetApi petApi = new PetApi (c1); Pet response = petApi.GetPetById (petId); Assert.IsInstanceOf (response, "Response is a Pet"); diff --git a/samples/client/petstore/csharp/SwaggerClientTest/bin/Debug/SwaggerClientTest.dll b/samples/client/petstore/csharp/SwaggerClientTest/bin/Debug/SwaggerClientTest.dll index 22cef5104c54181889d4b74bd7f493df286d7160..b0a59cff946eda2f0653fcd1fc07bd90f80e26e2 100755 GIT binary patch delta 2522 zcmZYB3ry2T7y$75+R~P4m^`$FnNTck|E0{Rn~u3@m}1-#c`1r0<0+z6>>@sJGy8)W z!bX=sNdjiLt}hQ(TR-A$tGFQV6waKJ_WZX9QV8L9^ZEd zNh=!-m5qk_R#@6_JR3&+04k*Tt3Zvj4gwROH~5c+g)mDru*+SH$x+4*w#R9fx6Fyg zNsL83`B;zE04p~D(^tO4m@a{}A7~x6yli3-eB})ECT{Fa z2|c-pD62J%%A1B=!{qXWJsO2yhly#l%3AQB3r4ix3=XeRYdghtHn8uUf6iG2Cs8$) zd%7Z)3SUbZFE}60NrisWC1@GUoH-p%tH>efGDq7oz}GDoo;M$k%7ptUnM@{(OJOpZ5YZ!M))+-HnJ}C5h$p%l z7LjyHsBJYQlfslV+ZxzFdS1!n+SH@UZ4{-{mId!oaG|n~tCqA(@vyaUjFhT)xlWSS zE7i7j&`By${9Jt~S$#GP_u>gyeKzQVLY+)hpAAZoiStGE&9?Q>_md2Y>T_W9ypXIu z2PUMj`W%>b0b^Kw4p>P$mGt-xu$ZJOIb10u@k|>bk0hRHBW&T~=hqm0N`8DU9H8JK z#mnU*wJH_yZ$S&`Gvx!WHj=oRJm@8fo5_O#l&n4p=9;>VELKHRII)+ zz5v?##netFsxO4s#gP)Um9|6JSP5Xs69 z+y)<$bS@9`zz?J_mzS%Xq*`2Qw(W3>=yc_A{ehC#Rt8CzC$FsxvQYBY%Af)zZmlhT z2XtSVyfrV}y^8Db3B52O#TL1Wm>0UQ$vt0Hkz>T=DC4g(n2p+gLuxO|cT=hcb#zdw z88uEiA!pu_u~Vq}-=uovOwyoB71=DfgF(u4u@rlNQ&*8DP+yQD62v;oklge|R2HcK zb(G{ojY!c6e^ZQ~pz>{WcjY$Ue)BtHQs`hs| zGX?cfiYGHu^Cqui1cSz}LJmjmgaxQ7<4wzrnLFV%icN$(h%Se96uWPEJ*FHAC{}N* z*6xCL0wE4K5(Bw`kCLHUYbbWiWkJ*SzzZobZF=+ydzwApUSU6CZ?y;Pr|n(#e*10v zi2XrRW(F)&$L);mX8 hsS(8!>w^Jw!y9EZ7KE_%r^19*B!~*3T&&e{Sez`Y)`n& zJo@RBemjnQ<%f<~6~blFw+65hY#Uh#D5|2LIMjNnFN*gnQq zrln03DTXGBBcl>U8L^3JymcmKJ2cG2wEU}00&fEcGvTBL>YC#$;jkppZwVaFg7lR$uEff`)hY*L%`S!v9q-Ni$@^gbBK8^#Awh)D1ntff)~Op^p#9(Fn6%&d Y9WWLMI}4Arn&kO`@NT#d4f72D0_8JQo&W#< delta 2590 zcmZwJ4NR0}902g=e|Ov+r$astInccDc<1EM`T4T=9WX;05r4|N+d>EpsGfh4G3e6J3m6Exh=l?v4quz~&_xJptkN^L9 zV0*XK8Mf6Kb~Qs#?WfsrL%CPh6E751<2W>gz#QMQd*-m$$O_w z#zBObA3fIM3Ih=Rwgf_Sv8`3jLl%RUJfx%6t06}$YJYohw0Cm|*v}1Sg^Vrd({?wbtI_CDJ=CBcq=`x$g?SbcF(t84FhSp+v0nJ%& zHF->wqSJ((k51BTHRF^C20q2Cj`T@DS|g6#Sgh>mqC1dUa>()f^b}}DRat)16_Hdp zz-2t{xIaA=`i0Io0&S^qR>(ZDoTR}YLKhq!st2ep5)x2O(qSvTY(lEYbqCXjs4j9e zVp2pp99EFm;b=spEd#2%+0ZW1AJJgWgkMoSnM}CLg~?<>P!BF@WXWWLMQD^Jx(H?p z>EuA$BA6!>B&XRH!&0Fsaz2&2N8!uJa;a?zY!Sg(@@A?XLJQ<_k_8_NrOF(3VG%9m|U1Gq{ul`NkZ(JmP4)(yQbw(OhxyvGS!%5IdQC=n`TllMe$ZUVQOs=2WGLTD0VcV7rCLaf3f=n`TT7Qq0DC$kbVPT`uE%t}~` zQg}8iVHc8JMN>>MRXqd)UgI8#j##X~tp)mT-wFW*AdYW#y z20jteIm<~o925$2dZ;>u6pJ&>wiYf5I-L1bLnwZ1>mcFm*s-mH3=}`Lb+8e|PHlh8 zdgweic4{8Davta56?)(v7n$uWA|B}cnXj3sAcqB$QM!vfn2jpC#Pud>qo1n^RXxbn zi1G{V<0CKgSQ~27RjwXBQfSbruxz5PVNhf`or{d%&;+3es79gCST>Jb=ZijvnkVE& zRSVUiPI8GI&WRY^L7~gs68r{-x_{w|4xpNaE}+_k?xBW+LR>7F_#r+o8ns_&F3Np_ z#}=a6xM(urnpZvG=QMs5&|vn$D5}!vw_FPMg6<|xG(HFziL8KWs7m8)%S%xeAdA>8 z<96*vSm2v)hmWEl*LOY%wrdTA_8Fwlw8mGm5GG8FOqNol71A40gS1!rQuHRzvfDQJoLYd@+5BJLU*zK z2V0(&Hjbqj7{|6W$FVZ3aVfNQ#AVqv#7VUDBPf=(zQdW&qH*rDD{<_&b*vH3PWx&4 zi7~FPzIF+O&41tC7dAfBV6Xe1B`PA=I1SO$rGw_M_dUMBC6NAdaCbu1{R5$QUfUD* z*20cw)KOnjBUmSEiwW@+eF0IEw0eWaSNR=yz`~~SXGna}F+KFxKWv96&9J{dssrxU ZyE`D>7t{%(T21h?zL0LX4Yl!xe*roYX{i7J diff --git a/samples/client/petstore/csharp/SwaggerClientTest/bin/Debug/SwaggerClientTest.dll.mdb b/samples/client/petstore/csharp/SwaggerClientTest/bin/Debug/SwaggerClientTest.dll.mdb index 34cdb18300fdedde7306847c1f11a5ff68289b8e..25bc7b803d9bea8c3673a505c362c1c36ebbff70 100644 GIT binary patch delta 5514 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 WXw(Yci?2gI@G1NR5+h~u_x}f#^*bd1 diff --git a/samples/client/petstore/csharp/SwaggerClientTest/obj/Debug/SwaggerClientTest.dll b/samples/client/petstore/csharp/SwaggerClientTest/obj/Debug/SwaggerClientTest.dll index 22cef5104c54181889d4b74bd7f493df286d7160..b0a59cff946eda2f0653fcd1fc07bd90f80e26e2 100755 GIT binary patch delta 2522 zcmZYB3ry2T7y$75+R~P4m^`$FnNTck|E0{Rn~u3@m}1-#c`1r0<0+z6>>@sJGy8)W z!bX=sNdjiLt}hQ(TR-A$tGFQV6waKJ_WZX9QV8L9^ZEd zNh=!-m5qk_R#@6_JR3&+04k*Tt3Zvj4gwROH~5c+g)mDru*+SH$x+4*w#R9fx6Fyg zNsL83`B;zE04p~D(^tO4m@a{}A7~x6yli3-eB})ECT{Fa z2|c-pD62J%%A1B=!{qXWJsO2yhly#l%3AQB3r4ix3=XeRYdghtHn8uUf6iG2Cs8$) zd%7Z)3SUbZFE}60NrisWC1@GUoH-p%tH>efGDq7oz}GDoo;M$k%7ptUnM@{(OJOpZ5YZ!M))+-HnJ}C5h$p%l z7LjyHsBJYQlfslV+ZxzFdS1!n+SH@UZ4{-{mId!oaG|n~tCqA(@vyaUjFhT)xlWSS zE7i7j&`By${9Jt~S$#GP_u>gyeKzQVLY+)hpAAZoiStGE&9?Q>_md2Y>T_W9ypXIu z2PUMj`W%>b0b^Kw4p>P$mGt-xu$ZJOIb10u@k|>bk0hRHBW&T~=hqm0N`8DU9H8JK z#mnU*wJH_yZ$S&`Gvx!WHj=oRJm@8fo5_O#l&n4p=9;>VELKHRII)+ zz5v?##netFsxO4s#gP)Um9|6JSP5Xs69 z+y)<$bS@9`zz?J_mzS%Xq*`2Qw(W3>=yc_A{ehC#Rt8CzC$FsxvQYBY%Af)zZmlhT z2XtSVyfrV}y^8Db3B52O#TL1Wm>0UQ$vt0Hkz>T=DC4g(n2p+gLuxO|cT=hcb#zdw z88uEiA!pu_u~Vq}-=uovOwyoB71=DfgF(u4u@rlNQ&*8DP+yQD62v;oklge|R2HcK zb(G{ojY!c6e^ZQ~pz>{WcjY$Ue)BtHQs`hs| zGX?cfiYGHu^Cqui1cSz}LJmjmgaxQ7<4wzrnLFV%icN$(h%Se96uWPEJ*FHAC{}N* z*6xCL0wE4K5(Bw`kCLHUYbbWiWkJ*SzzZobZF=+ydzwApUSU6CZ?y;Pr|n(#e*10v zi2XrRW(F)&$L);mX8 hsS(8!>w^Jw!y9EZ7KE_%r^19*B!~*3T&&e{Sez`Y)`n& zJo@RBemjnQ<%f<~6~blFw+65hY#Uh#D5|2LIMjNnFN*gnQq zrln03DTXGBBcl>U8L^3JymcmKJ2cG2wEU}00&fEcGvTBL>YC#$;jkppZwVaFg7lR$uEff`)hY*L%`S!v9q-Ni$@^gbBK8^#Awh)D1ntff)~Op^p#9(Fn6%&d Y9WWLMI}4Arn&kO`@NT#d4f72D0_8JQo&W#< delta 2590 zcmZwJ4NR0}902g=e|Ov+r$astInccDc<1EM`T4T=9WX;05r4|N+d>EpsGfh4G3e6J3m6Exh=l?v4quz~&_xJptkN^L9 zV0*XK8Mf6Kb~Qs#?WfsrL%CPh6E751<2W>gz#QMQd*-m$$O_w z#zBObA3fIM3Ih=Rwgf_Sv8`3jLl%RUJfx%6t06}$YJYohw0Cm|*v}1Sg^Vrd({?wbtI_CDJ=CBcq=`x$g?SbcF(t84FhSp+v0nJ%& zHF->wqSJ((k51BTHRF^C20q2Cj`T@DS|g6#Sgh>mqC1dUa>()f^b}}DRat)16_Hdp zz-2t{xIaA=`i0Io0&S^qR>(ZDoTR}YLKhq!st2ep5)x2O(qSvTY(lEYbqCXjs4j9e zVp2pp99EFm;b=spEd#2%+0ZW1AJJgWgkMoSnM}CLg~?<>P!BF@WXWWLMQD^Jx(H?p z>EuA$BA6!>B&XRH!&0Fsaz2&2N8!uJa;a?zY!Sg(@@A?XLJQ<_k_8_NrOF(3VG%9m|U1Gq{ul`NkZ(JmP4)(yQbw(OhxyvGS!%5IdQC=n`TllMe$ZUVQOs=2WGLTD0VcV7rCLaf3f=n`TT7Qq0DC$kbVPT`uE%t}~` zQg}8iVHc8JMN>>MRXqd)UgI8#j##X~tp)mT-wFW*AdYW#y z20jteIm<~o925$2dZ;>u6pJ&>wiYf5I-L1bLnwZ1>mcFm*s-mH3=}`Lb+8e|PHlh8 zdgweic4{8Davta56?)(v7n$uWA|B}cnXj3sAcqB$QM!vfn2jpC#Pud>qo1n^RXxbn zi1G{V<0CKgSQ~27RjwXBQfSbruxz5PVNhf`or{d%&;+3es79gCST>Jb=ZijvnkVE& zRSVUiPI8GI&WRY^L7~gs68r{-x_{w|4xpNaE}+_k?xBW+LR>7F_#r+o8ns_&F3Np_ z#}=a6xM(urnpZvG=QMs5&|vn$D5}!vw_FPMg6<|xG(HFziL8KWs7m8)%S%xeAdA>8 z<96*vSm2v)hmWEl*LOY%wrdTA_8Fwlw8mGm5GG8FOqNol71A40gS1!rQuHRzvfDQJoLYd@+5BJLU*zK z2V0(&Hjbqj7{|6W$FVZ3aVfNQ#AVqv#7VUDBPf=(zQdW&qH*rDD{<_&b*vH3PWx&4 zi7~FPzIF+O&41tC7dAfBV6Xe1B`PA=I1SO$rGw_M_dUMBC6NAdaCbu1{R5$QUfUD* z*20cw)KOnjBUmSEiwW@+eF0IEw0eWaSNR=yz`~~SXGna}F+KFxKWv96&9J{dssrxU ZyE`D>7t{%(T21h?zL0LX4Yl!xe*roYX{i7J diff --git a/samples/client/petstore/csharp/SwaggerClientTest/obj/Debug/SwaggerClientTest.dll.mdb b/samples/client/petstore/csharp/SwaggerClientTest/obj/Debug/SwaggerClientTest.dll.mdb index 34cdb18300fdedde7306847c1f11a5ff68289b8e..25bc7b803d9bea8c3673a505c362c1c36ebbff70 100644 GIT binary patch delta 5514 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 WXw(Yci?2gI@G1NR5+h~u_x}f#^*bd1 From aa55c95d1b0be23c1f9d521d66e7ffe33119aa4e Mon Sep 17 00:00:00 2001 From: wing328 Date: Mon, 21 Dec 2015 14:12:19 +0800 Subject: [PATCH 211/211] fix default needToImport --- .../io/swagger/codegen/DefaultCodegen.java | 3 +- .../java/io/swagger/client/ApiClient.java | 4 +- .../java/io/swagger/client/ApiException.java | 2 +- .../java/io/swagger/client/Configuration.java | 2 +- .../src/main/java/io/swagger/client/Pair.java | 2 +- .../java/io/swagger/client/StringUtil.java | 2 +- .../java/io/swagger/client/api/PetApi.java | 42 ++++++++++++++++++- .../java/io/swagger/client/api/StoreApi.java | 2 +- .../java/io/swagger/client/api/UserApi.java | 2 +- .../io/swagger/client/auth/ApiKeyAuth.java | 2 +- .../swagger/client/auth/Authentication.java | 2 +- .../io/swagger/client/auth/HttpBasicAuth.java | 2 +- .../java/io/swagger/client/auth/OAuth.java | 2 +- .../io/swagger/client/model/Category.java | 3 +- .../java/io/swagger/client/model/Order.java | 3 +- .../java/io/swagger/client/model/Pet.java | 3 +- .../java/io/swagger/client/model/Tag.java | 3 +- .../java/io/swagger/client/model/User.java | 3 +- 18 files changed, 64 insertions(+), 20 deletions(-) diff --git a/modules/swagger-codegen/src/main/java/io/swagger/codegen/DefaultCodegen.java b/modules/swagger-codegen/src/main/java/io/swagger/codegen/DefaultCodegen.java index 11472fec4ff..8d84f065284 100644 --- a/modules/swagger-codegen/src/main/java/io/swagger/codegen/DefaultCodegen.java +++ b/modules/swagger-codegen/src/main/java/io/swagger/codegen/DefaultCodegen.java @@ -1714,8 +1714,7 @@ public class DefaultCodegen { */ protected boolean needToImport(String type) { return !defaultIncludes.contains(type) - && !languageSpecificPrimitives.contains(type) - && type.indexOf(".") < 0; + && !languageSpecificPrimitives.contains(type); } protected List> toExamples(Map examples) { diff --git a/samples/client/petstore/java/default/src/main/java/io/swagger/client/ApiClient.java b/samples/client/petstore/java/default/src/main/java/io/swagger/client/ApiClient.java index f34125eaa44..8b3bbb24c9a 100644 --- a/samples/client/petstore/java/default/src/main/java/io/swagger/client/ApiClient.java +++ b/samples/client/petstore/java/default/src/main/java/io/swagger/client/ApiClient.java @@ -41,7 +41,7 @@ import io.swagger.client.auth.HttpBasicAuth; import io.swagger.client.auth.ApiKeyAuth; import io.swagger.client.auth.OAuth; -@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-12-09T22:51:50.471-05:00") +@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-12-21T14:12:11.520+08:00") public class ApiClient { private Map hostMap = new HashMap(); private Map defaultHeaderMap = new HashMap(); @@ -79,8 +79,8 @@ public class ApiClient { // Setup authentications (key: authentication name, value: authentication). authentications = new HashMap(); - authentications.put("petstore_auth", new OAuth()); authentications.put("api_key", new ApiKeyAuth("header", "api_key")); + authentications.put("petstore_auth", new OAuth()); // Prevent the authentications from being modified. authentications = Collections.unmodifiableMap(authentications); } diff --git a/samples/client/petstore/java/default/src/main/java/io/swagger/client/ApiException.java b/samples/client/petstore/java/default/src/main/java/io/swagger/client/ApiException.java index ceee6a36c45..0cebcddd1f7 100644 --- a/samples/client/petstore/java/default/src/main/java/io/swagger/client/ApiException.java +++ b/samples/client/petstore/java/default/src/main/java/io/swagger/client/ApiException.java @@ -3,7 +3,7 @@ package io.swagger.client; import java.util.Map; import java.util.List; -@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-11-29T00:18:25.953+08:00") +@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-12-21T14:12:11.520+08:00") public class ApiException extends Exception { private int code = 0; private Map> responseHeaders = null; diff --git a/samples/client/petstore/java/default/src/main/java/io/swagger/client/Configuration.java b/samples/client/petstore/java/default/src/main/java/io/swagger/client/Configuration.java index f39081c3f5d..fa70b81a40e 100644 --- a/samples/client/petstore/java/default/src/main/java/io/swagger/client/Configuration.java +++ b/samples/client/petstore/java/default/src/main/java/io/swagger/client/Configuration.java @@ -1,6 +1,6 @@ package io.swagger.client; -@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-11-29T00:18:25.953+08:00") +@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-12-21T14:12:11.520+08:00") public class Configuration { private static ApiClient defaultApiClient = new ApiClient(); diff --git a/samples/client/petstore/java/default/src/main/java/io/swagger/client/Pair.java b/samples/client/petstore/java/default/src/main/java/io/swagger/client/Pair.java index 32d1b6cd6f4..f5b33e8fbba 100644 --- a/samples/client/petstore/java/default/src/main/java/io/swagger/client/Pair.java +++ b/samples/client/petstore/java/default/src/main/java/io/swagger/client/Pair.java @@ -1,6 +1,6 @@ package io.swagger.client; -@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-11-29T00:18:25.953+08:00") +@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-12-21T14:12:11.520+08:00") public class Pair { private String name = ""; private String value = ""; diff --git a/samples/client/petstore/java/default/src/main/java/io/swagger/client/StringUtil.java b/samples/client/petstore/java/default/src/main/java/io/swagger/client/StringUtil.java index f21a48f2faa..4ba4ee3a2f3 100644 --- a/samples/client/petstore/java/default/src/main/java/io/swagger/client/StringUtil.java +++ b/samples/client/petstore/java/default/src/main/java/io/swagger/client/StringUtil.java @@ -1,6 +1,6 @@ package io.swagger.client; -@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-11-29T00:18:25.953+08:00") +@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-12-21T14:12:11.520+08:00") public class StringUtil { /** * Check if the given array contains the given value (with case-insensitive comparison). diff --git a/samples/client/petstore/java/default/src/main/java/io/swagger/client/api/PetApi.java b/samples/client/petstore/java/default/src/main/java/io/swagger/client/api/PetApi.java index 9f07449e6f8..22af7b53b18 100644 --- a/samples/client/petstore/java/default/src/main/java/io/swagger/client/api/PetApi.java +++ b/samples/client/petstore/java/default/src/main/java/io/swagger/client/api/PetApi.java @@ -12,7 +12,7 @@ import java.io.File; import java.util.*; -@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-12-09T22:51:50.471-05:00") +@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-12-21T14:12:11.520+08:00") public class PetApi { private ApiClient apiClient; @@ -347,6 +347,46 @@ public class PetApi { } + /** + * downloads an image + * + * @return File + */ + public File downloadFile() throws ApiException { + Object postBody = null; + + // create path and map variables + String path = "/pet/{petId}/downloadImage".replaceAll("\\{format\\}","json"); + + // query params + List queryParams = new ArrayList(); + Map headerParams = new HashMap(); + Map formParams = new HashMap(); + + + + + + + + final String[] accepts = { + "application/octet-stream" + }; + final String accept = apiClient.selectHeaderAccept(accepts); + + final String[] contentTypes = { + + }; + final String contentType = apiClient.selectHeaderContentType(contentTypes); + + String[] authNames = new String[] { }; + + + GenericType returnType = new GenericType() {}; + return apiClient.invokeAPI(path, "GET", queryParams, postBody, headerParams, formParams, accept, contentType, authNames, returnType); + + } + /** * uploads an image * diff --git a/samples/client/petstore/java/default/src/main/java/io/swagger/client/api/StoreApi.java b/samples/client/petstore/java/default/src/main/java/io/swagger/client/api/StoreApi.java index f6f3b84708e..4e425248d35 100644 --- a/samples/client/petstore/java/default/src/main/java/io/swagger/client/api/StoreApi.java +++ b/samples/client/petstore/java/default/src/main/java/io/swagger/client/api/StoreApi.java @@ -12,7 +12,7 @@ import io.swagger.client.model.Order; import java.util.*; -@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-12-09T22:51:50.471-05:00") +@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-12-21T14:12:11.520+08:00") public class StoreApi { private ApiClient apiClient; diff --git a/samples/client/petstore/java/default/src/main/java/io/swagger/client/api/UserApi.java b/samples/client/petstore/java/default/src/main/java/io/swagger/client/api/UserApi.java index 41b273b20b8..33028c95721 100644 --- a/samples/client/petstore/java/default/src/main/java/io/swagger/client/api/UserApi.java +++ b/samples/client/petstore/java/default/src/main/java/io/swagger/client/api/UserApi.java @@ -12,7 +12,7 @@ import java.util.*; import java.util.*; -@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-12-09T22:51:50.471-05:00") +@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-12-21T14:12:11.520+08:00") public class UserApi { private ApiClient apiClient; diff --git a/samples/client/petstore/java/default/src/main/java/io/swagger/client/auth/ApiKeyAuth.java b/samples/client/petstore/java/default/src/main/java/io/swagger/client/auth/ApiKeyAuth.java index 3cccbb7af1a..c9dcd028be8 100644 --- a/samples/client/petstore/java/default/src/main/java/io/swagger/client/auth/ApiKeyAuth.java +++ b/samples/client/petstore/java/default/src/main/java/io/swagger/client/auth/ApiKeyAuth.java @@ -5,7 +5,7 @@ import io.swagger.client.Pair; import java.util.Map; import java.util.List; -@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-11-29T00:18:25.953+08:00") +@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-12-21T14:12:11.520+08:00") public class ApiKeyAuth implements Authentication { private final String location; private final String paramName; diff --git a/samples/client/petstore/java/default/src/main/java/io/swagger/client/auth/Authentication.java b/samples/client/petstore/java/default/src/main/java/io/swagger/client/auth/Authentication.java index bf8dd752982..90aa4df66b9 100644 --- a/samples/client/petstore/java/default/src/main/java/io/swagger/client/auth/Authentication.java +++ b/samples/client/petstore/java/default/src/main/java/io/swagger/client/auth/Authentication.java @@ -5,7 +5,7 @@ import io.swagger.client.Pair; import java.util.Map; import java.util.List; -@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-11-29T00:18:25.953+08:00") +@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-12-21T14:12:11.520+08:00") public interface Authentication { /** Apply authentication settings to header and query params. */ void applyToParams(List queryParams, Map headerParams); diff --git a/samples/client/petstore/java/default/src/main/java/io/swagger/client/auth/HttpBasicAuth.java b/samples/client/petstore/java/default/src/main/java/io/swagger/client/auth/HttpBasicAuth.java index 1a9280b8d7d..7db3c8e9d5c 100644 --- a/samples/client/petstore/java/default/src/main/java/io/swagger/client/auth/HttpBasicAuth.java +++ b/samples/client/petstore/java/default/src/main/java/io/swagger/client/auth/HttpBasicAuth.java @@ -9,7 +9,7 @@ import java.util.List; import java.io.UnsupportedEncodingException; -@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-11-29T00:18:25.953+08:00") +@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-12-21T14:12:11.520+08:00") public class HttpBasicAuth implements Authentication { private String username; private String password; diff --git a/samples/client/petstore/java/default/src/main/java/io/swagger/client/auth/OAuth.java b/samples/client/petstore/java/default/src/main/java/io/swagger/client/auth/OAuth.java index a6e36a025a0..940b7267334 100644 --- a/samples/client/petstore/java/default/src/main/java/io/swagger/client/auth/OAuth.java +++ b/samples/client/petstore/java/default/src/main/java/io/swagger/client/auth/OAuth.java @@ -5,7 +5,7 @@ import io.swagger.client.Pair; import java.util.Map; import java.util.List; -@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-11-29T00:18:25.953+08:00") +@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-12-21T14:12:11.520+08:00") public class OAuth implements Authentication { private String accessToken; diff --git a/samples/client/petstore/java/default/src/main/java/io/swagger/client/model/Category.java b/samples/client/petstore/java/default/src/main/java/io/swagger/client/model/Category.java index a57e6646dba..abcb97e84ee 100644 --- a/samples/client/petstore/java/default/src/main/java/io/swagger/client/model/Category.java +++ b/samples/client/petstore/java/default/src/main/java/io/swagger/client/model/Category.java @@ -9,8 +9,9 @@ import io.swagger.annotations.*; import com.fasterxml.jackson.annotation.*; + @ApiModel(description = "") -@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-11-29T00:18:25.953+08:00") +@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-12-21T14:12:11.520+08:00") public class Category { private Long id = null; 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 61f1d56309c..b488fab6c3f 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 @@ -10,8 +10,9 @@ import io.swagger.annotations.*; import com.fasterxml.jackson.annotation.*; + @ApiModel(description = "") -@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-11-29T00:18:25.953+08:00") +@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-12-21T14:12:11.520+08:00") public class Order { private Long id = 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 f57e68a48d1..5a979dcb73e 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 @@ -12,8 +12,9 @@ import io.swagger.annotations.*; import com.fasterxml.jackson.annotation.*; + @ApiModel(description = "") -@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-11-29T00:18:25.953+08:00") +@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-12-21T14:12:11.520+08:00") public class Pet { private Long id = null; diff --git a/samples/client/petstore/java/default/src/main/java/io/swagger/client/model/Tag.java b/samples/client/petstore/java/default/src/main/java/io/swagger/client/model/Tag.java index a09cda034eb..41cfb3d80d6 100644 --- a/samples/client/petstore/java/default/src/main/java/io/swagger/client/model/Tag.java +++ b/samples/client/petstore/java/default/src/main/java/io/swagger/client/model/Tag.java @@ -9,8 +9,9 @@ import io.swagger.annotations.*; import com.fasterxml.jackson.annotation.*; + @ApiModel(description = "") -@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-11-29T00:18:25.953+08:00") +@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-12-21T14:12:11.520+08:00") public class Tag { private Long id = null; diff --git a/samples/client/petstore/java/default/src/main/java/io/swagger/client/model/User.java b/samples/client/petstore/java/default/src/main/java/io/swagger/client/model/User.java index ca5ece25bf9..61960c622f6 100644 --- a/samples/client/petstore/java/default/src/main/java/io/swagger/client/model/User.java +++ b/samples/client/petstore/java/default/src/main/java/io/swagger/client/model/User.java @@ -9,8 +9,9 @@ import io.swagger.annotations.*; import com.fasterxml.jackson.annotation.*; + @ApiModel(description = "") -@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-11-29T00:18:25.953+08:00") +@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-12-21T14:12:11.520+08:00") public class User { private Long id = null;