Skip to content

Commit 1c77f4e

Browse files
authored
Merge pull request #352 from rokgregoric/master
[NEW] Support for "Uses Scalar Type". [Rok Gregorič](#352)
2 parents 096e872 + 9ae4340 commit 1c77f4e

5 files changed

+38
-14
lines changed

mogenerator.h

+1
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@
3131

3232
@interface NSAttributeDescription (typing)
3333
- (BOOL)hasScalarAttributeType;
34+
- (BOOL)usesScalarAttributeType;
3435
- (NSString*)scalarAttributeType;
3536
- (NSString*)scalarAccessorMethodName;
3637
- (NSString*)scalarFactoryMethodName;

mogenerator.m

+16-3
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55

66
#import "mogenerator.h"
77
#import "NSManagedObjectModel+momcom.h"
8+
#import "NSAttributeDescription+momcom.h"
89
#import "NSString+MORegEx.h"
910

1011
static NSString * const kTemplateVar = @"TemplateVar";
@@ -15,6 +16,8 @@
1516

1617
static const NSString *const kAttributeValueScalarTypeKey = @"attributeValueScalarType";
1718
static const NSString *const kAdditionalHeaderFileNameKey = @"additionalHeaderFileName";
19+
static const NSString *const kCustomBaseClass = @"mogenerator.customBaseClass";
20+
static const NSString *const kReadOnly = @"mogenerator.readonly";
1821

1922
@interface NSEntityDescription (fetchedPropertiesAdditions)
2023
- (NSDictionary*)fetchedPropertiesByName;
@@ -194,7 +197,7 @@ - (NSString*)customSuperentity {
194197
}
195198
}
196199
- (NSString*)forcedCustomBaseClass {
197-
NSString* userInfoCustomBaseClass = [[self userInfo] objectForKey:@"mogenerator.customBaseClass"];
200+
NSString* userInfoCustomBaseClass = [[self userInfo] objectForKey:kCustomBaseClass];
198201
return userInfoCustomBaseClass ? userInfoCustomBaseClass : gCustomBaseClassForced;
199202
}
200203
/** @TypeInfo NSAttributeDescription */
@@ -419,8 +422,18 @@ - (BOOL)hasScalarAttributeType {
419422
return NO;
420423
}
421424
}
422-
- (NSString*)scalarAttributeType {
423425

426+
- (BOOL)usesScalarAttributeType {
427+
NSNumber *usesScalarAttributeType = [[self userInfo] objectForKey:kUsesScalarAttributeType];
428+
429+
if (usesScalarAttributeType) {
430+
return usesScalarAttributeType.boolValue;
431+
} else {
432+
return NO;
433+
}
434+
}
435+
436+
- (NSString*)scalarAttributeType {
424437
BOOL isUnsigned = [self isUnsigned];
425438

426439
NSString *attributeValueScalarType = [[self userInfo] objectForKey:kAttributeValueScalarTypeKey];
@@ -576,7 +589,7 @@ - (BOOL)hasTransformableAttributeType {
576589
}
577590

578591
- (BOOL)isReadonly {
579-
NSString *readonlyUserinfoValue = [[self userInfo] objectForKey:@"mogenerator.readonly"];
592+
NSString *readonlyUserinfoValue = [[self userInfo] objectForKey:kReadOnly];
580593
if (readonlyUserinfoValue != nil) {
581594
return YES;
582595
}

momcom/NSAttributeDescription+momcom.h

+2
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@
88

99
@import CoreData;
1010

11+
extern const NSString *const kUsesScalarAttributeType;
12+
1113
@interface NSAttributeDescription (momcom)
1214

1315
+ (NSAttributeDescription *)baseEntityForXML:(NSXMLElement *)xmlNode;

momcom/NSAttributeDescription+momcom.m

+9-1
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
#import "NSPropertyDescription+momcom.h"
1111

1212
static NSDictionary *attributeTypeForString;
13+
const NSString *const kUsesScalarAttributeType = @"mogenerator.usesScalarAttributeType";
1314

1415
@implementation NSAttributeDescription (momcom)
1516

@@ -44,7 +45,14 @@ + (NSAttributeDescription *)baseEntityForXML:(NSXMLElement *)xmlNode
4445
[attributeDescription setAttributeType:[attributeType integerValue]];
4546
}
4647
}
47-
48+
49+
NSXMLNode *userScalarElement = [xmlNode attributeForName:@"usesScalarValueType"];
50+
if (userScalarElement != nil) {
51+
NSMutableDictionary *userInfo = [[attributeDescription userInfo] mutableCopy];
52+
userInfo[kUsesScalarAttributeType] = [userScalarElement stringValue];
53+
[attributeDescription setUserInfo:userInfo.copy];
54+
}
55+
4856
NSXMLNode *defaultValueElement = [xmlNode attributeForName:@"defaultValueString"];
4957
if (defaultValueElement != nil) {
5058
NSString *defaultValueString = [defaultValueElement stringValue];

templates/machine.swift.motemplate

+10-10
Original file line numberDiff line numberDiff line change
@@ -23,10 +23,10 @@ public enum <$sanitizedManagedObjectClassName$>FetchedProperties: String {<$fore
2323
}
2424
<$endif$>
2525

26-
<$if hasUserInfoKeys && userInfoKeyValues.@count > 0$>
27-
public enum <$sanitizedManagedObjectClassName$>UserInfo: String {<$foreach UserInfo userInfoKeyValues do$>
28-
case <$UserInfo.key$> = "<$UserInfo.key$>"<$endforeach do$>
29-
}
26+
<$if hasUserInfoKeys && userInfoKeyValues.@count > 0$>
27+
public enum <$sanitizedManagedObjectClassName$>UserInfo: String {<$foreach UserInfo userInfoKeyValues do$>
28+
case <$UserInfo.key$> = "<$UserInfo.key$>"<$endforeach do$>
29+
}
3030
<$endif$>
3131

3232

@@ -61,29 +61,29 @@ open class _<$sanitizedManagedObjectClassName$>: NSManagedObject {
6161
<$if Attribute.hasDefinedAttributeType$>
6262
<$if Attribute.hasScalarAttributeType$>
6363
<$if Attribute.isReadonly$>
64-
open var <$Attribute.name$>: NSNumber?
64+
open var <$Attribute.name$>: <$if Attribute.usesScalarAttributeType$><$Attribute.scalarAttributeType$><$if Attribute.isOptional$> // Optional scalars not supported<$endif$><$else$>NSNumber<$if Attribute.isOptional$>?<$else$>!<$endif$><$endif$>
6565
{
6666
self.willAccessValue(forKey: <$sanitizedManagedObjectClassName$>Attributes.<$Attribute.name$>.rawValue)
67-
let <$Attribute.name$> = self.primitiveValue(forKey: <$sanitizedManagedObjectClassName$>Attributes.<$Attribute.name$>.rawValue) as? NSNumber
67+
let <$Attribute.name$> = self.primitiveValue(forKey: <$sanitizedManagedObjectClassName$>Attributes.<$Attribute.name$>.rawValue) as? <$if Attribute.usesScalarAttributeType$><$Attribute.scalarAttributeType$><$else$>NSNumber<$endif$>
6868
self.didAccessValue(forKey: <$sanitizedManagedObjectClassName$>Attributes.<$Attribute.name$>.rawValue)
6969
return <$Attribute.name$>
7070
}
7171
<$else$>
7272
@NSManaged open
73-
var <$Attribute.name$>: NSNumber?
73+
var <$Attribute.name$>: <$if Attribute.usesScalarAttributeType$><$Attribute.scalarAttributeType$><$if Attribute.isOptional$> // Optional scalars not supported<$endif$><$else$>NSNumber<$if Attribute.isOptional$>?<$else$>!<$endif$><$endif$>
7474
<$endif$>
7575
<$else$>
7676
<$if Attribute.isReadonly$>
77-
open var <$Attribute.name$>: <$Attribute.objectAttributeType$><$if Attribute.isOptional$>?<$endif$>
77+
open var <$Attribute.name$>: <$Attribute.objectAttributeType$><$if Attribute.isOptional$>?<$else$>!<$endif$>
7878
{
7979
self.willAccessValue(forKey: <$sanitizedManagedObjectClassName$>Attributes.<$Attribute.name$>.rawValue)
80-
let <$Attribute.name$> =self.primitiveValue(forKey: <$sanitizedManagedObjectClassName$>Attributes.<$Attribute.name$>.rawValue) as? <$Attribute.objectAttributeType$>
80+
let <$Attribute.name$> = self.primitiveValue(forKey: <$sanitizedManagedObjectClassName$>Attributes.<$Attribute.name$>.rawValue) as? <$Attribute.objectAttributeType$>
8181
self.didAccessValue(forKey: <$sanitizedManagedObjectClassName$>Attributes.<$Attribute.name$>.rawValue)
8282
return <$Attribute.name$>
8383
}
8484
<$else$>
8585
@NSManaged open
86-
var <$Attribute.name$>: <$Attribute.objectAttributeType$><$if Attribute.isOptional$>?<$endif$>
86+
var <$Attribute.name$>: <$Attribute.objectAttributeType$><$if Attribute.isOptional$>?<$else$>!<$endif$>
8787
<$endif$>
8888
<$endif$>
8989
<$endif$>

0 commit comments

Comments
 (0)