From b2e0d83f2e3d01e7ebd30bca8ba163fd4898418b Mon Sep 17 00:00:00 2001 From: geekerzp Date: Tue, 28 Jul 2015 17:21:10 +0800 Subject: [PATCH] Update objc client. * Fix issue that list of primitive types deserialization. * Add test cases for list of primitive types deserialization and nested list deserialization. --- .../codegen/languages/ObjcClientCodegen.java | 19 ++++++++++--------- .../resources/objc/ApiClient-body.mustache | 13 ++++++++----- .../src/test/scala/Objc/ObjcModelTest.scala | 2 +- .../objc/SwaggerClient/SWGApiClient.m | 13 ++++++++----- .../petstore/objc/SwaggerClient/SWGPet.h | 2 +- .../petstore/objc/SwaggerClient/SWGPetApi.h | 4 ++-- .../petstore/objc/SwaggerClient/SWGPetApi.m | 4 ++-- .../Tests/DeserializationTest.m | 18 ++++++++++++++++++ 8 files changed, 50 insertions(+), 25 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 3e5edbc169fd..df93a38aafa4 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 @@ -213,21 +213,22 @@ public class ObjcClientCodegen extends DefaultCodegen implements CodegenConfig { Property inner = ap.getItems(); String innerType = getSwaggerType(inner); - // In this codition, type of property p is array of primitive, - // return container type with pointer, e.g. `NSArray*' - if (languageSpecificPrimitives.contains(innerType)) { - return getSwaggerType(p) + "*"; - } - - // In this codition, type of property p is array of model, - // return container type combine inner type with pointer, e.g. `NSArray*' String innerTypeDeclaration = getTypeDeclaration(inner); if (innerTypeDeclaration.endsWith("*")) { innerTypeDeclaration = innerTypeDeclaration.substring(0, innerTypeDeclaration.length() - 1); } - return getSwaggerType(p) + "<" + innerTypeDeclaration + ">*"; + // In this codition, type of property p is array of primitive, + // return container type with pointer, e.g. `NSArray* /* NSString */' + if (languageSpecificPrimitives.contains(innerType)) { + return getSwaggerType(p) + "*" + " /* " + innerTypeDeclaration + " */"; + } + // In this codition, type of property p is array of model, + // return container type combine inner type with pointer, e.g. `NSArray*' + else { + return getSwaggerType(p) + "<" + innerTypeDeclaration + ">*"; + } } else if (p instanceof MapProperty) { MapProperty mp = (MapProperty) p; Property inner = mp.getAdditionalProperties(); 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 7ad0186daad3..e37d26e755b5 100644 --- a/modules/swagger-codegen/src/main/resources/objc/ApiClient-body.mustache +++ b/modules/swagger-codegen/src/main/resources/objc/ApiClient-body.mustache @@ -356,13 +356,14 @@ static void (^reachabilityChangeBlock)(int); NSTextCheckingResult *match = nil; NSMutableArray *resultArray = nil; NSMutableDictionary *resultDict = nil; + NSString *innerType = nil; // return nil if data is nil or class is nil if (!data || !class) { return nil; } - // remove "*" from class, if ends with "*" + // remove "*" from class, if ends with "*" if ([class hasSuffix:@"*"]) { class = [class substringToIndex:[class length] - 1]; } @@ -383,7 +384,7 @@ static void (^reachabilityChangeBlock)(int); range:NSMakeRange(0, [class length])]; if (match) { - NSString *innerType = [class substringWithRange:[match rangeAtIndex:1]]; + innerType = [class substringWithRange:[match rangeAtIndex:1]]; resultArray = [NSMutableArray arrayWithCapacity:[data count]]; [data enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) { @@ -395,8 +396,8 @@ static void (^reachabilityChangeBlock)(int); } // list of primitives - NSString *arrayOfPrimitivesPet = @"NSArray"; - regexp = [NSRegularExpression regularExpressionWithPattern:arrayOfPrimitivesPet + NSString *arrayOfPrimitivesPat = @"NSArray\\* /\\* (.+) \\*/"; + regexp = [NSRegularExpression regularExpressionWithPattern:arrayOfPrimitivesPat options:NSRegularExpressionCaseInsensitive error:nil]; match = [regexp firstMatchInString:class @@ -404,9 +405,11 @@ static void (^reachabilityChangeBlock)(int); range:NSMakeRange(0, [class length])]; if (match) { + innerType = [class substringWithRange:[match rangeAtIndex:1]]; + resultArray = [NSMutableArray arrayWithCapacity:[data count]]; [data enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) { - [resultArray addObject:[self deserialize:obj class:NSStringFromClass([obj class])]]; + [resultArray addObject:[self deserialize:obj class:innerType]]; }]; return resultArray; diff --git a/modules/swagger-codegen/src/test/scala/Objc/ObjcModelTest.scala b/modules/swagger-codegen/src/test/scala/Objc/ObjcModelTest.scala index 6747b94d4f8e..3d509ca1a2d8 100644 --- a/modules/swagger-codegen/src/test/scala/Objc/ObjcModelTest.scala +++ b/modules/swagger-codegen/src/test/scala/Objc/ObjcModelTest.scala @@ -90,7 +90,7 @@ class ObjcModelTest extends FlatSpec with Matchers { vars.get(0).isNotContainer should equal(true) vars.get(1).baseName should be("urls") - vars.get(1).datatype should be("NSArray*") + vars.get(1).datatype should be("NSArray* /* NSString */") vars.get(1).name should be("urls") // vars.get(1).defaultValue should be ("null") vars.get(1).baseType should be("NSArray") diff --git a/samples/client/petstore/objc/SwaggerClient/SWGApiClient.m b/samples/client/petstore/objc/SwaggerClient/SWGApiClient.m index 6a2f7753db5c..9ebc48af3487 100644 --- a/samples/client/petstore/objc/SwaggerClient/SWGApiClient.m +++ b/samples/client/petstore/objc/SwaggerClient/SWGApiClient.m @@ -356,13 +356,14 @@ static void (^reachabilityChangeBlock)(int); NSTextCheckingResult *match = nil; NSMutableArray *resultArray = nil; NSMutableDictionary *resultDict = nil; + NSString *innerType = nil; // return nil if data is nil or class is nil if (!data || !class) { return nil; } - // remove "*" from class, if ends with "*" + // remove "*" from class, if ends with "*" if ([class hasSuffix:@"*"]) { class = [class substringToIndex:[class length] - 1]; } @@ -383,7 +384,7 @@ static void (^reachabilityChangeBlock)(int); range:NSMakeRange(0, [class length])]; if (match) { - NSString *innerType = [class substringWithRange:[match rangeAtIndex:1]]; + innerType = [class substringWithRange:[match rangeAtIndex:1]]; resultArray = [NSMutableArray arrayWithCapacity:[data count]]; [data enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) { @@ -395,8 +396,8 @@ static void (^reachabilityChangeBlock)(int); } // list of primitives - NSString *arrayOfPrimitivesPet = @"NSArray"; - regexp = [NSRegularExpression regularExpressionWithPattern:arrayOfPrimitivesPet + NSString *arrayOfPrimitivesPat = @"NSArray\\* /\\* (.+) \\*/"; + regexp = [NSRegularExpression regularExpressionWithPattern:arrayOfPrimitivesPat options:NSRegularExpressionCaseInsensitive error:nil]; match = [regexp firstMatchInString:class @@ -404,9 +405,11 @@ static void (^reachabilityChangeBlock)(int); range:NSMakeRange(0, [class length])]; if (match) { + innerType = [class substringWithRange:[match rangeAtIndex:1]]; + resultArray = [NSMutableArray arrayWithCapacity:[data count]]; [data enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) { - [resultArray addObject:[self deserialize:obj class:NSStringFromClass([obj class])]]; + [resultArray addObject:[self deserialize:obj class:innerType]]; }]; return resultArray; diff --git a/samples/client/petstore/objc/SwaggerClient/SWGPet.h b/samples/client/petstore/objc/SwaggerClient/SWGPet.h index d78baade81ac..e340e0e2b86a 100644 --- a/samples/client/petstore/objc/SwaggerClient/SWGPet.h +++ b/samples/client/petstore/objc/SwaggerClient/SWGPet.h @@ -23,7 +23,7 @@ @property(nonatomic) NSString* name; -@property(nonatomic) NSArray* photoUrls; +@property(nonatomic) NSArray* /* NSString */ photoUrls; @property(nonatomic) NSArray* tags; /* pet status in the store [optional] diff --git a/samples/client/petstore/objc/SwaggerClient/SWGPetApi.h b/samples/client/petstore/objc/SwaggerClient/SWGPetApi.h index 929b16eab1ff..bcbf8c64f9b7 100644 --- a/samples/client/petstore/objc/SwaggerClient/SWGPetApi.h +++ b/samples/client/petstore/objc/SwaggerClient/SWGPetApi.h @@ -59,7 +59,7 @@ /// /// /// @return NSArray* --(NSNumber*) findPetsByStatusWithCompletionBlock :(NSArray*) status +-(NSNumber*) findPetsByStatusWithCompletionBlock :(NSArray* /* NSString */) status completionHandler: (void (^)(NSArray* output, NSError* error))completionBlock; @@ -74,7 +74,7 @@ /// /// /// @return NSArray* --(NSNumber*) findPetsByTagsWithCompletionBlock :(NSArray*) tags +-(NSNumber*) findPetsByTagsWithCompletionBlock :(NSArray* /* NSString */) tags completionHandler: (void (^)(NSArray* output, NSError* error))completionBlock; diff --git a/samples/client/petstore/objc/SwaggerClient/SWGPetApi.m b/samples/client/petstore/objc/SwaggerClient/SWGPetApi.m index 15f4af0564ef..91386db77eff 100644 --- a/samples/client/petstore/objc/SwaggerClient/SWGPetApi.m +++ b/samples/client/petstore/objc/SwaggerClient/SWGPetApi.m @@ -260,7 +260,7 @@ static NSString * basePath = @"http://petstore.swagger.io/v2"; /// /// @returns NSArray* /// --(NSNumber*) findPetsByStatusWithCompletionBlock: (NSArray*) status +-(NSNumber*) findPetsByStatusWithCompletionBlock: (NSArray* /* NSString */) status completionHandler: (void (^)(NSArray* output, NSError* error))completionBlock { @@ -341,7 +341,7 @@ static NSString * basePath = @"http://petstore.swagger.io/v2"; /// /// @returns NSArray* /// --(NSNumber*) findPetsByTagsWithCompletionBlock: (NSArray*) tags +-(NSNumber*) findPetsByTagsWithCompletionBlock: (NSArray* /* NSString */) tags completionHandler: (void (^)(NSArray* output, NSError* error))completionBlock { diff --git a/samples/client/petstore/objc/SwaggerClientTests/Tests/DeserializationTest.m b/samples/client/petstore/objc/SwaggerClientTests/Tests/DeserializationTest.m index a86ff7d01e4c..687eb5db7a37 100644 --- a/samples/client/petstore/objc/SwaggerClientTests/Tests/DeserializationTest.m +++ b/samples/client/petstore/objc/SwaggerClientTests/Tests/DeserializationTest.m @@ -55,6 +55,14 @@ XCTAssertTrue([result isEqualToString:data]); } +- (void)testDeserializeListOfString { + NSArray *data = @[@"test string"]; + NSArray *result = [apiClient deserialize:data class:@"NSArray* /* NSString */"]; + + XCTAssertTrue([result isKindOfClass:[NSArray class]]); + XCTAssertTrue([result[0] isKindOfClass:[NSString class]]); +} + - (void)testDeserializeListOfModels { NSArray *data = @[ @@ -131,4 +139,14 @@ XCTAssertTrue([result[@"foo"][@"bar"] isKindOfClass:[NSNumber class]]); } +- (void)testDeserializeNestedList { + NSArray *data = @[@[@"foo"]]; + + NSArray *result = [apiClient deserialize:data class:@"NSArray* /* NSArray* /* NSString */ */"]; + + XCTAssertTrue([result isKindOfClass:[NSArray class]]); + XCTAssertTrue([result[0] isKindOfClass:[NSArray class]]); + XCTAssertTrue([result[0][0] isKindOfClass:[NSString class]]); +} + @end