From bd06a629c69d0e37dc0ff7ea52f416fdf62b80bf Mon Sep 17 00:00:00 2001 From: Vincent Giersch Date: Wed, 16 Nov 2016 18:49:16 +0100 Subject: [PATCH] fix(swift3): multi-level inheritance support Supports multi-level inheritance to avoid having the variables from the parents of level > 2 This commit also fixes the comparison of the variables when skipping the variables in the children classes by only comparing their names (in some cases some parent variables were present in children classes) Signed-off-by: Vincent Giersch --- .../codegen/languages/Swift3Codegen.java | 16 +- .../Classes/Swaggers/APIs/FakeAPI.swift | 4 +- .../Classes/Swaggers/APIs/PetAPI.swift | 152 +++++++++--------- .../Classes/Swaggers/APIs/StoreAPI.swift | 60 +++---- .../Classes/Swaggers/APIs/UserAPI.swift | 44 ++--- 5 files changed, 142 insertions(+), 134 deletions(-) diff --git a/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/Swift3Codegen.java b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/Swift3Codegen.java index d08dd89c585..e567282cb77 100644 --- a/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/Swift3Codegen.java +++ b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/Swift3Codegen.java @@ -427,10 +427,18 @@ public class Swift3Codegen extends DefaultCodegen implements CodegenConfig { if(codegenModel.description != null) { codegenModel.imports.add("ApiModel"); } - if (allDefinitions != null && codegenModel.parentSchema != null) { - final Model parentModel = allDefinitions.get(codegenModel.parentSchema); - final CodegenModel parentCodegenModel = super.fromModel(codegenModel.parent, parentModel); + if (allDefinitions != null) { + String parentSchema = codegenModel.parentSchema; + + // multilevel inheritance: reconcile properties of all the parents + while (parentSchema != null) { + final Model parentModel = allDefinitions.get(parentSchema); + final CodegenModel parentCodegenModel = super.fromModel(codegenModel.parent, parentModel, allDefinitions); codegenModel = Swift3Codegen.reconcileProperties(codegenModel, parentCodegenModel); + + // get the next parent + parentSchema = parentCodegenModel.parentSchema; + } } return codegenModel; @@ -582,7 +590,7 @@ public class Swift3Codegen extends DefaultCodegen implements CodegenConfig { Iterator iterator = codegenProperties.iterator(); while (iterator.hasNext()) { CodegenProperty codegenProperty = iterator.next(); - if (codegenProperty.equals(parentModelCodegenProperty)) { + if (codegenProperty.baseName == parentModelCodegenProperty.baseName) { // We found a property in the child class that is // a duplicate of the one in the parent, so remove it. iterator.remove(); diff --git a/samples/client/petstore/swift3/default/PetstoreClient/Classes/Swaggers/APIs/FakeAPI.swift b/samples/client/petstore/swift3/default/PetstoreClient/Classes/Swaggers/APIs/FakeAPI.swift index 8a3f0796cdf..7ff3c6e4202 100644 --- a/samples/client/petstore/swift3/default/PetstoreClient/Classes/Swaggers/APIs/FakeAPI.swift +++ b/samples/client/petstore/swift3/default/PetstoreClient/Classes/Swaggers/APIs/FakeAPI.swift @@ -26,9 +26,9 @@ open class FakeAPI: APIBase { /** To test \"client\" model - PATCH /fake - - examples: [{example={ + - examples: [{contentType=application/json, example={ "client" : "aeiou" -}, contentType=application/json}] +}}] - parameter body: (body) client model diff --git a/samples/client/petstore/swift3/default/PetstoreClient/Classes/Swaggers/APIs/PetAPI.swift b/samples/client/petstore/swift3/default/PetstoreClient/Classes/Swaggers/APIs/PetAPI.swift index 06e868f881e..0588a85ade1 100644 --- a/samples/client/petstore/swift3/default/PetstoreClient/Classes/Swaggers/APIs/PetAPI.swift +++ b/samples/client/petstore/swift3/default/PetstoreClient/Classes/Swaggers/APIs/PetAPI.swift @@ -117,7 +117,7 @@ open class PetAPI: APIBase { - OAuth: - type: oauth2 - name: petstore_auth - - examples: [{example= + - examples: [{contentType=application/xml, example= 123456 doggie @@ -126,21 +126,21 @@ open class PetAPI: APIBase { string -, contentType=application/xml}, {example=[ { - "tags" : [ { - "id" : 123456789, - "name" : "aeiou" - } ], +}, {contentType=application/json, example=[ { + "photoUrls" : [ "aeiou" ], + "name" : "doggie", "id" : 123456789, "category" : { - "id" : 123456789, - "name" : "aeiou" + "name" : "aeiou", + "id" : 123456789 }, - "status" : "aeiou", - "name" : "doggie", - "photoUrls" : [ "aeiou" ] -} ], contentType=application/json}] - - examples: [{example= + "tags" : [ { + "name" : "aeiou", + "id" : 123456789 + } ], + "status" : "aeiou" +} ]}] + - examples: [{contentType=application/xml, example= 123456 doggie @@ -149,20 +149,20 @@ open class PetAPI: APIBase { string -, contentType=application/xml}, {example=[ { - "tags" : [ { - "id" : 123456789, - "name" : "aeiou" - } ], +}, {contentType=application/json, example=[ { + "photoUrls" : [ "aeiou" ], + "name" : "doggie", "id" : 123456789, "category" : { - "id" : 123456789, - "name" : "aeiou" + "name" : "aeiou", + "id" : 123456789 }, - "status" : "aeiou", - "name" : "doggie", - "photoUrls" : [ "aeiou" ] -} ], contentType=application/json}] + "tags" : [ { + "name" : "aeiou", + "id" : 123456789 + } ], + "status" : "aeiou" +} ]}] - parameter status: (query) Status values that need to be considered for filter @@ -205,7 +205,7 @@ open class PetAPI: APIBase { - OAuth: - type: oauth2 - name: petstore_auth - - examples: [{example= + - examples: [{contentType=application/xml, example= 123456 doggie @@ -214,21 +214,21 @@ open class PetAPI: APIBase { string -, contentType=application/xml}, {example=[ { - "tags" : [ { - "id" : 123456789, - "name" : "aeiou" - } ], +}, {contentType=application/json, example=[ { + "photoUrls" : [ "aeiou" ], + "name" : "doggie", "id" : 123456789, "category" : { - "id" : 123456789, - "name" : "aeiou" + "name" : "aeiou", + "id" : 123456789 }, - "status" : "aeiou", - "name" : "doggie", - "photoUrls" : [ "aeiou" ] -} ], contentType=application/json}] - - examples: [{example= + "tags" : [ { + "name" : "aeiou", + "id" : 123456789 + } ], + "status" : "aeiou" +} ]}] + - examples: [{contentType=application/xml, example= 123456 doggie @@ -237,20 +237,20 @@ open class PetAPI: APIBase { string -, contentType=application/xml}, {example=[ { - "tags" : [ { - "id" : 123456789, - "name" : "aeiou" - } ], +}, {contentType=application/json, example=[ { + "photoUrls" : [ "aeiou" ], + "name" : "doggie", "id" : 123456789, "category" : { - "id" : 123456789, - "name" : "aeiou" + "name" : "aeiou", + "id" : 123456789 }, - "status" : "aeiou", - "name" : "doggie", - "photoUrls" : [ "aeiou" ] -} ], contentType=application/json}] + "tags" : [ { + "name" : "aeiou", + "id" : 123456789 + } ], + "status" : "aeiou" +} ]}] - parameter tags: (query) Tags to filter by @@ -293,7 +293,7 @@ open class PetAPI: APIBase { - API Key: - type: apiKey api_key - name: api_key - - examples: [{example= + - examples: [{contentType=application/xml, example= 123456 doggie @@ -302,21 +302,21 @@ open class PetAPI: APIBase { string -, contentType=application/xml}, {example={ - "tags" : [ { - "id" : 123456789, - "name" : "aeiou" - } ], +}, {contentType=application/json, example={ + "photoUrls" : [ "aeiou" ], + "name" : "doggie", "id" : 123456789, "category" : { - "id" : 123456789, - "name" : "aeiou" + "name" : "aeiou", + "id" : 123456789 }, - "status" : "aeiou", - "name" : "doggie", - "photoUrls" : [ "aeiou" ] -}, contentType=application/json}] - - examples: [{example= + "tags" : [ { + "name" : "aeiou", + "id" : 123456789 + } ], + "status" : "aeiou" +}}] + - examples: [{contentType=application/xml, example= 123456 doggie @@ -325,20 +325,20 @@ open class PetAPI: APIBase { string -, contentType=application/xml}, {example={ - "tags" : [ { - "id" : 123456789, - "name" : "aeiou" - } ], +}, {contentType=application/json, example={ + "photoUrls" : [ "aeiou" ], + "name" : "doggie", "id" : 123456789, "category" : { - "id" : 123456789, - "name" : "aeiou" + "name" : "aeiou", + "id" : 123456789 }, - "status" : "aeiou", - "name" : "doggie", - "photoUrls" : [ "aeiou" ] -}, contentType=application/json}] + "tags" : [ { + "name" : "aeiou", + "id" : 123456789 + } ], + "status" : "aeiou" +}}] - parameter petId: (path) ID of pet to return @@ -467,11 +467,11 @@ open class PetAPI: APIBase { - OAuth: - type: oauth2 - name: petstore_auth - - examples: [{example={ - "message" : "aeiou", + - examples: [{contentType=application/json, example={ "code" : 123, - "type" : "aeiou" -}, contentType=application/json}] + "type" : "aeiou", + "message" : "aeiou" +}}] - parameter petId: (path) ID of pet to update - parameter additionalMetadata: (form) Additional data to pass to server (optional) diff --git a/samples/client/petstore/swift3/default/PetstoreClient/Classes/Swaggers/APIs/StoreAPI.swift b/samples/client/petstore/swift3/default/PetstoreClient/Classes/Swaggers/APIs/StoreAPI.swift index d5b2aede9c0..8c30504c5c9 100644 --- a/samples/client/petstore/swift3/default/PetstoreClient/Classes/Swaggers/APIs/StoreAPI.swift +++ b/samples/client/petstore/swift3/default/PetstoreClient/Classes/Swaggers/APIs/StoreAPI.swift @@ -67,9 +67,9 @@ open class StoreAPI: APIBase { - API Key: - type: apiKey api_key - name: api_key - - examples: [{example={ + - examples: [{contentType=application/json, example={ "key" : 123 -}, contentType=application/json}] +}}] - returns: RequestBuilder<[String:Int32]> */ @@ -105,36 +105,36 @@ open class StoreAPI: APIBase { Find purchase order by ID - GET /store/order/{orderId} - For valid response try integer IDs with value <= 5 or > 10. Other values will generated exceptions - - examples: [{example= + - examples: [{contentType=application/xml, example= 123456 123456 0 2000-01-23T04:56:07.000Z string true -, contentType=application/xml}, {example={ - "id" : 123456789, +}, {contentType=application/json, example={ "petId" : 123456789, - "complete" : true, - "status" : "aeiou", "quantity" : 123, - "shipDate" : "2000-01-23T04:56:07.000+00:00" -}, contentType=application/json}] - - examples: [{example= + "id" : 123456789, + "shipDate" : "2000-01-23T04:56:07.000+00:00", + "complete" : true, + "status" : "aeiou" +}}] + - examples: [{contentType=application/xml, example= 123456 123456 0 2000-01-23T04:56:07.000Z string true -, contentType=application/xml}, {example={ - "id" : 123456789, +}, {contentType=application/json, example={ "petId" : 123456789, - "complete" : true, - "status" : "aeiou", "quantity" : 123, - "shipDate" : "2000-01-23T04:56:07.000+00:00" -}, contentType=application/json}] + "id" : 123456789, + "shipDate" : "2000-01-23T04:56:07.000+00:00", + "complete" : true, + "status" : "aeiou" +}}] - parameter orderId: (path) ID of pet that needs to be fetched @@ -173,36 +173,36 @@ open class StoreAPI: APIBase { Place an order for a pet - POST /store/order - - - examples: [{example= + - examples: [{contentType=application/xml, example= 123456 123456 0 2000-01-23T04:56:07.000Z string true -, contentType=application/xml}, {example={ - "id" : 123456789, +}, {contentType=application/json, example={ "petId" : 123456789, - "complete" : true, - "status" : "aeiou", "quantity" : 123, - "shipDate" : "2000-01-23T04:56:07.000+00:00" -}, contentType=application/json}] - - examples: [{example= + "id" : 123456789, + "shipDate" : "2000-01-23T04:56:07.000+00:00", + "complete" : true, + "status" : "aeiou" +}}] + - examples: [{contentType=application/xml, example= 123456 123456 0 2000-01-23T04:56:07.000Z string true -, contentType=application/xml}, {example={ - "id" : 123456789, +}, {contentType=application/json, example={ "petId" : 123456789, - "complete" : true, - "status" : "aeiou", "quantity" : 123, - "shipDate" : "2000-01-23T04:56:07.000+00:00" -}, contentType=application/json}] + "id" : 123456789, + "shipDate" : "2000-01-23T04:56:07.000+00:00", + "complete" : true, + "status" : "aeiou" +}}] - parameter body: (body) order placed for purchasing the pet diff --git a/samples/client/petstore/swift3/default/PetstoreClient/Classes/Swaggers/APIs/UserAPI.swift b/samples/client/petstore/swift3/default/PetstoreClient/Classes/Swaggers/APIs/UserAPI.swift index 9aec457645a..84ba24276e2 100644 --- a/samples/client/petstore/swift3/default/PetstoreClient/Classes/Swaggers/APIs/UserAPI.swift +++ b/samples/client/petstore/swift3/default/PetstoreClient/Classes/Swaggers/APIs/UserAPI.swift @@ -167,7 +167,7 @@ open class UserAPI: APIBase { Get user by user name - GET /user/{username} - - - examples: [{example= + - examples: [{contentType=application/xml, example= 123456 string string @@ -176,17 +176,17 @@ open class UserAPI: APIBase { string string 0 -, contentType=application/xml}, {example={ - "id" : 123456789, - "lastName" : "aeiou", - "phone" : "aeiou", - "username" : "aeiou", - "email" : "aeiou", - "userStatus" : 123, +}, {contentType=application/json, example={ "firstName" : "aeiou", - "password" : "aeiou" -}, contentType=application/json}] - - examples: [{example= + "lastName" : "aeiou", + "password" : "aeiou", + "userStatus" : 123, + "phone" : "aeiou", + "id" : 123456789, + "email" : "aeiou", + "username" : "aeiou" +}}] + - examples: [{contentType=application/xml, example= 123456 string string @@ -195,16 +195,16 @@ open class UserAPI: APIBase { string string 0 -, contentType=application/xml}, {example={ - "id" : 123456789, - "lastName" : "aeiou", - "phone" : "aeiou", - "username" : "aeiou", - "email" : "aeiou", - "userStatus" : 123, +}, {contentType=application/json, example={ "firstName" : "aeiou", - "password" : "aeiou" -}, contentType=application/json}] + "lastName" : "aeiou", + "password" : "aeiou", + "userStatus" : 123, + "phone" : "aeiou", + "id" : 123456789, + "email" : "aeiou", + "username" : "aeiou" +}}] - parameter username: (path) The name that needs to be fetched. Use user1 for testing. @@ -246,8 +246,8 @@ open class UserAPI: APIBase { - - responseHeaders: [X-Rate-Limit(Int32), X-Expires-After(Date)] - responseHeaders: [X-Rate-Limit(Int32), X-Expires-After(Date)] - - examples: [{example=string, contentType=application/xml}, {example="aeiou", contentType=application/json}] - - examples: [{example=string, contentType=application/xml}, {example="aeiou", contentType=application/json}] + - examples: [{contentType=application/xml, example=string}, {contentType=application/json, example="aeiou"}] + - examples: [{contentType=application/xml, example=string}, {contentType=application/json, example="aeiou"}] - parameter username: (query) The user name for login - parameter password: (query) The password for login in clear text