From ae6b58d7bc25873f3abb49e6df949cc3ba83c740 Mon Sep 17 00:00:00 2001 From: Blake Watters Date: Tue, 11 Dec 2012 21:31:40 -0500 Subject: [PATCH] Add support for parameterizing `NSSet`. refs #1010 --- Code/Network/RKObjectParameterization.m | 3 +++ .../RKObjectParameterizationTest.m | 19 +++++++++++++++++++ 2 files changed, 22 insertions(+) diff --git a/Code/Network/RKObjectParameterization.m b/Code/Network/RKObjectParameterization.m index bd044cbb..4db6978d 100644 --- a/Code/Network/RKObjectParameterization.m +++ b/Code/Network/RKObjectParameterization.m @@ -111,6 +111,9 @@ } else if ([value isKindOfClass:[NSDecimalNumber class]]) { // Precision numbers are serialized as strings to work around Javascript notation limits transformedValue = [(NSDecimalNumber *)value stringValue]; + } else if ([value isKindOfClass:[NSSet class]]) { + // NSSets are not natively serializable, so let's just turn it into an NSArray + transformedValue = [value allObjects]; } else if ([value isKindOfClass:[NSOrderedSet class]]) { // NSOrderedSets are not natively serializable, so let's just turn it into an NSArray transformedValue = [value array]; diff --git a/Tests/Logic/ObjectMapping/RKObjectParameterizationTest.m b/Tests/Logic/ObjectMapping/RKObjectParameterizationTest.m index 8af974ec..355e7ec5 100644 --- a/Tests/Logic/ObjectMapping/RKObjectParameterizationTest.m +++ b/Tests/Logic/ObjectMapping/RKObjectParameterizationTest.m @@ -319,6 +319,25 @@ expect(string).to.equal(@"{\"key1-form-name\":\"value1\",\"set-form-name\":[\"setElementOne\",\"setElementTwo\",\"setElementThree\"]}"); } +- (void)testShouldSerializeAnNSSetToJSON +{ + NSDictionary *object = [NSDictionary dictionaryWithObjectsAndKeys:@"value1", @"key1", + [NSSet setWithObjects:@"setElementOne", nil], @"set", + nil]; + RKObjectMapping *mapping = [RKObjectMapping requestMapping]; + [mapping addPropertyMapping:[RKAttributeMapping attributeMappingFromKeyPath:@"key1" toKeyPath:@"key1-form-name"]]; + [mapping addPropertyMapping:[RKAttributeMapping attributeMappingFromKeyPath:@"set" toKeyPath:@"set-form-name"]]; + + NSError *error = nil; + RKRequestDescriptor *requestDescriptor = [RKRequestDescriptor requestDescriptorWithMapping:mapping objectClass:[NSDictionary class] rootKeyPath:nil]; + NSDictionary *parameters = [RKObjectParameterization parametersWithObject:object requestDescriptor:requestDescriptor error:&error]; + NSData *data = [RKMIMETypeSerialization dataFromObject:parameters MIMEType:RKMIMETypeJSON error:&error]; + NSString *string = [[[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding] stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; + + expect(error).to.beNil(); + expect(string).to.equal(@"{\"key1-form-name\":\"value1\",\"set-form-name\":[\"setElementOne\"]}"); +} + - (void)testParameterizationOfAttributesNestedByKeyPath { NSDictionary *object = @{ @"name" : @"Blake Watters", @"occupation" : @"Hacker" };