blob: 8d774915923bd7c3d7b2cb2d0835a38db448c78e [file] [log] [blame]
//
// MTLTestModel.m
// Mantle
//
// Created by Justin Spahr-Summers on 2012-09-11.
// Copyright (c) 2012 GitHub. All rights reserved.
//
#import "MTLTestModel.h"
NSString * const MTLTestModelErrorDomain = @"MTLTestModelErrorDomain";
const NSInteger MTLTestModelNameTooLong = 1;
const NSInteger MTLTestModelNameMissing = 2;
static NSUInteger modelVersion = 1;
@implementation MTLEmptyTestModel
@end
@implementation MTLTestModel
#pragma mark Properties
- (BOOL)validateName:(NSString **)name error:(NSError **)error {
if ([*name length] < 10) return YES;
if (error != NULL) {
*error = [NSError errorWithDomain:MTLTestModelErrorDomain code:MTLTestModelNameTooLong userInfo:nil];
}
return NO;
}
- (NSString *)dynamicName {
return self.name;
}
#pragma mark Versioning
+ (void)setModelVersion:(NSUInteger)version {
modelVersion = version;
}
+ (NSUInteger)modelVersion {
return modelVersion;
}
#pragma mark Lifecycle
- (instancetype)init {
self = [super init];
if (self == nil) return nil;
self.count = 1;
return self;
}
#pragma mark MTLJSONSerializing
+ (NSDictionary *)JSONKeyPathsByPropertyKey {
return @{
@"name": @"username",
@"nestedName": @"nested.name",
@"weakModel": NSNull.null,
};
}
+ (NSValueTransformer *)countJSONTransformer {
return [MTLValueTransformer
reversibleTransformerWithForwardBlock:^(NSString *str) {
return @(str.integerValue);
}
reverseBlock:^(NSNumber *num) {
return num.stringValue;
}];
}
#pragma mark NSCoding
- (void)encodeWithCoder:(NSCoder *)coder {
[super encodeWithCoder:coder];
if (modelVersion == 0) {
[coder encodeObject:self.name forKey:@"mtl_name"];
}
}
+ (NSDictionary *)encodingBehaviorsByPropertyKey {
return [super.encodingBehaviorsByPropertyKey mtl_dictionaryByAddingEntriesFromDictionary:@{
@"nestedName": @(MTLModelEncodingBehaviorExcluded)
}];
}
- (id)decodeValueForKey:(NSString *)key withCoder:(NSCoder *)coder modelVersion:(NSUInteger)fromVersion {
NSParameterAssert(key != nil);
NSParameterAssert(coder != nil);
if ([key isEqual:@"name"] && fromVersion == 0) {
return [@"M: " stringByAppendingString:[coder decodeObjectForKey:@"mtl_name"]];
}
return [super decodeValueForKey:key withCoder:coder modelVersion:fromVersion];
}
+ (NSDictionary *)dictionaryValueFromArchivedExternalRepresentation:(NSDictionary *)externalRepresentation version:(NSUInteger)fromVersion {
NSParameterAssert(externalRepresentation != nil);
NSParameterAssert(fromVersion == 1);
return @{
@"name": externalRepresentation[@"username"],
@"nestedName": externalRepresentation[@"nested"][@"name"],
@"count": @([externalRepresentation[@"count"] integerValue])
};
}
#pragma mark Merging
- (void)mergeCountFromModel:(MTLTestModel *)model {
self.count += model.count;
}
@end
@implementation MTLSubclassTestModel
@end
@implementation MTLArrayTestModel
+ (NSDictionary *)JSONKeyPathsByPropertyKey {
return @{
@"names": @"users.name"
};
}
@end
@implementation MTLSubstitutingTestModel
+ (NSDictionary *)JSONKeyPathsByPropertyKey {
return @{};
}
+ (Class)classForParsingJSONDictionary:(NSDictionary *)JSONDictionary {
NSParameterAssert(JSONDictionary != nil);
if (JSONDictionary[@"username"] == nil) {
return nil;
} else {
return MTLTestModel.class;
}
}
@end
@implementation MTLValidationModel
- (BOOL)validateName:(NSString **)name error:(NSError **)error {
if (*name != nil) return YES;
if (error != NULL) {
*error = [NSError errorWithDomain:MTLTestModelErrorDomain code:MTLTestModelNameMissing userInfo:nil];
}
return NO;
}
@end
@implementation MTLSelfValidatingModel
- (BOOL)validateName:(NSString **)name error:(NSError **)error {
if (*name != nil) return YES;
*name = @"foobar";
return YES;
}
@end
@implementation MTLIllegalJSONMappingModel
+ (NSDictionary *)JSONKeyPathsByPropertyKey {
return @{
@"name": @"username"
};
}
@end