diff --git a/Code/ObjectMapping/RKObjectLoader.m b/Code/ObjectMapping/RKObjectLoader.m index d8fb85fa..b0f93677 100644 --- a/Code/ObjectMapping/RKObjectLoader.m +++ b/Code/ObjectMapping/RKObjectLoader.m @@ -200,15 +200,24 @@ return result; } +- (RKObjectMapping *)configuredObjectMapping { + if (self.objectMapping) { + return self.objectMapping; + } + + return [self.mappingProvider objectMappingForResourcePath:self.resourcePath]; +} + - (RKObjectMappingResult*)performMapping:(NSError**)error { NSAssert(_sentSynchronously || ![NSThread isMainThread], @"Mapping should occur on a background thread"); RKObjectMappingProvider* mappingProvider; - if (self.objectMapping) { - NSString* rootKeyPath = self.objectMapping.rootKeyPath ? self.objectMapping.rootKeyPath : @""; + RKObjectMapping *configuredObjectMapping = [self configuredObjectMapping]; + if (configuredObjectMapping) { + NSString* rootKeyPath = configuredObjectMapping.rootKeyPath ? configuredObjectMapping.rootKeyPath : @""; RKLogDebug(@"Found directly configured object mapping, creating temporary mapping provider for keyPath %@", rootKeyPath); mappingProvider = [RKObjectMappingProvider mappingProvider]; - [mappingProvider setMapping:self.objectMapping forKeyPath:rootKeyPath]; + [mappingProvider setMapping:configuredObjectMapping forKeyPath:rootKeyPath]; } else { RKLogDebug(@"No object mapping provider, using mapping provider from parent object manager to perform KVC mapping"); mappingProvider = self.mappingProvider; diff --git a/Code/ObjectMapping/RKObjectRouter.h b/Code/ObjectMapping/RKObjectRouter.h index 7acf5e57..efff298b 100644 --- a/Code/ObjectMapping/RKObjectRouter.h +++ b/Code/ObjectMapping/RKObjectRouter.h @@ -3,7 +3,7 @@ // RestKit // // Created by Blake Watters on 10/18/10. -// Copyright 2010 Two Toasters +// Copyright 2010 RestKit // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/Code/ObjectMapping/RKObjectRouter.m b/Code/ObjectMapping/RKObjectRouter.m index 967156dc..e8910f64 100644 --- a/Code/ObjectMapping/RKObjectRouter.m +++ b/Code/ObjectMapping/RKObjectRouter.m @@ -3,7 +3,7 @@ // RestKit // // Created by Blake Watters on 10/18/10. -// Copyright 2010 Two Toasters +// Copyright 2010 RestKit // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/Specs/ObjectMapping/RKObjectLoaderSpec.m b/Specs/ObjectMapping/RKObjectLoaderSpec.m index 22867c02..2cb35b77 100644 --- a/Specs/ObjectMapping/RKObjectLoaderSpec.m +++ b/Specs/ObjectMapping/RKObjectLoaderSpec.m @@ -439,6 +439,56 @@ assertThat(user.firstname, is(equalTo(@"Diego"))); } +- (void)testShouldDetermineObjectLoaderBasedOnResourcePathPatternWithExactMatch { + RKObjectMapping* userMapping = [RKObjectMapping mappingForClass:[RKSpecComplexUser class]]; + userMapping.rootKeyPath = @"data.STUser"; + [userMapping mapAttributes:@"firstname", nil]; + + RKSpecComplexUser* user = [[RKSpecComplexUser new] autorelease]; + RKObjectManager* objectManager = [RKObjectManager objectManagerWithBaseURL:RKSpecGetBaseURL()]; + RKSpecResponseLoader* responseLoader = [RKSpecResponseLoader responseLoader]; + RKObjectMappingProvider *mappingProvider = [RKObjectMappingProvider mappingProvider]; + [mappingProvider setObjectMapping:userMapping forResourcePathPattern:@"/JSON/ComplexNestedUser.json"]; + + RKURL *URL = [objectManager.baseURL URLByAppendingResourcePath:@"/JSON/ComplexNestedUser.json"]; + RKObjectLoader* objectLoader = [RKObjectLoader loaderWithURL:URL mappingProvider:mappingProvider]; + objectLoader.delegate = responseLoader; + objectLoader.method = RKRequestMethodGET; + objectLoader.targetObject = user; + + [objectLoader sendAsynchronously]; + [responseLoader waitForResponse]; + + NSLog(@"Response: %@", responseLoader.objects); + + assertThat(user.firstname, is(equalTo(@"Diego"))); +} + +- (void)testShouldDetermineObjectLoaderBasedOnResourcePathPatternWithPartialMatch { + RKObjectMapping* userMapping = [RKObjectMapping mappingForClass:[RKSpecComplexUser class]]; + userMapping.rootKeyPath = @"data.STUser"; + [userMapping mapAttributes:@"firstname", nil]; + + RKSpecComplexUser* user = [[RKSpecComplexUser new] autorelease]; + RKObjectManager* objectManager = [RKObjectManager objectManagerWithBaseURL:RKSpecGetBaseURL()]; + RKSpecResponseLoader* responseLoader = [RKSpecResponseLoader responseLoader]; + RKObjectMappingProvider *mappingProvider = [RKObjectMappingProvider mappingProvider]; + [mappingProvider setObjectMapping:userMapping forResourcePathPattern:@"/JSON/:name\\.json"]; + + RKURL *URL = [objectManager.baseURL URLByAppendingResourcePath:@"/JSON/ComplexNestedUser.json"]; + RKObjectLoader* objectLoader = [RKObjectLoader loaderWithURL:URL mappingProvider:mappingProvider]; + objectLoader.delegate = responseLoader; + objectLoader.method = RKRequestMethodGET; + objectLoader.targetObject = user; + + [objectLoader sendAsynchronously]; + [responseLoader waitForResponse]; + + NSLog(@"Response: %@", responseLoader.objects); + + assertThat(user.firstname, is(equalTo(@"Diego"))); +} + - (void)testShouldReturnSuccessWhenTheStatusCodeIs200AndTheResponseBodyIsEmpty { RKObjectManager* objectManager = RKSpecNewObjectManager();