From d08c5fa9bdd5d6a90336eb644be6d2d8e695bb73 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Franc=CC=A7ois=20Benaiteau?= <francois.benaiteau@gmail.com> Date: Sun, 13 Oct 2013 21:09:03 +0200 Subject: [PATCH 001/149] ADD First test on getHeaderDescriptionString --- ObjectiveCCodeGenerator_test.py | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) create mode 100644 ObjectiveCCodeGenerator_test.py diff --git a/ObjectiveCCodeGenerator_test.py b/ObjectiveCCodeGenerator_test.py new file mode 100644 index 0000000..2965cf0 --- /dev/null +++ b/ObjectiveCCodeGenerator_test.py @@ -0,0 +1,29 @@ +from ObjectiveCCodeGenerator import * + + +import unittest + +class TestObjectiveCCodeGenerator(unittest.TestCase): + def setUp(self): + print('In setUp()') + self.gen = ObjectiveCCodeGenerator() + + def tearDown(self): + print('In tearDown()') + del self.gen + + def test_getHeaderDescriptionString(self): + result = self.gen.getHeaderDescriptionString("MyClass") + expected_result = """// +// MyClass.h +// +// Created by MetaJSONParser. +// Copyright (c) 2013 SinnerSchrader Mobile. All rights reserved. + +""" + self.assertMultiLineEqual(result, expected_result) + + +if __name__ == '__main__': + unittest.main() + From 000025f96ee8caf6022a3f6732dcbf212c8a6426 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Franc=CC=A7ois=20Benaiteau?= <francois.benaiteau@gmail.com> Date: Sun, 13 Oct 2013 21:30:55 +0200 Subject: [PATCH 002/149] Refactor code to use must ache templates getCommonDescriptionString and getHeaderDescriptionString --- ObjectiveCCodeGenerator.py | 28 ++++++++++++++++------------ templates/header.h.mustache | 6 ++++++ 2 files changed, 22 insertions(+), 12 deletions(-) create mode 100644 templates/header.h.mustache diff --git a/ObjectiveCCodeGenerator.py b/ObjectiveCCodeGenerator.py index 346072f..b96888d 100755 --- a/ObjectiveCCodeGenerator.py +++ b/ObjectiveCCodeGenerator.py @@ -23,28 +23,32 @@ ''' import datetime, time, os +from pystache import Renderer + + class ObjectiveCCodeGenerator : projectPrefix = "" dirPath = "" - + def __init__(self): projectPrefix = "" dirPath = "classes" - - - def getCommonDescriptionString(self) : + + def templateFilePath(self, filename) : + templatePath = os.path.realpath( __file__ ) + templatePath = templatePath.replace(os.path.basename( __file__ ), 'templates') + return os.path.join(templatePath, filename) + + def getCommonDescriptionString(self, name) : + templateFile = open(self.templateFilePath("header.h.mustache"), "r") today = datetime.date.fromtimestamp(time.time()) - commonDescription = "//\n// Created by MetaJSONParser." - commonDescription += "\n// Copyright (c) "+ str(today.year) +" SinnerSchrader Mobile. All rights reserved.\n\n" - return commonDescription - + return Renderer().render(templateFile.read(), {"date": str(today.year), "filename": name}) + def getHeaderDescriptionString(self, name) : - hDescriptionString = "//\n// "+ self.getTitledString(name) +".h\n" - hDescriptionString += self.getCommonDescriptionString() - return hDescriptionString - + return self.getCommonDescriptionString(self.getTitledString(name) + ".h") + def getSourceDescriptionString(self, name) : mDescriptionString = "//\n// "+ self.getTitledString(name) +".m\n" mDescriptionString += self.getCommonDescriptionString() diff --git a/templates/header.h.mustache b/templates/header.h.mustache new file mode 100644 index 0000000..427a9ac --- /dev/null +++ b/templates/header.h.mustache @@ -0,0 +1,6 @@ +// +// {{filename}} +// +// Created by MetaJSONParser. +// Copyright (c) {{date}} SinnerSchrader Mobile. All rights reserved. + From 58e37e3954a0095e60d7482cc2aba5fcfdbcc69b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Franc=CC=A7ois=20Benaiteau?= <francois.benaiteau@gmail.com> Date: Sun, 13 Oct 2013 21:32:34 +0200 Subject: [PATCH 003/149] Refactor getSourceDescriptionString --- ObjectiveCCodeGenerator.py | 6 ++---- ObjectiveCCodeGenerator_test.py | 11 +++++++++++ 2 files changed, 13 insertions(+), 4 deletions(-) diff --git a/ObjectiveCCodeGenerator.py b/ObjectiveCCodeGenerator.py index b96888d..b1b43d2 100755 --- a/ObjectiveCCodeGenerator.py +++ b/ObjectiveCCodeGenerator.py @@ -50,10 +50,8 @@ def getHeaderDescriptionString(self, name) : return self.getCommonDescriptionString(self.getTitledString(name) + ".h") def getSourceDescriptionString(self, name) : - mDescriptionString = "//\n// "+ self.getTitledString(name) +".m\n" - mDescriptionString += self.getCommonDescriptionString() - return mDescriptionString - + return self.getCommonDescriptionString(self.getTitledString(name) + ".m") + def makeVarName(self,schemeObj) : returnName = schemeObj.type_name if str(schemeObj.type_name) == "id" or str(schemeObj.type_name) == "description" : diff --git a/ObjectiveCCodeGenerator_test.py b/ObjectiveCCodeGenerator_test.py index 2965cf0..aa3c906 100644 --- a/ObjectiveCCodeGenerator_test.py +++ b/ObjectiveCCodeGenerator_test.py @@ -24,6 +24,17 @@ def test_getHeaderDescriptionString(self): self.assertMultiLineEqual(result, expected_result) + def test_getSourceDescriptionString(self): + result = self.gen.getSourceDescriptionString("MyClass") + expected_result = """// +// MyClass.m +// +// Created by MetaJSONParser. +// Copyright (c) 2013 SinnerSchrader Mobile. All rights reserved. + +""" + self.assertMultiLineEqual(result, expected_result) + if __name__ == '__main__': unittest.main() From eb2342d3976afc2f5be5e2b23151981ebf3d67a9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Franc=CC=A7ois=20Benaiteau?= <francois.benaiteau@gmail.com> Date: Sun, 13 Oct 2013 21:37:20 +0200 Subject: [PATCH 004/149] Update ignored files: default output folder --- .gitignore | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.gitignore b/.gitignore index cddc58e..be385b8 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,5 @@ # Exclude .pyc (compile python file) files *.pyc + +# Default ouptut folder +src/ From 66b0a4f2372549bed632b8ac4e359b6f7817aecd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Franc=CC=A7ois=20Benaiteau?= <francois.benaiteau@gmail.com> Date: Sun, 13 Oct 2013 23:04:19 +0200 Subject: [PATCH 005/149] ADD tests on make function for Objc Given a simple scheme, diff between generated files and expected files --- ObjectiveCCodeGenerator_test.py | 73 +++++++++++++++++++++++------- samples/test_class.json | 20 ++++++++ test_data/S2MSenderJSONObject.h | 11 +++++ test_data/S2MSenderJSONObject.m | 11 +++++ test_data/_S2MSenderJSONObject.h | 22 +++++++++ test_data/_S2MSenderJSONObject.m | 67 +++++++++++++++++++++++++++ test_data/schemeObj.p | 78 ++++++++++++++++++++++++++++++++ 7 files changed, 266 insertions(+), 16 deletions(-) create mode 100644 samples/test_class.json create mode 100644 test_data/S2MSenderJSONObject.h create mode 100644 test_data/S2MSenderJSONObject.m create mode 100644 test_data/_S2MSenderJSONObject.h create mode 100644 test_data/_S2MSenderJSONObject.m create mode 100644 test_data/schemeObj.p diff --git a/ObjectiveCCodeGenerator_test.py b/ObjectiveCCodeGenerator_test.py index aa3c906..6e1f463 100644 --- a/ObjectiveCCodeGenerator_test.py +++ b/ObjectiveCCodeGenerator_test.py @@ -1,40 +1,81 @@ from ObjectiveCCodeGenerator import * +from JSONScheme import * - +import pickle import unittest +import commands class TestObjectiveCCodeGenerator(unittest.TestCase): - def setUp(self): - print('In setUp()') - self.gen = ObjectiveCCodeGenerator() + def setUp(self): + print('In setUp()') + self.gen = ObjectiveCCodeGenerator() + - def tearDown(self): - print('In tearDown()') - del self.gen + def tearDown(self): + print('In tearDown()') + del self.gen - def test_getHeaderDescriptionString(self): - result = self.gen.getHeaderDescriptionString("MyClass") - expected_result = """// + def test_getHeaderDescriptionString(self): + result = self.gen.getHeaderDescriptionString("MyClass") + expected_result = """// // MyClass.h // // Created by MetaJSONParser. // Copyright (c) 2013 SinnerSchrader Mobile. All rights reserved. """ - self.assertMultiLineEqual(result, expected_result) + self.assertMultiLineEqual(result, expected_result) - def test_getSourceDescriptionString(self): - result = self.gen.getSourceDescriptionString("MyClass") - expected_result = """// + def test_getSourceDescriptionString(self): + result = self.gen.getSourceDescriptionString("MyClass") + expected_result = """// // MyClass.m // // Created by MetaJSONParser. // Copyright (c) 2013 SinnerSchrader Mobile. All rights reserved. """ - self.assertMultiLineEqual(result, expected_result) + self.assertMultiLineEqual(result, expected_result) + + def test_makeMachineHeader(self): + self.gen.dirPath = './src' + schemeObject = pickle.load(open('test_data/schemeObj.p', 'rb')) + self.gen.make(schemeObject) + command = "diff src/AbstractInterfaceFiles/_S2MSenderJSONObject.h test_data/_S2MSenderJSONObject.h" + status, output = commands.getstatusoutput(command) + print output + self.assertIs(status,0, "generated header file is different") + + def test_makeMachineSource(self): + self.gen.dirPath = './src' + schemeObject = pickle.load(open('test_data/schemeObj.p', 'rb')) + self.gen.make(schemeObject) + command = "diff src/AbstractInterfaceFiles/_S2MSenderJSONObject.m test_data/_S2MSenderJSONObject.m" + status, output = commands.getstatusoutput(command) + print output + self.assertIs(status,0, "generated source file is different") + + def test_makeHumanHeader(self): + self.gen.dirPath = './src' + schemeObject = pickle.load(open('test_data/schemeObj.p', 'rb')) + self.gen.make(schemeObject) + command = "diff src/S2MSenderJSONObject.h test_data/S2MSenderJSONObject.h" + status, output = commands.getstatusoutput(command) + print output + self.assertIs(status,0, "generated human header file is different") + + def test_makeHumanSource(self): + self.gen.dirPath = './src' + schemeObject = pickle.load(open('test_data/schemeObj.p', 'rb')) + self.gen.make(schemeObject) + command = "diff src/S2MSenderJSONObject.m test_data/S2MSenderJSONObject.m" + status, output = commands.getstatusoutput(command) + print output + self.assertIs(status,0, "generated human source file is different") + + if __name__ == '__main__': - unittest.main() + unittest.main() diff --git a/samples/test_class.json b/samples/test_class.json new file mode 100644 index 0000000..3b01e7f --- /dev/null +++ b/samples/test_class.json @@ -0,0 +1,20 @@ +[ + { + "name" : "sender", + "base-type" : "object", + "description" : "sender info.", + "property" : + [ + { + "name" : "senderName", + "base-type" : "string", + "required" : 1 + }, + { + "name" : "previewImageURL", + "base-type" : "string", + "required" : 1 + } + ] + } +] diff --git a/test_data/S2MSenderJSONObject.h b/test_data/S2MSenderJSONObject.h new file mode 100644 index 0000000..f11c44e --- /dev/null +++ b/test_data/S2MSenderJSONObject.h @@ -0,0 +1,11 @@ +// +// S2MSenderJSONObject.h +// +// Created by MetaJSONParser. +// Copyright (c) 2013 SinnerSchrader Mobile. All rights reserved. + +#import "_S2MSenderJSONObject.h" +@interface S2MSenderJSONObject : _S2MSenderJSONObject + +@end + diff --git a/test_data/S2MSenderJSONObject.m b/test_data/S2MSenderJSONObject.m new file mode 100644 index 0000000..4c78325 --- /dev/null +++ b/test_data/S2MSenderJSONObject.m @@ -0,0 +1,11 @@ +// +// S2MSenderJSONObject.m +// +// Created by MetaJSONParser. +// Copyright (c) 2013 SinnerSchrader Mobile. All rights reserved. + +#import "S2MSenderJSONObject.h" +@implementation S2MSenderJSONObject + +@end + diff --git a/test_data/_S2MSenderJSONObject.h b/test_data/_S2MSenderJSONObject.h new file mode 100644 index 0000000..9d28cc6 --- /dev/null +++ b/test_data/_S2MSenderJSONObject.h @@ -0,0 +1,22 @@ +// +// _S2MSenderJSONObject.h +// +// Created by MetaJSONParser. +// Copyright (c) 2013 SinnerSchrader Mobile. All rights reserved. + +#import <Foundation/Foundation.h> + +@class S2MSenderJSONObject; + +@interface _S2MSenderJSONObject : NSObject <NSCoding> + + +@property (nonatomic, strong) NSString *senderName; +@property (nonatomic, strong) NSString *previewImageURL; + ++ (S2MSenderJSONObject *)senderWithDictionary:(NSDictionary *)dic withError:(NSError **)error; +- (id)initWithDictionary:(NSDictionary *)dic withError:(NSError **)error; +- (NSDictionary *)propertyDictionary; + +@end + diff --git a/test_data/_S2MSenderJSONObject.m b/test_data/_S2MSenderJSONObject.m new file mode 100644 index 0000000..6f23fa2 --- /dev/null +++ b/test_data/_S2MSenderJSONObject.m @@ -0,0 +1,67 @@ +// +// _S2MSenderJSONObject.m +// +// Created by MetaJSONParser. +// Copyright (c) 2013 SinnerSchrader Mobile. All rights reserved. + +#import "APIParser.h" +#import "NSString+RegExValidation.h" +#import "S2MSenderJSONObject.h" + + +@implementation _S2MSenderJSONObject + +#pragma mark - factory + ++ (S2MSenderJSONObject *)senderWithDictionary:(NSDictionary *)dic withError:(NSError **)error { + return [[S2MSenderJSONObject alloc] initWithDictionary:dic withError:error]; +} + + +#pragma mark - initialize +- (id)initWithDictionary:(NSDictionary *)dic withError:(NSError **)error { + self = [super init]; + if (self) { + self.senderName = [APIParser stringFromResponseDictionary:dic forKey:@"senderName" acceptNumber:NO acceptNil:NO error:error]; + if (*error) { + return self; + } + self.previewImageURL = [APIParser stringFromResponseDictionary:dic forKey:@"previewImageURL" acceptNumber:NO acceptNil:NO error:error]; + if (*error) { + return self; + } + } + return self; +} + + +#pragma mark - getter + +#pragma mark - NSCoding +- (void)encodeWithCoder:(NSCoder*)coder { + [coder encodeObject:self.senderName forKey:@"senderName"]; + [coder encodeObject:self.previewImageURL forKey:@"previewImageURL"]; +} +- (id)initWithCoder:(NSCoder *)coder { + self = [super init]; + self.senderName = [coder decodeObjectForKey:@"senderName"]; + self.previewImageURL = [coder decodeObjectForKey:@"previewImageURL"]; + return self; +} + +#pragma mark - Object Info +- (NSDictionary *)propertyDictionary { + NSMutableDictionary *dic = [[NSMutableDictionary alloc] init]; + if (self.senderName) { + [dic setObject:self.senderName forKey:@"senderName"]; + } + if (self.previewImageURL) { + [dic setObject:self.previewImageURL forKey:@"previewImageURL"]; + } + return dic; +} +- (NSString *)description { + return [NSString stringWithFormat:@"%@",[self propertyDictionary]]; +} + +@end diff --git a/test_data/schemeObj.p b/test_data/schemeObj.p new file mode 100644 index 0000000..840aae4 --- /dev/null +++ b/test_data/schemeObj.p @@ -0,0 +1,78 @@ +(iJSONScheme +JSONScheme +p0 +(dp1 +S'type_description' +p2 +S'sender info.' +p3 +sS'type_name' +p4 +S'sender' +p5 +sS'projectPrefix' +p6 +S'S2M' +p7 +sS'base_type' +p8 +S'object' +p9 +sS'base_type_list' +p10 +(lp11 +sS'objectSuffix' +p12 +S'JSONObject' +p13 +sS'props' +p14 +(lp15 +(iJSONScheme +JSONScheme +p16 +(dp17 +S'domain' +p18 +(lp19 +S'ROOT' +p20 +ag5 +asS'required' +p21 +I1 +sg4 +S'senderName' +p22 +sg6 +g7 +sg8 +S'string' +p23 +sg10 +(lp24 +sg12 +g13 +sba(iJSONScheme +JSONScheme +p25 +(dp26 +g18 +(lp27 +g20 +ag5 +asg21 +I1 +sg4 +S'previewImageURL' +p28 +sg6 +g7 +sg8 +S'string' +p29 +sg10 +(lp30 +sg12 +g13 +sbasb. \ No newline at end of file From 589b6fcbd7e5ea6dfbcb2aba7547ed94884c8b4a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Franc=CC=A7ois=20Benaiteau?= <francois.benaiteau@gmail.com> Date: Tue, 22 Oct 2013 10:29:08 +0200 Subject: [PATCH 006/149] [WIP] ADD test for generated header Use second template for source.m --- ObjectiveCCodeGenerator.py | 218 +++++++++++++++++--------------- ObjectiveCCodeGenerator_test.py | 26 ++-- templates/header.h.mustache | 22 +++- templates/source.m.mustache | 6 + 4 files changed, 150 insertions(+), 122 deletions(-) create mode 100644 templates/source.m.mustache diff --git a/ObjectiveCCodeGenerator.py b/ObjectiveCCodeGenerator.py index b1b43d2..d101710 100755 --- a/ObjectiveCCodeGenerator.py +++ b/ObjectiveCCodeGenerator.py @@ -22,9 +22,10 @@ THE SOFTWARE. ''' -import datetime, time, os +import datetime, time, os, sys from pystache import Renderer - +# import pickle +# from cStringIO import StringIO class ObjectiveCCodeGenerator : @@ -42,7 +43,7 @@ def templateFilePath(self, filename) : return os.path.join(templatePath, filename) def getCommonDescriptionString(self, name) : - templateFile = open(self.templateFilePath("header.h.mustache"), "r") + templateFile = open(self.templateFilePath("source.m.mustache"), "r") today = datetime.date.fromtimestamp(time.time()) return Renderer().render(templateFile.read(), {"date": str(today.year), "filename": name}) @@ -67,17 +68,35 @@ def makeVarName(self,schemeObj) : returnName = self.projectPrefix.lower() + titleName #print returnName break - + return returnName - + + def processProperties(self, propObj) : + propertyHash = {"declaration": self.propertyDefinitionString(propObj)} + if propObj.type_description and len(propObj.type_description) : + propertyHash["comment"] = propObj.type_description + return propertyHash + + def generateHeaderFile(self, schemeObj) : + templateFile = open(self.templateFilePath("header.h.mustache"), "r") + today = datetime.date.fromtimestamp(time.time()) + props = [] + for prop in schemeObj.props: + props.append(self.processProperties(prop)) + + hashParams = {"date": str(today.year), "machineClassName": schemeObj.getMachineClassName(), "humanClassName": schemeObj.getClassName(), "variableName": self.makeVarName(schemeObj), "properties": props} + print "hashParams" + print hashParams + + return Renderer().render(templateFile.read(), hashParams) + + def make(self, schemeObj) : headerString = "" sourceString = "" - - hDescriptionString = self.getHeaderDescriptionString(schemeObj.getMachineClassName()) + mDescriptionString = self.getSourceDescriptionString(schemeObj.getMachineClassName()) - hIncludeHeaders = "#import <Foundation/Foundation.h>\n" mIncludeHeaders = "#import \"" + self.projectPrefix + "APIParser.h\"\n" mIncludeHeaders += "#import \"NSString+RegExValidation.h\"\n" mIncludeHeaders += "#import \"" + schemeObj.getClassName() +".h\"\n" @@ -88,17 +107,17 @@ def make(self, schemeObj) : propertyDefinition = "" methodDefinition = "" initMethodString = "" - + factoryMethodImpl = "\n+ (" + schemeObj.getClassName() +" *)" + self.makeVarName(schemeObj) + "WithDictionary:(NSDictionary *)dic withError:(NSError **)error {\n" factoryMethodImpl += " return [[" + schemeObj.getClassName() + " alloc] initWithDictionary:dic withError:error];\n" factoryMethodImpl += "}\n\n" - + descriptionMethodString = "- (NSString *)description {\n return [NSString stringWithFormat:@\"%@\",[self propertyDictionary]];\n}\n" propertyDictionaryString = "- (NSDictionary *)propertyDictionary {\n" - + encodeMethodString = "- (void)encodeWithCoder:(NSCoder*)coder {\n" decodeMethodString = "- (id)initWithCoder:(NSCoder *)coder {\n" - + """ check base type """ @@ -108,7 +127,7 @@ def make(self, schemeObj) : if schemeObj.rootBaseType() != "object" : print "error : ", schemeObj.base_type ," (" , schemeObj.type_name,") is not custom 'object' type.\n" return False - + if len(schemeObj.props) == 0 : # don't make source codes. print "NO Property : " + schemeObj.getMachineClassName() @@ -119,7 +138,7 @@ def make(self, schemeObj) : decodeMethodString += " self = [super initWithCoder:coder];\n" propertyDictionaryString += " NSDictionary *parentDic = [super propertyDictionary];\n" propertyDictionaryString += " NSMutableDictionary *dic = [[NSMutableDictionary alloc] initWithDictionary:parentDic];\n" - + #print "(make : !object) : find scheme : " + schemeObj.base_type + " from : " + schemeObj.type_name if schemeObj.hasScheme(schemeObj.base_type) : parentSchemeObj = schemeObj.getScheme(schemeObj.base_type) @@ -144,17 +163,13 @@ def make(self, schemeObj) : #property dictionary method methodDefinition += "- (NSDictionary *)propertyDictionary;\n" getterMethodImplementation = "" - - + + """ check properties """ otherClasses = {} for propObj in schemeObj.props : - if propObj.type_description and len(propObj.type_description) : - propertyDefinition += "// " + propObj.type_description + "\n" - propertyDefinition += self.propertyDefinitionString(propObj) - decodeMethodString += self.propertyDecodeString(propObj, 1) encodeMethodString += self.propertyEncodeString(propObj, 1) propertyDictionaryString += self.setPropertyDictionaryString(propObj, "dic", 1) @@ -167,7 +182,7 @@ def make(self, schemeObj) : initMethodString += self.getNaturalTypeValidationCode(propObj, tmpArrayName, 2, "self") tmpMutableArrayName = "tmp" + self.getTitledString(propObj.type_name) initMethodString += " NSMutableArray *" + tmpMutableArrayName + " = [[NSMutableArray alloc] initWithCapacity:" + tmpArrayName + ".count];\n" - + initMethodString += " for (NSUInteger loop = 0; loop < " + tmpArrayName + ".count; loop++) {\n" subTypeSchemeObj = propObj.getScheme(subTypeSchemeName) @@ -197,7 +212,7 @@ def make(self, schemeObj) : initMethodString += " }\n" initMethodString += " self." + self.makeVarName(propObj) + " = [NSArray arrayWithArray:" + tmpMutableArrayName + "];\n" - + elif propObj.isNaturalType() : initMethodString += self.getNaturalTypeGetterFromDictionaryCode(propObj, "", "self." + self.makeVarName(propObj), "dic", propObj.type_name, (propObj.required != True), 2, "self") initMethodString += self.getNaturalTypeValidationCode(propObj, "self." + self.makeVarName(propObj), 2, "self") @@ -205,7 +220,7 @@ def make(self, schemeObj) : pass else : continue - + elif propObj.rootBaseType() == "object" : if otherClasses.has_key(propObj.type_name) == False : otherClasses[propObj.type_name] = propObj @@ -238,7 +253,7 @@ def make(self, schemeObj) : print " undefined type : " + multiTypeScheme continue multiTypeSchemeObj = propObj.getScheme(multiTypeScheme) - + if multiTypeSchemeObj.rootBaseType() == "object" and otherClasses.has_key(multiTypeScheme) == False: otherClasses[multiTypeScheme] = multiTypeSchemeObj elif propObj.rootBaseType() == "any" : @@ -282,12 +297,7 @@ def make(self, schemeObj) : interfaceImplementation += "\n#pragma mark - getter\n" + getterMethodImplementation interfaceImplementation += "\n#pragma mark - NSCoding\n" + encodeMethodString + decodeMethodString interfaceImplementation += "\n#pragma mark - Object Info\n" + propertyDictionaryString + descriptionMethodString +"\n@end\n" - headerString += hDescriptionString + hIncludeHeaders + "\n" - if len(predefineCalsses) > 0 : - headerString += predefineCalsses + "\n" - - headerString += interfaceDefinition + "\n" sourceString += mDescriptionString + mIncludeHeaders + "\n\n" + interfaceImplementation if not os.path.exists(self.dirPath): @@ -300,11 +310,13 @@ def make(self, schemeObj) : os.makedirs(self.dirPath + "/AbstractInterfaceFiles/") #machine file - #print headerString + machine_header_file = self.generateHeaderFile(schemeObj) + # print machine_header_file try: - headerFile = open(self.dirPath + "/AbstractInterfaceFiles/" + schemeObj.getMachineClassName() + ".h", "w") - print "create " + self.dirPath + "/AbstractInterfaceFiles/" + schemeObj.getMachineClassName() + ".h" + " file..." - headerFile.write(headerString) # Write a string to a file + headerFilename = self.dirPath + "/AbstractInterfaceFiles/" + schemeObj.getMachineClassName() + ".h" + headerFile = open(headerFilename, "w") + print "create " + headerFilename + " file..." + headerFile.write(machine_header_file) # Write a string to a file finally : headerFile.close() @@ -316,8 +328,8 @@ def make(self, schemeObj) : finally : sourceFile.close() - - #customizable file + + #customizable file customizableInterface = self.getHeaderDescriptionString(schemeObj.getClassName()) customizableInterface += "#import \"" + schemeObj.getMachineClassName() +".h\"\n" customizableInterface += "@interface " + schemeObj.getClassName() + " : " + schemeObj.getMachineClassName() + "\n\n@end\n\n" @@ -325,7 +337,7 @@ def make(self, schemeObj) : customizableImplementation = self.getSourceDescriptionString(schemeObj.getClassName()) customizableImplementation += "#import \"" + schemeObj.getClassName() +".h\"\n" customizableImplementation += "@implementation " + schemeObj.getClassName() + "\n\n@end\n\n" - + #print headerString customizableInterfaceFileName = self.dirPath + "/" + schemeObj.getClassName() + ".h" @@ -355,10 +367,10 @@ def make(self, schemeObj) : """ def getterMethodDefinitionStringInDictionary(self, returnTypeName, typeName, typeTitle, postFix) : return "- (" + returnTypeName + ")" + typeName + "As" + typeTitle + postFix - + def getterMethodDefinitionStringInArray(self, returnTypeName, typeName, arrayName, postFix) : return "- (" + returnTypeName + ")" + typeName + "In"+ arrayName + postFix - + def getTitledString(self, inputString) : titledString = inputString.upper() titledString = titledString[:1] + inputString[1:] @@ -389,7 +401,7 @@ def getNaturalTypeClassString(self,typeName) : def getterMethodDefinitionString(self, schemeObj) : resultStringList= [] - + titleName = schemeObj.type_name.upper() titleName = titleName[:1] + schemeObj.type_name[1:] postFix = ":(NSError **)error;\n" @@ -401,12 +413,12 @@ def getterMethodDefinitionString(self, schemeObj) : baseSubTypeSchemeObj = schemeObj.getScheme(schemeName) baseSubTypeTitle = baseSubTypeSchemeObj.type_name.upper() baseSubTypeTitle = baseSubTypeTitle[:1] + baseSubTypeSchemeObj.type_name[1:] - + if baseSubTypeSchemeObj.isNaturalType() == False : resultStringList.append(self.getterMethodDefinitionStringInDictionary(baseSubTypeSchemeObj.getClassName() + " *", schemeObj.type_name, baseSubTypeSchemeObj.getClassName(), postFix)) else : resultStringList.append(self.getterMethodDefinitionStringInDictionary(self.getNaturalTypeClassString(baseSubTypeSchemeObj.rootBaseType()), schemeObj.type_name, baseSubTypeTitle, postFix)) - + elif schemeName == "any" : resultStringList.append(self.getterMethodDefinitionStringInDictionary("id", schemeObj.type_name, "Object", postFix)) else : @@ -418,12 +430,12 @@ def getterMethodDefinitionString(self, schemeObj) : #print "(getterMethodDefinitionString : array) : find scheme : " + schemeName + " from : " + schemeObj.type_name if schemeObj.hasScheme(schemeName) : baseSubTypeSchemeObj = schemeObj.getScheme(schemeName) - + if baseSubTypeSchemeObj.isNaturalType() == False : resultStringList.append(self.getterMethodDefinitionStringInArray(baseSubTypeSchemeObj.getClassName() + " *", baseSubTypeSchemeObj.type_name, titleName, postFix)) else : resultStringList.append(self.getterMethodDefinitionStringInArray(self.getNaturalTypeClassString(baseSubTypeSchemeObj.rootBaseType()), baseSubTypeSchemeObj.type_name, titleName, postFix)) - + elif schemeName == "any" : resultStringList.append(self.getterMethodDefinitionStringInArray("id", "object", titleName, postFix)) else : @@ -441,7 +453,7 @@ def getterMethodDefinitionString(self, schemeObj) : resultStringList = [] return resultStringList - + def getterMethodString(self, schemeObj) : resultString = "" postFix = ":(NSError **)error {\n" @@ -449,7 +461,7 @@ def getterMethodString(self, schemeObj) : titleName = titleName[:1] + schemeObj.type_name[1:] tmpVarName = "tmp" + self.getTitledString(schemeObj.type_name) selfDicName = "self." + self.makeVarName(schemeObj) - + if schemeObj.rootBaseType() == "multi" : for schemeName in schemeObj.getBaseTypes() : #print "(getterMethodString : multi) : find scheme : " + schemeName + " from : " + schemeObj.type_name @@ -457,7 +469,7 @@ def getterMethodString(self, schemeObj) : baseSubTypeSchemeObj = schemeObj.getScheme(schemeName) baseSubTypeTitle = baseSubTypeSchemeObj.type_name.upper() baseSubTypeTitle = baseSubTypeTitle[:1] + baseSubTypeSchemeObj.type_name[1:] - + if baseSubTypeSchemeObj.isNaturalType() == False : tmpDicName = "tmp" + self.getTitledString(schemeObj.type_name) + "Dic" resultString += self.getterMethodDefinitionStringInDictionary(baseSubTypeSchemeObj.getClassName() + " *", schemeObj.type_name, baseSubTypeSchemeObj.getClassName(), postFix) @@ -472,7 +484,7 @@ def getterMethodString(self, schemeObj) : resultString += self.getHandleErrorCode( tmpVarName +" == nil", "", "nil", 1) resultString += self.getNaturalTypeValidationCode(baseSubTypeSchemeObj, tmpVarName, 1, "nil") resultString += " return " + tmpVarName + ";\n}\n" - + elif schemeName == "any" : resultString += self.getterMethodDefinitionStringInDictionary("id", schemeObj.type_name, "Object", postFix) resultString += self.getUndefinedTypeGetterFromDictionaryCode("id ", tmpVarName, selfDicName, schemeObj.type_name, (schemeObj.required != True), 1, "nil") @@ -481,14 +493,14 @@ def getterMethodString(self, schemeObj) : resultString += self.getterMethodDefinitionStringInDictionary(self.getNaturalTypeClassString(schemeName), schemeObj.type_name, self.getNaturalTypeClassTitleString(schemeName),postFix) resultString += self.getNaturalTypeGetterFromDictionaryCode(schemeName, self.getNaturalTypeClassString(schemeName), tmpVarName, selfDicName, schemeObj.type_name, (schemeObj.required != True), 1, "nil") resultString += " return " + tmpVarName + ";\n}\n" - + elif schemeObj.rootBaseType() == "array" : postFix = "AtIndex:(NSUInteger)index withError:(NSError **)error {\n"; for schemeName in schemeObj.getSubType() : if schemeObj.hasScheme(schemeName) : #print "(getterMethodString : array) : find scheme : " + schemeName + " from : " + schemeObj.type_name baseSubTypeSchemeObj = schemeObj.getScheme(schemeName) - + if baseSubTypeSchemeObj.isNaturalType() == False : tmpDicName = "tmp" + self.getTitledString(schemeObj.type_name) + "Dic" resultString += self.getterMethodDefinitionStringInArray(baseSubTypeSchemeObj.getClassName() + " *", baseSubTypeSchemeObj.type_name, titleName, postFix) @@ -504,7 +516,7 @@ def getterMethodString(self, schemeObj) : resultString += self.getNaturalTypeValidationCode(baseSubTypeSchemeObj, tmpVarName, 1, "nil") resultString += " return " + tmpVarName + ";\n}\n" - + elif schemeName == "any" : resultString += self.getterMethodDefinitionStringInArray("id", "object", titleName, postFix) resultString += self.getGetterFromArrayCode("id ", tmpVarName, selfDicName, "index", (schemeObj.required != True), 1, "nil") @@ -513,22 +525,22 @@ def getterMethodString(self, schemeObj) : resultString += self.getterMethodDefinitionStringInArray(self.getNaturalTypeClassString(schemeName), schemeName, titleName, postFix) resultString += self.getNaturalTypeGetterFromArrayCode(schemeName, self.getNaturalTypeClassString(schemeName), tmpVarName, selfDicName, "index", (schemeObj.required != True), 1, "nil") resultString += " return " + tmpVarName + ";\n}\n" - + elif schemeObj.base_type == "any" : resultString += self.getterMethodDefinitionStringInDictionary("id", schemeObj.type_name, "Object", postFix) resultString += self.getUndefinedTypeGetterFromDictionaryCode("id ", tmpVarName, selfDicName, schemeObj.type_name, (schemeObj.required != True), 1, "nil") resultString += " return " + tmpVarName + ";\n}\n" - + elif schemeObj.isNaturalType() : print "Error : " + schemeObj.type_name + " is Natural type. don't need to implement getter method.\n" return "#error " + schemeObj.type_name + " is Natural type. don't need to implement getter method.\n" - + else : print "Error : " + schemeObj.type_name + " is Custom Object type. don't need to implement getter method.\n" return "#error " + schemeObj.type_name + " is Custom Object type. don't need to implement getter method.\n" - + return resultString - + def getIndentString(self, indentDepth) : resultString = "" indentString = " " @@ -536,7 +548,7 @@ def getIndentString(self, indentDepth) : resultString += indentString return resultString - + def getHandleErrorCode(self, statement, errorString, returnVarName, indentDepth) : resultString = "" firstIndent = self.getIndentString(indentDepth) @@ -555,13 +567,13 @@ def getStringValidationCode(self, schemeObj, varName, indentDepth, returnVarName errorString = "NSDictionary *userInfo = [NSDictionary dictionaryWithObjectsAndKeys:@\"" + self.makeVarName(schemeObj) + "\", @\"propertyName\", @\"" + schemeObj.type_name + "\", @\"key\", @\"validation error\", @\"reason\", NSStringFromClass([self class]), @\"objectClass\",nil];\n" errorString += secondIndent + "*error = [NSError errorWithDomain:k" + self.projectPrefix + "ErrorDomain_parser code:k" + self.projectPrefix + "ErrorDomain_parser_valueIsNotValid userInfo:userInfo];\n" errorString += secondIndent + "NSLog(@\"%@\", *error);\n" - + maxResult = schemeObj.getMaxLength() - + if maxResult[0] : statementString = str(varName) + ".length > " + str(maxResult[1]) resultString += self.getHandleErrorCode(statementString, errorString, returnVarName, indentDepth) - + minResult = schemeObj.getMinLength() if minResult[0] : statementString = varName + ".length < " + str(minResult[1]) @@ -571,7 +583,7 @@ def getStringValidationCode(self, schemeObj, varName, indentDepth, returnVarName if regExResult[0] : statementString = varName + " && ["+varName+" matchesRegExString:@\"" +str(regExResult[1])+ "\"] == NO" resultString += self.getHandleErrorCode(statementString, errorString, returnVarName, indentDepth) - + return resultString def getDateValidationCode(self, schemeObj, varName, indentDepth, returnVarName) : @@ -582,12 +594,12 @@ def getDateValidationCode(self, schemeObj, varName, indentDepth, returnVarName) errorString = "NSDictionary *userInfo = [NSDictionary dictionaryWithObjectsAndKeys:@\"" + self.makeVarName(schemeObj) + "\", @\"propertyName\", @\"" + schemeObj.type_name + "\", @\"key\", @\"validation error\", @\"reason\", NSStringFromClass([self class]), @\"objectClass\",nil];\n" errorString += secondIndent + "*error = [NSError errorWithDomain:k" + self.projectPrefix + "ErrorDomain_parser code:k" + self.projectPrefix + "ErrorDomain_parser_valueIsNotValid userInfo:userInfo];\n" errorString += secondIndent + "NSLog(@\"%@\", *error);\n" - + maxResult = schemeObj.getMaxValue() if maxResult[0] : statementString = "["+varName+" timeIntervalSince1970] > " + str(maxResult[1]) resultString += self.getHandleErrorCode(statementString, errorString, returnVarName, indentDepth) - + minResult = schemeObj.getMinValue() if minResult[0] : statementString = "["+varName+" timeIntervalSince1970] < " + str(minResult[1]) @@ -603,12 +615,12 @@ def getDataValidationCode(self, schemeObj, varName, indentDepth, returnVarName) errorString = "NSDictionary *userInfo = [NSDictionary dictionaryWithObjectsAndKeys:@\"" + self.makeVarName(schemeObj) + "\", @\"propertyName\", @\"" + schemeObj.type_name + "\", @\"key\", @\"validation error\", @\"reason\", NSStringFromClass([self class]), @\"objectClass\",nil];\n" errorString += secondIndent + "*error = [NSError errorWithDomain:k" + self.projectPrefix + "ErrorDomain_parser code:k" + self.projectPrefix + "ErrorDomain_parser_valueIsNotValid userInfo:userInfo];\n" errorString += secondIndent + "NSLog(@\"%@\", *error);\n" - + maxResult = schemeObj.getMaxLength() if maxResult[0] : statementString = varName+".length > " + str(maxResult[1]) resultString += self.getHandleErrorCode(statementString, errorString, returnVarName, indentDepth) - + minResult = schemeObj.getMinLength() if minResult[0] : statementString = varName+".length < " + str(minResult[1]) @@ -624,18 +636,18 @@ def getNumberValidationCode(self, schemeObj, varName, indentDepth, returnVarName errorString = "NSDictionary *userInfo = [NSDictionary dictionaryWithObjectsAndKeys:@\"" + self.makeVarName(schemeObj) + "\", @\"propertyName\", @\"" + schemeObj.type_name + "\", @\"key\", @\"validation error\", @\"reason\", NSStringFromClass([self class]), @\"objectClass\",nil];\n" errorString += secondIndent + "*error = [NSError errorWithDomain:k" + self.projectPrefix + "ErrorDomain_parser code:k" + self.projectPrefix + "ErrorDomain_parser_valueIsNotValid userInfo:userInfo];\n" errorString += secondIndent + "NSLog(@\"%@\", *error);\n" - + maxResult = schemeObj.getMaxValue() if maxResult[0] : statementString = "["+varName+" floatValue] > " + str(maxResult[1]) resultString += self.getHandleErrorCode(statementString, errorString, returnVarName, indentDepth) - + minResult = schemeObj.getMinValue() if minResult[0] : statementString = "["+varName+" floatValue] < " + str(minResult[1]) resultString += self.getHandleErrorCode(statementString, errorString, returnVarName, indentDepth) return resultString - + def getArrayValidationCode(self, schemeObj, varName, indentDepth, returnVarName) : resultString = "" statementString = "" @@ -644,12 +656,12 @@ def getArrayValidationCode(self, schemeObj, varName, indentDepth, returnVarName) errorString = "NSDictionary *userInfo = [NSDictionary dictionaryWithObjectsAndKeys:@\"" + self.makeVarName(schemeObj) + "\", @\"propertyName\", @\"" + schemeObj.type_name + "\", @\"key\", @\"validation error\", @\"reason\", NSStringFromClass([self class]), @\"objectClass\",nil];\n" errorString += secondIndent + "*error = [NSError errorWithDomain:k" + self.projectPrefix + "ErrorDomain_parser code:k" + self.projectPrefix + "ErrorDomain_parser_valueIsNotValid userInfo:userInfo];\n" errorString += secondIndent + "NSLog(@\"%@\", *error);\n" - + maxResult = schemeObj.getMaxCount() if maxResult[0] : statementString = varName+".count > " + str(maxResult[1]) resultString += self.getHandleErrorCode(statementString, errorString, returnVarName, indentDepth) - + minResult = schemeObj.getMinCount() if minResult[0] : statementString = varName+".count < " + str(minResult[1]) @@ -669,7 +681,7 @@ def getNaturalTypeValidationCode(self, schemeObj, varName, indentDepth, returnVa return self.getDateValidationCode(schemeObj, varName, indentDepth, returnVarName) elif schemeObj.rootBaseType() == "data" : return self.getDataValidationCode(schemeObj, varName, indentDepth, returnVarName) - + return "" @@ -715,21 +727,21 @@ def getUndefinedTypeGetterFromDictionaryCode(self, className, varName, dicName, resultString = "" firstIndent = self.getIndentString(indentDepth) secondIndent = self.getIndentString(indentDepth+1) - + resultString += firstIndent if className and len(className) : resultString += className resultString += varName + " = [" + self.projectPrefix + "APIParser objectFromResponseDictionary:" + dicName + " forKey:@\"" + keyName + "\" acceptNil:" - + if allowNull : resultString += "YES" else : resultString += "NO" resultString += " error:error];\n" resultString += self.getHandleErrorCode("*error", "", returnVarName, indentDepth) - + return resultString - + def getNaturalTypeGetterFromArrayCode(self, schemeObj, className, varName, arrayName, indexVar, allowNull, indentDepth, returnVarName) : schemeBaseType = "" if type(schemeObj) == str or type(schemeObj) == unicode: @@ -743,7 +755,7 @@ def getNaturalTypeGetterFromArrayCode(self, schemeObj, className, varName, array resultString = "" firstIndent = self.getIndentString(indentDepth) secondIndent = self.getIndentString(indentDepth+1) - + if schemeBaseType == "array" : resultString += firstIndent + className + varName + " = [" + self.projectPrefix + "APIParser arrayFromResponseArray:" + arrayName + " atIndex:" + indexVar + " acceptNil:" elif schemeBaseType == "string" : @@ -759,21 +771,21 @@ def getNaturalTypeGetterFromArrayCode(self, schemeObj, className, varName, array else : print "Error (getNaturalTypeGetterFromArrayCode): undfined scheme natural base type " + schemeObj return "#error - undfined scheme natural base type\n" - + if allowNull : resultString += "YES" else : resultString += "NO" resultString += " error:error];\n" resultString += self.getHandleErrorCode("*error", "", returnVarName, indentDepth) - + return resultString - + def getDictionaryGetterFromDictionaryCode(self, varName, dicName, keyName, allowNull, indentDepth, returnVarName) : resultString = "" firstIndent = self.getIndentString(indentDepth) secondIndent = self.getIndentString(indentDepth+1) - + resultString += firstIndent + "NSDictionary *"+ varName + " = [" + self.projectPrefix + "APIParser dictionaryFromResponseDictionary:" + dicName + " forKey:@\"" + keyName + "\" acceptNil:" if allowNull : resultString += "YES" @@ -787,7 +799,7 @@ def getDictionaryGetterFromArrayCode(self, varName, arrayName, indexVar, allowNu resultString = "" firstIndent = self.getIndentString(indentDepth) secondIndent = self.getIndentString(indentDepth+1) - + resultString += firstIndent + "NSDictionary *"+ varName + " = [" + self.projectPrefix + "APIParser dictionaryFromResponseArray:" + arrayName + " atIndex:" + indexVar + " acceptNil:" if allowNull : resultString += "YES" @@ -795,7 +807,7 @@ def getDictionaryGetterFromArrayCode(self, varName, arrayName, indexVar, allowNu resultString += "NO" resultString += " error:error];\n" resultString += self.getHandleErrorCode("*error", "", returnVarName, indentDepth) - + return resultString def getObjectAllocatorFromDictionaryCode(self, defineClass, className, varName, dicName, allowNull, indentDepth, returnVarName) : @@ -811,24 +823,24 @@ def getObjectAllocatorFromDictionaryCode(self, defineClass, className, varName, resultString += firstIndent + "}\n" return resultString - + def getDictionaryAllocatorCode(self, defineClass, varName, objectName, keyNmae, indentDepth, returnVarName) : resultString = "" firstIndent = self.getIndentString(indentDepth) secondIndent = self.getIndentString(indentDepth+1) - + resultString += firstIndent if defineClass : resultString += "NSDictionary *" resultString += varName + " = [NSDictionary dictionaryWithObjectsAndKeys:"+ objectName +", @\"" + keyNmae + "\", nil];\n" - + return resultString def getGetterFromDictionaryCode(self, className, varName, dicName, keyName, allowNull, indentDepth, returnVarName) : resultString = "" firstIndent = self.getIndentString(indentDepth) secondIndent = self.getIndentString(indentDepth+1) - + resultString += firstIndent + className + varName + " = [" + self.projectPrefix + "APIParser objectFromResponseDictionary:" + dicName + " forKey:@\"" + keyName + "\" acceptNil:" if allowNull : resultString += "YES" @@ -842,7 +854,7 @@ def getGetterFromDictionaryCode(self, className, varName, dicName, keyName, allo def getGetterFromArrayCode(self, className, varName, arrayName, indexVar, allowNull, indentDepth, returnVarName) : resultString = "" firstIndent = self.getIndentString(indentDepth) - secondIndent = self.getIndentString(indentDepth+1) + secondIndent = self.getIndentString(indentDepth+1) resultString += firstIndent + className + varName + " = [" + self.projectPrefix + "APIParser objectFromResponseArray:" + arrayName + " atIndex:" + indexVar resultString += " acceptNil:" if allowNull : @@ -852,31 +864,31 @@ def getGetterFromArrayCode(self, className, varName, arrayName, indexVar, allowN resultString += " error:error];\n" resultString += self.getHandleErrorCode("*error", "", returnVarName, indentDepth) return resultString - + def propertyDefinitionString(self, schemeObj) : resultString = "" - + if schemeObj.isNaturalType() : if schemeObj.rootBaseType() == "boolean" : - return "@property (nonatomic, assign) BOOL " + self.makeVarName(schemeObj) + ";\n" + return "@property (nonatomic, assign) BOOL " + self.makeVarName(schemeObj) + ";" elif schemeObj.rootBaseType() == "string" : - return "@property (nonatomic, strong) NSString *" + self.makeVarName(schemeObj) + ";\n" + return "@property (nonatomic, strong) NSString *" + self.makeVarName(schemeObj) + ";" elif schemeObj.rootBaseType() == "date" : - return "@property (nonatomic, strong) NSDate *" + self.makeVarName(schemeObj) + ";\n" + return "@property (nonatomic, strong) NSDate *" + self.makeVarName(schemeObj) + ";" elif schemeObj.rootBaseType() == "data" : - return "@property (nonatomic, strong) NSData *" + self.makeVarName(schemeObj) + ";\n" + return "@property (nonatomic, strong) NSData *" + self.makeVarName(schemeObj) + ";" elif schemeObj.rootBaseType() == "number" : - return "@property (nonatomic, strong) NSNumber *" + self.makeVarName(schemeObj) + ";\n" + return "@property (nonatomic, strong) NSNumber *" + self.makeVarName(schemeObj) + ";" elif schemeObj.rootBaseType() == "array" : - return "@property (nonatomic, strong) NSArray *" + self.makeVarName(schemeObj) + ";\n" + return "@property (nonatomic, strong) NSArray *" + self.makeVarName(schemeObj) + ";" else : - return "@property (nonatomic, strong) id " + self.makeVarName(schemeObj) + ";\n" + return "@property (nonatomic, strong) id " + self.makeVarName(schemeObj) + ";" elif schemeObj.rootBaseType() == "multi" or schemeObj.rootBaseType() == "any" : - return "@property (nonatomic, strong) NSDictionary *" + self.makeVarName(schemeObj) + ";\n" - - - return "@property (nonatomic, strong) "+ schemeObj.getClassName() +" *" + self.makeVarName(schemeObj) + ";\n" + return "@property (nonatomic, strong) NSDictionary *" + self.makeVarName(schemeObj) + ";" + + + return "@property (nonatomic, strong) "+ schemeObj.getClassName() +" *" + self.makeVarName(schemeObj) + ";" def propertyDecodeString(self, schemeObj, indentDepth) : firstIndent = self.getIndentString(indentDepth) @@ -931,7 +943,7 @@ def setPropertyDictionaryString(self, schemeObj, dicName, indentDepth) : class TemplateCodeGenerator : - + projectPrefix = "" dirPath = "" templatePath = "./templates" @@ -1006,9 +1018,9 @@ def writeTemplates(self) : self.writeNSStringCategory() self.dirPath = baseDirPath + "/Utilities/APIParser" self.writeAPIParser() - - - + + + diff --git a/ObjectiveCCodeGenerator_test.py b/ObjectiveCCodeGenerator_test.py index 6e1f463..e76be8d 100644 --- a/ObjectiveCCodeGenerator_test.py +++ b/ObjectiveCCodeGenerator_test.py @@ -9,24 +9,13 @@ class TestObjectiveCCodeGenerator(unittest.TestCase): def setUp(self): print('In setUp()') self.gen = ObjectiveCCodeGenerator() - + self.gen.dirPath = './src' + self.maxDiff = None def tearDown(self): print('In tearDown()') del self.gen - def test_getHeaderDescriptionString(self): - result = self.gen.getHeaderDescriptionString("MyClass") - expected_result = """// -// MyClass.h -// -// Created by MetaJSONParser. -// Copyright (c) 2013 SinnerSchrader Mobile. All rights reserved. - -""" - self.assertMultiLineEqual(result, expected_result) - - def test_getSourceDescriptionString(self): result = self.gen.getSourceDescriptionString("MyClass") expected_result = """// @@ -39,7 +28,6 @@ def test_getSourceDescriptionString(self): self.assertMultiLineEqual(result, expected_result) def test_makeMachineHeader(self): - self.gen.dirPath = './src' schemeObject = pickle.load(open('test_data/schemeObj.p', 'rb')) self.gen.make(schemeObject) command = "diff src/AbstractInterfaceFiles/_S2MSenderJSONObject.h test_data/_S2MSenderJSONObject.h" @@ -48,7 +36,6 @@ def test_makeMachineHeader(self): self.assertIs(status,0, "generated header file is different") def test_makeMachineSource(self): - self.gen.dirPath = './src' schemeObject = pickle.load(open('test_data/schemeObj.p', 'rb')) self.gen.make(schemeObject) command = "diff src/AbstractInterfaceFiles/_S2MSenderJSONObject.m test_data/_S2MSenderJSONObject.m" @@ -57,7 +44,6 @@ def test_makeMachineSource(self): self.assertIs(status,0, "generated source file is different") def test_makeHumanHeader(self): - self.gen.dirPath = './src' schemeObject = pickle.load(open('test_data/schemeObj.p', 'rb')) self.gen.make(schemeObject) command = "diff src/S2MSenderJSONObject.h test_data/S2MSenderJSONObject.h" @@ -66,7 +52,6 @@ def test_makeHumanHeader(self): self.assertIs(status,0, "generated human header file is different") def test_makeHumanSource(self): - self.gen.dirPath = './src' schemeObject = pickle.load(open('test_data/schemeObj.p', 'rb')) self.gen.make(schemeObject) command = "diff src/S2MSenderJSONObject.m test_data/S2MSenderJSONObject.m" @@ -74,7 +59,12 @@ def test_makeHumanSource(self): print output self.assertIs(status,0, "generated human source file is different") - + def test_generateHeaderFile(self): + schemeObject = pickle.load(open('test_data/schemeObj.p', 'rb')) + with open("test_data/_S2MSenderJSONObject.h", 'r') as content_file: + expected_result = content_file.read() + result = self.gen.generateHeaderFile(schemeObject) + self.assertMultiLineEqual(result, expected_result) if __name__ == '__main__': unittest.main() diff --git a/templates/header.h.mustache b/templates/header.h.mustache index 427a9ac..e26f92c 100644 --- a/templates/header.h.mustache +++ b/templates/header.h.mustache @@ -1,6 +1,26 @@ // -// {{filename}} +// {{machineClassName}}.h // // Created by MetaJSONParser. // Copyright (c) {{date}} SinnerSchrader Mobile. All rights reserved. +#import <Foundation/Foundation.h> + +@class {{humanClassName}}; + +@interface {{machineClassName}} : NSObject <NSCoding> + + +{{#properties}} +{{#comment}} +//{{comment}} +{{/comment }} +{{declaration}} +{{/properties}} + ++ ({{humanClassName}} *){{variableName}}WithDictionary:(NSDictionary *)dic withError:(NSError **)error; +- (id)initWithDictionary:(NSDictionary *)dic withError:(NSError **)error; +- (NSDictionary *)propertyDictionary; + +@end + diff --git a/templates/source.m.mustache b/templates/source.m.mustache new file mode 100644 index 0000000..427a9ac --- /dev/null +++ b/templates/source.m.mustache @@ -0,0 +1,6 @@ +// +// {{filename}} +// +// Created by MetaJSONParser. +// Copyright (c) {{date}} SinnerSchrader Mobile. All rights reserved. + From 63f90de17c837db5bdf87071b910b11500d9bae0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Franc=CC=A7ois=20Benaiteau?= <francois.benaiteau@gmail.com> Date: Fri, 1 Nov 2013 09:08:17 +0100 Subject: [PATCH 007/149] Extract functions to write files out of the make function --- ObjectiveCCodeGenerator.py | 82 ++++++++++++++++++-------------------- 1 file changed, 38 insertions(+), 44 deletions(-) diff --git a/ObjectiveCCodeGenerator.py b/ObjectiveCCodeGenerator.py index d101710..d812488 100755 --- a/ObjectiveCCodeGenerator.py +++ b/ObjectiveCCodeGenerator.py @@ -300,34 +300,12 @@ def make(self, schemeObj) : sourceString += mDescriptionString + mIncludeHeaders + "\n\n" + interfaceImplementation - if not os.path.exists(self.dirPath): - os.makedirs(self.dirPath) - - if self.dirPath.endswith("/") : - self.dirPath = self.dirPath[:-1] - - if not os.path.exists(self.dirPath + "/AbstractInterfaceFiles/"): - os.makedirs(self.dirPath + "/AbstractInterfaceFiles/") - - #machine file - machine_header_file = self.generateHeaderFile(schemeObj) - # print machine_header_file - try: - headerFilename = self.dirPath + "/AbstractInterfaceFiles/" + schemeObj.getMachineClassName() + ".h" - headerFile = open(headerFilename, "w") - print "create " + headerFilename + " file..." - headerFile.write(machine_header_file) # Write a string to a file - finally : - headerFile.close() + ### Creating output ########## - #print sourceString - try: - sourceFile = open(self.dirPath + "/AbstractInterfaceFiles/" + schemeObj.getMachineClassName() + ".m", "w") - print "create " + self.dirPath + "/AbstractInterfaceFiles/" + schemeObj.getMachineClassName() + ".m" + " file..." - sourceFile.write(sourceString) # Write a string to a file - finally : - sourceFile.close() + # machine files + self.write_abstract_file(schemeObj.getMachineClassName() + ".h", self.generateHeaderFile(schemeObj)) + self.write_abstract_file(schemeObj.getMachineClassName() + ".m", sourceString) #customizable file customizableInterface = self.getHeaderDescriptionString(schemeObj.getClassName()) @@ -339,27 +317,43 @@ def make(self, schemeObj) : customizableImplementation += "@implementation " + schemeObj.getClassName() + "\n\n@end\n\n" - #print headerString - customizableInterfaceFileName = self.dirPath + "/" + schemeObj.getClassName() + ".h" - if os.path.isfile(customizableInterfaceFileName) is False : - print "create " + customizableInterfaceFileName + " file..." - try: - headerFile = open(customizableInterfaceFileName, "w") - headerFile.write(customizableInterface) # Write a string to a file - finally : - headerFile.close() + # human files + self.write_human_file(schemeObj.getClassName() + ".h", customizableInterface) + self.write_human_file(schemeObj.getClassName() + ".m", customizableImplementation) + + return True + + def write_abstract_file(self, filename, content) : + folder = "/AbstractInterfaceFiles/" + if not os.path.exists(self.dirPath + folder): + os.makedirs(self.dirPath + folder) + + filepath = self.dirPath + folder + filename + self.write_file(filepath, content) + + def write_human_file(self, filename, content) : + folder = "/" + if not os.path.exists(self.dirPath + folder): + os.makedirs(self.dirPath + folder) + + filepath = self.dirPath + folder + filename + self.write_file(filepath, content) + + def write_file(self, filename, content) : + if not os.path.exists(self.dirPath): + os.makedirs(self.dirPath) + + if self.dirPath.endswith("/") : + self.dirPath = self.dirPath[:-1] - #print sourceString - customizableImplementationFileName = self.dirPath + "/" + schemeObj.getClassName() + ".m" - if os.path.isfile(customizableImplementationFileName) is False : - print "create " + customizableImplementationFileName + " file..." + + if os.path.isfile(filename) is False : + print "create " + filename + " file..." try: - sourceFile = open(customizableImplementationFileName, "w") - sourceFile.write(customizableImplementation) # Write a string to a file + writefile = open(filename, "w") + writefile.write(content) # Write a string to a file finally : - sourceFile.close() - - return True + writefile.close() """ From aea218afb9c3a382ca9344a61e0f007f544508f4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Franc=CC=A7ois=20Benaiteau?= <francois.benaiteau@gmail.com> Date: Fri, 1 Nov 2013 09:29:56 +0100 Subject: [PATCH 008/149] Refactor content of human header file --- ObjectiveCCodeGenerator.py | 19 ++++++++++++------- templates/_header.h.mustache | 26 ++++++++++++++++++++++++++ templates/header.h.mustache | 22 +++------------------- test_data/S2MSenderJSONObject.h | 1 - 4 files changed, 41 insertions(+), 27 deletions(-) create mode 100644 templates/_header.h.mustache diff --git a/ObjectiveCCodeGenerator.py b/ObjectiveCCodeGenerator.py index d812488..226dc60 100755 --- a/ObjectiveCCodeGenerator.py +++ b/ObjectiveCCodeGenerator.py @@ -78,7 +78,7 @@ def processProperties(self, propObj) : return propertyHash def generateHeaderFile(self, schemeObj) : - templateFile = open(self.templateFilePath("header.h.mustache"), "r") + templateFile = open(self.templateFilePath("_header.h.mustache"), "r") today = datetime.date.fromtimestamp(time.time()) props = [] for prop in schemeObj.props: @@ -90,6 +90,16 @@ def generateHeaderFile(self, schemeObj) : return Renderer().render(templateFile.read(), hashParams) + def generateHumanHeaderFile(self, schemeObj) : + templateFile = open(self.templateFilePath("header.h.mustache"), "r") + today = datetime.date.fromtimestamp(time.time()) + + hashParams = {"date": str(today.year), "machineClassName": schemeObj.getMachineClassName(), "humanClassName": schemeObj.getClassName()} + + print hashParams + + return Renderer().render(templateFile.read(), hashParams) + def make(self, schemeObj) : headerString = "" @@ -302,23 +312,18 @@ def make(self, schemeObj) : ### Creating output ########## - # machine files self.write_abstract_file(schemeObj.getMachineClassName() + ".h", self.generateHeaderFile(schemeObj)) self.write_abstract_file(schemeObj.getMachineClassName() + ".m", sourceString) #customizable file - customizableInterface = self.getHeaderDescriptionString(schemeObj.getClassName()) - customizableInterface += "#import \"" + schemeObj.getMachineClassName() +".h\"\n" - customizableInterface += "@interface " + schemeObj.getClassName() + " : " + schemeObj.getMachineClassName() + "\n\n@end\n\n" customizableImplementation = self.getSourceDescriptionString(schemeObj.getClassName()) customizableImplementation += "#import \"" + schemeObj.getClassName() +".h\"\n" customizableImplementation += "@implementation " + schemeObj.getClassName() + "\n\n@end\n\n" - # human files - self.write_human_file(schemeObj.getClassName() + ".h", customizableInterface) + self.write_human_file(schemeObj.getClassName() + ".h", self.generateHumanHeaderFile(schemeObj)) self.write_human_file(schemeObj.getClassName() + ".m", customizableImplementation) return True diff --git a/templates/_header.h.mustache b/templates/_header.h.mustache new file mode 100644 index 0000000..e26f92c --- /dev/null +++ b/templates/_header.h.mustache @@ -0,0 +1,26 @@ +// +// {{machineClassName}}.h +// +// Created by MetaJSONParser. +// Copyright (c) {{date}} SinnerSchrader Mobile. All rights reserved. + +#import <Foundation/Foundation.h> + +@class {{humanClassName}}; + +@interface {{machineClassName}} : NSObject <NSCoding> + + +{{#properties}} +{{#comment}} +//{{comment}} +{{/comment }} +{{declaration}} +{{/properties}} + ++ ({{humanClassName}} *){{variableName}}WithDictionary:(NSDictionary *)dic withError:(NSError **)error; +- (id)initWithDictionary:(NSDictionary *)dic withError:(NSError **)error; +- (NSDictionary *)propertyDictionary; + +@end + diff --git a/templates/header.h.mustache b/templates/header.h.mustache index e26f92c..5ed18b6 100644 --- a/templates/header.h.mustache +++ b/templates/header.h.mustache @@ -1,26 +1,10 @@ // -// {{machineClassName}}.h +// {{humanClassName}}.h // // Created by MetaJSONParser. // Copyright (c) {{date}} SinnerSchrader Mobile. All rights reserved. -#import <Foundation/Foundation.h> - -@class {{humanClassName}}; - -@interface {{machineClassName}} : NSObject <NSCoding> - - -{{#properties}} -{{#comment}} -//{{comment}} -{{/comment }} -{{declaration}} -{{/properties}} - -+ ({{humanClassName}} *){{variableName}}WithDictionary:(NSDictionary *)dic withError:(NSError **)error; -- (id)initWithDictionary:(NSDictionary *)dic withError:(NSError **)error; -- (NSDictionary *)propertyDictionary; +#import "{{machineClassName}}.h" +@interface {{humanClassName}} : {{machineClassName}} @end - diff --git a/test_data/S2MSenderJSONObject.h b/test_data/S2MSenderJSONObject.h index f11c44e..4ba26ea 100644 --- a/test_data/S2MSenderJSONObject.h +++ b/test_data/S2MSenderJSONObject.h @@ -8,4 +8,3 @@ @interface S2MSenderJSONObject : _S2MSenderJSONObject @end - From 206bd84f9d20e098b1960feccf4718e608ecd8e2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Franc=CC=A7ois=20Benaiteau?= <francois.benaiteau@gmail.com> Date: Fri, 1 Nov 2013 09:39:56 +0100 Subject: [PATCH 009/149] Refactor human source file --- ObjectiveCCodeGenerator.py | 24 +++++++++--------------- templates/_source.m.mustache | 6 ++++++ templates/source.m.mustache | 7 ++++++- 3 files changed, 21 insertions(+), 16 deletions(-) create mode 100644 templates/_source.m.mustache diff --git a/ObjectiveCCodeGenerator.py b/ObjectiveCCodeGenerator.py index 226dc60..6d96b86 100755 --- a/ObjectiveCCodeGenerator.py +++ b/ObjectiveCCodeGenerator.py @@ -43,13 +43,10 @@ def templateFilePath(self, filename) : return os.path.join(templatePath, filename) def getCommonDescriptionString(self, name) : - templateFile = open(self.templateFilePath("source.m.mustache"), "r") + templateFile = open(self.templateFilePath("_source.m.mustache"), "r") today = datetime.date.fromtimestamp(time.time()) return Renderer().render(templateFile.read(), {"date": str(today.year), "filename": name}) - def getHeaderDescriptionString(self, name) : - return self.getCommonDescriptionString(self.getTitledString(name) + ".h") - def getSourceDescriptionString(self, name) : return self.getCommonDescriptionString(self.getTitledString(name) + ".m") @@ -85,8 +82,8 @@ def generateHeaderFile(self, schemeObj) : props.append(self.processProperties(prop)) hashParams = {"date": str(today.year), "machineClassName": schemeObj.getMachineClassName(), "humanClassName": schemeObj.getClassName(), "variableName": self.makeVarName(schemeObj), "properties": props} - print "hashParams" - print hashParams + # print "hashParams" + # print hashParams return Renderer().render(templateFile.read(), hashParams) @@ -95,12 +92,15 @@ def generateHumanHeaderFile(self, schemeObj) : today = datetime.date.fromtimestamp(time.time()) hashParams = {"date": str(today.year), "machineClassName": schemeObj.getMachineClassName(), "humanClassName": schemeObj.getClassName()} + return Renderer().render(templateFile.read(), hashParams) - print hashParams + def generateHumanSourceFile(self, schemeObj) : + templateFile = open(self.templateFilePath("source.m.mustache"), "r") + today = datetime.date.fromtimestamp(time.time()) + hashParams = {"date": str(today.year), "machineClassName": schemeObj.getMachineClassName(), "humanClassName": schemeObj.getClassName()} return Renderer().render(templateFile.read(), hashParams) - def make(self, schemeObj) : headerString = "" sourceString = "" @@ -316,15 +316,9 @@ def make(self, schemeObj) : self.write_abstract_file(schemeObj.getMachineClassName() + ".h", self.generateHeaderFile(schemeObj)) self.write_abstract_file(schemeObj.getMachineClassName() + ".m", sourceString) - #customizable file - - customizableImplementation = self.getSourceDescriptionString(schemeObj.getClassName()) - customizableImplementation += "#import \"" + schemeObj.getClassName() +".h\"\n" - customizableImplementation += "@implementation " + schemeObj.getClassName() + "\n\n@end\n\n" - # human files self.write_human_file(schemeObj.getClassName() + ".h", self.generateHumanHeaderFile(schemeObj)) - self.write_human_file(schemeObj.getClassName() + ".m", customizableImplementation) + self.write_human_file(schemeObj.getClassName() + ".m", self.generateHumanSourceFile(schemeObj)) return True diff --git a/templates/_source.m.mustache b/templates/_source.m.mustache new file mode 100644 index 0000000..427a9ac --- /dev/null +++ b/templates/_source.m.mustache @@ -0,0 +1,6 @@ +// +// {{filename}} +// +// Created by MetaJSONParser. +// Copyright (c) {{date}} SinnerSchrader Mobile. All rights reserved. + diff --git a/templates/source.m.mustache b/templates/source.m.mustache index 427a9ac..42d0fd3 100644 --- a/templates/source.m.mustache +++ b/templates/source.m.mustache @@ -1,6 +1,11 @@ // -// {{filename}} +// {{humanClassName}}.m // // Created by MetaJSONParser. // Copyright (c) {{date}} SinnerSchrader Mobile. All rights reserved. +#import "{{humanClassName}}.h" +@implementation {{humanClassName}} + +@end + From f2dd2958d7477754ab831b9af706cdd10e4faba5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Franc=CC=A7ois=20Benaiteau?= <francois.benaiteau@gmail.com> Date: Fri, 1 Nov 2013 09:44:06 +0100 Subject: [PATCH 010/149] Cleanup make function, move creating machine source file to its own function --- ObjectiveCCodeGenerator.py | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/ObjectiveCCodeGenerator.py b/ObjectiveCCodeGenerator.py index 6d96b86..6e9e75d 100755 --- a/ObjectiveCCodeGenerator.py +++ b/ObjectiveCCodeGenerator.py @@ -101,8 +101,7 @@ def generateHumanSourceFile(self, schemeObj) : hashParams = {"date": str(today.year), "machineClassName": schemeObj.getMachineClassName(), "humanClassName": schemeObj.getClassName()} return Renderer().render(templateFile.read(), hashParams) - def make(self, schemeObj) : - headerString = "" + def generateSourceFile(self, schemeObj) : sourceString = "" mDescriptionString = self.getSourceDescriptionString(schemeObj.getMachineClassName()) @@ -310,11 +309,14 @@ def make(self, schemeObj) : sourceString += mDescriptionString + mIncludeHeaders + "\n\n" + interfaceImplementation + return sourceString + + def make(self, schemeObj) : ### Creating output ########## # machine files self.write_abstract_file(schemeObj.getMachineClassName() + ".h", self.generateHeaderFile(schemeObj)) - self.write_abstract_file(schemeObj.getMachineClassName() + ".m", sourceString) + self.write_abstract_file(schemeObj.getMachineClassName() + ".m", self.generateSourceFile(schemeObj)) # human files self.write_human_file(schemeObj.getClassName() + ".h", self.generateHumanHeaderFile(schemeObj)) From 5eb3fdabf9bdf490de98c578429018644723fe82 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Franc=CC=A7ois=20Benaiteau?= <francois.benaiteau@gmail.com> Date: Fri, 1 Nov 2013 09:51:13 +0100 Subject: [PATCH 011/149] start using python naming convention --- ObjectiveCCodeGenerator.py | 29 +++++++++++++++-------------- ObjectiveCCodeGenerator_test.py | 4 ++-- 2 files changed, 17 insertions(+), 16 deletions(-) diff --git a/ObjectiveCCodeGenerator.py b/ObjectiveCCodeGenerator.py index 6e9e75d..b4f0848 100755 --- a/ObjectiveCCodeGenerator.py +++ b/ObjectiveCCodeGenerator.py @@ -22,7 +22,10 @@ THE SOFTWARE. ''' -import datetime, time, os, sys +import datetime +import time +import os +import sys from pystache import Renderer # import pickle # from cStringIO import StringIO @@ -37,18 +40,18 @@ def __init__(self): projectPrefix = "" dirPath = "classes" - def templateFilePath(self, filename) : + def template_file_path(self, filename) : templatePath = os.path.realpath( __file__ ) templatePath = templatePath.replace(os.path.basename( __file__ ), 'templates') return os.path.join(templatePath, filename) - def getCommonDescriptionString(self, name) : - templateFile = open(self.templateFilePath("_source.m.mustache"), "r") + def common_description_string(self, name) : + templateFile = open(self.template_file_path("_source.m.mustache"), "r") today = datetime.date.fromtimestamp(time.time()) return Renderer().render(templateFile.read(), {"date": str(today.year), "filename": name}) - def getSourceDescriptionString(self, name) : - return self.getCommonDescriptionString(self.getTitledString(name) + ".m") + def source_description_string(self, name) : + return self.common_description_string(self.getTitledString(name) + ".m") def makeVarName(self,schemeObj) : returnName = schemeObj.type_name @@ -68,18 +71,18 @@ def makeVarName(self,schemeObj) : return returnName - def processProperties(self, propObj) : + def process_properties(self, propObj) : propertyHash = {"declaration": self.propertyDefinitionString(propObj)} if propObj.type_description and len(propObj.type_description) : propertyHash["comment"] = propObj.type_description return propertyHash def generateHeaderFile(self, schemeObj) : - templateFile = open(self.templateFilePath("_header.h.mustache"), "r") + templateFile = open(self.template_file_path("_header.h.mustache"), "r") today = datetime.date.fromtimestamp(time.time()) props = [] for prop in schemeObj.props: - props.append(self.processProperties(prop)) + props.append(self.process_properties(prop)) hashParams = {"date": str(today.year), "machineClassName": schemeObj.getMachineClassName(), "humanClassName": schemeObj.getClassName(), "variableName": self.makeVarName(schemeObj), "properties": props} # print "hashParams" @@ -88,14 +91,14 @@ def generateHeaderFile(self, schemeObj) : return Renderer().render(templateFile.read(), hashParams) def generateHumanHeaderFile(self, schemeObj) : - templateFile = open(self.templateFilePath("header.h.mustache"), "r") + templateFile = open(self.template_file_path("header.h.mustache"), "r") today = datetime.date.fromtimestamp(time.time()) hashParams = {"date": str(today.year), "machineClassName": schemeObj.getMachineClassName(), "humanClassName": schemeObj.getClassName()} return Renderer().render(templateFile.read(), hashParams) def generateHumanSourceFile(self, schemeObj) : - templateFile = open(self.templateFilePath("source.m.mustache"), "r") + templateFile = open(self.template_file_path("source.m.mustache"), "r") today = datetime.date.fromtimestamp(time.time()) hashParams = {"date": str(today.year), "machineClassName": schemeObj.getMachineClassName(), "humanClassName": schemeObj.getClassName()} @@ -104,7 +107,7 @@ def generateHumanSourceFile(self, schemeObj) : def generateSourceFile(self, schemeObj) : sourceString = "" - mDescriptionString = self.getSourceDescriptionString(schemeObj.getMachineClassName()) + mDescriptionString = self.source_description_string(schemeObj.getMachineClassName()) mIncludeHeaders = "#import \"" + self.projectPrefix + "APIParser.h\"\n" mIncludeHeaders += "#import \"NSString+RegExValidation.h\"\n" @@ -312,8 +315,6 @@ def generateSourceFile(self, schemeObj) : return sourceString def make(self, schemeObj) : - ### Creating output ########## - # machine files self.write_abstract_file(schemeObj.getMachineClassName() + ".h", self.generateHeaderFile(schemeObj)) self.write_abstract_file(schemeObj.getMachineClassName() + ".m", self.generateSourceFile(schemeObj)) diff --git a/ObjectiveCCodeGenerator_test.py b/ObjectiveCCodeGenerator_test.py index e76be8d..5dacb60 100644 --- a/ObjectiveCCodeGenerator_test.py +++ b/ObjectiveCCodeGenerator_test.py @@ -16,8 +16,8 @@ def tearDown(self): print('In tearDown()') del self.gen - def test_getSourceDescriptionString(self): - result = self.gen.getSourceDescriptionString("MyClass") + def test_source_description_string(self): + result = self.gen.source_description_string("MyClass") expected_result = """// // MyClass.m // From be69c1e56617d8215a1695f89ee7c01252a60b41 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Franc=CC=A7ois=20Benaiteau?= <francois.benaiteau@gmail.com> Date: Fri, 1 Nov 2013 09:57:12 +0100 Subject: [PATCH 012/149] rename function to match responsibility --- ObjectiveCCodeGenerator.py | 4 ++-- ObjectiveCCodeGenerator_test.py | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/ObjectiveCCodeGenerator.py b/ObjectiveCCodeGenerator.py index b4f0848..0619563 100755 --- a/ObjectiveCCodeGenerator.py +++ b/ObjectiveCCodeGenerator.py @@ -77,7 +77,7 @@ def process_properties(self, propObj) : propertyHash["comment"] = propObj.type_description return propertyHash - def generateHeaderFile(self, schemeObj) : + def machine_header_content(self, schemeObj) : templateFile = open(self.template_file_path("_header.h.mustache"), "r") today = datetime.date.fromtimestamp(time.time()) props = [] @@ -316,7 +316,7 @@ def generateSourceFile(self, schemeObj) : def make(self, schemeObj) : # machine files - self.write_abstract_file(schemeObj.getMachineClassName() + ".h", self.generateHeaderFile(schemeObj)) + self.write_abstract_file(schemeObj.getMachineClassName() + ".h", self.machine_header_content(schemeObj)) self.write_abstract_file(schemeObj.getMachineClassName() + ".m", self.generateSourceFile(schemeObj)) # human files diff --git a/ObjectiveCCodeGenerator_test.py b/ObjectiveCCodeGenerator_test.py index 5dacb60..153ff14 100644 --- a/ObjectiveCCodeGenerator_test.py +++ b/ObjectiveCCodeGenerator_test.py @@ -59,11 +59,11 @@ def test_makeHumanSource(self): print output self.assertIs(status,0, "generated human source file is different") - def test_generateHeaderFile(self): + def test_machine_header_content(self): schemeObject = pickle.load(open('test_data/schemeObj.p', 'rb')) with open("test_data/_S2MSenderJSONObject.h", 'r') as content_file: expected_result = content_file.read() - result = self.gen.generateHeaderFile(schemeObject) + result = self.gen.machine_header_content(schemeObject) self.assertMultiLineEqual(result, expected_result) if __name__ == '__main__': From 7e3751eed0b79ff6509c3fd313d72645f16ed354 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Franc=CC=A7ois=20Benaiteau?= <francois.benaiteau@gmail.com> Date: Fri, 1 Nov 2013 09:58:59 +0100 Subject: [PATCH 013/149] Rename generateHumanHeaderFile() to human_header_content() --- ObjectiveCCodeGenerator.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ObjectiveCCodeGenerator.py b/ObjectiveCCodeGenerator.py index 0619563..f658d42 100755 --- a/ObjectiveCCodeGenerator.py +++ b/ObjectiveCCodeGenerator.py @@ -90,7 +90,7 @@ def machine_header_content(self, schemeObj) : return Renderer().render(templateFile.read(), hashParams) - def generateHumanHeaderFile(self, schemeObj) : + def human_header_content(self, schemeObj) : templateFile = open(self.template_file_path("header.h.mustache"), "r") today = datetime.date.fromtimestamp(time.time()) @@ -320,7 +320,7 @@ def make(self, schemeObj) : self.write_abstract_file(schemeObj.getMachineClassName() + ".m", self.generateSourceFile(schemeObj)) # human files - self.write_human_file(schemeObj.getClassName() + ".h", self.generateHumanHeaderFile(schemeObj)) + self.write_human_file(schemeObj.getClassName() + ".h", self.human_header_content(schemeObj)) self.write_human_file(schemeObj.getClassName() + ".m", self.generateHumanSourceFile(schemeObj)) return True From fb39c4c6036ad1ffcea0ce014c55435011e91445 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Franc=CC=A7ois=20Benaiteau?= <francois.benaiteau@gmail.com> Date: Fri, 1 Nov 2013 10:00:37 +0100 Subject: [PATCH 014/149] Rename generateHumanSourceFile() to human_source_content() --- ObjectiveCCodeGenerator.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ObjectiveCCodeGenerator.py b/ObjectiveCCodeGenerator.py index f658d42..360d08c 100755 --- a/ObjectiveCCodeGenerator.py +++ b/ObjectiveCCodeGenerator.py @@ -97,7 +97,7 @@ def human_header_content(self, schemeObj) : hashParams = {"date": str(today.year), "machineClassName": schemeObj.getMachineClassName(), "humanClassName": schemeObj.getClassName()} return Renderer().render(templateFile.read(), hashParams) - def generateHumanSourceFile(self, schemeObj) : + def human_source_content(self, schemeObj) : templateFile = open(self.template_file_path("source.m.mustache"), "r") today = datetime.date.fromtimestamp(time.time()) @@ -321,7 +321,7 @@ def make(self, schemeObj) : # human files self.write_human_file(schemeObj.getClassName() + ".h", self.human_header_content(schemeObj)) - self.write_human_file(schemeObj.getClassName() + ".m", self.generateHumanSourceFile(schemeObj)) + self.write_human_file(schemeObj.getClassName() + ".m", self.human_source_content(schemeObj)) return True From 25661e88d4d737f0f7a8053b076d194d66beb6d0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Franc=CC=A7ois=20Benaiteau?= <francois.benaiteau@gmail.com> Date: Fri, 1 Nov 2013 10:01:44 +0100 Subject: [PATCH 015/149] Rename generateSourceFile() to machine_Source_content() --- ObjectiveCCodeGenerator.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ObjectiveCCodeGenerator.py b/ObjectiveCCodeGenerator.py index 360d08c..bc4f6d7 100755 --- a/ObjectiveCCodeGenerator.py +++ b/ObjectiveCCodeGenerator.py @@ -104,7 +104,7 @@ def human_source_content(self, schemeObj) : hashParams = {"date": str(today.year), "machineClassName": schemeObj.getMachineClassName(), "humanClassName": schemeObj.getClassName()} return Renderer().render(templateFile.read(), hashParams) - def generateSourceFile(self, schemeObj) : + def machine_source_content(self, schemeObj) : sourceString = "" mDescriptionString = self.source_description_string(schemeObj.getMachineClassName()) @@ -317,7 +317,7 @@ def generateSourceFile(self, schemeObj) : def make(self, schemeObj) : # machine files self.write_abstract_file(schemeObj.getMachineClassName() + ".h", self.machine_header_content(schemeObj)) - self.write_abstract_file(schemeObj.getMachineClassName() + ".m", self.generateSourceFile(schemeObj)) + self.write_abstract_file(schemeObj.getMachineClassName() + ".m", self.machine_source_content(schemeObj)) # human files self.write_human_file(schemeObj.getClassName() + ".h", self.human_header_content(schemeObj)) From 937d4b7337ed7ed07fb2f099e755119d84943982 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Franc=CC=A7ois=20Benaiteau?= <francois.benaiteau@gmail.com> Date: Fri, 1 Nov 2013 10:12:12 +0100 Subject: [PATCH 016/149] Removed unused functions --- ObjectiveCCodeGenerator.py | 46 ++++++++++++++++----------------- ObjectiveCCodeGenerator_test.py | 11 -------- templates/_source.m.mustache | 2 +- 3 files changed, 23 insertions(+), 36 deletions(-) diff --git a/ObjectiveCCodeGenerator.py b/ObjectiveCCodeGenerator.py index bc4f6d7..9e3191e 100755 --- a/ObjectiveCCodeGenerator.py +++ b/ObjectiveCCodeGenerator.py @@ -45,14 +45,6 @@ def template_file_path(self, filename) : templatePath = templatePath.replace(os.path.basename( __file__ ), 'templates') return os.path.join(templatePath, filename) - def common_description_string(self, name) : - templateFile = open(self.template_file_path("_source.m.mustache"), "r") - today = datetime.date.fromtimestamp(time.time()) - return Renderer().render(templateFile.read(), {"date": str(today.year), "filename": name}) - - def source_description_string(self, name) : - return self.common_description_string(self.getTitledString(name) + ".m") - def makeVarName(self,schemeObj) : returnName = schemeObj.type_name if str(schemeObj.type_name) == "id" or str(schemeObj.type_name) == "description" : @@ -77,19 +69,6 @@ def process_properties(self, propObj) : propertyHash["comment"] = propObj.type_description return propertyHash - def machine_header_content(self, schemeObj) : - templateFile = open(self.template_file_path("_header.h.mustache"), "r") - today = datetime.date.fromtimestamp(time.time()) - props = [] - for prop in schemeObj.props: - props.append(self.process_properties(prop)) - - hashParams = {"date": str(today.year), "machineClassName": schemeObj.getMachineClassName(), "humanClassName": schemeObj.getClassName(), "variableName": self.makeVarName(schemeObj), "properties": props} - # print "hashParams" - # print hashParams - - return Renderer().render(templateFile.read(), hashParams) - def human_header_content(self, schemeObj) : templateFile = open(self.template_file_path("header.h.mustache"), "r") today = datetime.date.fromtimestamp(time.time()) @@ -104,11 +83,30 @@ def human_source_content(self, schemeObj) : hashParams = {"date": str(today.year), "machineClassName": schemeObj.getMachineClassName(), "humanClassName": schemeObj.getClassName()} return Renderer().render(templateFile.read(), hashParams) + def machine_header_content(self, schemeObj) : + templateFile = open(self.template_file_path("_header.h.mustache"), "r") + today = datetime.date.fromtimestamp(time.time()) + props = [] + for prop in schemeObj.props: + props.append(self.process_properties(prop)) + + hashParams = {"date": str(today.year), "machineClassName": schemeObj.getMachineClassName(), "humanClassName": schemeObj.getClassName(), "variableName": self.makeVarName(schemeObj), "properties": props} + # print "hashParams" + # print hashParams + + return Renderer().render(templateFile.read(), hashParams) + def machine_source_content(self, schemeObj) : - sourceString = "" + templateFile = open(self.template_file_path("_source.m.mustache"), "r") + today = datetime.date.fromtimestamp(time.time()) + + # retrieve all params for template + hashParams = {"date": str(today.year), "machineClassName": schemeObj.getMachineClassName()} - mDescriptionString = self.source_description_string(schemeObj.getMachineClassName()) + # render + sourceString = Renderer().render(templateFile.read(), hashParams) + # process missing content mIncludeHeaders = "#import \"" + self.projectPrefix + "APIParser.h\"\n" mIncludeHeaders += "#import \"NSString+RegExValidation.h\"\n" mIncludeHeaders += "#import \"" + schemeObj.getClassName() +".h\"\n" @@ -310,7 +308,7 @@ def machine_source_content(self, schemeObj) : interfaceImplementation += "\n#pragma mark - NSCoding\n" + encodeMethodString + decodeMethodString interfaceImplementation += "\n#pragma mark - Object Info\n" + propertyDictionaryString + descriptionMethodString +"\n@end\n" - sourceString += mDescriptionString + mIncludeHeaders + "\n\n" + interfaceImplementation + sourceString += mIncludeHeaders + "\n\n" + interfaceImplementation return sourceString diff --git a/ObjectiveCCodeGenerator_test.py b/ObjectiveCCodeGenerator_test.py index 153ff14..c910216 100644 --- a/ObjectiveCCodeGenerator_test.py +++ b/ObjectiveCCodeGenerator_test.py @@ -16,17 +16,6 @@ def tearDown(self): print('In tearDown()') del self.gen - def test_source_description_string(self): - result = self.gen.source_description_string("MyClass") - expected_result = """// -// MyClass.m -// -// Created by MetaJSONParser. -// Copyright (c) 2013 SinnerSchrader Mobile. All rights reserved. - -""" - self.assertMultiLineEqual(result, expected_result) - def test_makeMachineHeader(self): schemeObject = pickle.load(open('test_data/schemeObj.p', 'rb')) self.gen.make(schemeObject) diff --git a/templates/_source.m.mustache b/templates/_source.m.mustache index 427a9ac..f6895e6 100644 --- a/templates/_source.m.mustache +++ b/templates/_source.m.mustache @@ -1,5 +1,5 @@ // -// {{filename}} +// {{machineClassName}}.m // // Created by MetaJSONParser. // Copyright (c) {{date}} SinnerSchrader Mobile. All rights reserved. From fb3ba3fe0655c24aa5fe9b7530ed1daee38ac719 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Franc=CC=A7ois=20Benaiteau?= <francois.benaiteau@gmail.com> Date: Fri, 1 Nov 2013 21:55:24 +0100 Subject: [PATCH 017/149] Moved includeHeaders to template for machineSourceFile --- ObjectiveCCodeGenerator.py | 12 ++---------- templates/_source.m.mustache | 3 +++ 2 files changed, 5 insertions(+), 10 deletions(-) diff --git a/ObjectiveCCodeGenerator.py b/ObjectiveCCodeGenerator.py index 9e3191e..2fb117c 100755 --- a/ObjectiveCCodeGenerator.py +++ b/ObjectiveCCodeGenerator.py @@ -101,15 +101,12 @@ def machine_source_content(self, schemeObj) : today = datetime.date.fromtimestamp(time.time()) # retrieve all params for template - hashParams = {"date": str(today.year), "machineClassName": schemeObj.getMachineClassName()} + hashParams = {"date": str(today.year), "machineClassName": schemeObj.getMachineClassName(), "projectPrefix": self.projectPrefix, "humanClassName": schemeObj.getClassName()} # render sourceString = Renderer().render(templateFile.read(), hashParams) # process missing content - mIncludeHeaders = "#import \"" + self.projectPrefix + "APIParser.h\"\n" - mIncludeHeaders += "#import \"NSString+RegExValidation.h\"\n" - mIncludeHeaders += "#import \"" + schemeObj.getClassName() +".h\"\n" predefineCalsses = "" interfaceDefinition = "@class " + schemeObj.getClassName() + ";\n\n" interfaceDefinition += "@interface " + schemeObj.getMachineClassName() @@ -293,11 +290,6 @@ def machine_source_content(self, schemeObj) : otherClassList.append(otherClassObject) otherClassNameList.append(otherClassObject.getClassName()) - for includeTypeObj in otherClassList : - predefineCalsses += "@class " + includeTypeObj.getClassName() + ";\n" - mIncludeHeaders += "#import \""+ includeTypeObj.getClassName() + ".h\"\n" - if len(includeTypeObj.props) and includeTypeObj.rootBaseType() == "object" : - self.make(includeTypeObj) initMethodString += " }\n" + " return self;\n}\n\n" interfaceDefinition += "\n" + propertyDefinition + "\n" + methodDefinition + "\n@end\n" @@ -308,7 +300,7 @@ def machine_source_content(self, schemeObj) : interfaceImplementation += "\n#pragma mark - NSCoding\n" + encodeMethodString + decodeMethodString interfaceImplementation += "\n#pragma mark - Object Info\n" + propertyDictionaryString + descriptionMethodString +"\n@end\n" - sourceString += mIncludeHeaders + "\n\n" + interfaceImplementation + sourceString += "\n\n" + interfaceImplementation return sourceString diff --git a/templates/_source.m.mustache b/templates/_source.m.mustache index f6895e6..ff0cc27 100644 --- a/templates/_source.m.mustache +++ b/templates/_source.m.mustache @@ -4,3 +4,6 @@ // Created by MetaJSONParser. // Copyright (c) {{date}} SinnerSchrader Mobile. All rights reserved. +#import "{{projectPrefix}}APIParser.h" +#import "NSString+RegExValidation.h" +#import "{{humanClassName}}.h" From 939fc4b9bbde60333058ca4365538695b5da287a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Franc=CC=A7ois=20Benaiteau?= <francois.benaiteau@gmail.com> Date: Fri, 1 Nov 2013 23:44:42 +0100 Subject: [PATCH 018/149] Moving all code source generation of machine code to template ADD to_dictionnary got JSONScheme --- JSONScheme.py | 5 +- ObjectiveCCodeGenerator.py | 210 +---------------------------------- templates/_source.m.mustache | 57 ++++++++++ 3 files changed, 67 insertions(+), 205 deletions(-) diff --git a/JSONScheme.py b/JSONScheme.py index e6eda3c..701f4de 100755 --- a/JSONScheme.py +++ b/JSONScheme.py @@ -77,7 +77,10 @@ def __init__(self): maxLength = 0 minLength = 0 domain = ["ROOT"] - + + def __setattr__(self, name, value): + self.__dict__[name] = value + def hasScheme(self, schemeName) : tmpDomainList = list(self.domain) tmpDomainList.append(self.type_name) diff --git a/ObjectiveCCodeGenerator.py b/ObjectiveCCodeGenerator.py index 2fb117c..f5fa058 100755 --- a/ObjectiveCCodeGenerator.py +++ b/ObjectiveCCodeGenerator.py @@ -89,7 +89,6 @@ def machine_header_content(self, schemeObj) : props = [] for prop in schemeObj.props: props.append(self.process_properties(prop)) - hashParams = {"date": str(today.year), "machineClassName": schemeObj.getMachineClassName(), "humanClassName": schemeObj.getClassName(), "variableName": self.makeVarName(schemeObj), "properties": props} # print "hashParams" # print hashParams @@ -100,207 +99,17 @@ def machine_source_content(self, schemeObj) : templateFile = open(self.template_file_path("_source.m.mustache"), "r") today = datetime.date.fromtimestamp(time.time()) + props = [] + for prop in schemeObj.props: + props.append(prop.__dict__) + print props + # retrieve all params for template - hashParams = {"date": str(today.year), "machineClassName": schemeObj.getMachineClassName(), "projectPrefix": self.projectPrefix, "humanClassName": schemeObj.getClassName()} + hashParams = {"date": str(today.year), "machineClassName": schemeObj.getMachineClassName(), "projectPrefix": self.projectPrefix, "humanClassName": schemeObj.getClassName(), "variableName": self.makeVarName(schemeObj), "properties": props} # render sourceString = Renderer().render(templateFile.read(), hashParams) - # process missing content - predefineCalsses = "" - interfaceDefinition = "@class " + schemeObj.getClassName() + ";\n\n" - interfaceDefinition += "@interface " + schemeObj.getMachineClassName() - interfaceImplementation = "@implementation " + schemeObj.getMachineClassName() + "\n" - propertyDefinition = "" - methodDefinition = "" - initMethodString = "" - - factoryMethodImpl = "\n+ (" + schemeObj.getClassName() +" *)" + self.makeVarName(schemeObj) + "WithDictionary:(NSDictionary *)dic withError:(NSError **)error {\n" - factoryMethodImpl += " return [[" + schemeObj.getClassName() + " alloc] initWithDictionary:dic withError:error];\n" - factoryMethodImpl += "}\n\n" - - descriptionMethodString = "- (NSString *)description {\n return [NSString stringWithFormat:@\"%@\",[self propertyDictionary]];\n}\n" - propertyDictionaryString = "- (NSDictionary *)propertyDictionary {\n" - - encodeMethodString = "- (void)encodeWithCoder:(NSCoder*)coder {\n" - decodeMethodString = "- (id)initWithCoder:(NSCoder *)coder {\n" - - """ - check base type - """ - if schemeObj.isNaturalType() or schemeObj.rootBaseType() == "any": - print "error : ", schemeObj.base_type ," (" , schemeObj.type_name, ") is natural type. Cannot make source code for it.\n" - return False - if schemeObj.rootBaseType() != "object" : - print "error : ", schemeObj.base_type ," (" , schemeObj.type_name,") is not custom 'object' type.\n" - return False - - if len(schemeObj.props) == 0 : - # don't make source codes. - print "NO Property : " + schemeObj.getMachineClassName() - - if schemeObj.base_type != "object" : - - encodeMethodString += " [super encodeWithCoder:coder];\n" - decodeMethodString += " self = [super initWithCoder:coder];\n" - propertyDictionaryString += " NSDictionary *parentDic = [super propertyDictionary];\n" - propertyDictionaryString += " NSMutableDictionary *dic = [[NSMutableDictionary alloc] initWithDictionary:parentDic];\n" - - #print "(make : !object) : find scheme : " + schemeObj.base_type + " from : " + schemeObj.type_name - if schemeObj.hasScheme(schemeObj.base_type) : - parentSchemeObj = schemeObj.getScheme(schemeObj.base_type) - hIncludeHeaders += "#import \"" + parentSchemeObj.getClassName() + ".h\"\n" - interfaceDefinition += " : " + parentSchemeObj.getClassName() + "\n" - initMethodString = "- (id)initWithDictionary:(NSDictionary *)dic withError:(NSError **)error {\n self = [super initWithDictionary:dic withError:error];\n" - else : - print "error : ", schemeObj.base_type, "(parent type of ", schemeObj.type_name ,") is not defined.\n" - return False - else : - decodeMethodString += " self = [super init];\n" - interfaceDefinition += " : NSObject <NSCoding>\n" - initMethodString = "- (id)initWithDictionary:(NSDictionary *)dic withError:(NSError **)error {\n self = [super init];\n" - propertyDictionaryString += " NSMutableDictionary *dic = [[NSMutableDictionary alloc] init];\n" - - initMethodString += " if (self) {\n" - interfaceDefinition += "\n" - #factory method - methodDefinition += "+ (" + schemeObj.getClassName() +" *)" + self.makeVarName(schemeObj) + "WithDictionary:(NSDictionary *)dic withError:(NSError **)error;\n" - #initialize - methodDefinition += "- (id)initWithDictionary:(NSDictionary *)dic withError:(NSError **)error;\n" - #property dictionary method - methodDefinition += "- (NSDictionary *)propertyDictionary;\n" - getterMethodImplementation = "" - - - """ - check properties - """ - otherClasses = {} - for propObj in schemeObj.props : - decodeMethodString += self.propertyDecodeString(propObj, 1) - encodeMethodString += self.propertyEncodeString(propObj, 1) - propertyDictionaryString += self.setPropertyDictionaryString(propObj, "dic", 1) - - subTypeSchemeList = propObj.getSubType() - if propObj.rootBaseType() == "array" and len(subTypeSchemeList) == 1 and not "any" in subTypeSchemeList: - subTypeSchemeName = subTypeSchemeList[0] - tmpArrayName = "tmp" + self.getTitledString(propObj.type_name) + "Array" - initMethodString += self.getNaturalTypeGetterFromDictionaryCode(propObj, "NSArray *", tmpArrayName, "dic", propObj.type_name, (propObj.required != True), 2, "self") - initMethodString += self.getNaturalTypeValidationCode(propObj, tmpArrayName, 2, "self") - tmpMutableArrayName = "tmp" + self.getTitledString(propObj.type_name) - initMethodString += " NSMutableArray *" + tmpMutableArrayName + " = [[NSMutableArray alloc] initWithCapacity:" + tmpArrayName + ".count];\n" - - initMethodString += " for (NSUInteger loop = 0; loop < " + tmpArrayName + ".count; loop++) {\n" - subTypeSchemeObj = propObj.getScheme(subTypeSchemeName) - - if subTypeSchemeName in propObj.naturalTypeList : - initMethodString += self.getNaturalTypeGetterFromArrayCode(subTypeSchemeName, self.getNaturalTypeClassString(subTypeSchemeName), "tmpValue", tmpArrayName, "loop", (propObj.required != True), 3, "self") - initMethodString += " if (tmpValue) {\n" - initMethodString += " [" + tmpMutableArrayName + " addObject:tmpValue];\n" - initMethodString += " }\n" - elif subTypeSchemeObj and subTypeSchemeObj.isNaturalType() : - initMethodString += self.getNaturalTypeGetterFromArrayCode(subTypeSchemeName, self.getNaturalTypeClassString(subTypeSchemeObj.rootBaseType()), "tmpValue", tmpArrayName, "loop", (propObj.required != True), 3, "self") - if subTypeSchemeObj : - initMethodString += self.getNaturalTypeValidationCode(subTypeSchemeObj, "tmpValue", 3, "self") - initMethodString += " if (tmpValue) {\n" - initMethodString += " [" + tmpMutableArrayName + " addObject:tmpValue];\n" - initMethodString += " }\n" - elif subTypeSchemeObj and subTypeSchemeObj.rootBaseType() == "object" : - tmpDicName = "tmpDic" - initMethodString += self.getDictionaryGetterFromArrayCode(tmpDicName, tmpArrayName, "loop", False, 3, "self") - initMethodString += " " + subTypeSchemeObj.getClassName() + "*tmpObject = nil;\n" - initMethodString += self.getObjectAllocatorFromDictionaryCode(False, subTypeSchemeObj.getClassName(), "tmpObject", tmpDicName, (propObj.required != True), 3, "self") - initMethodString += " if (tmpObject) {\n" - initMethodString += " [" + tmpMutableArrayName + " addObject:tmpObject];\n" - initMethodString += " }\n" - else : - print "Error : can't handle subType of " + propObj.type_name - return False - - initMethodString += " }\n" - initMethodString += " self." + self.makeVarName(propObj) + " = [NSArray arrayWithArray:" + tmpMutableArrayName + "];\n" - - elif propObj.isNaturalType() : - initMethodString += self.getNaturalTypeGetterFromDictionaryCode(propObj, "", "self." + self.makeVarName(propObj), "dic", propObj.type_name, (propObj.required != True), 2, "self") - initMethodString += self.getNaturalTypeValidationCode(propObj, "self." + self.makeVarName(propObj), 2, "self") - if len(subTypeSchemeList) > 1 or "any" in subTypeSchemeList : - pass - else : - continue - - elif propObj.rootBaseType() == "object" : - if otherClasses.has_key(propObj.type_name) == False : - otherClasses[propObj.type_name] = propObj - tmpVarName = "tmp"+self.getTitledString(propObj.type_name) - initMethodString += self.getDictionaryGetterFromDictionaryCode(tmpVarName, "dic", propObj.type_name, (propObj.required != True), 2, "self") - initMethodString += self.getObjectAllocatorFromDictionaryCode(False, propObj.getClassName(), "self." + self.makeVarName(propObj), tmpVarName, (propObj.required != True), 2, "self") - continue - - else : - tmpVarName = "tmp" + self.getTitledString(propObj.type_name) - initMethodString += self.getGetterFromDictionaryCode("id ", tmpVarName, "dic", propObj.type_name, (propObj.required != True), 2, "self") - initMethodString += " if ("+ tmpVarName +") {\n" - initMethodString += self.getDictionaryAllocatorCode(False, "self." + self.makeVarName(propObj), tmpVarName, propObj.type_name, 3, "self") - initMethodString += " }\n" - - if propObj.rootBaseType() == "array" and len(subTypeSchemeList) == 1 and not "any" in subTypeSchemeList: - pass - else : - for methodDefinitionString in self.getterMethodDefinitionString(propObj) : - methodDefinition += methodDefinitionString - getterMethodImplementation += self.getterMethodString(propObj); - - if propObj.rootBaseType() == "multi" : - for multiTypeScheme in propObj.getBaseTypes() : - if multiTypeScheme in propObj.naturalTypeList or multiTypeScheme == "any" : - continue - #print "(make : property multi) : find scheme : " + multiTypeScheme + " from : " + propObj.type_name - elif schemeObj.hasScheme(multiTypeScheme) == False : - print "Warning : " + propObj.type_name + " in " + propObj.getDomainString() + " (multi) has undefined base-type." - print " undefined type : " + multiTypeScheme - continue - multiTypeSchemeObj = propObj.getScheme(multiTypeScheme) - - if multiTypeSchemeObj.rootBaseType() == "object" and otherClasses.has_key(multiTypeScheme) == False: - otherClasses[multiTypeScheme] = multiTypeSchemeObj - elif propObj.rootBaseType() == "any" : - pass - - elif propObj.rootBaseType() == "array" : - for subTypeScheme in propObj.getSubType() : - if subTypeScheme in propObj.naturalTypeList or subTypeScheme == "any" : - continue - #print "(make : property array) : find scheme : " + subTypeScheme + " from : " + propObj.type_name - elif propObj.hasScheme(subTypeScheme) == False: - print "Warning : " + propObj.type_name + " in " + propObj.getDomainString() + " (array) has undefined sub type." - print " undefined type : " + multiTypeScheme - continue - subTypeSchemeObj = propObj.getScheme(subTypeScheme) - if subTypeSchemeObj.rootBaseType() == "object" and otherClasses.has_key(subTypeSchemeObj.type_name) == False : - otherClasses[subTypeSchemeObj.type_name] = subTypeSchemeObj - - encodeMethodString += "}\n" - decodeMethodString += " return self;\n}\n" - propertyDictionaryString += " return dic;\n}\n" - otherClassNameList = [] - otherClassList = [] - for otherClassName in otherClasses : - otherClassObject = otherClasses[otherClassName] - if not otherClassObject.getClassName() in otherClassNameList : - otherClassList.append(otherClassObject) - otherClassNameList.append(otherClassObject.getClassName()) - - - initMethodString += " }\n" + " return self;\n}\n\n" - interfaceDefinition += "\n" + propertyDefinition + "\n" + methodDefinition + "\n@end\n" - - interfaceImplementation += "\n#pragma mark - factory\n" + factoryMethodImpl - interfaceImplementation += "\n#pragma mark - initialize\n" + initMethodString - interfaceImplementation += "\n#pragma mark - getter\n" + getterMethodImplementation - interfaceImplementation += "\n#pragma mark - NSCoding\n" + encodeMethodString + decodeMethodString - interfaceImplementation += "\n#pragma mark - Object Info\n" + propertyDictionaryString + descriptionMethodString +"\n@end\n" - - sourceString += "\n\n" + interfaceImplementation return sourceString @@ -1017,13 +826,6 @@ def writeTemplates(self) : - - - - - - - diff --git a/templates/_source.m.mustache b/templates/_source.m.mustache index ff0cc27..c4a6f98 100644 --- a/templates/_source.m.mustache +++ b/templates/_source.m.mustache @@ -7,3 +7,60 @@ #import "{{projectPrefix}}APIParser.h" #import "NSString+RegExValidation.h" #import "{{humanClassName}}.h" + + +@implementation {{machineClassName}} + +#pragma mark - factory + ++ ({{humanClassName}} *){{variableName}}WithDictionary:(NSDictionary *)dic withError:(NSError **)error { + return [[{{humanClassName}} alloc] initWithDictionary:dic withError:error]; +} + + +#pragma mark - initialize +- (id)initWithDictionary:(NSDictionary *)dic withError:(NSError **)error { + self = [super init]; + if (self) { + {{#properties}} + self.{{type_name}} = [APIParser stringFromResponseDictionary:dic forKey:@"{{type_name}}" acceptNumber:NO acceptNil:NO error:error]; + if (*error) { + return self; + } + {{/properties}} + } + return self; +} + + +#pragma mark - getter + +#pragma mark - NSCoding +- (void)encodeWithCoder:(NSCoder*)coder { + {{#properties}} + [coder encodeObject:self.{{type_name}} forKey:@"{{type_name}}"]; + {{/properties}} +} +- (id)initWithCoder:(NSCoder *)coder { + self = [super init]; + {{#properties}} + self.{{type_name}} = [coder decodeObjectForKey:@"{{type_name}}"]; + {{/properties}} + return self; +} + +#pragma mark - Object Info +- (NSDictionary *)propertyDictionary { + NSMutableDictionary *dic = [[NSMutableDictionary alloc] init]; + {{#properties}} + if (self.{{type_name}}) { + [dic setObject:self.{{type_name}} forKey:@"{{type_name}}"]; + } + {{/properties}} + return dic; +} +- (NSString *)description { + return [NSString stringWithFormat:@"%@",[self propertyDictionary]]; +} + +@end From e659804a3ea725246f16194b9f94636508c8e989 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Franc=CC=A7ois=20Benaiteau?= <francois.benaiteau@gmail.com> Date: Fri, 1 Nov 2013 23:59:14 +0100 Subject: [PATCH 019/149] ADD output files of test.json sample Assuring code functionality while refactoring --- .../_FBEMySessionSuffix.h | 24 + .../_FBEMySessionSuffix.m | 85 +++ .../AbstractInterfaceFiles/_FBEPersonSuffix.h | 22 + .../AbstractInterfaceFiles/_FBEPersonSuffix.m | 67 ++ .../_FBEUserAddressSuffix.h | 26 + .../_FBEUserAddressSuffix.m | 103 +++ .../AbstractInterfaceFiles/_FBEUserSuffix.h | 33 + .../AbstractInterfaceFiles/_FBEUserSuffix.m | 158 +++++ test_data/test_json/FBEMySessionSuffix.h | 11 + test_data/test_json/FBEMySessionSuffix.m | 11 + test_data/test_json/FBEPersonSuffix.h | 11 + test_data/test_json/FBEPersonSuffix.m | 11 + test_data/test_json/FBEUserAddressSuffix.h | 11 + test_data/test_json/FBEUserAddressSuffix.m | 11 + test_data/test_json/FBEUserSuffix.h | 11 + test_data/test_json/FBEUserSuffix.m | 11 + .../Utilities/APIParser/FBEAPIParser.h | 294 +++++++++ .../Utilities/APIParser/FBEAPIParser.m | 590 ++++++++++++++++++ .../NSString/NSString+RegExValidation.h | 18 + .../NSString/NSString+RegExValidation.m | 32 + 20 files changed, 1540 insertions(+) create mode 100644 test_data/test_json/AbstractInterfaceFiles/_FBEMySessionSuffix.h create mode 100644 test_data/test_json/AbstractInterfaceFiles/_FBEMySessionSuffix.m create mode 100644 test_data/test_json/AbstractInterfaceFiles/_FBEPersonSuffix.h create mode 100644 test_data/test_json/AbstractInterfaceFiles/_FBEPersonSuffix.m create mode 100644 test_data/test_json/AbstractInterfaceFiles/_FBEUserAddressSuffix.h create mode 100644 test_data/test_json/AbstractInterfaceFiles/_FBEUserAddressSuffix.m create mode 100644 test_data/test_json/AbstractInterfaceFiles/_FBEUserSuffix.h create mode 100644 test_data/test_json/AbstractInterfaceFiles/_FBEUserSuffix.m create mode 100644 test_data/test_json/FBEMySessionSuffix.h create mode 100644 test_data/test_json/FBEMySessionSuffix.m create mode 100644 test_data/test_json/FBEPersonSuffix.h create mode 100644 test_data/test_json/FBEPersonSuffix.m create mode 100644 test_data/test_json/FBEUserAddressSuffix.h create mode 100644 test_data/test_json/FBEUserAddressSuffix.m create mode 100644 test_data/test_json/FBEUserSuffix.h create mode 100644 test_data/test_json/FBEUserSuffix.m create mode 100644 test_data/test_json/Utilities/APIParser/FBEAPIParser.h create mode 100644 test_data/test_json/Utilities/APIParser/FBEAPIParser.m create mode 100644 test_data/test_json/Utilities/NSString/NSString+RegExValidation.h create mode 100644 test_data/test_json/Utilities/NSString/NSString+RegExValidation.m diff --git a/test_data/test_json/AbstractInterfaceFiles/_FBEMySessionSuffix.h b/test_data/test_json/AbstractInterfaceFiles/_FBEMySessionSuffix.h new file mode 100644 index 0000000..1248e08 --- /dev/null +++ b/test_data/test_json/AbstractInterfaceFiles/_FBEMySessionSuffix.h @@ -0,0 +1,24 @@ +// +// _FBEMySessionSuffix.h +// +// Created by MetaJSONParser. +// Copyright (c) 2013 SinnerSchrader Mobile. All rights reserved. + +#import <Foundation/Foundation.h> + +@class FBEMySessionSuffix; + +@interface _FBEMySessionSuffix : NSObject <NSCoding> + + +// session string after login +@property (nonatomic, strong) NSString *sessionID; +// Experation date of session +@property (nonatomic, strong) NSDate *expirationDate; + ++ (FBEMySessionSuffix *)mySessionWithDictionary:(NSDictionary *)dic withError:(NSError **)error; +- (id)initWithDictionary:(NSDictionary *)dic withError:(NSError **)error; +- (NSDictionary *)propertyDictionary; + +@end + diff --git a/test_data/test_json/AbstractInterfaceFiles/_FBEMySessionSuffix.m b/test_data/test_json/AbstractInterfaceFiles/_FBEMySessionSuffix.m new file mode 100644 index 0000000..dce655e --- /dev/null +++ b/test_data/test_json/AbstractInterfaceFiles/_FBEMySessionSuffix.m @@ -0,0 +1,85 @@ +// +// _FBEMySessionSuffix.m +// +// Created by MetaJSONParser. +// Copyright (c) 2013 SinnerSchrader Mobile. All rights reserved. + +#import "FBEAPIParser.h" +#import "NSString+RegExValidation.h" +#import "FBEMySessionSuffix.h" + + +@implementation _FBEMySessionSuffix + +#pragma mark - factory + ++ (FBEMySessionSuffix *)mySessionWithDictionary:(NSDictionary *)dic withError:(NSError **)error { + return [[FBEMySessionSuffix alloc] initWithDictionary:dic withError:error]; +} + + +#pragma mark - initialize +- (id)initWithDictionary:(NSDictionary *)dic withError:(NSError **)error { + self = [super init]; + if (self) { + self.sessionID = [FBEAPIParser stringFromResponseDictionary:dic forKey:@"sessionID" acceptNumber:NO acceptNil:NO error:error]; + if (*error) { + return self; + } + if (self.sessionID.length > 50) { + NSDictionary *userInfo = [NSDictionary dictionaryWithObjectsAndKeys:@"sessionID", @"propertyName", @"sessionID", @"key", @"validation error", @"reason", NSStringFromClass([self class]), @"objectClass",nil]; + *error = [NSError errorWithDomain:kFBEErrorDomain_parser code:kFBEErrorDomain_parser_valueIsNotValid userInfo:userInfo]; + NSLog(@"%@", *error); + return self; + } + if (self.sessionID.length < 20) { + NSDictionary *userInfo = [NSDictionary dictionaryWithObjectsAndKeys:@"sessionID", @"propertyName", @"sessionID", @"key", @"validation error", @"reason", NSStringFromClass([self class]), @"objectClass",nil]; + *error = [NSError errorWithDomain:kFBEErrorDomain_parser code:kFBEErrorDomain_parser_valueIsNotValid userInfo:userInfo]; + NSLog(@"%@", *error); + return self; + } + self.expirationDate = [FBEAPIParser dateWithTimeIntervalFromResponseDictionary:dic forKey:@"expirationDate" acceptNil:NO error:error]; + if (*error) { + return self; + } + if ([self.expirationDate timeIntervalSince1970] > 183759284) { + NSDictionary *userInfo = [NSDictionary dictionaryWithObjectsAndKeys:@"expirationDate", @"propertyName", @"expirationDate", @"key", @"validation error", @"reason", NSStringFromClass([self class]), @"objectClass",nil]; + *error = [NSError errorWithDomain:kFBEErrorDomain_parser code:kFBEErrorDomain_parser_valueIsNotValid userInfo:userInfo]; + NSLog(@"%@", *error); + return self; + } + } + return self; +} + + +#pragma mark - getter + +#pragma mark - NSCoding +- (void)encodeWithCoder:(NSCoder*)coder { + [coder encodeObject:self.sessionID forKey:@"sessionID"]; + [coder encodeObject:self.expirationDate forKey:@"expirationDate"]; +} +- (id)initWithCoder:(NSCoder *)coder { + self = [super init]; + self.sessionID = [coder decodeObjectForKey:@"sessionID"]; + self.expirationDate = [coder decodeObjectForKey:@"expirationDate"]; + return self; +} + +#pragma mark - Object Info +- (NSDictionary *)propertyDictionary { + NSMutableDictionary *dic = [[NSMutableDictionary alloc] init]; + if (self.sessionID) { + [dic setObject:self.sessionID forKey:@"sessionID"]; + } + if (self.expirationDate) { + [dic setObject:[NSNumber numberWithInteger:[[NSNumber numberWithDouble:[self.expirationDate timeIntervalSince1970]] longValue]] forKey:@"expirationDate"]; + } + return dic; +} +- (NSString *)description { + return [NSString stringWithFormat:@"%@",[self propertyDictionary]]; +} + +@end diff --git a/test_data/test_json/AbstractInterfaceFiles/_FBEPersonSuffix.h b/test_data/test_json/AbstractInterfaceFiles/_FBEPersonSuffix.h new file mode 100644 index 0000000..31d0651 --- /dev/null +++ b/test_data/test_json/AbstractInterfaceFiles/_FBEPersonSuffix.h @@ -0,0 +1,22 @@ +// +// _FBEPersonSuffix.h +// +// Created by MetaJSONParser. +// Copyright (c) 2013 SinnerSchrader Mobile. All rights reserved. + +#import <Foundation/Foundation.h> + +@class FBEPersonSuffix; + +@interface _FBEPersonSuffix : NSObject <NSCoding> + + +@property (nonatomic, strong) NSString *firstName; +@property (nonatomic, strong) NSString *lastName; + ++ (FBEPersonSuffix *)personWithDictionary:(NSDictionary *)dic withError:(NSError **)error; +- (id)initWithDictionary:(NSDictionary *)dic withError:(NSError **)error; +- (NSDictionary *)propertyDictionary; + +@end + diff --git a/test_data/test_json/AbstractInterfaceFiles/_FBEPersonSuffix.m b/test_data/test_json/AbstractInterfaceFiles/_FBEPersonSuffix.m new file mode 100644 index 0000000..963ee06 --- /dev/null +++ b/test_data/test_json/AbstractInterfaceFiles/_FBEPersonSuffix.m @@ -0,0 +1,67 @@ +// +// _FBEPersonSuffix.m +// +// Created by MetaJSONParser. +// Copyright (c) 2013 SinnerSchrader Mobile. All rights reserved. + +#import "FBEAPIParser.h" +#import "NSString+RegExValidation.h" +#import "FBEPersonSuffix.h" + + +@implementation _FBEPersonSuffix + +#pragma mark - factory + ++ (FBEPersonSuffix *)personWithDictionary:(NSDictionary *)dic withError:(NSError **)error { + return [[FBEPersonSuffix alloc] initWithDictionary:dic withError:error]; +} + + +#pragma mark - initialize +- (id)initWithDictionary:(NSDictionary *)dic withError:(NSError **)error { + self = [super init]; + if (self) { + self.firstName = [FBEAPIParser stringFromResponseDictionary:dic forKey:@"firstName" acceptNumber:NO acceptNil:NO error:error]; + if (*error) { + return self; + } + self.lastName = [FBEAPIParser stringFromResponseDictionary:dic forKey:@"lastName" acceptNumber:NO acceptNil:NO error:error]; + if (*error) { + return self; + } + } + return self; +} + + +#pragma mark - getter + +#pragma mark - NSCoding +- (void)encodeWithCoder:(NSCoder*)coder { + [coder encodeObject:self.firstName forKey:@"firstName"]; + [coder encodeObject:self.lastName forKey:@"lastName"]; +} +- (id)initWithCoder:(NSCoder *)coder { + self = [super init]; + self.firstName = [coder decodeObjectForKey:@"firstName"]; + self.lastName = [coder decodeObjectForKey:@"lastName"]; + return self; +} + +#pragma mark - Object Info +- (NSDictionary *)propertyDictionary { + NSMutableDictionary *dic = [[NSMutableDictionary alloc] init]; + if (self.firstName) { + [dic setObject:self.firstName forKey:@"firstName"]; + } + if (self.lastName) { + [dic setObject:self.lastName forKey:@"lastName"]; + } + return dic; +} +- (NSString *)description { + return [NSString stringWithFormat:@"%@",[self propertyDictionary]]; +} + +@end diff --git a/test_data/test_json/AbstractInterfaceFiles/_FBEUserAddressSuffix.h b/test_data/test_json/AbstractInterfaceFiles/_FBEUserAddressSuffix.h new file mode 100644 index 0000000..8defafc --- /dev/null +++ b/test_data/test_json/AbstractInterfaceFiles/_FBEUserAddressSuffix.h @@ -0,0 +1,26 @@ +// +// _FBEUserAddressSuffix.h +// +// Created by MetaJSONParser. +// Copyright (c) 2013 SinnerSchrader Mobile. All rights reserved. + +#import <Foundation/Foundation.h> + +@class FBEUserAddressSuffix; + +@interface _FBEUserAddressSuffix : NSObject <NSCoding> + + +@property (nonatomic, strong) NSString *street; +@property (nonatomic, strong) NSString *houseNumber; +@property (nonatomic, strong) NSString *additionalAddress; +@property (nonatomic, strong) NSString *City; +@property (nonatomic, strong) NSString *Country; +@property (nonatomic, strong) NSString *zipCode; + ++ (FBEUserAddressSuffix *)userAddressWithDictionary:(NSDictionary *)dic withError:(NSError **)error; +- (id)initWithDictionary:(NSDictionary *)dic withError:(NSError **)error; +- (NSDictionary *)propertyDictionary; + +@end + diff --git a/test_data/test_json/AbstractInterfaceFiles/_FBEUserAddressSuffix.m b/test_data/test_json/AbstractInterfaceFiles/_FBEUserAddressSuffix.m new file mode 100644 index 0000000..ee4a474 --- /dev/null +++ b/test_data/test_json/AbstractInterfaceFiles/_FBEUserAddressSuffix.m @@ -0,0 +1,103 @@ +// +// _FBEUserAddressSuffix.m +// +// Created by MetaJSONParser. +// Copyright (c) 2013 SinnerSchrader Mobile. All rights reserved. + +#import "FBEAPIParser.h" +#import "NSString+RegExValidation.h" +#import "FBEUserAddressSuffix.h" + + +@implementation _FBEUserAddressSuffix + +#pragma mark - factory + ++ (FBEUserAddressSuffix *)userAddressWithDictionary:(NSDictionary *)dic withError:(NSError **)error { + return [[FBEUserAddressSuffix alloc] initWithDictionary:dic withError:error]; +} + + +#pragma mark - initialize +- (id)initWithDictionary:(NSDictionary *)dic withError:(NSError **)error { + self = [super init]; + if (self) { + self.street = [FBEAPIParser stringFromResponseDictionary:dic forKey:@"street" acceptNumber:NO acceptNil:NO error:error]; + if (*error) { + return self; + } + self.houseNumber = [FBEAPIParser stringFromResponseDictionary:dic forKey:@"houseNumber" acceptNumber:NO acceptNil:NO error:error]; + if (*error) { + return self; + } + self.additionalAddress = [FBEAPIParser stringFromResponseDictionary:dic forKey:@"additionalAddress" acceptNumber:NO acceptNil:YES error:error]; + if (*error) { + return self; + } + self.City = [FBEAPIParser stringFromResponseDictionary:dic forKey:@"City" acceptNumber:NO acceptNil:NO error:error]; + if (*error) { + return self; + } + self.Country = [FBEAPIParser stringFromResponseDictionary:dic forKey:@"Country" acceptNumber:NO acceptNil:NO error:error]; + if (*error) { + return self; + } + self.zipCode = [FBEAPIParser stringFromResponseDictionary:dic forKey:@"zipCode" acceptNumber:NO acceptNil:NO error:error]; + if (*error) { + return self; + } + } + return self; +} + + +#pragma mark - getter + +#pragma mark - NSCoding +- (void)encodeWithCoder:(NSCoder*)coder { + [coder encodeObject:self.street forKey:@"street"]; + [coder encodeObject:self.houseNumber forKey:@"houseNumber"]; + [coder encodeObject:self.additionalAddress forKey:@"additionalAddress"]; + [coder encodeObject:self.City forKey:@"City"]; + [coder encodeObject:self.Country forKey:@"Country"]; + [coder encodeObject:self.zipCode forKey:@"zipCode"]; +} +- (id)initWithCoder:(NSCoder *)coder { + self = [super init]; + self.street = [coder decodeObjectForKey:@"street"]; + self.houseNumber = [coder decodeObjectForKey:@"houseNumber"]; + self.additionalAddress = [coder decodeObjectForKey:@"additionalAddress"]; + self.City = [coder decodeObjectForKey:@"City"]; + self.Country = [coder decodeObjectForKey:@"Country"]; + self.zipCode = [coder decodeObjectForKey:@"zipCode"]; + return self; +} + +#pragma mark - Object Info +- (NSDictionary *)propertyDictionary { + NSMutableDictionary *dic = [[NSMutableDictionary alloc] init]; + if (self.street) { + [dic setObject:self.street forKey:@"street"]; + } + if (self.houseNumber) { + [dic setObject:self.houseNumber forKey:@"houseNumber"]; + } + if (self.additionalAddress) { + [dic setObject:self.additionalAddress forKey:@"additionalAddress"]; + } + if (self.City) { + [dic setObject:self.City forKey:@"City"]; + } + if (self.Country) { + [dic setObject:self.Country forKey:@"Country"]; + } + if (self.zipCode) { + [dic setObject:self.zipCode forKey:@"zipCode"]; + } + return dic; +} +- (NSString *)description { + return [NSString stringWithFormat:@"%@",[self propertyDictionary]]; +} + +@end diff --git a/test_data/test_json/AbstractInterfaceFiles/_FBEUserSuffix.h b/test_data/test_json/AbstractInterfaceFiles/_FBEUserSuffix.h new file mode 100644 index 0000000..37b954b --- /dev/null +++ b/test_data/test_json/AbstractInterfaceFiles/_FBEUserSuffix.h @@ -0,0 +1,33 @@ +// +// _FBEUserSuffix.h +// +// Created by MetaJSONParser. +// Copyright (c) 2013 SinnerSchrader Mobile. All rights reserved. + +#import <Foundation/Foundation.h> +#import "FBEPersonSuffix.h" + +@class FBEUserAddressSuffix; +@class FBEPersonSuffix; +@class FBEMySessionSuffix; + +@class FBEUserSuffix; + +@interface _FBEUserSuffix : FBEPersonSuffix + + +@property (nonatomic, strong) NSString *email; +@property (nonatomic, strong) NSArray *family; +@property (nonatomic, strong) NSString *userID; +@property (nonatomic, strong) FBEUserAddressSuffix *address; +@property (nonatomic, strong) FBEMySessionSuffix *session; + ++ (FBEUserSuffix *)userWithDictionary:(NSDictionary *)dic withError:(NSError **)error; +- (id)initWithDictionary:(NSDictionary *)dic withError:(NSError **)error; +- (NSDictionary *)propertyDictionary; +- (FBEPersonSuffix *)personInFamilyAtIndex:(NSUInteger)index withError:(NSError **)error; +- (FBEUserAddressSuffix *)userAddressInFamilyAtIndex:(NSUInteger)index withError:(NSError **)error; +- (NSString *)stringInFamilyAtIndex:(NSUInteger)index withError:(NSError **)error; + +@end + diff --git a/test_data/test_json/AbstractInterfaceFiles/_FBEUserSuffix.m b/test_data/test_json/AbstractInterfaceFiles/_FBEUserSuffix.m new file mode 100644 index 0000000..b740869 --- /dev/null +++ b/test_data/test_json/AbstractInterfaceFiles/_FBEUserSuffix.m @@ -0,0 +1,158 @@ +// +// _FBEUserSuffix.m +// +// Created by MetaJSONParser. +// Copyright (c) 2013 SinnerSchrader Mobile. All rights reserved. + +#import "FBEAPIParser.h" +#import "NSString+RegExValidation.h" +#import "FBEUserSuffix.h" +#import "FBEUserAddressSuffix.h" +#import "FBEPersonSuffix.h" +#import "FBEMySessionSuffix.h" + + +@implementation _FBEUserSuffix + +#pragma mark - factory + ++ (FBEUserSuffix *)userWithDictionary:(NSDictionary *)dic withError:(NSError **)error { + return [[FBEUserSuffix alloc] initWithDictionary:dic withError:error]; +} + + +#pragma mark - initialize +- (id)initWithDictionary:(NSDictionary *)dic withError:(NSError **)error { + self = [super initWithDictionary:dic withError:error]; + if (self) { + self.email = [FBEAPIParser stringFromResponseDictionary:dic forKey:@"email" acceptNumber:NO acceptNil:YES error:error]; + if (*error) { + return self; + } + if (self.email && [self.email matchesRegExString:@"[A-Z0-9._%+-]+@(?:[A-Z0-9-]+\.)+[A-Z]{2,4}"] == NO) { + NSDictionary *userInfo = [NSDictionary dictionaryWithObjectsAndKeys:@"email", @"propertyName", @"email", @"key", @"validation error", @"reason", NSStringFromClass([self class]), @"objectClass",nil]; + *error = [NSError errorWithDomain:kFBEErrorDomain_parser code:kFBEErrorDomain_parser_valueIsNotValid userInfo:userInfo]; + NSLog(@"%@", *error); + return self; + } + self.family = [FBEAPIParser arrayFromResponseDictionary:dic forKey:@"family" acceptNil:NO error:error]; + if (*error) { + return self; + } + self.userID = [FBEAPIParser stringFromResponseDictionary:dic forKey:@"userID" acceptNumber:NO acceptNil:NO error:error]; + if (*error) { + return self; + } + NSDictionary *tmpAddress = [FBEAPIParser dictionaryFromResponseDictionary:dic forKey:@"address" acceptNil:NO error:error]; + if (*error) { + return self; + } + if (tmpAddress) { + self.address= [[FBEUserAddressSuffix alloc] initWithDictionary:tmpAddress withError:error]; + if (*error) { + return self; + } + } + NSDictionary *tmpSession = [FBEAPIParser dictionaryFromResponseDictionary:dic forKey:@"session" acceptNil:NO error:error]; + if (*error) { + return self; + } + if (tmpSession) { + self.session= [[FBEMySessionSuffix alloc] initWithDictionary:tmpSession withError:error]; + if (*error) { + return self; + } + } + } + return self; +} + + +#pragma mark - getter +- (FBEPersonSuffix *)personInFamilyAtIndex:(NSUInteger)index withError:(NSError **)error { + NSDictionary *tmpFamilyDic = [FBEAPIParser dictionaryFromResponseArray:self.family atIndex:index acceptNil:NO error:error]; + if (*error) { + return nil; + } + FBEPersonSuffix *tmpFamily = nil; + if (tmpFamilyDic == nil) { + return nil; + } + if (tmpFamilyDic) { + tmpFamily= [[FBEPersonSuffix alloc] initWithDictionary:tmpFamilyDic withError:error]; + if (*error) { + return nil; + } + } + return tmpFamily; +} +- (FBEUserAddressSuffix *)userAddressInFamilyAtIndex:(NSUInteger)index withError:(NSError **)error { + NSDictionary *tmpFamilyDic = [FBEAPIParser dictionaryFromResponseArray:self.family atIndex:index acceptNil:NO error:error]; + if (*error) { + return nil; + } + FBEUserAddressSuffix *tmpFamily = nil; + if (tmpFamilyDic == nil) { + return nil; + } + if (tmpFamilyDic) { + tmpFamily= [[FBEUserAddressSuffix alloc] initWithDictionary:tmpFamilyDic withError:error]; + if (*error) { + return nil; + } + } + return tmpFamily; +} +- (NSString *)stringInFamilyAtIndex:(NSUInteger)index withError:(NSError **)error { + NSString *tmpFamily = [FBEAPIParser stringFromResponseArray:self.family atIndex:index acceptNil:NO error:error]; + if (*error) { + return nil; + } + return tmpFamily; +} + +#pragma mark - NSCoding +- (void)encodeWithCoder:(NSCoder*)coder { + [super encodeWithCoder:coder]; + [coder encodeObject:self.email forKey:@"email"]; + [coder encodeObject:self.family forKey:@"family"]; + [coder encodeObject:self.userID forKey:@"userID"]; + [coder encodeObject:self.address forKey:@"address"]; + [coder encodeObject:self.session forKey:@"session"]; +} +- (id)initWithCoder:(NSCoder *)coder { + self = [super initWithCoder:coder]; + self.email = [coder decodeObjectForKey:@"email"]; + self.family = [coder decodeObjectForKey:@"family"]; + self.userID = [coder decodeObjectForKey:@"userID"]; + self.address = [coder decodeObjectForKey:@"address"]; + self.session = [coder decodeObjectForKey:@"session"]; + return self; +} + +#pragma mark - Object Info +- (NSDictionary *)propertyDictionary { + NSDictionary *parentDic = [super propertyDictionary]; + NSMutableDictionary *dic = [[NSMutableDictionary alloc] initWithDictionary:parentDic]; + if (self.email) { + [dic setObject:self.email forKey:@"email"]; + } + if (self.family) { + [dic setObject:self.family forKey:@"family"]; + } + if (self.userID) { + [dic setObject:self.userID forKey:@"userID"]; + } + if (self.address) { + [dic setObject:[self.address propertyDictionary] forKey:@"address"]; + } + if (self.session) { + [dic setObject:[self.session propertyDictionary] forKey:@"session"]; + } + return dic; +} +- (NSString *)description { + return [NSString stringWithFormat:@"%@",[self propertyDictionary]]; +} + +@end diff --git a/test_data/test_json/FBEMySessionSuffix.h b/test_data/test_json/FBEMySessionSuffix.h new file mode 100644 index 0000000..bf5229d --- /dev/null +++ b/test_data/test_json/FBEMySessionSuffix.h @@ -0,0 +1,11 @@ +// +// FBEMySessionSuffix.h +// +// Created by MetaJSONParser. +// Copyright (c) 2013 SinnerSchrader Mobile. All rights reserved. + +#import "_FBEMySessionSuffix.h" +@interface FBEMySessionSuffix : _FBEMySessionSuffix + +@end + diff --git a/test_data/test_json/FBEMySessionSuffix.m b/test_data/test_json/FBEMySessionSuffix.m new file mode 100644 index 0000000..7b5bea6 --- /dev/null +++ b/test_data/test_json/FBEMySessionSuffix.m @@ -0,0 +1,11 @@ +// +// FBEMySessionSuffix.m +// +// Created by MetaJSONParser. +// Copyright (c) 2013 SinnerSchrader Mobile. All rights reserved. + +#import "FBEMySessionSuffix.h" +@implementation FBEMySessionSuffix + +@end + diff --git a/test_data/test_json/FBEPersonSuffix.h b/test_data/test_json/FBEPersonSuffix.h new file mode 100644 index 0000000..b948029 --- /dev/null +++ b/test_data/test_json/FBEPersonSuffix.h @@ -0,0 +1,11 @@ +// +// FBEPersonSuffix.h +// +// Created by MetaJSONParser. +// Copyright (c) 2013 SinnerSchrader Mobile. All rights reserved. + +#import "_FBEPersonSuffix.h" +@interface FBEPersonSuffix : _FBEPersonSuffix + +@end + diff --git a/test_data/test_json/FBEPersonSuffix.m b/test_data/test_json/FBEPersonSuffix.m new file mode 100644 index 0000000..e87c108 --- /dev/null +++ b/test_data/test_json/FBEPersonSuffix.m @@ -0,0 +1,11 @@ +// +// FBEPersonSuffix.m +// +// Created by MetaJSONParser. +// Copyright (c) 2013 SinnerSchrader Mobile. All rights reserved. + +#import "FBEPersonSuffix.h" +@implementation FBEPersonSuffix + +@end + diff --git a/test_data/test_json/FBEUserAddressSuffix.h b/test_data/test_json/FBEUserAddressSuffix.h new file mode 100644 index 0000000..fa6992c --- /dev/null +++ b/test_data/test_json/FBEUserAddressSuffix.h @@ -0,0 +1,11 @@ +// +// FBEUserAddressSuffix.h +// +// Created by MetaJSONParser. +// Copyright (c) 2013 SinnerSchrader Mobile. All rights reserved. + +#import "_FBEUserAddressSuffix.h" +@interface FBEUserAddressSuffix : _FBEUserAddressSuffix + +@end + diff --git a/test_data/test_json/FBEUserAddressSuffix.m b/test_data/test_json/FBEUserAddressSuffix.m new file mode 100644 index 0000000..9771151 --- /dev/null +++ b/test_data/test_json/FBEUserAddressSuffix.m @@ -0,0 +1,11 @@ +// +// FBEUserAddressSuffix.m +// +// Created by MetaJSONParser. +// Copyright (c) 2013 SinnerSchrader Mobile. All rights reserved. + +#import "FBEUserAddressSuffix.h" +@implementation FBEUserAddressSuffix + +@end + diff --git a/test_data/test_json/FBEUserSuffix.h b/test_data/test_json/FBEUserSuffix.h new file mode 100644 index 0000000..9a0ee61 --- /dev/null +++ b/test_data/test_json/FBEUserSuffix.h @@ -0,0 +1,11 @@ +// +// FBEUserSuffix.h +// +// Created by MetaJSONParser. +// Copyright (c) 2013 SinnerSchrader Mobile. All rights reserved. + +#import "_FBEUserSuffix.h" +@interface FBEUserSuffix : _FBEUserSuffix + +@end + diff --git a/test_data/test_json/FBEUserSuffix.m b/test_data/test_json/FBEUserSuffix.m new file mode 100644 index 0000000..65383a2 --- /dev/null +++ b/test_data/test_json/FBEUserSuffix.m @@ -0,0 +1,11 @@ +// +// FBEUserSuffix.m +// +// Created by MetaJSONParser. +// Copyright (c) 2013 SinnerSchrader Mobile. All rights reserved. + +#import "FBEUserSuffix.h" +@implementation FBEUserSuffix + +@end + diff --git a/test_data/test_json/Utilities/APIParser/FBEAPIParser.h b/test_data/test_json/Utilities/APIParser/FBEAPIParser.h new file mode 100644 index 0000000..4c5d159 --- /dev/null +++ b/test_data/test_json/Utilities/APIParser/FBEAPIParser.h @@ -0,0 +1,294 @@ + +// +// Created by MetaJSONParser. +// Copyright (c) 2013 SinnerSchrader Mobile. All rights reserved. +// + +#import <Foundation/Foundation.h> + +extern NSInteger const kFBEErrorDomain_parser_protocolError; +extern NSInteger const kFBEErrorDomain_parser_dictionaryExpected; +extern NSInteger const kFBEErrorDomain_parser_arrayExpected; +extern NSInteger const kFBEErrorDomain_parser_numberExpected; +extern NSInteger const kFBEErrorDomain_parser_stringExpected; +extern NSInteger const kFBEErrorDomain_parser_dateExpected; +extern NSInteger const kFBEErrorDomain_parser_keyNotFound; +extern NSInteger const kFBEErrorDomain_parser_indexNotFound; +extern NSInteger const kFBEErrorDomain_parser_valueIsNull; +extern NSInteger const kFBEErrorDomain_parser_dataExpected; +extern NSInteger const kFBEErrorDomain_parser_valueIsNotValid; + +extern NSString * const kFBEErrorDomain_parser; + +/** + The APIParser facilitates parsing the fields of the JSON response. + + The ResponseObjects may be `NSDictionaries` or `NSArrays`, depending on the method. Each method performs type checking and returns an sets the `NSError` indirect reference to an `NSError` object. The `NSError` indirect reference will be guaranteed to be `nil` upon success, which is contrary to Cocoa conventions but necessary since `nil` or `FALSE` may be valid return values. + */ +@interface FBEAPIParser : NSObject + +#pragma mark - Response Parsing + +/** + Gets an `NSDictionary` object from the response array. + @param responseObject The JSON Array + @param key The key of the item of the responseObject to be read + @param acceptNil If set to YES, no error will be given if the item to be read is not available. Otherwise, an NSError is generated. + @param error `nil` if parsing was successful + @returns The dictionary read from the responseObject + */ ++(NSDictionary*)dictionaryFromResponseArray:(id)responseObject + atIndex:(NSUInteger)index + acceptNil:(BOOL)acceptNil + error:(NSError**)error; + +/** + Gets an `NSArray` object from the response array. + @param responseObject The JSON Array + @param key The key of the item of the responseObject to be read + @param acceptNil If set to YES, no error will be given if the item to be read is not available. Otherwise, an NSError is generated. + @param error `nil` if parsing was successful + @returns The array read from the responseObject + */ ++(NSArray*)arrayFromResponseArray:(id)responseObject + atIndex:(NSUInteger)index + acceptNil:(BOOL)acceptNil + error:(NSError**)error; + +/** + Gets an `NSString` object from the response array. + @param responseObject The JSON Array + @param key The key of the item of the responseObject to be read + @param acceptNil If set to YES, no error will be given if the item to be read is not available. Otherwise, an NSError is generated. + @param error `nil` if parsing was successful + @returns The string read from the responseObject + */ + ++(NSString *)stringFromResponseArray:(id)responseObject + atIndex:(NSUInteger)index + acceptNil:(BOOL)acceptNil + error:(NSError**)error; + +/** + Gets an `NSNumber` object from the response array. + @param responseObject The JSON Array + @param key The key of the item of the responseObject to be read + @param acceptNil If set to YES, no error will be given if the item to be read is not available. Otherwise, an NSError is generated. + @param error `nil` if parsing was successful + @returns The object read from the responseObject + */ ++(NSNumber *)numberFromResponseArray:(id)responseObject + atIndex:(NSUInteger)index + acceptNil:(BOOL)acceptNil + error:(NSError**)error; + +/** + Gets a `BOOL` value from the response array. + @param responseObject The JSON Array + @param key The key of the item of the responseObject to be read + @param acceptNil If set to YES, no error will be given if the item to be read is not available. Otherwise, an NSError is generated. + @param error `nil` if parsing was successful + @returns The value read from the responseObject. Will be `NO` if the item to be read is not available. + */ ++(BOOL)boolFromResponseArray:(id)responseObject + atIndex:(NSUInteger)index + acceptNil:(BOOL)acceptNil + error:(NSError**)error; + +/** + Gets an `NSDate` object from the response array. + @param responseObject The JSON Array + @param key The key of the item of the responseObject to be read (the value for this key should be time interval since 1970) + @param acceptNil If set to YES, no error will be given if the item to be read is not available. Otherwise, an NSError is generated. + @param error `nil` if parsing was successful + @returns The date read from the responseObject + */ ++(NSDate *)dateWithTimeIntervalFromResponseArray:(id)responseObject + atIndex:(NSUInteger)index + acceptNil:(BOOL)acceptNil + error:(NSError**)error; + + + +/** + Gets an `NSData` object from the response array. + @param responseObject The JSON Array + @param key The key of the item of the responseObject to be read + @param acceptNil If set to YES, no error will be given if the item to be read is not available. Otherwise, an NSError is generated. + @param error `nil` if parsing was successful + @returns The data read from the responseObject + */ ++ (NSData*)dataFromResponseArray:(NSDictionary*)responseObject + atIndex:(NSUInteger)index + acceptNil:(BOOL)acceptNil + error:(NSError**)error; + +/** + Gets an Objective-C object of an anonymous type from the response object. + @param responseObject The JSON Dictionary + @param key The key of the item of the responseObject to be read + @param acceptNil If set to YES, no error will be given if the item to be read is not available. Otherwise, an NSError is generated. + @param error `nil` if parsing was successful + @returns The object read from the responseObject + */ ++(id)objectFromResponseDictionary:(id)responseObject + forKey:(NSString*)key + acceptNil:(BOOL)acceptNil + error:(NSError**)error; + + +/** + Gets an Objective-C object of an anonymous type from the response array. + @param responseObject The JSON Array + @param index The index of the item of the responseObject to be read + @param acceptNil If set to YES, no error will be given if the item to be read is not available. Otherwise, an NSError is generated. + @param error `nil` if parsing was successful + @returns The object read from the responseObject + */ ++(id)objectFromResponseArray:(id)responseObject + atIndex:(NSUInteger)index + acceptNil:(BOOL)acceptNil + error:(NSError**)error; + + +/** + Gets an `NSNumber` object from the response object. + @param responseObject The JSON Dictionary + @param key The key of the item of the responseObject to be read + @param acceptNil If set to YES, no error will be given if the item to be read is not available. Otherwise, an NSError is generated. + @param error `nil` if parsing was successful + @returns The object read from the responseObject + */ ++(NSNumber*)numberFromResponseDictionary:(id)responseObject + forKey:(NSString*)key + acceptNil:(BOOL)acceptNil + error:(NSError**)error; + + +/** + Gets a `BOOL` value from the response object. + @param responseObject The JSON Dictionary + @param key The key of the item of the responseObject to be read + @param acceptNil If set to YES, no error will be given if the item to be read is not available. Otherwise, an NSError is generated. + @param error `nil` if parsing was successful + @returns The value read from the responseObject. Will be `NO` if the item to be read is not available. + */ ++(BOOL)boolFromResponseDictionary:(id)responseObject + forKey:(NSString*)key + acceptNil:(BOOL)acceptNil + error:(NSError**)error +; + +/** + Gets an `NSDictionary` object from the response object. + @param responseObject The JSON Dictionary + @param key The key of the item of the responseObject to be read + @param acceptNil If set to YES, no error will be given if the item to be read is not available. Otherwise, an NSError is generated. + @param error `nil` if parsing was successful + @returns The dictionary read from the responseObject + */ ++(NSDictionary*)dictionaryFromResponseDictionary:(id)responseObject + forKey:(NSString*)key + acceptNil:(BOOL)acceptNil + error:(NSError**)error; + + +/** + Gets an `NSArray` object from the response object. + @param responseObject The JSON Dictionary + @param key The key of the item of the responseObject to be read + @param acceptNil If set to YES, no error will be given if the item to be read is not available. Otherwise, an NSError is generated. + @param error `nil` if parsing was successful + @returns The array read from the responseObject + */ ++(NSArray*)arrayFromResponseDictionary:(id)responseObject + forKey:(NSString*)key + acceptNil:(BOOL)acceptNil + error:(NSError**)error +; + +/** + Gets an `NSString` object from the response object. + @param responseObject The JSON Dictionary + @param key The key of the item of the responseObject to be read + @param acceptNumber If yes, the string will be generated by invocing -desription on the responseObject if it is kind of an NSNumber. + @param acceptNil If set to YES, no error will be given if the item to be read is not available. Otherwise, an NSError is generated. + @param error `nil` if parsing was successful + @returns The string read from the responseObject + */ ++(NSString*)stringFromResponseDictionary:(id)responseObject + forKey:(NSString*)key + acceptNumber:(BOOL)acceptNumber + acceptNil:(BOOL)acceptNil + error:(NSError**)error +; + +/** + Gets an `NSDate` object from the response object. The JSON data for the `key` may be either an iso8601 date string or a number. In case of a string, the formatting must be `yyyy-MM-dd'T'HHmmssZZZ`; in case of a number it must be a Unix time stamp (since 1970). + @param responseObject The JSON Dictionary + @param key The key of the item of the responseObject to be read + @param acceptNil If set to YES, no error will be given if the item to be read is not available. Otherwise, an NSError is generated. + @param error `nil` if parsing was successful + @returns The date read from the responseObject + */ ++(NSDate*)dateFromResponseDictionary:(id)responseObject + forKey:(NSString*)key + acceptNil:(BOOL)acceptNil + error:(NSError**)error +; + +/** + Gets an `NSData` object from the response object. + @param responseObject The JSON Dictionary + @param key The key of the item of the responseObject to be read + @param acceptNil If set to YES, no error will be given if the item to be read is not available. Otherwise, an NSError is generated. + @param error `nil` if parsing was successful + @returns The data read from the responseObject + */ ++ (NSData*)dataFromResponseDictionary:(NSDictionary*)responseObject + forKey:(NSString*)key + acceptNil:(BOOL)acceptNil + error:(NSError**)error +; + +/** + Gets an `NSDate` object from the response object. + @param responseObject The JSON Dictionary + @param key The key of the item of the responseObject to be read (the value for this key should be time interval since 1970) + @param acceptNil If set to YES, no error will be given if the item to be read is not available. Otherwise, an NSError is generated. + @param error `nil` if parsing was successful + @returns The date read from the responseObject + */ ++(NSDate*)dateWithTimeIntervalFromResponseDictionary:(id)responseObject + forKey:(NSString*)key + acceptNil:(BOOL)acceptNil + error:(NSError**)error +; + +/** + Gets an `NSDate` object from the response object (milliseconds -> seconds). + @param responseObject The JSON Dictionary + @param key The key of the item of the responseObject to be read (the value for this key should be time interval since 1970) + @param acceptNil If set to YES, no error will be given if the item to be read is not available. Otherwise, an NSError is generated. + @param error `nil` if parsing was successful + @returns The date read from the responseObject + */ ++(NSDate*)dateWithMilliSecondsTimeIntervalFromResponseDictionary:(id)responseObject + forKey:(NSString*)key + acceptNil:(BOOL)acceptNil + error:(NSError**)error +; + + +/** + The `NSString` is generated using a predefined `NSDateFormatter`. + + The date formatter is cached after the first invocation. + The date formatter is currently hardcoded to use the locale `en_US_POSIX`and date format `yyyy'-'MM'-'dd'T'HH':'mm':'ssZZZ'`. + TODO: This will likely have to change! + @param date + @returns The formatted date string + */ ++(NSString*)iso8601StringFromDate:(NSDate *)date; + +@end diff --git a/test_data/test_json/Utilities/APIParser/FBEAPIParser.m b/test_data/test_json/Utilities/APIParser/FBEAPIParser.m new file mode 100644 index 0000000..32f6427 --- /dev/null +++ b/test_data/test_json/Utilities/APIParser/FBEAPIParser.m @@ -0,0 +1,590 @@ + +// +// Created by MetaJSONParser. +// Copyright (c) 2013 SinnerSchrader Mobile. All rights reserved. +// + +#import "FBEAPIParser.h" + +NSInteger const kFBEErrorDomain_parser_protocolError = 1; +NSInteger const kFBEErrorDomain_parser_dictionaryExpected = 2; +NSInteger const kFBEErrorDomain_parser_arrayExpected = 3; +NSInteger const kFBEErrorDomain_parser_numberExpected = 4; +NSInteger const kFBEErrorDomain_parser_stringExpected = 5; +NSInteger const kFBEErrorDomain_parser_dateExpected = 6; +NSInteger const kFBEErrorDomain_parser_keyNotFound = 7; +NSInteger const kFBEErrorDomain_parser_indexNotFound = 8; +NSInteger const kFBEErrorDomain_parser_valueIsNull = 9; +NSInteger const kFBEErrorDomain_parser_dataExpected = 10; +NSInteger const kFBEErrorDomain_parser_valueIsNotValid = 11; + +NSString * const kFBEErrorDomain_parser = @"FBEParser"; + +#ifndef FBE_ASSURE_ERROR +#define FBE_ASSURE_ERROR(error) \ +if (!(error)) (error) = (NSError*__autoreleasing*)alloca(sizeof(NSError*)); \ +*(error) = nil; +#endif + +@implementation FBEAPIParser + +#pragma mark - respone parsing + +//date Parsing ++(NSString *)iso8601StringFromDate:(NSDate *)date { + static NSDateFormatter * iso8601DateFormatter; + + // If the date formatters aren't already set up, do that now and cache them + // for subsequence reuse. + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + iso8601DateFormatter = [[NSDateFormatter alloc] init]; + + // TODO: use the system locale! Also, adapt the documentation in the declaration. + NSLocale *enUSPOSIXLocale = [[NSLocale alloc] initWithLocaleIdentifier:@"en_US_POSIX"]; + [iso8601DateFormatter setLocale:enUSPOSIXLocale]; +#if !__has_feature(objc_arc) + [enUSPOSIXLocale release]; +#endif + // !!!: Adapt the documentation if the format string is modified. + [iso8601DateFormatter setDateFormat:@"yyyy'-'MM'-'dd'T'HH':'mm':'ssZZZ'"]; + }); + + if (!date) { + return nil; + } + + return [iso8601DateFormatter stringFromDate:date]; +} + ++(NSDate *)dateFromISO8601String:(NSString *)timeString error:(NSError**)error { + FBE_ASSURE_ERROR(error); + + static NSDateFormatter * iso8601DateFormatter; + + // If the date formatters aren't already set up, do that now and cache them + // for subsequent reuse. + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + iso8601DateFormatter = [[NSDateFormatter alloc] init]; + NSLocale *enUSPOSIXLocale = [[NSLocale alloc] initWithLocaleIdentifier:@"en_US_POSIX"]; + [iso8601DateFormatter setLocale:enUSPOSIXLocale]; +#if !__has_feature(objc_arc) + [enUSPOSIXLocale release]; +#endif + // [iso8601DateFormatter setDateFormat:@"yyyy'-'MM'-'dd'T'HH':'mm':'ss'+00:00'"]; + // [iso8601DateFormatter setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:0]]; + [iso8601DateFormatter setDateFormat:@"yyyy-MM-dd'T'HHmmssZZZ"]; + }); + + if (!timeString) { + return nil; + } + + timeString = [timeString stringByReplacingOccurrencesOfString:@":" withString:@""]; + NSDate *date = [iso8601DateFormatter dateFromString:timeString]; + if (!date) { + *error = [NSError errorWithDomain:kFBEErrorDomain_parser code:kFBEErrorDomain_parser_dateExpected userInfo:nil]; + return nil; + } + + return date; +} + ++(id)objectFromResponseArray:(id)responseObject + atIndex:(NSUInteger)index + acceptNil:(BOOL)acceptNil + error:(NSError**)error { + FBE_ASSURE_ERROR(error); + + if (![responseObject isKindOfClass:[NSArray class]]) + { + *error = [NSError errorWithDomain:kFBEErrorDomain_parser code:kFBEErrorDomain_parser_arrayExpected userInfo:nil]; + return nil; + } + NSArray *responseArray = (NSArray*)responseObject; + + if (index >= [responseArray count]) { + if (!acceptNil) { + *error =[NSError errorWithDomain:kFBEErrorDomain_parser code:kFBEErrorDomain_parser_indexNotFound userInfo:nil]; + } + return nil; + } + + id object = [responseArray objectAtIndex:index]; + if (!object || object == [NSNull null]) { + if (!acceptNil) { + *error =[NSError errorWithDomain:kFBEErrorDomain_parser code:kFBEErrorDomain_parser_valueIsNull userInfo:nil]; + } + return nil; + } + + return object; +} + ++(NSDictionary*)dictionaryFromResponseArray:(id)responseObject + atIndex:(NSUInteger)index + acceptNil:(BOOL)acceptNil + error:(NSError**)error { + FBE_ASSURE_ERROR(error); + + id dictionary = [self objectFromResponseArray:responseObject atIndex:index acceptNil:acceptNil error:error]; + if (*error || !dictionary) + { + // pass unchanged error from objectFromResponseDictionary + return nil; + } + + if (![dictionary isKindOfClass:[NSDictionary class]]) + { + *error = [NSError errorWithDomain:kFBEErrorDomain_parser code:kFBEErrorDomain_parser_dictionaryExpected userInfo:nil]; + return nil; + } + + return (NSDictionary*)dictionary; +} + ++(NSArray*)arrayFromResponseArray:(id)responseObject + atIndex:(NSUInteger)index + acceptNil:(BOOL)acceptNil + error:(NSError**)error { + FBE_ASSURE_ERROR(error); + + id array = [self objectFromResponseArray:responseObject atIndex:index acceptNil:acceptNil error:error]; + + if (*error || !array) + { + // pass unchanged error from objectFromResponseDictionary + return nil; + } + + if (![array isKindOfClass:[NSArray class]]) + { + *error = [NSError errorWithDomain:kFBEErrorDomain_parser code:kFBEErrorDomain_parser_arrayExpected userInfo:nil]; + return nil; + } + + return (NSArray*)array; +} + ++(NSString *)stringFromResponseArray:(id)responseObject + atIndex:(NSUInteger)index + acceptNil:(BOOL)acceptNil + error:(NSError**)error { + FBE_ASSURE_ERROR(error); + + id string = [self objectFromResponseArray:responseObject atIndex:index acceptNil:acceptNil error:error]; + + if (*error || !string) + { + // pass unchanged error from objectFromResponseDictionary + return nil; + } + + if (![string isKindOfClass:[NSString class]]) + { + *error = [NSError errorWithDomain:kFBEErrorDomain_parser code:kFBEErrorDomain_parser_stringExpected userInfo:nil]; + return nil; + } + + return (NSString*)string; +} + ++(NSNumber *)numberFromResponseArray:(id)responseObject + atIndex:(NSUInteger)index + acceptNil:(BOOL)acceptNil + error:(NSError**)error { + FBE_ASSURE_ERROR(error); + + id number = [self objectFromResponseArray:responseObject atIndex:index acceptNil:acceptNil error:error]; + + if (*error || !number) + { + // pass unchanged error from objectFromResponseDictionary + return nil; + } + + if ([number isKindOfClass:[NSString class]]) { + + NSString *numberString = (NSString *)number; +#if !__has_feature(objc_arc) + NSNumberFormatter * formatter = [[[NSNumberFormatter alloc] init] autorelease]; +#else + NSNumberFormatter * formatter = [[NSNumberFormatter alloc] init]; +#endif + [formatter setNumberStyle:NSNumberFormatterNoStyle]; + number = [formatter numberFromString:numberString]; + + } + + if (![number isKindOfClass:[NSNumber class]]) + { + *error = [NSError errorWithDomain:kFBEErrorDomain_parser code:kFBEErrorDomain_parser_numberExpected userInfo:nil]; + return nil; + } + + NSNumber *FBENumber = [NSNumber numberWithLongLong:[number longLongValue]]; + return (NSNumber*)FBENumber; +} + ++(BOOL)boolFromResponseArray:(id)responseObject + atIndex:(NSUInteger)index + acceptNil:(BOOL)acceptNil + error:(NSError**)error { + FBE_ASSURE_ERROR(error); + + NSNumber *number = [self numberFromResponseArray:responseObject atIndex:index acceptNil:acceptNil error:error]; + + if (*error || !number) + { + // pass unchanged error from objectFromResponseDictionary + return NO; + } + + return [number boolValue]; +} + ++(NSDate *)dateWithTimeIntervalFromResponseArray:(id)responseObject + atIndex:(NSUInteger)index + acceptNil:(BOOL)acceptNil + error:(NSError**)error { + FBE_ASSURE_ERROR(error); + + NSNumber *timeInterval = [self numberFromResponseArray:responseObject atIndex:index acceptNil:acceptNil error:error]; + + if (*error || !timeInterval || ![timeInterval isKindOfClass:[NSNumber class]]) + { + // pass unchanged error from stringFromResponseDictionary + *error = [NSError errorWithDomain:kFBEErrorDomain_parser code:kFBEErrorDomain_parser_dateExpected userInfo:nil]; + return nil; + } + + NSDate *date = [NSDate dateWithTimeIntervalSince1970:[timeInterval doubleValue]]; + + return date; +} + ++ (NSData*)dataFromResponseArray:(NSDictionary*)responseObject + atIndex:(NSUInteger)index + acceptNil:(BOOL)acceptNil + error:(NSError**)error +{ + FBE_ASSURE_ERROR(error); + + id data = [self objectFromResponseArray:responseObject atIndex:index acceptNil:acceptNil error:error]; + + if (*error || !data) + { + // pass unchanged error from objectFromResponseDictionary + return nil; + } + + if ([data isKindOfClass:[NSString class]]) { + NSString *dataString = (NSString *)data; + data = [dataString dataUsingEncoding:NSUTF8StringEncoding]; + } + + if (![data isKindOfClass:[NSData class]]) { + *error = [NSError errorWithDomain:kFBEErrorDomain_parser code:kFBEErrorDomain_parser_dataExpected userInfo:nil]; + return nil; + } + + return (NSData*)data; +} + ++(id)objectFromResponseDictionary:(id)responseObject + forKey:(NSString*)key + acceptNil:(BOOL)acceptNil + error:(NSError**)error +{ + FBE_ASSURE_ERROR(error); + + if (![responseObject isKindOfClass:[NSDictionary class]]) + { + *error = [NSError errorWithDomain:kFBEErrorDomain_parser code:kFBEErrorDomain_parser_dictionaryExpected userInfo:nil]; + return nil; + } + NSDictionary *responseDict = responseObject; + + id object = [responseDict objectForKey:key]; + if (!object) { + if (!acceptNil) { + *error =[NSError errorWithDomain:kFBEErrorDomain_parser code:kFBEErrorDomain_parser_keyNotFound userInfo:nil]; + } + return nil; + } + if (object == [NSNull null]) { + if (!acceptNil) { + *error =[NSError errorWithDomain:kFBEErrorDomain_parser code:kFBEErrorDomain_parser_valueIsNull userInfo:nil]; + } + return nil; + } + + return object; +} + ++(NSDictionary*)dictionaryFromResponseDictionary:(id)responseObject + forKey:(NSString*)key + acceptNil:(BOOL)acceptNil + error:(NSError**)error +{ + FBE_ASSURE_ERROR(error); + + id dictionary = [self objectFromResponseDictionary:responseObject + forKey:key + acceptNil:acceptNil + error:error]; + if (*error || !dictionary) + { + // pass unchanged error from objectFromResponseDictionary + return nil; + } + + if (![dictionary isKindOfClass:[NSDictionary class]]) + { + *error = [NSError errorWithDomain:kFBEErrorDomain_parser code:kFBEErrorDomain_parser_dictionaryExpected userInfo:nil]; + return nil; + } + + return (NSDictionary*)dictionary; +} + ++(NSArray*)arrayFromResponseDictionary:(id)responseObject + forKey:(NSString*)key + acceptNil:(BOOL)acceptNil + error:(NSError**)error +{ + FBE_ASSURE_ERROR(error); + + id array = [self objectFromResponseDictionary:responseObject + forKey:key + acceptNil:acceptNil + error:error]; + if (*error || !array) + { + // pass unchanged error from objectFromResponseDictionary + return nil; + } + + if (![array isKindOfClass:[NSArray class]]) + { + *error = [NSError errorWithDomain:kFBEErrorDomain_parser code:kFBEErrorDomain_parser_arrayExpected userInfo:nil]; + return nil; + } + + return (NSArray*)array; +} + ++(NSNumber*)numberFromResponseDictionary:(id)responseObject + forKey:(NSString*)key + acceptNil:(BOOL)acceptNil + error:(NSError**)error +{ + FBE_ASSURE_ERROR(error); + + id number = [self objectFromResponseDictionary:responseObject + forKey:key + acceptNil:acceptNil + error:error]; + if (*error || !number) + { + // pass unchanged error from objectFromResponseDictionary + return nil; + } + + if ([number isKindOfClass:[NSString class]]) { + + NSString *numberString = (NSString *)number; + +#if !__has_feature(objc_arc) + NSNumberFormatter * formatter = [[[NSNumberFormatter alloc] init] autorelease]; +#else + NSNumberFormatter * formatter = [[NSNumberFormatter alloc] init]; +#endif + [formatter setNumberStyle:NSNumberFormatterNoStyle]; + number = [formatter numberFromString:numberString]; + + } + + if (![number isKindOfClass:[NSNumber class]]) + { + *error = [NSError errorWithDomain:kFBEErrorDomain_parser code:kFBEErrorDomain_parser_numberExpected userInfo:nil]; + return nil; + } + + NSNumber *FBENumber = [NSNumber numberWithLongLong:[number longLongValue]]; + return (NSNumber*)FBENumber; +} + ++(BOOL)boolFromResponseDictionary:(id)responseObject + forKey:(NSString*)key + acceptNil:(BOOL)acceptNil + error:(NSError**)error { + FBE_ASSURE_ERROR(error); + + NSNumber *number = [self numberFromResponseDictionary:responseObject + forKey:key + acceptNil:acceptNil + error:error]; + if (*error || !number) + { + // pass unchanged error from objectFromResponseDictionary + return NO; + } + + return [number boolValue]; +} + ++(NSString*)stringFromResponseDictionary:(id)responseObject + forKey:(NSString*)key + acceptNumber:(BOOL)acceptNumber + acceptNil:(BOOL)acceptNil + error:(NSError**)error +{ + FBE_ASSURE_ERROR(error); + + id string = [self objectFromResponseDictionary:responseObject + forKey:key + acceptNil:acceptNil + error:error]; + if (*error || !string) + { + // pass unchanged error from objectFromResponseDictionary + return nil; + } + + if (acceptNumber && [string isKindOfClass:[NSNumber class]]) { + string = [string description]; + } + + if (![string isKindOfClass:[NSString class]]) + { + *error = [NSError errorWithDomain:kFBEErrorDomain_parser code:kFBEErrorDomain_parser_stringExpected userInfo:nil]; + return nil; + } + + return (NSString*)string; +} + ++(NSDate*)dateFromResponseDictionary:(id)responseObject + forKey:(NSString*)key + acceptNil:(BOOL)acceptNil + error:(NSError**)error +{ + FBE_ASSURE_ERROR(error); + + id dateObject = [self stringFromResponseDictionary:responseObject + forKey:key + acceptNumber:YES + acceptNil:acceptNil + error:error]; + if (*error || !dateObject) + { + // pass unchanged error from stringFromResponseDictionary + return nil; + } + + NSDate *date = nil; + if ([dateObject isKindOfClass:[NSString class]]) { + NSString *dateString = (NSString *)dateObject; + date = [self dateFromISO8601String:dateString error:error]; + if (*error) { + return nil; + } + } else { + NSNumber *dateNumber = (NSNumber *)dateObject; + date = [NSDate dateWithTimeIntervalSince1970:[dateNumber longValue]]; + } + + return date; +} + ++ (NSData*)dataFromResponseDictionary:(NSDictionary*)responseObject + forKey:(NSString*)key + acceptNil:(BOOL)acceptNil + error:(NSError**)error +{ + FBE_ASSURE_ERROR(error); + + id data = [self objectFromResponseDictionary:responseObject + forKey:key + acceptNil:acceptNil + error:error]; + if (*error || !data) + { + // pass unchanged error from objectFromResponseDictionary + return nil; + } + + if ([data isKindOfClass:[NSString class]]) { + NSString *dataString = (NSString *)data; + data = [dataString dataUsingEncoding:NSUTF8StringEncoding]; + } + + if (![data isKindOfClass:[NSData class]]) { + *error = [NSError errorWithDomain:kFBEErrorDomain_parser code:kFBEErrorDomain_parser_dataExpected userInfo:nil]; + return nil; + } + + return (NSData*)data; +} + + ++(NSDate*)dateWithTimeIntervalFromResponseDictionary:(id)responseObject + forKey:(NSString*)key + acceptNil:(BOOL)acceptNil + error:(NSError**)error +{ + FBE_ASSURE_ERROR(error); + + NSNumber *timeInterval = [self numberFromResponseDictionary:responseObject + forKey:key + acceptNil:acceptNil + error:error]; + if (!timeInterval && acceptNil) { + return nil; + } + + if (*error || !timeInterval || ![timeInterval isKindOfClass:[NSNumber class]]) + { + // pass unchanged error from stringFromResponseDictionary + *error = [NSError errorWithDomain:kFBEErrorDomain_parser code:kFBEErrorDomain_parser_dateExpected userInfo:nil]; + return nil; + } + + NSDate *date = [NSDate dateWithTimeIntervalSince1970:[timeInterval doubleValue]]; + + return date; +} + ++(NSDate*)dateWithMilliSecondsTimeIntervalFromResponseDictionary:(id)responseObject + forKey:(NSString*)key + acceptNil:(BOOL)acceptNil + error:(NSError**)error +{ + FBE_ASSURE_ERROR(error); + + NSNumber *dateNumber = [self numberFromResponseDictionary:responseObject + forKey:key + acceptNil:acceptNil + error:error]; + if (!dateNumber && acceptNil) { + return nil; + } + + NSNumber *timeInterval = [NSNumber numberWithLongLong:(dateNumber.longLongValue / 1000)]; + + if (*error || !timeInterval || ![timeInterval isKindOfClass:[NSNumber class]]) + { + // pass unchanged error from stringFromResponseDictionary + *error = [NSError errorWithDomain:kFBEErrorDomain_parser code:kFBEErrorDomain_parser_dateExpected userInfo:nil]; + return nil; + } + + NSDate *date = [NSDate dateWithTimeIntervalSince1970:[timeInterval longLongValue]]; + + return date; +} + + +@end diff --git a/test_data/test_json/Utilities/NSString/NSString+RegExValidation.h b/test_data/test_json/Utilities/NSString/NSString+RegExValidation.h new file mode 100644 index 0000000..3d967dc --- /dev/null +++ b/test_data/test_json/Utilities/NSString/NSString+RegExValidation.h @@ -0,0 +1,18 @@ +// +// NSString+RegExValidation.h +// +// Created by MetaJSONParser. +// Copyright (c) 2013 SinnerSchrader Mobile. All rights reserved. + +#import <Foundation/Foundation.h> + +@interface NSString (RegExValidation) + +#define emailRegex @"^[_a-z0-9-]+(\\.[_a-z0-9-]+)*@[a-z0-9-]+(\\.[a-z0-9-]+)*(\\.[a-z]{2,4})$" + +- (NSUInteger) numberOfMatchesWithRegExString:(NSString *)regExString; + +- (BOOL) matchesRegExString:(NSString *)regExString; + +- (BOOL) isValidEmailFormatString; +@end diff --git a/test_data/test_json/Utilities/NSString/NSString+RegExValidation.m b/test_data/test_json/Utilities/NSString/NSString+RegExValidation.m new file mode 100644 index 0000000..41d68dc --- /dev/null +++ b/test_data/test_json/Utilities/NSString/NSString+RegExValidation.m @@ -0,0 +1,32 @@ +// +// NSString+RegExValidation.m +// +// Created by MetaJSONParser. +// Copyright (c) 2013 SinnerSchrader Mobile. All rights reserved. + +#import "NSString+RegExValidation.h" + +@implementation NSString (RegExValidation) + +- (NSUInteger) numberOfMatchesWithRegExString:(NSString *)regExString { + if (regExString == nil || [regExString isKindOfClass:[NSString class]] == NO || regExString.length == 0) { + return 0; + } + NSError *error = nil; + NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:regExString options:NSRegularExpressionCaseInsensitive error:&error]; + if (error) { + NSLog(@"Regular expression match error : %@", error); + return 0; + } + return [regex numberOfMatchesInString:self options:0 range:NSMakeRange(0, self.length)]; +} + +- (BOOL) matchesRegExString:(NSString *)regExString { + return ([self numberOfMatchesWithRegExString:regExString] > 0); +} + +- (BOOL) isValidEmailFormatString { + return [self matchesRegExString:emailRegex]; +} + +@end From 7d6b3c2d87e4dad7bd0c4a3ea135cbfa5010a249 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Franc=CC=A7ois=20Benaiteau?= <francois.benaiteau@gmail.com> Date: Sat, 2 Nov 2013 00:36:42 +0100 Subject: [PATCH 020/149] Cleanup test on test_class.json for obj-c --- ObjectiveCCodeGenerator.py | 19 ------ ObjectiveCCodeGenerator_test.py | 58 +++++++------------ test_data/{schemeObj.p => test_class.p} | 0 .../{ => test_class}/S2MSenderJSONObject.h | 0 .../{ => test_class}/S2MSenderJSONObject.m | 0 .../{ => test_class}/_S2MSenderJSONObject.h | 0 .../{ => test_class}/_S2MSenderJSONObject.m | 0 7 files changed, 21 insertions(+), 56 deletions(-) rename test_data/{schemeObj.p => test_class.p} (100%) rename test_data/{ => test_class}/S2MSenderJSONObject.h (100%) rename test_data/{ => test_class}/S2MSenderJSONObject.m (100%) rename test_data/{ => test_class}/_S2MSenderJSONObject.h (100%) rename test_data/{ => test_class}/_S2MSenderJSONObject.m (100%) diff --git a/ObjectiveCCodeGenerator.py b/ObjectiveCCodeGenerator.py index f5fa058..5eda885 100755 --- a/ObjectiveCCodeGenerator.py +++ b/ObjectiveCCodeGenerator.py @@ -813,22 +813,3 @@ def writeTemplates(self) : self.writeNSStringCategory() self.dirPath = baseDirPath + "/Utilities/APIParser" self.writeAPIParser() - - - - - - - - - - - - - - - - - - - diff --git a/ObjectiveCCodeGenerator_test.py b/ObjectiveCCodeGenerator_test.py index c910216..0bd4f7f 100644 --- a/ObjectiveCCodeGenerator_test.py +++ b/ObjectiveCCodeGenerator_test.py @@ -7,53 +7,37 @@ class TestObjectiveCCodeGenerator(unittest.TestCase): def setUp(self): - print('In setUp()') self.gen = ObjectiveCCodeGenerator() self.gen.dirPath = './src' self.maxDiff = None + default_folder = 'test_data/' + self.test_file_path = default_folder + 'test_class' + + self.scheme_sender_object = pickle.load(open(self.test_file_path + '.p', 'rb')) def tearDown(self): - print('In tearDown()') del self.gen - def test_makeMachineHeader(self): - schemeObject = pickle.load(open('test_data/schemeObj.p', 'rb')) - self.gen.make(schemeObject) - command = "diff src/AbstractInterfaceFiles/_S2MSenderJSONObject.h test_data/_S2MSenderJSONObject.h" - status, output = commands.getstatusoutput(command) - print output - self.assertIs(status,0, "generated header file is different") - - def test_makeMachineSource(self): - schemeObject = pickle.load(open('test_data/schemeObj.p', 'rb')) - self.gen.make(schemeObject) - command = "diff src/AbstractInterfaceFiles/_S2MSenderJSONObject.m test_data/_S2MSenderJSONObject.m" - status, output = commands.getstatusoutput(command) - print output - self.assertIs(status,0, "generated source file is different") - - def test_makeHumanHeader(self): - schemeObject = pickle.load(open('test_data/schemeObj.p', 'rb')) - self.gen.make(schemeObject) - command = "diff src/S2MSenderJSONObject.h test_data/S2MSenderJSONObject.h" - status, output = commands.getstatusoutput(command) - print output - self.assertIs(status,0, "generated human header file is different") - - def test_makeHumanSource(self): - schemeObject = pickle.load(open('test_data/schemeObj.p', 'rb')) - self.gen.make(schemeObject) - command = "diff src/S2MSenderJSONObject.m test_data/S2MSenderJSONObject.m" - status, output = commands.getstatusoutput(command) - print output - self.assertIs(status,0, "generated human source file is different") + def test_human_header_content(self): + result = self.gen.human_header_content(self.scheme_sender_object) + self.assert_content_file(self.test_file_path + "/S2MSenderJSONObject.h", result) + + def test_human_source_content(self): + result = self.gen.human_source_content(self.scheme_sender_object) + self.assert_content_file(self.test_file_path + "/S2MSenderJSONObject.m", result) + + def test_machine_source_content(self): + result = self.gen.machine_source_content(self.scheme_sender_object) + self.assert_content_file(self.test_file_path + "/_S2MSenderJSONObject.m", result) def test_machine_header_content(self): - schemeObject = pickle.load(open('test_data/schemeObj.p', 'rb')) - with open("test_data/_S2MSenderJSONObject.h", 'r') as content_file: + result = self.gen.machine_header_content(self.scheme_sender_object) + self.assert_content_file(self.test_file_path + "/_S2MSenderJSONObject.h", result) + + def assert_content_file(self, filename, content): + with open(filename, 'r') as content_file: expected_result = content_file.read() - result = self.gen.machine_header_content(schemeObject) - self.assertMultiLineEqual(result, expected_result) + self.assertMultiLineEqual(content, expected_result) if __name__ == '__main__': unittest.main() diff --git a/test_data/schemeObj.p b/test_data/test_class.p similarity index 100% rename from test_data/schemeObj.p rename to test_data/test_class.p diff --git a/test_data/S2MSenderJSONObject.h b/test_data/test_class/S2MSenderJSONObject.h similarity index 100% rename from test_data/S2MSenderJSONObject.h rename to test_data/test_class/S2MSenderJSONObject.h diff --git a/test_data/S2MSenderJSONObject.m b/test_data/test_class/S2MSenderJSONObject.m similarity index 100% rename from test_data/S2MSenderJSONObject.m rename to test_data/test_class/S2MSenderJSONObject.m diff --git a/test_data/_S2MSenderJSONObject.h b/test_data/test_class/_S2MSenderJSONObject.h similarity index 100% rename from test_data/_S2MSenderJSONObject.h rename to test_data/test_class/_S2MSenderJSONObject.h diff --git a/test_data/_S2MSenderJSONObject.m b/test_data/test_class/_S2MSenderJSONObject.m similarity index 100% rename from test_data/_S2MSenderJSONObject.m rename to test_data/test_class/_S2MSenderJSONObject.m From 7173371305131795bbe714b0a6b91dffe40e3a5a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Franc=CC=A7ois=20Benaiteau?= <francois.benaiteau@gmail.com> Date: Sat, 2 Nov 2013 01:22:42 +0100 Subject: [PATCH 021/149] ADD dump object for test.json --- test_data/test_json.p | 155 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 155 insertions(+) create mode 100644 test_data/test_json.p diff --git a/test_data/test_json.p b/test_data/test_json.p new file mode 100644 index 0000000..995e096 --- /dev/null +++ b/test_data/test_json.p @@ -0,0 +1,155 @@ +(iJSONScheme +JSONScheme +p0 +(dp1 +S'type_description' +p2 +S'test description of user type.' +p3 +sS'type_name' +p4 +S'user' +p5 +sS'projectPrefix' +p6 +S'FBE' +p7 +sS'base_type' +p8 +S'person' +p9 +sS'base_type_list' +p10 +(lp11 +sS'objectSuffix' +p12 +S'Suffix' +p13 +sS'props' +p14 +(lp15 +(iJSONScheme +JSONScheme +p16 +(dp17 +S'regex' +p18 +S'[A-Z0-9._%+-]+@(?:[A-Z0-9-]+\\.)+[A-Z]{2,4}' +p19 +sS'domain' +p20 +(lp21 +S'ROOT' +p22 +ag5 +asg4 +S'email' +p23 +sg6 +g7 +sg8 +S'string' +p24 +sg10 +(lp25 +sg12 +g13 +sba(iJSONScheme +JSONScheme +p26 +(dp27 +g20 +(lp28 +g22 +ag5 +asS'required' +p29 +I1 +sg4 +S'family' +p30 +sg6 +g7 +sg8 +S'array' +p31 +sg10 +(lp32 +sg12 +g13 +sS'sub_type' +p33 +(lp34 +S'person' +p35 +aS'userAddress' +p36 +aS'string' +p37 +asba(iJSONScheme +JSONScheme +p38 +(dp39 +g20 +(lp40 +g22 +ag5 +asg29 +I1 +sg4 +S'userID' +p41 +sg6 +g7 +sg8 +S'string' +p42 +sg10 +(lp43 +sg12 +g13 +sba(iJSONScheme +JSONScheme +p44 +(dp45 +g20 +(lp46 +g22 +ag5 +asg29 +I1 +sg4 +S'address' +p47 +sg6 +g7 +sg8 +S'userAddress' +p48 +sg10 +(lp49 +sg12 +g13 +sba(iJSONScheme +JSONScheme +p50 +(dp51 +g20 +(lp52 +g22 +ag5 +asg29 +I1 +sg4 +S'session' +p53 +sg6 +g7 +sg8 +S'mySession' +p54 +sg10 +(lp55 +sg12 +g13 +sbasb. \ No newline at end of file From 1aabcfb5e50d4248f130c4dfbcf691c9afd6181e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Franc=CC=A7ois=20Benaiteau?= <francois.benaiteau@gmail.com> Date: Sat, 2 Nov 2013 01:23:24 +0100 Subject: [PATCH 022/149] Refactor tests to reuse for test.json --- ObjectiveCCodeGenerator_test.py | 79 +++++++++++++++++++-------------- 1 file changed, 46 insertions(+), 33 deletions(-) diff --git a/ObjectiveCCodeGenerator_test.py b/ObjectiveCCodeGenerator_test.py index 0bd4f7f..9a539eb 100644 --- a/ObjectiveCCodeGenerator_test.py +++ b/ObjectiveCCodeGenerator_test.py @@ -3,41 +3,54 @@ import pickle import unittest -import commands + class TestObjectiveCCodeGenerator(unittest.TestCase): - def setUp(self): - self.gen = ObjectiveCCodeGenerator() - self.gen.dirPath = './src' - self.maxDiff = None - default_folder = 'test_data/' - self.test_file_path = default_folder + 'test_class' - - self.scheme_sender_object = pickle.load(open(self.test_file_path + '.p', 'rb')) - - def tearDown(self): - del self.gen - - def test_human_header_content(self): - result = self.gen.human_header_content(self.scheme_sender_object) - self.assert_content_file(self.test_file_path + "/S2MSenderJSONObject.h", result) - - def test_human_source_content(self): - result = self.gen.human_source_content(self.scheme_sender_object) - self.assert_content_file(self.test_file_path + "/S2MSenderJSONObject.m", result) - - def test_machine_source_content(self): - result = self.gen.machine_source_content(self.scheme_sender_object) - self.assert_content_file(self.test_file_path + "/_S2MSenderJSONObject.m", result) - - def test_machine_header_content(self): - result = self.gen.machine_header_content(self.scheme_sender_object) - self.assert_content_file(self.test_file_path + "/_S2MSenderJSONObject.h", result) - - def assert_content_file(self, filename, content): - with open(filename, 'r') as content_file: - expected_result = content_file.read() - self.assertMultiLineEqual(content, expected_result) + def setUp(self): + self.gen = ObjectiveCCodeGenerator() + self.gen.dirPath = './src' + self.maxDiff = None + self.default_folder = 'test_data/' + + def tearDown(self): + del self.gen + + def assert_content_file(self, filename, content): + with open(filename, 'r') as content_file: + expected_result = content_file.read() + self.assertMultiLineEqual(content, expected_result) + +class TestSampleTestClassCase(TestObjectiveCCodeGenerator): + def setUp(self): + super(TestSampleTestClassCase, self).setUp() + self.test_file_path = self.default_folder + 'test_class' + self.scheme_object = pickle.load(open(self.test_file_path + '.p', 'rb')) + + + def test_human_header_content(self): + result = self.gen.human_header_content(self.scheme_object) + self.assert_content_file(self.test_file_path + "/S2MSenderJSONObject.h", result) + + def test_human_source_content(self): + result = self.gen.human_source_content(self.scheme_object) + self.assert_content_file(self.test_file_path + "/S2MSenderJSONObject.m", result) + + def test_machine_source_content(self): + result = self.gen.machine_source_content(self.scheme_object) + self.assert_content_file(self.test_file_path + "/_S2MSenderJSONObject.m", result) + + def test_machine_header_content(self): + result = self.gen.machine_header_content(self.scheme_object) + self.assert_content_file(self.test_file_path + "/_S2MSenderJSONObject.h", result) + +class TestSampleTestCase(TestObjectiveCCodeGenerator): + def setUp(self): + super(TestSampleTestCase, self).setUp() + self.test_file_path = self.default_folder + 'test_json' + self.scheme_object = pickle.load(open(self.test_file_path + '.p', 'rb')) + + def test_machine_source_content(self): + self.gen.make(self.scheme_object) if __name__ == '__main__': unittest.main() From 89924c21f0d3346310722e6008f5cea352753307 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Franc=CC=A7ois=20Benaiteau?= <francois.benaiteau@sinnerschrader-mobile.com> Date: Tue, 15 Apr 2014 18:46:19 +0200 Subject: [PATCH 023/149] add notes about development --- Development.md | 15 +++++++++++++++ 1 file changed, 15 insertions(+) create mode 100644 Development.md diff --git a/Development.md b/Development.md new file mode 100644 index 0000000..507bbce --- /dev/null +++ b/Development.md @@ -0,0 +1,15 @@ +# Tools to develop metaJSON + +MetaJSON has now some dependencies to be developed, in particular to be tested. There are listed in a `requirements.txt`. + +``` +sudo easy_install pip +sudo pip install -r requirements.txt +``` + + +## Run Tests + +`nosetests` will all the tests at the root of repo. +`nosetests <filename>` run only this test file. +`nosetests -s` run tests with output From 63ea444e120ec564ffcda28992f440bae14dfcee Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Franc=CC=A7ois=20Benaiteau?= <francois.benaiteau@sinnerschrader-mobile.com> Date: Tue, 15 Apr 2014 18:46:46 +0200 Subject: [PATCH 024/149] add requirements for development --- requirements.txt | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 requirements.txt diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..3cf4c2b --- /dev/null +++ b/requirements.txt @@ -0,0 +1,2 @@ +nose +pystache From 8195cb9b99b689d4b36bdb1e455d940bbc8a7656 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Franc=CC=A7ois=20Benaiteau?= <francois.benaiteau@sinnerschrader-mobile.com> Date: Tue, 15 Apr 2014 18:47:00 +0200 Subject: [PATCH 025/149] add sample test for mustache --- mustache_test.py | 34 ++++++++ templates/machine.m.mustache | 159 +++++++++++++++++++++++++++++++++++ 2 files changed, 193 insertions(+) create mode 100644 mustache_test.py create mode 100644 templates/machine.m.mustache diff --git a/mustache_test.py b/mustache_test.py new file mode 100644 index 0000000..f2be7f6 --- /dev/null +++ b/mustache_test.py @@ -0,0 +1,34 @@ +import unittest + +import datetime +import time +import os +import sys +from pystache import Renderer + +# run nosetests -s mustache_test.py +class TestMustache(unittest.TestCase): + + def assert_content_file(self, filename, content): + with open(filename, 'r') as content_file: + expected_result = content_file.read() + self.assertMultiLineEqual(content, expected_result) + + def test_mustache_machine_m(self): + templateFile = open(self.template_file_path("machine.m.mustache"), "r") + today = datetime.date.fromtimestamp(time.time()) + + hashParams = {"date": str(today.year), "machineClassName": "_MyObject", "projectPrefix": "S2M", "humanClassName": "MyObject", "variableName": ""} + + result = Renderer().render(templateFile.read(), hashParams) + print result + # self.assert_content_file(self.test_file_path + "/_S2MSenderJSONObject.h", result) + + def template_file_path(self, filename) : + templatePath = os.path.realpath( __file__ ) + templatePath = templatePath.replace(os.path.basename( __file__ ), 'templates') + return os.path.join(templatePath, filename) + + +if __name__ == '__main__': + unittest.main() diff --git a/templates/machine.m.mustache b/templates/machine.m.mustache new file mode 100644 index 0000000..89b10e3 --- /dev/null +++ b/templates/machine.m.mustache @@ -0,0 +1,159 @@ +// +// {{machineClassName}}.m +// +// Created by MetaJSONParser. +// Copyright (c) {{date}} SinnerSchrader Mobile. All rights reserved. + +#import "{{projectPrefix}}APIParser.h" +#import "NSString+RegExValidation.h" +#import "{{humanClassName}}.h" + + +@implementation {{machineClassName}} + +#pragma mark - factory + ++ ({{humanClassName}} *){{variableName}}WithDictionary:(NSDictionary *)dic withError:(NSError **)error { + return [[{{humanClassName}} alloc] initWithDictionary:dic withError:error]; +} + + +#pragma mark - initialize +- (id)initWithDictionary:(NSDictionary *)dic withError:(NSError **)error { + self = [super initWithDictionary:dic withError:error]; + if (self) { + {{#numberProperties}} + self.{{varName}} = [{{projectPrefix}}APIParser numberFromResponseDictionary:dic forKey:@"{{type_name}}" acceptNil:{{#required}}NO{{/required}}{{^required}}YES{{/required}} error:error]; + if (*error) { + return self; + } + {{/numberProperties}} + {{#stringProperties}} + self.{{varName}} = [{{projectPrefix}}APIParser numberFromResponseDictionary:dic forKey:@"{{type_name}}" acceptNumber:YES acceptNil:{{#required}}NO{{/required}}{{^required}}YES{{/required}} error:error]; + {{#regex}} + if (self.{{varName}} && [self.{{varName}} matchesRegExString:@"{{value}}"] == NO) { + NSDictionary *userInfo = @{@"propertyName" : @"{{varName}}", + @"key" : @"{{type_name}}", + @"reason" : @"validation error", + @"objectClass" : NSStringFromClass([self class])}; + *error = [NSError errorWithDomain:kEGMErrorDomain_parser code:kEGMErrorDomain_parser_valueIsNotValid userInfo:userInfo]; + NSLog(@"%@", *error); + return self; + } + {{/regex}} + {{#maxLength}} + if (self.{{varName}}.length > {{value}}) { + NSDictionary *userInfo = @{@"propertyName" : @"{{varName}}", + @"key" : @"{{type_name}}", + @"reason" : @"max length validation error", + @"objectClass" : NSStringFromClass([self class])}; + *error = [NSError errorWithDomain:kEGMErrorDomain_parser code:kEGMErrorDomain_parser_valueIsNotValid userInfo:userInfo]; + NSLog(@"%@", *error); + return self; + } + {{/maxLength}} + {{#minLength}} + if (self.{{varName}}.length < {{value}}) { + NSDictionary *userInfo = @{@"propertyName" : @"{{varName}}", + @"key" : @"{{type_name}}", + @"reason" : @"min length validation error", + @"objectClass" : NSStringFromClass([self class])}; + *error = [NSError errorWithDomain:kEGMErrorDomain_parser code:kEGMErrorDomain_parser_valueIsNotValid userInfo:userInfo]; + NSLog(@"%@", *error); + return self; + } + {{/minLength}} + if (*error) { + return self; + } + {{/stringProperties}} + {{#booleanProperties}} + {{/booleanProperties}} + {{#dataProperties}} + {{/dataProperties}} + {{#dateProperties}} + {{/dateProperties}} + {{#msDateProperties}} + {{/msDateProperties}} + {{#arrayProperties}} + {{/arrayProperties}} + {{#objectProperties}} + {{/objectProperties}} + {{#undefinedProperties}} + {{/undefinedProperties}} + } + return self; +} + + +#pragma mark - getter + +#pragma mark - NSCoding +- (void)encodeWithCoder:(NSCoder*)coder { + [super encodeWithCoder:coder]; + {{#numberProperties}} + {{/numberProperties}} + {{#stringProperties}} + {{/stringProperties}} + {{#booleanProperties}} + {{/booleanProperties}} + {{#dataProperties}} + {{/dataProperties}} + {{#dateProperties}} + {{/dateProperties}} + {{#msDateProperties}} + {{/msDateProperties}} + {{#arrayProperties}} + {{/arrayProperties}} + {{#objectProperties}} + {{/objectProperties}} + {{#undefinedProperties}} + {{/undefinedProperties}} +} +- (id)initWithCoder:(NSCoder *)coder { + self = [super initWithCoder:coder]; + {{#numberProperties}} + {{/numberProperties}} + {{#stringProperties}} + {{/stringProperties}} + {{#booleanProperties}} + {{/booleanProperties}} + {{#dataProperties}} + {{/dataProperties}} + {{#dateProperties}} + {{/dateProperties}} + {{#msDateProperties}} + {{/msDateProperties}} + {{#arrayProperties}} + {{/arrayProperties}} + {{#objectProperties}} + {{/objectProperties}} + {{#undefinedProperties}} + {{/undefinedProperties}} + return self; +} + +#pragma mark - Object Info +- (NSDictionary *)propertyDictionary { + NSMutableDictionary *dic = [[super propertyDictionary] mutableCopy]; + {{#numberProperties}} + {{/numberProperties}} + {{#stringProperties}} + {{/stringProperties}} + {{#booleanProperties}} + {{/booleanProperties}} + {{#dataProperties}} + {{/dataProperties}} + {{#dateProperties}} + {{/dateProperties}} + {{#msDateProperties}} + {{/msDateProperties}} + {{#arrayProperties}} + {{/arrayProperties}} + {{#objectProperties}} + {{/objectProperties}} + {{#undefinedProperties}} + {{/undefinedProperties}} + return dic; +} +@end From 15d2321b07540457b7cfa9442678c93e5f8ff5f9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Franc=CC=A7ois=20Benaiteau?= <francois.benaiteau@sinnerschrader-mobile.com> Date: Wed, 16 Apr 2014 11:06:17 +0200 Subject: [PATCH 026/149] update template and test --- mustache_test.py | 8 +- templates/machine.m.mustache | 256 ++++++++++++++++++----------------- 2 files changed, 140 insertions(+), 124 deletions(-) diff --git a/mustache_test.py b/mustache_test.py index f2be7f6..ccf84c7 100644 --- a/mustache_test.py +++ b/mustache_test.py @@ -18,7 +18,13 @@ def test_mustache_machine_m(self): templateFile = open(self.template_file_path("machine.m.mustache"), "r") today = datetime.date.fromtimestamp(time.time()) - hashParams = {"date": str(today.year), "machineClassName": "_MyObject", "projectPrefix": "S2M", "humanClassName": "MyObject", "variableName": ""} + idProp = {'varName': 's2mId', 'name': 'id'} + firstName = {'varName': 'firstName', 'name': 'firstName'} + myNumber = {'varName': 'myNumber', 'name': 'myNumber'} + + stringProperties = [idProp, firstName] + numberProperties = [myNumber] + hashParams = {"date": str(today.year), "machineClassName": "_MyObject", "projectPrefix": "S2M", "humanClassName": "MyObject", "variableName": "myObject", "stringProperties": stringProperties, 'numberProperties': numberProperties} result = Renderer().render(templateFile.read(), hashParams) print result diff --git a/templates/machine.m.mustache b/templates/machine.m.mustache index 89b10e3..11aa14d 100644 --- a/templates/machine.m.mustache +++ b/templates/machine.m.mustache @@ -14,75 +14,75 @@ #pragma mark - factory + ({{humanClassName}} *){{variableName}}WithDictionary:(NSDictionary *)dic withError:(NSError **)error { - return [[{{humanClassName}} alloc] initWithDictionary:dic withError:error]; + return [[{{humanClassName}} alloc] initWithDictionary:dic withError:error]; } #pragma mark - initialize - (id)initWithDictionary:(NSDictionary *)dic withError:(NSError **)error { - self = [super initWithDictionary:dic withError:error]; - if (self) { - {{#numberProperties}} - self.{{varName}} = [{{projectPrefix}}APIParser numberFromResponseDictionary:dic forKey:@"{{type_name}}" acceptNil:{{#required}}NO{{/required}}{{^required}}YES{{/required}} error:error]; - if (*error) { - return self; - } - {{/numberProperties}} - {{#stringProperties}} - self.{{varName}} = [{{projectPrefix}}APIParser numberFromResponseDictionary:dic forKey:@"{{type_name}}" acceptNumber:YES acceptNil:{{#required}}NO{{/required}}{{^required}}YES{{/required}} error:error]; - {{#regex}} - if (self.{{varName}} && [self.{{varName}} matchesRegExString:@"{{value}}"] == NO) { - NSDictionary *userInfo = @{@"propertyName" : @"{{varName}}", - @"key" : @"{{type_name}}", - @"reason" : @"validation error", - @"objectClass" : NSStringFromClass([self class])}; - *error = [NSError errorWithDomain:kEGMErrorDomain_parser code:kEGMErrorDomain_parser_valueIsNotValid userInfo:userInfo]; - NSLog(@"%@", *error); - return self; - } - {{/regex}} - {{#maxLength}} - if (self.{{varName}}.length > {{value}}) { - NSDictionary *userInfo = @{@"propertyName" : @"{{varName}}", - @"key" : @"{{type_name}}", - @"reason" : @"max length validation error", - @"objectClass" : NSStringFromClass([self class])}; - *error = [NSError errorWithDomain:kEGMErrorDomain_parser code:kEGMErrorDomain_parser_valueIsNotValid userInfo:userInfo]; - NSLog(@"%@", *error); - return self; - } - {{/maxLength}} - {{#minLength}} - if (self.{{varName}}.length < {{value}}) { - NSDictionary *userInfo = @{@"propertyName" : @"{{varName}}", - @"key" : @"{{type_name}}", - @"reason" : @"min length validation error", - @"objectClass" : NSStringFromClass([self class])}; - *error = [NSError errorWithDomain:kEGMErrorDomain_parser code:kEGMErrorDomain_parser_valueIsNotValid userInfo:userInfo]; - NSLog(@"%@", *error); - return self; - } - {{/minLength}} - if (*error) { - return self; - } - {{/stringProperties}} - {{#booleanProperties}} - {{/booleanProperties}} - {{#dataProperties}} - {{/dataProperties}} - {{#dateProperties}} - {{/dateProperties}} - {{#msDateProperties}} - {{/msDateProperties}} - {{#arrayProperties}} - {{/arrayProperties}} - {{#objectProperties}} - {{/objectProperties}} - {{#undefinedProperties}} - {{/undefinedProperties}} - } - return self; + self = [super initWithDictionary:dic withError:error]; + if (self) { + {{#numberProperties}} + self.{{varName}} = [{{projectPrefix}}APIParser numberFromResponseDictionary:dic forKey:@"{{name}}" acceptNil:{{#required}}NO{{/required}}{{^required}}YES{{/required}} error:error]; + if (*error) { + return self; + } + {{/numberProperties}} + {{#stringProperties}} + self.{{varName}} = [{{projectPrefix}}APIParser numberFromResponseDictionary:dic forKey:@"{{name}}" acceptNumber:YES acceptNil:{{#required}}NO{{/required}}{{^required}}YES{{/required}} error:error]; + {{#regex}} + if (self.{{varName}} && [self.{{varName}} matchesRegExString:@"{{value}}"] == NO) { + NSDictionary *userInfo = @{@"propertyName" : @"{{varName}}", + @"key" : @"{{name}}", + @"reason" : @"validation error", + @"objectClass" : NSStringFromClass([self class])}; + *error = [NSError errorWithDomain:kEGMErrorDomain_parser code:kEGMErrorDomain_parser_valueIsNotValid userInfo:userInfo]; + NSLog(@"%@", *error); + return self; + } + {{/regex}} + {{#maxLength}} + if (self.{{varName}}.length > {{value}}) { + NSDictionary *userInfo = @{@"propertyName" : @"{{varName}}", + @"key" : @"{{name}}", + @"reason" : @"max length validation error", + @"objectClass" : NSStringFromClass([self class])}; + *error = [NSError errorWithDomain:kEGMErrorDomain_parser code:kEGMErrorDomain_parser_valueIsNotValid userInfo:userInfo]; + NSLog(@"%@", *error); + return self; + } + {{/maxLength}} + {{#minLength}} + if (self.{{varName}}.length < {{value}}) { + NSDictionary *userInfo = @{@"propertyName" : @"{{varName}}", + @"key" : @"{{name}}", + @"reason" : @"min length validation error", + @"objectClass" : NSStringFromClass([self class])}; + *error = [NSError errorWithDomain:kEGMErrorDomain_parser code:kEGMErrorDomain_parser_valueIsNotValid userInfo:userInfo]; + NSLog(@"%@", *error); + return self; + } + {{/minLength}} + if (*error) { + return self; + } + {{/stringProperties}} + {{#booleanProperties}} + {{/booleanProperties}} + {{#dataProperties}} + {{/dataProperties}} + {{#dateProperties}} + {{/dateProperties}} + {{#msDateProperties}} + {{/msDateProperties}} + {{#arrayProperties}} + {{/arrayProperties}} + {{#objectProperties}} + {{/objectProperties}} + {{#undefinedProperties}} + {{/undefinedProperties}} + } + return self; } @@ -90,70 +90,80 @@ #pragma mark - NSCoding - (void)encodeWithCoder:(NSCoder*)coder { - [super encodeWithCoder:coder]; - {{#numberProperties}} - {{/numberProperties}} - {{#stringProperties}} - {{/stringProperties}} - {{#booleanProperties}} - {{/booleanProperties}} - {{#dataProperties}} - {{/dataProperties}} - {{#dateProperties}} - {{/dateProperties}} - {{#msDateProperties}} - {{/msDateProperties}} - {{#arrayProperties}} - {{/arrayProperties}} - {{#objectProperties}} - {{/objectProperties}} - {{#undefinedProperties}} - {{/undefinedProperties}} + [super encodeWithCoder:coder]; + {{#numberProperties}} + [coder encodeObject:{{varName}} forKey:@"{{name}}"]; + {{/numberProperties}} + {{#stringProperties}} + [coder encodeObject:{{varName}} forKey:@"{{name}}"]; + {{/stringProperties}} + {{#booleanProperties}} + {{/booleanProperties}} + {{#dataProperties}} + {{/dataProperties}} + {{#dateProperties}} + {{/dateProperties}} + {{#msDateProperties}} + {{/msDateProperties}} + {{#arrayProperties}} + {{/arrayProperties}} + {{#objectProperties}} + {{/objectProperties}} + {{#undefinedProperties}} + {{/undefinedProperties}} } - (id)initWithCoder:(NSCoder *)coder { - self = [super initWithCoder:coder]; - {{#numberProperties}} - {{/numberProperties}} - {{#stringProperties}} - {{/stringProperties}} - {{#booleanProperties}} - {{/booleanProperties}} - {{#dataProperties}} - {{/dataProperties}} - {{#dateProperties}} - {{/dateProperties}} - {{#msDateProperties}} - {{/msDateProperties}} - {{#arrayProperties}} - {{/arrayProperties}} - {{#objectProperties}} - {{/objectProperties}} - {{#undefinedProperties}} - {{/undefinedProperties}} - return self; + self = [super initWithCoder:coder]; + {{#numberProperties}} + self.{{varName}} = [coder decodeObjectForKey:@"{{name}}"]; + {{/numberProperties}} + {{#stringProperties}} + self.{{varName}} = [coder decodeObjectForKey:@"{{name}}"]; + {{/stringProperties}} + {{#booleanProperties}} + {{/booleanProperties}} + {{#dataProperties}} + {{/dataProperties}} + {{#dateProperties}} + {{/dateProperties}} + {{#msDateProperties}} + {{/msDateProperties}} + {{#arrayProperties}} + {{/arrayProperties}} + {{#objectProperties}} + {{/objectProperties}} + {{#undefinedProperties}} + {{/undefinedProperties}} + return self; } #pragma mark - Object Info - (NSDictionary *)propertyDictionary { - NSMutableDictionary *dic = [[super propertyDictionary] mutableCopy]; - {{#numberProperties}} - {{/numberProperties}} - {{#stringProperties}} - {{/stringProperties}} - {{#booleanProperties}} - {{/booleanProperties}} - {{#dataProperties}} - {{/dataProperties}} - {{#dateProperties}} - {{/dateProperties}} - {{#msDateProperties}} - {{/msDateProperties}} - {{#arrayProperties}} - {{/arrayProperties}} - {{#objectProperties}} - {{/objectProperties}} - {{#undefinedProperties}} - {{/undefinedProperties}} - return dic; + NSMutableDictionary *dic = [[super propertyDictionary] mutableCopy]; + {{#numberProperties}} + if (self.{{varName}}) { + [dic setObject:self.{{varName}} forKey:@"{{name}}"]; + } + {{/numberProperties}} + {{#stringProperties}} + if (self.{{varName}}) { + [dic setObject:self.{{varName}} forKey:@"{{name}}"]; + } + {{/stringProperties}} + {{#booleanProperties}} + {{/booleanProperties}} + {{#dataProperties}} + {{/dataProperties}} + {{#dateProperties}} + {{/dateProperties}} + {{#msDateProperties}} + {{/msDateProperties}} + {{#arrayProperties}} + {{/arrayProperties}} + {{#objectProperties}} + {{/objectProperties}} + {{#undefinedProperties}} + {{/undefinedProperties}} + return dic; } @end From 1fd6cd0164b9cc166293f22f2c4fcb475e8031fa Mon Sep 17 00:00:00 2001 From: Park Sanggeon <sanggeon.park@sinnerschrader-mobile.com> Date: Wed, 16 Apr 2014 11:39:48 +0200 Subject: [PATCH 027/149] add handling methods --- templates/machine.m.mustache | 67 ++++++++++++++++++++++++++++++++++-- 1 file changed, 65 insertions(+), 2 deletions(-) diff --git a/templates/machine.m.mustache b/templates/machine.m.mustache index 89b10e3..83e214a 100644 --- a/templates/machine.m.mustache +++ b/templates/machine.m.mustache @@ -85,68 +85,124 @@ return self; } - +{{#baseObjectType}} +#pargma mark - clone +-(instancetype) clone +{ + NSData *archivedData = [NSKeyedArchiver archivedDataWithRootObject:self]; + typeof(self) clone = [NSKeyedUnarchiver unarchiveObjectWithData:archivedData]; + return clone; +} +{{/baseObjectType}} #pragma mark - getter +{{#arrayProperties}} +{{/arrayProperties}} + +{{#undefinedProperties}} +{{/undefinedProperties}} + #pragma mark - NSCoding - (void)encodeWithCoder:(NSCoder*)coder { [super encodeWithCoder:coder]; {{#numberProperties}} + [coder encodeObject:self.{{varName}} forKey:@"{{name}}"]; {{/numberProperties}} {{#stringProperties}} + [coder encodeObject:self.{{varName}} forKey:@"{{name}}"]; {{/stringProperties}} {{#booleanProperties}} + [coder encodeBool:self.{{varName}} forKey:@"{{name}}"]; {{/booleanProperties}} {{#dataProperties}} + [coder encodeObject:self.{{varName}} forKey:@"{{name}}"]; {{/dataProperties}} {{#dateProperties}} + [coder encodeObject:self.{{varName}} forKey:@"{{name}}"]; {{/dateProperties}} {{#msDateProperties}} + [coder encodeObject:self.{{varName}} forKey:@"{{name}}"]; {{/msDateProperties}} {{#arrayProperties}} + [coder encodeObject:self.{{varName}} forKey:@"{{name}}"]; {{/arrayProperties}} {{#objectProperties}} + [coder encodeObject:self.{{varName}} forKey:@"{{name}}"]; {{/objectProperties}} {{#undefinedProperties}} + [coder encodeObject:self.{{varName}} forKey:@"{{name}}"]; {{/undefinedProperties}} } + - (id)initWithCoder:(NSCoder *)coder { self = [super initWithCoder:coder]; {{#numberProperties}} + self.{{varName}} = [coder decodeObjectForKey:@"{{name}}"]; {{/numberProperties}} {{#stringProperties}} + self.{{varName}} = [coder decodeObjectForKey:@"{{name}}"]; {{/stringProperties}} {{#booleanProperties}} + self.{{varName}} = [coder decodeBoolForKey:@"{{name}}"]; {{/booleanProperties}} {{#dataProperties}} + self.{{varName}} = [coder decodeObjectForKey:@"{{name}}"]; {{/dataProperties}} {{#dateProperties}} + self.{{varName}} = [coder decodeObjectForKey:@"{{name}}"]; {{/dateProperties}} {{#msDateProperties}} + self.{{varName}} = [coder decodeObjectForKey:@"{{name}}"]; {{/msDateProperties}} {{#arrayProperties}} + self.{{varName}} = [coder decodeObjectForKey:@"{{name}}"]; {{/arrayProperties}} {{#objectProperties}} + self.{{varName}} = [coder decodeObjectForKey:@"{{name}}"]; {{/objectProperties}} {{#undefinedProperties}} + self.{{varName}} = [coder decodeObjectForKey:@"{{name}}"]; {{/undefinedProperties}} return self; } #pragma mark - Object Info - (NSDictionary *)propertyDictionary { + {{#baseObjectType}} NSMutableDictionary *dic = [[super propertyDictionary] mutableCopy]; + {{/baseObjectType}} + {{^baseObjectType}} + NSMutableDictionary *dic = [[NSMutableDictionary alloc] init]; + {{/baseObjectType}} {{#numberProperties}} + if (self.{{varName}}) { + [dic setObject:self.{{varName}} forKey:@"{{name}}"]; + } {{/numberProperties}} {{#stringProperties}} + if (self.{{varName}}) { + [dic setObject:self.{{varName}} forKey:@"{{name}}"]; + } {{/stringProperties}} {{#booleanProperties}} + if (self.{{varName}}) { + [dic setObject:[NSNumber numberWithBool:self.{{varName}}] forKey:@"{{name}}"]; + } {{/booleanProperties}} {{#dataProperties}} {{/dataProperties}} {{#dateProperties}} {{/dateProperties}} - {{#msDateProperties}} + {{#msDateProperties}} + if (self.{{varName}}) { + NSNumber* number = @([self.lastModificationTimestamp timeIntervalSince1970] * 1000); + NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init]; + [formatter setNumberStyle:NSNumberFormatterNoStyle]; + [formatter setNegativeFormat:@"0"]; + NSString *value = [formatter stringFromNumber:number]; + NSNumber *convertedNumber = [formatter numberFromString:value]; + [dic setObject:convertedNumber forKey:@"{{name}}"]; + } {{/msDateProperties}} {{#arrayProperties}} {{/arrayProperties}} @@ -156,4 +212,11 @@ {{/undefinedProperties}} return dic; } + +{{#baseObjectType}} +- (NSString *)description +{ + return [[self propertyDictionary] description]; +} +{{/baseObjectType}} @end From 22aa9204ed08c7736f211244010d66a6f5dbc5cf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Franc=CC=A7ois=20Benaiteau?= <francois.benaiteau@sinnerschrader-mobile.com> Date: Wed, 16 Apr 2014 11:49:27 +0200 Subject: [PATCH 028/149] Fixes all tests --- templates/_header.h.mustache | 1 - templates/source.m.mustache | 1 - test_data/test_class/S2MSenderJSONObject.h | 2 +- test_data/test_class/S2MSenderJSONObject.m | 3 +-- test_data/test_class/_S2MSenderJSONObject.h | 3 +-- test_data/test_class/_S2MSenderJSONObject.m | 2 +- 6 files changed, 4 insertions(+), 8 deletions(-) diff --git a/templates/_header.h.mustache b/templates/_header.h.mustache index e26f92c..e8102c1 100644 --- a/templates/_header.h.mustache +++ b/templates/_header.h.mustache @@ -23,4 +23,3 @@ - (NSDictionary *)propertyDictionary; @end - diff --git a/templates/source.m.mustache b/templates/source.m.mustache index 42d0fd3..ee9ebfd 100644 --- a/templates/source.m.mustache +++ b/templates/source.m.mustache @@ -8,4 +8,3 @@ @implementation {{humanClassName}} @end - diff --git a/test_data/test_class/S2MSenderJSONObject.h b/test_data/test_class/S2MSenderJSONObject.h index 4ba26ea..3b9b6da 100644 --- a/test_data/test_class/S2MSenderJSONObject.h +++ b/test_data/test_class/S2MSenderJSONObject.h @@ -2,7 +2,7 @@ // S2MSenderJSONObject.h // // Created by MetaJSONParser. -// Copyright (c) 2013 SinnerSchrader Mobile. All rights reserved. +// Copyright (c) 2014 SinnerSchrader Mobile. All rights reserved. #import "_S2MSenderJSONObject.h" @interface S2MSenderJSONObject : _S2MSenderJSONObject diff --git a/test_data/test_class/S2MSenderJSONObject.m b/test_data/test_class/S2MSenderJSONObject.m index 4c78325..f749b53 100644 --- a/test_data/test_class/S2MSenderJSONObject.m +++ b/test_data/test_class/S2MSenderJSONObject.m @@ -2,10 +2,9 @@ // S2MSenderJSONObject.m // // Created by MetaJSONParser. -// Copyright (c) 2013 SinnerSchrader Mobile. All rights reserved. +// Copyright (c) 2014 SinnerSchrader Mobile. All rights reserved. #import "S2MSenderJSONObject.h" @implementation S2MSenderJSONObject @end - diff --git a/test_data/test_class/_S2MSenderJSONObject.h b/test_data/test_class/_S2MSenderJSONObject.h index 9d28cc6..24ea721 100644 --- a/test_data/test_class/_S2MSenderJSONObject.h +++ b/test_data/test_class/_S2MSenderJSONObject.h @@ -2,7 +2,7 @@ // _S2MSenderJSONObject.h // // Created by MetaJSONParser. -// Copyright (c) 2013 SinnerSchrader Mobile. All rights reserved. +// Copyright (c) 2014 SinnerSchrader Mobile. All rights reserved. #import <Foundation/Foundation.h> @@ -19,4 +19,3 @@ - (NSDictionary *)propertyDictionary; @end - diff --git a/test_data/test_class/_S2MSenderJSONObject.m b/test_data/test_class/_S2MSenderJSONObject.m index 6f23fa2..300afd6 100644 --- a/test_data/test_class/_S2MSenderJSONObject.m +++ b/test_data/test_class/_S2MSenderJSONObject.m @@ -2,7 +2,7 @@ // _S2MSenderJSONObject.m // // Created by MetaJSONParser. -// Copyright (c) 2013 SinnerSchrader Mobile. All rights reserved. +// Copyright (c) 2014 SinnerSchrader Mobile. All rights reserved. #import "APIParser.h" #import "NSString+RegExValidation.h" From 54602738d1db32b48ca824d4ef191b81691515dd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Franc=CC=A7ois=20Benaiteau?= <francois.benaiteau@sinnerschrader-mobile.com> Date: Wed, 16 Apr 2014 14:16:05 +0200 Subject: [PATCH 029/149] Start to process template with different kind of properties --- ObjectiveCCodeGenerator.py | 31 +++-- ObjectiveCCodeGenerator_test.py | 19 +-- templates/_source.m.mustache | 139 +++++++++++++++++--- test_data/test_class/_S2MSenderJSONObject.m | 4 +- 4 files changed, 158 insertions(+), 35 deletions(-) diff --git a/ObjectiveCCodeGenerator.py b/ObjectiveCCodeGenerator.py index 5eda885..26012bd 100755 --- a/ObjectiveCCodeGenerator.py +++ b/ObjectiveCCodeGenerator.py @@ -67,6 +67,10 @@ def process_properties(self, propObj) : propertyHash = {"declaration": self.propertyDefinitionString(propObj)} if propObj.type_description and len(propObj.type_description) : propertyHash["comment"] = propObj.type_description + propertyHash['name'] = propObj.type_name + propertyHash['varName'] = self.makeVarName(propObj) + if propObj.required == 1: + propertyHash['required'] = True return propertyHash def human_header_content(self, schemeObj) : @@ -86,10 +90,17 @@ def human_source_content(self, schemeObj) : def machine_header_content(self, schemeObj) : templateFile = open(self.template_file_path("_header.h.mustache"), "r") today = datetime.date.fromtimestamp(time.time()) - props = [] + + numberProps = [] + stringProps = [] for prop in schemeObj.props: - props.append(self.process_properties(prop)) - hashParams = {"date": str(today.year), "machineClassName": schemeObj.getMachineClassName(), "humanClassName": schemeObj.getClassName(), "variableName": self.makeVarName(schemeObj), "properties": props} + if prop.base_type == "string": + stringProps.append(self.process_properties(prop)) + if prop.base_type == "number": + numberProps.append(self.process_properties(prop)) + + hashParams = {"date": str(today.year), "machineClassName": schemeObj.getMachineClassName(), "humanClassName": schemeObj.getClassName(), "variableName": self.makeVarName(schemeObj), "stringProperties": stringProps, "numberProperties": numberProps} + print hashParams # print "hashParams" # print hashParams @@ -99,14 +110,16 @@ def machine_source_content(self, schemeObj) : templateFile = open(self.template_file_path("_source.m.mustache"), "r") today = datetime.date.fromtimestamp(time.time()) - props = [] + numberProps = [] + stringProps = [] for prop in schemeObj.props: - props.append(prop.__dict__) - print props - - # retrieve all params for template - hashParams = {"date": str(today.year), "machineClassName": schemeObj.getMachineClassName(), "projectPrefix": self.projectPrefix, "humanClassName": schemeObj.getClassName(), "variableName": self.makeVarName(schemeObj), "properties": props} + if prop.base_type == "string": + stringProps.append(self.process_properties(prop)) + if prop.base_type == "number": + numberProps.append(self.process_properties(prop)) + hashParams = {"date": str(today.year), "machineClassName": schemeObj.getMachineClassName(), "humanClassName": schemeObj.getClassName(), "variableName": self.makeVarName(schemeObj), "stringProperties": stringProps, "numberProperties": numberProps} + print hashParams # render sourceString = Renderer().render(templateFile.read(), hashParams) diff --git a/ObjectiveCCodeGenerator_test.py b/ObjectiveCCodeGenerator_test.py index 9a539eb..d23b657 100644 --- a/ObjectiveCCodeGenerator_test.py +++ b/ObjectiveCCodeGenerator_test.py @@ -43,15 +43,18 @@ def test_machine_header_content(self): result = self.gen.machine_header_content(self.scheme_object) self.assert_content_file(self.test_file_path + "/_S2MSenderJSONObject.h", result) -class TestSampleTestCase(TestObjectiveCCodeGenerator): - def setUp(self): - super(TestSampleTestCase, self).setUp() - self.test_file_path = self.default_folder + 'test_json' - self.scheme_object = pickle.load(open(self.test_file_path + '.p', 'rb')) - - def test_machine_source_content(self): + def test_make(self): + result = self.gen.machine_header_content(self.scheme_object) self.gen.make(self.scheme_object) +# class TestSampleTestCase(TestObjectiveCCodeGenerator): +# def setUp(self): +# super(TestSampleTestCase, self).setUp() +# self.test_file_path = self.default_folder + 'test_json' +# self.scheme_object = pickle.load(open(self.test_file_path + '.p', 'rb')) +# +# def test_machine_source_content(self): +# self.gen.make(self.scheme_object) + if __name__ == '__main__': unittest.main() - diff --git a/templates/_source.m.mustache b/templates/_source.m.mustache index c4a6f98..3aea9f0 100644 --- a/templates/_source.m.mustache +++ b/templates/_source.m.mustache @@ -20,14 +20,67 @@ #pragma mark - initialize - (id)initWithDictionary:(NSDictionary *)dic withError:(NSError **)error { - self = [super init]; + self = [super initWithDictionary:dic withError:error]; if (self) { - {{#properties}} - self.{{type_name}} = [APIParser stringFromResponseDictionary:dic forKey:@"{{type_name}}" acceptNumber:NO acceptNil:NO error:error]; + {{#numberProperties}} + self.{{varName}} = [{{projectPrefix}}APIParser numberFromResponseDictionary:dic forKey:@"{{name}}" acceptNil:{{#required}}NO{{/required}}{{^required}}YES{{/required}} error:error]; if (*error) { return self; } - {{/properties}} + {{/numberProperties}} + {{#stringProperties}} + self.{{varName}} = [{{projectPrefix}}APIParser stringFromResponseDictionary:dic forKey:@"{{name}}" acceptNumber:YES acceptNil:{{#required}}NO{{/required}}{{^required}}YES{{/required}} error:error]; + {{#regex}} + if (self.{{varName}} && [self.{{varName}} matchesRegExString:@"{{value}}"] == NO) { + NSDictionary *userInfo = @{@"propertyName" : @"{{varName}}", + @"key" : @"{{name}}", + @"reason" : @"validation error", + @"objectClass" : NSStringFromClass([self class])}; + *error = [NSError errorWithDomain:kEGMErrorDomain_parser code:kEGMErrorDomain_parser_valueIsNotValid userInfo:userInfo]; + NSLog(@"%@", *error); + return self; + } + {{/regex}} + {{#maxLength}} + if (self.{{varName}}.length > {{value}}) { + NSDictionary *userInfo = @{@"propertyName" : @"{{varName}}", + @"key" : @"{{name}}", + @"reason" : @"max length validation error", + @"objectClass" : NSStringFromClass([self class])}; + *error = [NSError errorWithDomain:kEGMErrorDomain_parser code:kEGMErrorDomain_parser_valueIsNotValid userInfo:userInfo]; + NSLog(@"%@", *error); + return self; + } + {{/maxLength}} + {{#minLength}} + if (self.{{varName}}.length < {{value}}) { + NSDictionary *userInfo = @{@"propertyName" : @"{{varName}}", + @"key" : @"{{name}}", + @"reason" : @"min length validation error", + @"objectClass" : NSStringFromClass([self class])}; + *error = [NSError errorWithDomain:kEGMErrorDomain_parser code:kEGMErrorDomain_parser_valueIsNotValid userInfo:userInfo]; + NSLog(@"%@", *error); + return self; + } + {{/minLength}} + if (*error) { + return self; + } + {{/stringProperties}} + {{#booleanProperties}} + {{/booleanProperties}} + {{#dataProperties}} + {{/dataProperties}} + {{#dateProperties}} + {{/dateProperties}} + {{#msDateProperties}} + {{/msDateProperties}} + {{#arrayProperties}} + {{/arrayProperties}} + {{#objectProperties}} + {{/objectProperties}} + {{#undefinedProperties}} + {{/undefinedProperties}} } return self; } @@ -37,26 +90,80 @@ #pragma mark - NSCoding - (void)encodeWithCoder:(NSCoder*)coder { - {{#properties}} - [coder encodeObject:self.{{type_name}} forKey:@"{{type_name}}"]; - {{/properties}} + [super encodeWithCoder:coder]; + {{#numberProperties}} + [coder encodeObject:self.{{varName}} forKey:@"{{name}}"]; + {{/numberProperties}} + {{#stringProperties}} + [coder encodeObject:self.{{varName}} forKey:@"{{name}}"]; + {{/stringProperties}} + {{#booleanProperties}} + {{/booleanProperties}} + {{#dataProperties}} + {{/dataProperties}} + {{#dateProperties}} + {{/dateProperties}} + {{#msDateProperties}} + {{/msDateProperties}} + {{#arrayProperties}} + {{/arrayProperties}} + {{#objectProperties}} + {{/objectProperties}} + {{#undefinedProperties}} + {{/undefinedProperties}} } - (id)initWithCoder:(NSCoder *)coder { - self = [super init]; - {{#properties}} - self.{{type_name}} = [coder decodeObjectForKey:@"{{type_name}}"]; - {{/properties}} + self = [super initWithCoder:coder]; + {{#numberProperties}} + self.{{varName}} = [coder decodeObjectForKey:@"{{name}}"]; + {{/numberProperties}} + {{#stringProperties}} + self.{{varName}} = [coder decodeObjectForKey:@"{{name}}"]; + {{/stringProperties}} + {{#booleanProperties}} + {{/booleanProperties}} + {{#dataProperties}} + {{/dataProperties}} + {{#dateProperties}} + {{/dateProperties}} + {{#msDateProperties}} + {{/msDateProperties}} + {{#arrayProperties}} + {{/arrayProperties}} + {{#objectProperties}} + {{/objectProperties}} + {{#undefinedProperties}} + {{/undefinedProperties}} return self; } #pragma mark - Object Info - (NSDictionary *)propertyDictionary { - NSMutableDictionary *dic = [[NSMutableDictionary alloc] init]; - {{#properties}} - if (self.{{type_name}}) { - [dic setObject:self.{{type_name}} forKey:@"{{type_name}}"]; + NSMutableDictionary *dic = [[super propertyDictionary] mutableCopy]; + {{#numberProperties}} + if (self.{{varName}}) { + [dic setObject:self.{{varName}} forKey:@"{{name}}"]; + } + {{/numberProperties}} + {{#stringProperties}} + if (self.{{varName}}) { + [dic setObject:self.{{varName}} forKey:@"{{name}}"]; } - {{/properties}} + {{/stringProperties}} + {{#booleanProperties}} + {{/booleanProperties}} + {{#dataProperties}} + {{/dataProperties}} + {{#dateProperties}} + {{/dateProperties}} + {{#msDateProperties}} + {{/msDateProperties}} + {{#arrayProperties}} + {{/arrayProperties}} + {{#objectProperties}} + {{/objectProperties}} + {{#undefinedProperties}} + {{/undefinedProperties}} return dic; } - (NSString *)description { diff --git a/test_data/test_class/_S2MSenderJSONObject.m b/test_data/test_class/_S2MSenderJSONObject.m index 300afd6..a345670 100644 --- a/test_data/test_class/_S2MSenderJSONObject.m +++ b/test_data/test_class/_S2MSenderJSONObject.m @@ -22,11 +22,11 @@ + (S2MSenderJSONObject *)senderWithDictionary:(NSDictionary *)dic withError:(NSE - (id)initWithDictionary:(NSDictionary *)dic withError:(NSError **)error { self = [super init]; if (self) { - self.senderName = [APIParser stringFromResponseDictionary:dic forKey:@"senderName" acceptNumber:NO acceptNil:NO error:error]; + self.senderName = [APIParser stringFromResponseDictionary:dic forKey:@"senderName" acceptNumber:YES acceptNil:NO error:error]; if (*error) { return self; } - self.previewImageURL = [APIParser stringFromResponseDictionary:dic forKey:@"previewImageURL" acceptNumber:NO acceptNil:NO error:error]; + self.previewImageURL = [APIParser stringFromResponseDictionary:dic forKey:@"previewImageURL" acceptNumber:YES acceptNil:NO error:error]; if (*error) { return self; } From e525e5c9154ecda142894531320ea9372614e031 Mon Sep 17 00:00:00 2001 From: Park Sanggeon <sanggeon.park@sinnerschrader-mobile.com> Date: Wed, 16 Apr 2014 14:33:49 +0200 Subject: [PATCH 030/149] indentations --- templates/machine.m.mustache | 130 +++++++++++++++++------------------ 1 file changed, 65 insertions(+), 65 deletions(-) diff --git a/templates/machine.m.mustache b/templates/machine.m.mustache index c4184d9..34f5578 100644 --- a/templates/machine.m.mustache +++ b/templates/machine.m.mustache @@ -135,66 +135,66 @@ } - (id)initWithCoder:(NSCoder *)coder { - self = [super initWithCoder:coder]; - {{#numberProperties}} - self.{{varName}} = [coder decodeObjectForKey:@"{{name}}"]; - {{/numberProperties}} - {{#stringProperties}} - self.{{varName}} = [coder decodeObjectForKey:@"{{name}}"]; - {{/stringProperties}} - {{#booleanProperties}} - self.{{varName}} = [coder decodeBoolForKey:@"{{name}}"]; - {{/booleanProperties}} - {{#dataProperties}} - self.{{varName}} = [coder decodeObjectForKey:@"{{name}}"]; - {{/dataProperties}} - {{#dateProperties}} - self.{{varName}} = [coder decodeObjectForKey:@"{{name}}"]; - {{/dateProperties}} - {{#msDateProperties}} - self.{{varName}} = [coder decodeObjectForKey:@"{{name}}"]; - {{/msDateProperties}} - {{#arrayProperties}} - self.{{varName}} = [coder decodeObjectForKey:@"{{name}}"]; - {{/arrayProperties}} - {{#objectProperties}} - self.{{varName}} = [coder decodeObjectForKey:@"{{name}}"]; - {{/objectProperties}} - {{#undefinedProperties}} - self.{{varName}} = [coder decodeObjectForKey:@"{{name}}"]; - {{/undefinedProperties}} - return self; + self = [super initWithCoder:coder]; + {{#numberProperties}} + self.{{varName}} = [coder decodeObjectForKey:@"{{name}}"]; + {{/numberProperties}} + {{#stringProperties}} + self.{{varName}} = [coder decodeObjectForKey:@"{{name}}"]; + {{/stringProperties}} + {{#booleanProperties}} + self.{{varName}} = [coder decodeBoolForKey:@"{{name}}"]; + {{/booleanProperties}} + {{#dataProperties}} + self.{{varName}} = [coder decodeObjectForKey:@"{{name}}"]; + {{/dataProperties}} + {{#dateProperties}} + self.{{varName}} = [coder decodeObjectForKey:@"{{name}}"]; + {{/dateProperties}} + {{#msDateProperties}} + self.{{varName}} = [coder decodeObjectForKey:@"{{name}}"]; + {{/msDateProperties}} + {{#arrayProperties}} + self.{{varName}} = [coder decodeObjectForKey:@"{{name}}"]; + {{/arrayProperties}} + {{#objectProperties}} + self.{{varName}} = [coder decodeObjectForKey:@"{{name}}"]; + {{/objectProperties}} + {{#undefinedProperties}} + self.{{varName}} = [coder decodeObjectForKey:@"{{name}}"]; + {{/undefinedProperties}} + return self; } #pragma mark - Object Info - (NSDictionary *)propertyDictionary { - {{#baseObjectType}} - NSMutableDictionary *dic = [[super propertyDictionary] mutableCopy]; - {{/baseObjectType}} - {{^baseObjectType}} - NSMutableDictionary *dic = [[NSMutableDictionary alloc] init]; - {{/baseObjectType}} - {{#numberProperties}} - if (self.{{varName}}) { - [dic setObject:self.{{varName}} forKey:@"{{name}}"]; - } - {{/numberProperties}} - {{#stringProperties}} - if (self.{{varName}}) { - [dic setObject:self.{{varName}} forKey:@"{{name}}"]; - } - {{/stringProperties}} - {{#booleanProperties}} - if (self.{{varName}}) { - [dic setObject:[NSNumber numberWithBool:self.{{varName}}] forKey:@"{{name}}"]; - } - {{/booleanProperties}} - {{#dataProperties}} - {{/dataProperties}} - {{#dateProperties}} - {{/dateProperties}} - {{#msDateProperties}} - if (self.{{varName}}) { + {{#baseTypeIsObject}} + NSMutableDictionary *dic = [[super propertyDictionary] mutableCopy]; + {{/baseTypeIsObject}} + {{^baseTypeIsObject}} + NSMutableDictionary *dic = [[NSMutableDictionary alloc] init]; + {{/baseTypeIsObject}} + {{#numberProperties}} + if (self.{{varName}}) { + [dic setObject:self.{{varName}} forKey:@"{{name}}"]; + } + {{/numberProperties}} + {{#stringProperties}} + if (self.{{varName}}) { + [dic setObject:self.{{varName}} forKey:@"{{name}}"]; + } + {{/stringProperties}} + {{#booleanProperties}} + if (self.{{varName}}) { + [dic setObject:[NSNumber numberWithBool:self.{{varName}}] forKey:@"{{name}}"]; + } + {{/booleanProperties}} + {{#dataProperties}} + {{/dataProperties}} + {{#dateProperties}} + {{/dateProperties}} + {{#msDateProperties}} + if (self.{{varName}}) { NSNumber* number = @([self.lastModificationTimestamp timeIntervalSince1970] * 1000); NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init]; [formatter setNumberStyle:NSNumberFormatterNoStyle]; @@ -203,20 +203,20 @@ NSNumber *convertedNumber = [formatter numberFromString:value]; [dic setObject:convertedNumber forKey:@"{{name}}"]; } - {{/msDateProperties}} - {{#arrayProperties}} - {{/arrayProperties}} - {{#objectProperties}} - {{/objectProperties}} - {{#undefinedProperties}} - {{/undefinedProperties}} - return dic; + {{/msDateProperties}} + {{#arrayProperties}} + {{/arrayProperties}} + {{#objectProperties}} + {{/objectProperties}} + {{#undefinedProperties}} + {{/undefinedProperties}} + return dic; } {{#baseObjectType}} - (NSString *)description { - return [[self propertyDictionary] description]; + return [[self propertyDictionary] description]; } {{/baseObjectType}} @end From b5c620f155df35da252e286936ed7fd3fbc069fc Mon Sep 17 00:00:00 2001 From: Park Sanggeon <sanggeon.park@sinnerschrader-mobile.com> Date: Wed, 16 Apr 2014 14:33:55 +0200 Subject: [PATCH 031/149] add more --- templates/_source.m.mustache | 100 ++++++++++++++++++++++++++--------- 1 file changed, 75 insertions(+), 25 deletions(-) diff --git a/templates/_source.m.mustache b/templates/_source.m.mustache index 3aea9f0..4b96f12 100644 --- a/templates/_source.m.mustache +++ b/templates/_source.m.mustache @@ -29,38 +29,38 @@ } {{/numberProperties}} {{#stringProperties}} - self.{{varName}} = [{{projectPrefix}}APIParser stringFromResponseDictionary:dic forKey:@"{{name}}" acceptNumber:YES acceptNil:{{#required}}NO{{/required}}{{^required}}YES{{/required}} error:error]; + self.{{varName}} = [{{projectPrefix}}APIParser numberFromResponseDictionary:dic forKey:@"{{name}}" acceptNumber:YES acceptNil:{{#required}}NO{{/required}}{{^required}}YES{{/required}} error:error]; {{#regex}} if (self.{{varName}} && [self.{{varName}} matchesRegExString:@"{{value}}"] == NO) { - NSDictionary *userInfo = @{@"propertyName" : @"{{varName}}", - @"key" : @"{{name}}", - @"reason" : @"validation error", - @"objectClass" : NSStringFromClass([self class])}; - *error = [NSError errorWithDomain:kEGMErrorDomain_parser code:kEGMErrorDomain_parser_valueIsNotValid userInfo:userInfo]; - NSLog(@"%@", *error); - return self; + NSDictionary *userInfo = @{@"propertyName" : @"{{varName}}", + @"key" : @"{{name}}", + @"reason" : @"validation error", + @"objectClass" : NSStringFromClass([self class])}; + *error = [NSError errorWithDomain:kEGMErrorDomain_parser code:kEGMErrorDomain_parser_valueIsNotValid userInfo:userInfo]; + NSLog(@"%@", *error); + return self; } {{/regex}} {{#maxLength}} if (self.{{varName}}.length > {{value}}) { - NSDictionary *userInfo = @{@"propertyName" : @"{{varName}}", - @"key" : @"{{name}}", - @"reason" : @"max length validation error", - @"objectClass" : NSStringFromClass([self class])}; - *error = [NSError errorWithDomain:kEGMErrorDomain_parser code:kEGMErrorDomain_parser_valueIsNotValid userInfo:userInfo]; - NSLog(@"%@", *error); - return self; + NSDictionary *userInfo = @{@"propertyName" : @"{{varName}}", + @"key" : @"{{name}}", + @"reason" : @"max length validation error", + @"objectClass" : NSStringFromClass([self class])}; + *error = [NSError errorWithDomain:kEGMErrorDomain_parser code:kEGMErrorDomain_parser_valueIsNotValid userInfo:userInfo]; + NSLog(@"%@", *error); + return self; } {{/maxLength}} {{#minLength}} if (self.{{varName}}.length < {{value}}) { - NSDictionary *userInfo = @{@"propertyName" : @"{{varName}}", - @"key" : @"{{name}}", - @"reason" : @"min length validation error", - @"objectClass" : NSStringFromClass([self class])}; - *error = [NSError errorWithDomain:kEGMErrorDomain_parser code:kEGMErrorDomain_parser_valueIsNotValid userInfo:userInfo]; - NSLog(@"%@", *error); - return self; + NSDictionary *userInfo = @{@"propertyName" : @"{{varName}}", + @"key" : @"{{name}}", + @"reason" : @"min length validation error", + @"objectClass" : NSStringFromClass([self class])}; + *error = [NSError errorWithDomain:kEGMErrorDomain_parser code:kEGMErrorDomain_parser_valueIsNotValid userInfo:userInfo]; + NSLog(@"%@", *error); + return self; } {{/minLength}} if (*error) { @@ -85,9 +85,23 @@ return self; } - +{{#baseTypeIsObject}} +#pargma mark - clone +-(instancetype) clone +{ + NSData *archivedData = [NSKeyedArchiver archivedDataWithRootObject:self]; + typeof(self) clone = [NSKeyedUnarchiver unarchiveObjectWithData:archivedData]; + return clone; +} +{{/baseTypeIsObject}} #pragma mark - getter +{{#arrayProperties}} +{{/arrayProperties}} + +{{#undefinedProperties}} +{{/undefinedProperties}} + #pragma mark - NSCoding - (void)encodeWithCoder:(NSCoder*)coder { [super encodeWithCoder:coder]; @@ -98,20 +112,28 @@ [coder encodeObject:self.{{varName}} forKey:@"{{name}}"]; {{/stringProperties}} {{#booleanProperties}} + [coder encodeBool:self.{{varName}} forKey:@"{{name}}"]; {{/booleanProperties}} {{#dataProperties}} + [coder encodeObject:self.{{varName}} forKey:@"{{name}}"]; {{/dataProperties}} {{#dateProperties}} + [coder encodeObject:self.{{varName}} forKey:@"{{name}}"]; {{/dateProperties}} {{#msDateProperties}} + [coder encodeObject:self.{{varName}} forKey:@"{{name}}"]; {{/msDateProperties}} {{#arrayProperties}} + [coder encodeObject:self.{{varName}} forKey:@"{{name}}"]; {{/arrayProperties}} {{#objectProperties}} + [coder encodeObject:self.{{varName}} forKey:@"{{name}}"]; {{/objectProperties}} {{#undefinedProperties}} + [coder encodeObject:self.{{varName}} forKey:@"{{name}}"]; {{/undefinedProperties}} } + - (id)initWithCoder:(NSCoder *)coder { self = [super initWithCoder:coder]; {{#numberProperties}} @@ -121,25 +143,37 @@ self.{{varName}} = [coder decodeObjectForKey:@"{{name}}"]; {{/stringProperties}} {{#booleanProperties}} + self.{{varName}} = [coder decodeBoolForKey:@"{{name}}"]; {{/booleanProperties}} {{#dataProperties}} + self.{{varName}} = [coder decodeObjectForKey:@"{{name}}"]; {{/dataProperties}} {{#dateProperties}} + self.{{varName}} = [coder decodeObjectForKey:@"{{name}}"]; {{/dateProperties}} {{#msDateProperties}} + self.{{varName}} = [coder decodeObjectForKey:@"{{name}}"]; {{/msDateProperties}} {{#arrayProperties}} + self.{{varName}} = [coder decodeObjectForKey:@"{{name}}"]; {{/arrayProperties}} {{#objectProperties}} + self.{{varName}} = [coder decodeObjectForKey:@"{{name}}"]; {{/objectProperties}} {{#undefinedProperties}} + self.{{varName}} = [coder decodeObjectForKey:@"{{name}}"]; {{/undefinedProperties}} return self; } #pragma mark - Object Info - (NSDictionary *)propertyDictionary { + {{#baseTypeIsObject}} NSMutableDictionary *dic = [[super propertyDictionary] mutableCopy]; + {{/baseTypeIsObject}} + {{^baseTypeIsObject}} + NSMutableDictionary *dic = [[NSMutableDictionary alloc] init]; + {{/baseTypeIsObject}} {{#numberProperties}} if (self.{{varName}}) { [dic setObject:self.{{varName}} forKey:@"{{name}}"]; @@ -151,12 +185,24 @@ } {{/stringProperties}} {{#booleanProperties}} + if (self.{{varName}}) { + [dic setObject:[NSNumber numberWithBool:self.{{varName}}] forKey:@"{{name}}"]; + } {{/booleanProperties}} {{#dataProperties}} {{/dataProperties}} {{#dateProperties}} {{/dateProperties}} {{#msDateProperties}} + if (self.{{varName}}) { + NSNumber* number = @([self.lastModificationTimestamp timeIntervalSince1970] * 1000); + NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init]; + [formatter setNumberStyle:NSNumberFormatterNoStyle]; + [formatter setNegativeFormat:@"0"]; + NSString *value = [formatter stringFromNumber:number]; + NSNumber *convertedNumber = [formatter numberFromString:value]; + [dic setObject:convertedNumber forKey:@"{{name}}"]; + } {{/msDateProperties}} {{#arrayProperties}} {{/arrayProperties}} @@ -166,8 +212,12 @@ {{/undefinedProperties}} return dic; } -- (NSString *)description { - return [NSString stringWithFormat:@"%@",[self propertyDictionary]]; + +{{#baseTypeIsObject}} +- (NSString *)description +{ + return [[self propertyDictionary] description]; } +{{/baseTypeIsObject}} @end From fe037d75a322fbc93515459262d1905844611004 Mon Sep 17 00:00:00 2001 From: Park Sanggeon <sanggeon.park@sinnerschrader-mobile.com> Date: Wed, 16 Apr 2014 14:45:06 +0200 Subject: [PATCH 032/149] add new methods --- templates/_header.h.mustache | 52 +++++++++++++++++++++++++++++++----- templates/_source.m.mustache | 2 +- 2 files changed, 46 insertions(+), 8 deletions(-) diff --git a/templates/_header.h.mustache b/templates/_header.h.mustache index e8102c1..96be327 100644 --- a/templates/_header.h.mustache +++ b/templates/_header.h.mustache @@ -9,17 +9,55 @@ @class {{humanClassName}}; @interface {{machineClassName}} : NSObject <NSCoding> - - -{{#properties}} -{{#comment}} -//{{comment}} +{{#numberProperties}} +{{/comment }} +@property (nonatomic, strong) NSNumber *{{name}}; +{{/numberProperties}} +{{#stringProperties}} +{{/comment }} +@property (nonatomic, strong) NSString *{{name}}; +{{/stringProperties}} +{{#booleanProperties}} +{{/comment }} +@property (nonatomic, assign) BOOL {{name}}; +{{/booleanProperties}} +{{#dataProperties}} +{{/comment }} +@property (nonatomic, strong) NSData *{{name}}; +{{/dataProperties}} +{{#dateProperties}} {{/comment }} -{{declaration}} -{{/properties}} +@property (nonatomic, strong) NSDate *{{name}}; +{{/dateProperties}} +{{#msDateProperties}} +{{/comment }} +@property (nonatomic, strong) NSDate *{{name}}; +{{/msDateProperties}} +{{#arrayProperties}} +{{/comment }} +@property (nonatomic, strong) NSArray *{{name}}; +{{/arrayProperties}} +{{#objectProperties}} +{{/comment }} +@property (nonatomic, strong) {{base_type}} *{{name}}; +{{/objectProperties}} +{{#undefinedProperties}} +{{/comment }} +@property (nonatomic, strong) id {{name}}; +{{/undefinedProperties}} + ({{humanClassName}} *){{variableName}}WithDictionary:(NSDictionary *)dic withError:(NSError **)error; - (id)initWithDictionary:(NSDictionary *)dic withError:(NSError **)error; +{{#baseTypeIsObject}} +#pargma mark - clone +- (instancetype)clone; - (NSDictionary *)propertyDictionary; +{{/baseTypeIsObject}} + +{{#arrayProperties}} +{{/arrayProperties}} + +{{#undefinedProperties}} +{{/undefinedProperties}} @end diff --git a/templates/_source.m.mustache b/templates/_source.m.mustache index 4b96f12..122893e 100644 --- a/templates/_source.m.mustache +++ b/templates/_source.m.mustache @@ -87,7 +87,7 @@ {{#baseTypeIsObject}} #pargma mark - clone --(instancetype) clone +- (instancetype)clone { NSData *archivedData = [NSKeyedArchiver archivedDataWithRootObject:self]; typeof(self) clone = [NSKeyedUnarchiver unarchiveObjectWithData:archivedData]; From ef8886e25317c52899086e9b186854cd4359f2e3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Franc=CC=A7ois=20Benaiteau?= <francois.benaiteau@sinnerschrader-mobile.com> Date: Wed, 16 Apr 2014 15:17:32 +0200 Subject: [PATCH 033/149] machine file template passes test --- ObjectiveCCodeGenerator.py | 7 ++-- templates/_source.m.mustache | 39 ++++++++++----------- test_data/test_class/_S2MSenderJSONObject.m | 28 +++++++++------ 3 files changed, 42 insertions(+), 32 deletions(-) diff --git a/ObjectiveCCodeGenerator.py b/ObjectiveCCodeGenerator.py index 26012bd..cc6f588 100755 --- a/ObjectiveCCodeGenerator.py +++ b/ObjectiveCCodeGenerator.py @@ -71,6 +71,7 @@ def process_properties(self, propObj) : propertyHash['varName'] = self.makeVarName(propObj) if propObj.required == 1: propertyHash['required'] = True + print propObj.base_type return propertyHash def human_header_content(self, schemeObj) : @@ -113,12 +114,14 @@ def machine_source_content(self, schemeObj) : numberProps = [] stringProps = [] for prop in schemeObj.props: - if prop.base_type == "string": + if prop.rootBaseType() == "string": stringProps.append(self.process_properties(prop)) - if prop.base_type == "number": + if prop.rootBaseType() == "number": numberProps.append(self.process_properties(prop)) hashParams = {"date": str(today.year), "machineClassName": schemeObj.getMachineClassName(), "humanClassName": schemeObj.getClassName(), "variableName": self.makeVarName(schemeObj), "stringProperties": stringProps, "numberProperties": numberProps} + if schemeObj.base_type == 'object': + hashParams['baseTypeIsObject'] = True print hashParams # render sourceString = Renderer().render(templateFile.read(), hashParams) diff --git a/templates/_source.m.mustache b/templates/_source.m.mustache index 122893e..e5270d0 100644 --- a/templates/_source.m.mustache +++ b/templates/_source.m.mustache @@ -13,14 +13,20 @@ #pragma mark - factory -+ ({{humanClassName}} *){{variableName}}WithDictionary:(NSDictionary *)dic withError:(NSError **)error { ++ ({{humanClassName}} *){{variableName}}WithDictionary:(NSDictionary *)dic withError:(NSError **)error +{ return [[{{humanClassName}} alloc] initWithDictionary:dic withError:error]; } - #pragma mark - initialize -- (id)initWithDictionary:(NSDictionary *)dic withError:(NSError **)error { +- (id)initWithDictionary:(NSDictionary *)dic withError:(NSError **)error +{ + {{#baseTypeIsObject}} + self = [super init]; + {{/baseTypeIsObject}} + {{^baseTypeIsObject}} self = [super initWithDictionary:dic withError:error]; + {{/baseTypeIsObject}} if (self) { {{#numberProperties}} self.{{varName}} = [{{projectPrefix}}APIParser numberFromResponseDictionary:dic forKey:@"{{name}}" acceptNil:{{#required}}NO{{/required}}{{^required}}YES{{/required}} error:error]; @@ -29,7 +35,7 @@ } {{/numberProperties}} {{#stringProperties}} - self.{{varName}} = [{{projectPrefix}}APIParser numberFromResponseDictionary:dic forKey:@"{{name}}" acceptNumber:YES acceptNil:{{#required}}NO{{/required}}{{^required}}YES{{/required}} error:error]; + self.{{varName}} = [{{projectPrefix}}APIParser stringFromResponseDictionary:dic forKey:@"{{name}}" acceptNumber:YES acceptNil:{{#required}}NO{{/required}}{{^required}}YES{{/required}} error:error]; {{#regex}} if (self.{{varName}} && [self.{{varName}} matchesRegExString:@"{{value}}"] == NO) { NSDictionary *userInfo = @{@"propertyName" : @"{{varName}}", @@ -85,25 +91,16 @@ return self; } -{{#baseTypeIsObject}} -#pargma mark - clone -- (instancetype)clone -{ - NSData *archivedData = [NSKeyedArchiver archivedDataWithRootObject:self]; - typeof(self) clone = [NSKeyedUnarchiver unarchiveObjectWithData:archivedData]; - return clone; -} -{{/baseTypeIsObject}} #pragma mark - getter - {{#arrayProperties}} {{/arrayProperties}} - {{#undefinedProperties}} {{/undefinedProperties}} #pragma mark - NSCoding -- (void)encodeWithCoder:(NSCoder*)coder { + +- (void)encodeWithCoder:(NSCoder*)coder +{ [super encodeWithCoder:coder]; {{#numberProperties}} [coder encodeObject:self.{{varName}} forKey:@"{{name}}"]; @@ -134,7 +131,8 @@ {{/undefinedProperties}} } -- (id)initWithCoder:(NSCoder *)coder { +- (id)initWithCoder:(NSCoder *)coder +{ self = [super initWithCoder:coder]; {{#numberProperties}} self.{{varName}} = [coder decodeObjectForKey:@"{{name}}"]; @@ -167,12 +165,13 @@ } #pragma mark - Object Info -- (NSDictionary *)propertyDictionary { +- (NSDictionary *)propertyDictionary +{ {{#baseTypeIsObject}} - NSMutableDictionary *dic = [[super propertyDictionary] mutableCopy]; + NSMutableDictionary *dic = [[NSMutableDictionary alloc] init]; {{/baseTypeIsObject}} {{^baseTypeIsObject}} - NSMutableDictionary *dic = [[NSMutableDictionary alloc] init]; + NSMutableDictionary *dic = [[super propertyDictionary] mutableCopy]; {{/baseTypeIsObject}} {{#numberProperties}} if (self.{{varName}}) { diff --git a/test_data/test_class/_S2MSenderJSONObject.m b/test_data/test_class/_S2MSenderJSONObject.m index a345670..9c34c2c 100644 --- a/test_data/test_class/_S2MSenderJSONObject.m +++ b/test_data/test_class/_S2MSenderJSONObject.m @@ -13,13 +13,14 @@ @implementation _S2MSenderJSONObject #pragma mark - factory -+ (S2MSenderJSONObject *)senderWithDictionary:(NSDictionary *)dic withError:(NSError **)error { ++ (S2MSenderJSONObject *)senderWithDictionary:(NSDictionary *)dic withError:(NSError **)error +{ return [[S2MSenderJSONObject alloc] initWithDictionary:dic withError:error]; } - #pragma mark - initialize -- (id)initWithDictionary:(NSDictionary *)dic withError:(NSError **)error { +- (id)initWithDictionary:(NSDictionary *)dic withError:(NSError **)error +{ self = [super init]; if (self) { self.senderName = [APIParser stringFromResponseDictionary:dic forKey:@"senderName" acceptNumber:YES acceptNil:NO error:error]; @@ -34,23 +35,28 @@ - (id)initWithDictionary:(NSDictionary *)dic withError:(NSError **)error { return self; } - #pragma mark - getter #pragma mark - NSCoding -- (void)encodeWithCoder:(NSCoder*)coder { + +- (void)encodeWithCoder:(NSCoder*)coder +{ + [super encodeWithCoder:coder]; [coder encodeObject:self.senderName forKey:@"senderName"]; [coder encodeObject:self.previewImageURL forKey:@"previewImageURL"]; } -- (id)initWithCoder:(NSCoder *)coder { - self = [super init]; + +- (id)initWithCoder:(NSCoder *)coder +{ + self = [super initWithCoder:coder]; self.senderName = [coder decodeObjectForKey:@"senderName"]; self.previewImageURL = [coder decodeObjectForKey:@"previewImageURL"]; return self; } #pragma mark - Object Info -- (NSDictionary *)propertyDictionary { +- (NSDictionary *)propertyDictionary +{ NSMutableDictionary *dic = [[NSMutableDictionary alloc] init]; if (self.senderName) { [dic setObject:self.senderName forKey:@"senderName"]; @@ -60,8 +66,10 @@ - (NSDictionary *)propertyDictionary { } return dic; } -- (NSString *)description { - return [NSString stringWithFormat:@"%@",[self propertyDictionary]]; + +- (NSString *)description +{ + return [[self propertyDictionary] description]; } @end From 11462efe2e2cfecd3fb65f80efa331faadd7f47d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Franc=CC=A7ois=20Benaiteau?= <francois.benaiteau@sinnerschrader-mobile.com> Date: Wed, 16 Apr 2014 15:50:44 +0200 Subject: [PATCH 034/149] header template has now properties --- ObjectiveCCodeGenerator.py | 47 ++++++++------------- templates/_header.h.mustache | 41 ++++++++++++------ test_data/test_class/_S2MSenderJSONObject.h | 1 - 3 files changed, 45 insertions(+), 44 deletions(-) diff --git a/ObjectiveCCodeGenerator.py b/ObjectiveCCodeGenerator.py index cc6f588..71152f4 100755 --- a/ObjectiveCCodeGenerator.py +++ b/ObjectiveCCodeGenerator.py @@ -71,7 +71,6 @@ def process_properties(self, propObj) : propertyHash['varName'] = self.makeVarName(propObj) if propObj.required == 1: propertyHash['required'] = True - print propObj.base_type return propertyHash def human_header_content(self, schemeObj) : @@ -89,26 +88,26 @@ def human_source_content(self, schemeObj) : return Renderer().render(templateFile.read(), hashParams) def machine_header_content(self, schemeObj) : - templateFile = open(self.template_file_path("_header.h.mustache"), "r") - today = datetime.date.fromtimestamp(time.time()) + template_file = open(self.template_file_path("_header.h.mustache"), "r") + return self.machine_file_content(schemeObj, template_file) - numberProps = [] - stringProps = [] - for prop in schemeObj.props: - if prop.base_type == "string": - stringProps.append(self.process_properties(prop)) - if prop.base_type == "number": - numberProps.append(self.process_properties(prop)) + def machine_source_content(self, schemeObj) : + template_file = open(self.template_file_path("_source.m.mustache"), "r") + return self.machine_file_content(schemeObj, template_file) - hashParams = {"date": str(today.year), "machineClassName": schemeObj.getMachineClassName(), "humanClassName": schemeObj.getClassName(), "variableName": self.makeVarName(schemeObj), "stringProperties": stringProps, "numberProperties": numberProps} - print hashParams - # print "hashParams" - # print hashParams + def make(self, schemeObj) : + # machine files + self.write_abstract_file(schemeObj.getMachineClassName() + ".h", self.machine_header_content(schemeObj)) + self.write_abstract_file(schemeObj.getMachineClassName() + ".m", self.machine_source_content(schemeObj)) - return Renderer().render(templateFile.read(), hashParams) + # human files + self.write_human_file(schemeObj.getClassName() + ".h", self.human_header_content(schemeObj)) + self.write_human_file(schemeObj.getClassName() + ".m", self.human_source_content(schemeObj)) - def machine_source_content(self, schemeObj) : - templateFile = open(self.template_file_path("_source.m.mustache"), "r") + return True + + + def machine_file_content(self, schemeObj, template_file) : today = datetime.date.fromtimestamp(time.time()) numberProps = [] @@ -124,21 +123,9 @@ def machine_source_content(self, schemeObj) : hashParams['baseTypeIsObject'] = True print hashParams # render - sourceString = Renderer().render(templateFile.read(), hashParams) - - + sourceString = Renderer().render(template_file.read(), hashParams) return sourceString - def make(self, schemeObj) : - # machine files - self.write_abstract_file(schemeObj.getMachineClassName() + ".h", self.machine_header_content(schemeObj)) - self.write_abstract_file(schemeObj.getMachineClassName() + ".m", self.machine_source_content(schemeObj)) - - # human files - self.write_human_file(schemeObj.getClassName() + ".h", self.human_header_content(schemeObj)) - self.write_human_file(schemeObj.getClassName() + ".m", self.human_source_content(schemeObj)) - - return True def write_abstract_file(self, filename, content) : folder = "/AbstractInterfaceFiles/" diff --git a/templates/_header.h.mustache b/templates/_header.h.mustache index 96be327..bb41a93 100644 --- a/templates/_header.h.mustache +++ b/templates/_header.h.mustache @@ -9,54 +9,69 @@ @class {{humanClassName}}; @interface {{machineClassName}} : NSObject <NSCoding> + {{#numberProperties}} -{{/comment }} +{{#comment}} +//{{comment}} +{{/comment}} @property (nonatomic, strong) NSNumber *{{name}}; {{/numberProperties}} {{#stringProperties}} -{{/comment }} +{{#comment}} +//{{comment}} +{{/comment}} @property (nonatomic, strong) NSString *{{name}}; {{/stringProperties}} {{#booleanProperties}} -{{/comment }} +{{#comment}} +//{{comment}} +{{/comment}} @property (nonatomic, assign) BOOL {{name}}; {{/booleanProperties}} {{#dataProperties}} -{{/comment }} +{{#comment}} +//{{comment}} +{{/comment}} @property (nonatomic, strong) NSData *{{name}}; {{/dataProperties}} {{#dateProperties}} -{{/comment }} +{{#comment}} +//{{comment}} +{{/comment}} @property (nonatomic, strong) NSDate *{{name}}; {{/dateProperties}} {{#msDateProperties}} -{{/comment }} +{{#comment}} +//{{comment}} +{{/comment}} @property (nonatomic, strong) NSDate *{{name}}; {{/msDateProperties}} {{#arrayProperties}} -{{/comment }} +{{#comment}} +//{{comment}} +{{/comment}} @property (nonatomic, strong) NSArray *{{name}}; {{/arrayProperties}} {{#objectProperties}} -{{/comment }} +{{#comment}} +//{{comment}} +{{/comment}} @property (nonatomic, strong) {{base_type}} *{{name}}; {{/objectProperties}} {{#undefinedProperties}} -{{/comment }} +{{#comment}} +//{{comment}} +{{/comment}} @property (nonatomic, strong) id {{name}}; {{/undefinedProperties}} + ({{humanClassName}} *){{variableName}}WithDictionary:(NSDictionary *)dic withError:(NSError **)error; - (id)initWithDictionary:(NSDictionary *)dic withError:(NSError **)error; {{#baseTypeIsObject}} -#pargma mark - clone -- (instancetype)clone; - (NSDictionary *)propertyDictionary; {{/baseTypeIsObject}} - {{#arrayProperties}} {{/arrayProperties}} - {{#undefinedProperties}} {{/undefinedProperties}} diff --git a/test_data/test_class/_S2MSenderJSONObject.h b/test_data/test_class/_S2MSenderJSONObject.h index 24ea721..4e03269 100644 --- a/test_data/test_class/_S2MSenderJSONObject.h +++ b/test_data/test_class/_S2MSenderJSONObject.h @@ -10,7 +10,6 @@ @interface _S2MSenderJSONObject : NSObject <NSCoding> - @property (nonatomic, strong) NSString *senderName; @property (nonatomic, strong) NSString *previewImageURL; From db8e2ea6be6f3defb0d070518f872712cd9e3198 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Franc=CC=A7ois=20Benaiteau?= <francois.benaiteau@sinnerschrader-mobile.com> Date: Wed, 16 Apr 2014 15:54:59 +0200 Subject: [PATCH 035/149] remove call to propertyDefinitionString --- ObjectiveCCodeGenerator.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ObjectiveCCodeGenerator.py b/ObjectiveCCodeGenerator.py index 71152f4..5251d2a 100755 --- a/ObjectiveCCodeGenerator.py +++ b/ObjectiveCCodeGenerator.py @@ -64,7 +64,7 @@ def makeVarName(self,schemeObj) : return returnName def process_properties(self, propObj) : - propertyHash = {"declaration": self.propertyDefinitionString(propObj)} + propertyHash = {} if propObj.type_description and len(propObj.type_description) : propertyHash["comment"] = propObj.type_description propertyHash['name'] = propObj.type_name From aa6cf15d0ba7e9b6a499d40c076107edfaf7be64 Mon Sep 17 00:00:00 2001 From: Park Sanggeon <sanggeon.park@sinnerschrader-mobile.com> Date: Wed, 16 Apr 2014 16:05:54 +0200 Subject: [PATCH 036/149] add templates for humanClass Signed-off-by: Park Sanggeon <sanggeon.park@sinnerschrader-mobile.com> --- templates/_header.h.mustache | 9 ++++++++- templates/source.m.mustache | 5 +++++ 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/templates/_header.h.mustache b/templates/_header.h.mustache index 96be327..096d59d 100644 --- a/templates/_header.h.mustache +++ b/templates/_header.h.mustache @@ -5,10 +5,17 @@ // Copyright (c) {{date}} SinnerSchrader Mobile. All rights reserved. #import <Foundation/Foundation.h> +{{^baseTypeIsObject}} +#import "{{baseClassName}}.h" +{{/baseTypeIsObject}} @class {{humanClassName}}; - +{{#baseTypeIsObject}} @interface {{machineClassName}} : NSObject <NSCoding> +{{/baseTypeIsObject}} +{{^baseTypeIsObject}} +@interface {{machineClassName}} : {{baseClassName}} +{{/baseTypeIsObject}} {{#numberProperties}} {{/comment }} @property (nonatomic, strong) NSNumber *{{name}}; diff --git a/templates/source.m.mustache b/templates/source.m.mustache index ee9ebfd..94bad0f 100644 --- a/templates/source.m.mustache +++ b/templates/source.m.mustache @@ -5,6 +5,11 @@ // Copyright (c) {{date}} SinnerSchrader Mobile. All rights reserved. #import "{{humanClassName}}.h" + +@interface {{humanClassName}} () + +@end + @implementation {{humanClassName}} @end From 62af7fac956970cc79eeca0d4e0687077d092f43 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Franc=CC=A7ois=20Benaiteau?= <francois.benaiteau@sinnerschrader-mobile.com> Date: Wed, 16 Apr 2014 16:16:45 +0200 Subject: [PATCH 037/149] add new test case for string options and regexp --- ObjectiveCCodeGenerator_test.py | 24 +++++- samples/test_string_options.json | 20 +++++ test_data/test_string_options.p | 85 +++++++++++++++++++ .../test_string_options/S2MLoginJSONObject.h | 11 +++ .../test_string_options/S2MLoginJSONObject.m | 11 +++ .../test_string_options/_S2MLoginJSONObject.h | 22 +++++ .../test_string_options/_S2MLoginJSONObject.m | 85 +++++++++++++++++++ 7 files changed, 256 insertions(+), 2 deletions(-) create mode 100644 samples/test_string_options.json create mode 100644 test_data/test_string_options.p create mode 100644 test_data/test_string_options/S2MLoginJSONObject.h create mode 100644 test_data/test_string_options/S2MLoginJSONObject.m create mode 100644 test_data/test_string_options/_S2MLoginJSONObject.h create mode 100644 test_data/test_string_options/_S2MLoginJSONObject.m diff --git a/ObjectiveCCodeGenerator_test.py b/ObjectiveCCodeGenerator_test.py index d23b657..856deb4 100644 --- a/ObjectiveCCodeGenerator_test.py +++ b/ObjectiveCCodeGenerator_test.py @@ -43,9 +43,29 @@ def test_machine_header_content(self): result = self.gen.machine_header_content(self.scheme_object) self.assert_content_file(self.test_file_path + "/_S2MSenderJSONObject.h", result) - def test_make(self): + +class TestSampleTestStringOptionsCase(TestObjectiveCCodeGenerator): + def setUp(self): + super(TestSampleTestStringOptionsCase, self).setUp() + self.test_file_path = self.default_folder + 'test_string_options' + self.scheme_object = pickle.load(open(self.test_file_path + '.p', 'rb')) + + + def test_human_header_content(self): + result = self.gen.human_header_content(self.scheme_object) + self.assert_content_file(self.test_file_path + "/S2MLoginJSONObject.h", result) + + def test_human_source_content(self): + result = self.gen.human_source_content(self.scheme_object) + self.assert_content_file(self.test_file_path + "/S2MLoginJSONObject.m", result) + + def test_machine_source_content(self): + result = self.gen.machine_source_content(self.scheme_object) + self.assert_content_file(self.test_file_path + "/_S2MLoginJSONObject.m", result) + + def test_machine_header_content(self): result = self.gen.machine_header_content(self.scheme_object) - self.gen.make(self.scheme_object) + self.assert_content_file(self.test_file_path + "/_S2MLoginJSONObject.h", result) # class TestSampleTestCase(TestObjectiveCCodeGenerator): # def setUp(self): diff --git a/samples/test_string_options.json b/samples/test_string_options.json new file mode 100644 index 0000000..5926b6e --- /dev/null +++ b/samples/test_string_options.json @@ -0,0 +1,20 @@ +[ + { + "name" : "login", + "base-type" : "object", + "property" : + [ + { + "name": "emailString", + "base-type": "string", + "regex": "[a-z0-9!#$%&'*+/=?^_`{|}~-](?:\\\\.[a-z0-9!#$%&'*/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\\\\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?" + }, + { + "name" : "password", + "base-type" : "string", + "minLength": 3, + "maxLength": 12 + } + ] + } +] diff --git a/test_data/test_string_options.p b/test_data/test_string_options.p new file mode 100644 index 0000000..15a2710 --- /dev/null +++ b/test_data/test_string_options.p @@ -0,0 +1,85 @@ +(iJSONScheme +JSONScheme +p0 +(dp1 +S'base_type_list' +p2 +(lp3 +sS'type_name' +p4 +S'login' +p5 +sS'projectPrefix' +p6 +S'S2M' +p7 +sS'base_type' +p8 +S'object' +p9 +sS'props' +p10 +(lp11 +(iJSONScheme +JSONScheme +p12 +(dp13 +S'regex' +p14 +S"[a-z0-9!#$%&'*+/=?^_`{|}~-](?:\\\\.[a-z0-9!#$%&'*/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\\\\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?" +p15 +sS'domain' +p16 +(lp17 +S'ROOT' +p18 +ag5 +asg4 +S'emailString' +p19 +sg6 +g7 +sg8 +S'string' +p20 +sg2 +(lp21 +sS'objectSuffix' +p22 +S'JSONObject' +p23 +sba(iJSONScheme +JSONScheme +p24 +(dp25 +g16 +(lp26 +g18 +ag5 +asS'hasMinLength' +p27 +I01 +sS'minLength' +p28 +I3 +sg4 +S'password' +p29 +sg6 +g7 +sg8 +S'string' +p30 +sg2 +(lp31 +sg22 +g23 +sS'maxLength' +p32 +I12 +sS'hasMaxLength' +p33 +I01 +sbasg22 +g23 +sb. \ No newline at end of file diff --git a/test_data/test_string_options/S2MLoginJSONObject.h b/test_data/test_string_options/S2MLoginJSONObject.h new file mode 100644 index 0000000..5f8a958 --- /dev/null +++ b/test_data/test_string_options/S2MLoginJSONObject.h @@ -0,0 +1,11 @@ +// +// S2MLoginJSONObject.h +// +// Created by MetaJSONParser. +// Copyright (c) 2014 SinnerSchrader Mobile. All rights reserved. + +#import "_S2MLoginJSONObject.h" +@interface S2MLoginJSONObject : _S2MLoginJSONObject + +@end + diff --git a/test_data/test_string_options/S2MLoginJSONObject.m b/test_data/test_string_options/S2MLoginJSONObject.m new file mode 100644 index 0000000..5b5e6ee --- /dev/null +++ b/test_data/test_string_options/S2MLoginJSONObject.m @@ -0,0 +1,11 @@ +// +// S2MLoginJSONObject.m +// +// Created by MetaJSONParser. +// Copyright (c) 2014 SinnerSchrader Mobile. All rights reserved. + +#import "S2MLoginJSONObject.h" +@implementation S2MLoginJSONObject + +@end + diff --git a/test_data/test_string_options/_S2MLoginJSONObject.h b/test_data/test_string_options/_S2MLoginJSONObject.h new file mode 100644 index 0000000..2a371bd --- /dev/null +++ b/test_data/test_string_options/_S2MLoginJSONObject.h @@ -0,0 +1,22 @@ +// +// _S2MLoginJSONObject.h +// +// Created by MetaJSONParser. +// Copyright (c) 2014 SinnerSchrader Mobile. All rights reserved. + +#import <Foundation/Foundation.h> + +@class S2MLoginJSONObject; + +@interface _S2MLoginJSONObject : NSObject <NSCoding> + + +@property (nonatomic, strong) NSString *emailString; +@property (nonatomic, strong) NSString *password; + ++ (S2MLoginJSONObject *)loginWithDictionary:(NSDictionary *)dic withError:(NSError **)error; +- (id)initWithDictionary:(NSDictionary *)dic withError:(NSError **)error; +- (NSDictionary *)propertyDictionary; + +@end + diff --git a/test_data/test_string_options/_S2MLoginJSONObject.m b/test_data/test_string_options/_S2MLoginJSONObject.m new file mode 100644 index 0000000..4f6fda2 --- /dev/null +++ b/test_data/test_string_options/_S2MLoginJSONObject.m @@ -0,0 +1,85 @@ +// +// _S2MLoginJSONObject.m +// +// Created by MetaJSONParser. +// Copyright (c) 2014 SinnerSchrader Mobile. All rights reserved. + +#import "S2MAPIParser.h" +#import "NSString+RegExValidation.h" +#import "S2MLoginJSONObject.h" + + +@implementation _S2MLoginJSONObject + +#pragma mark - factory + ++ (S2MLoginJSONObject *)loginWithDictionary:(NSDictionary *)dic withError:(NSError **)error { + return [[S2MLoginJSONObject alloc] initWithDictionary:dic withError:error]; +} + + +#pragma mark - initialize +- (id)initWithDictionary:(NSDictionary *)dic withError:(NSError **)error { + self = [super init]; + if (self) { + self.emailString = [S2MAPIParser stringFromResponseDictionary:dic forKey:@"emailString" acceptNumber:NO acceptNil:YES error:error]; + if (*error) { + return self; + } + if (self.emailString && [self.emailString matchesRegExString:@"[a-z0-9!#$%&'*+/=?^_`{|}~-](?:\\.[a-z0-9!#$%&'*/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?"] == NO) { + NSDictionary *userInfo = [NSDictionary dictionaryWithObjectsAndKeys:@"emailString", @"propertyName", @"emailString", @"key", @"validation error", @"reason", NSStringFromClass([self class]), @"objectClass",nil]; + *error = [NSError errorWithDomain:kS2MErrorDomain_parser code:kS2MErrorDomain_parser_valueIsNotValid userInfo:userInfo]; + NSLog(@"%@", *error); + return self; + } + self.password = [S2MAPIParser stringFromResponseDictionary:dic forKey:@"password" acceptNumber:NO acceptNil:YES error:error]; + if (*error) { + return self; + } + if (self.password.length > 12) { + NSDictionary *userInfo = [NSDictionary dictionaryWithObjectsAndKeys:@"password", @"propertyName", @"password", @"key", @"validation error", @"reason", NSStringFromClass([self class]), @"objectClass",nil]; + *error = [NSError errorWithDomain:kS2MErrorDomain_parser code:kS2MErrorDomain_parser_valueIsNotValid userInfo:userInfo]; + NSLog(@"%@", *error); + return self; + } + if (self.password.length < 3) { + NSDictionary *userInfo = [NSDictionary dictionaryWithObjectsAndKeys:@"password", @"propertyName", @"password", @"key", @"validation error", @"reason", NSStringFromClass([self class]), @"objectClass",nil]; + *error = [NSError errorWithDomain:kS2MErrorDomain_parser code:kS2MErrorDomain_parser_valueIsNotValid userInfo:userInfo]; + NSLog(@"%@", *error); + return self; + } + } + return self; +} + + +#pragma mark - getter + +#pragma mark - NSCoding +- (void)encodeWithCoder:(NSCoder*)coder { + [coder encodeObject:self.emailString forKey:@"emailString"]; + [coder encodeObject:self.password forKey:@"password"]; +} +- (id)initWithCoder:(NSCoder *)coder { + self = [super init]; + self.emailString = [coder decodeObjectForKey:@"emailString"]; + self.password = [coder decodeObjectForKey:@"password"]; + return self; +} + +#pragma mark - Object Info +- (NSDictionary *)propertyDictionary { + NSMutableDictionary *dic = [[NSMutableDictionary alloc] init]; + if (self.emailString) { + [dic setObject:self.emailString forKey:@"emailString"]; + } + if (self.password) { + [dic setObject:self.password forKey:@"password"]; + } + return dic; +} +- (NSString *)description { + return [NSString stringWithFormat:@"%@",[self propertyDictionary]]; +} + +@end From 1c02c76f6c8cb1be1aaecb2ae8e036c92fc58e00 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Franc=CC=A7ois=20Benaiteau?= <francois.benaiteau@sinnerschrader-mobile.com> Date: Wed, 16 Apr 2014 16:17:08 +0200 Subject: [PATCH 038/149] add notes for development and testing --- Development.md | 1 + 1 file changed, 1 insertion(+) diff --git a/Development.md b/Development.md index 507bbce..99bbc7f 100644 --- a/Development.md +++ b/Development.md @@ -13,3 +13,4 @@ sudo pip install -r requirements.txt `nosetests` will all the tests at the root of repo. `nosetests <filename>` run only this test file. `nosetests -s` run tests with output +`nosetests ObjectiveCCodeGenerator_test:TestSampleTestClassCase.test_human_source_content` run only one single test From 5486fcf2d100876e5c99a6a07e418d88158e9a19 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Franc=CC=A7ois=20Benaiteau?= <francois.benaiteau@sinnerschrader-mobile.com> Date: Wed, 16 Apr 2014 16:20:47 +0200 Subject: [PATCH 039/149] Fixes TestSampleTestStringOptionsCase.test_machine_header_content test Removes human file tests as it's not different from other test cases --- ObjectiveCCodeGenerator_test.py | 9 --------- test_data/test_string_options/S2MLoginJSONObject.h | 11 ----------- test_data/test_string_options/S2MLoginJSONObject.m | 11 ----------- test_data/test_string_options/_S2MLoginJSONObject.h | 2 -- 4 files changed, 33 deletions(-) delete mode 100644 test_data/test_string_options/S2MLoginJSONObject.h delete mode 100644 test_data/test_string_options/S2MLoginJSONObject.m diff --git a/ObjectiveCCodeGenerator_test.py b/ObjectiveCCodeGenerator_test.py index 856deb4..34cab1b 100644 --- a/ObjectiveCCodeGenerator_test.py +++ b/ObjectiveCCodeGenerator_test.py @@ -50,15 +50,6 @@ def setUp(self): self.test_file_path = self.default_folder + 'test_string_options' self.scheme_object = pickle.load(open(self.test_file_path + '.p', 'rb')) - - def test_human_header_content(self): - result = self.gen.human_header_content(self.scheme_object) - self.assert_content_file(self.test_file_path + "/S2MLoginJSONObject.h", result) - - def test_human_source_content(self): - result = self.gen.human_source_content(self.scheme_object) - self.assert_content_file(self.test_file_path + "/S2MLoginJSONObject.m", result) - def test_machine_source_content(self): result = self.gen.machine_source_content(self.scheme_object) self.assert_content_file(self.test_file_path + "/_S2MLoginJSONObject.m", result) diff --git a/test_data/test_string_options/S2MLoginJSONObject.h b/test_data/test_string_options/S2MLoginJSONObject.h deleted file mode 100644 index 5f8a958..0000000 --- a/test_data/test_string_options/S2MLoginJSONObject.h +++ /dev/null @@ -1,11 +0,0 @@ -// -// S2MLoginJSONObject.h -// -// Created by MetaJSONParser. -// Copyright (c) 2014 SinnerSchrader Mobile. All rights reserved. - -#import "_S2MLoginJSONObject.h" -@interface S2MLoginJSONObject : _S2MLoginJSONObject - -@end - diff --git a/test_data/test_string_options/S2MLoginJSONObject.m b/test_data/test_string_options/S2MLoginJSONObject.m deleted file mode 100644 index 5b5e6ee..0000000 --- a/test_data/test_string_options/S2MLoginJSONObject.m +++ /dev/null @@ -1,11 +0,0 @@ -// -// S2MLoginJSONObject.m -// -// Created by MetaJSONParser. -// Copyright (c) 2014 SinnerSchrader Mobile. All rights reserved. - -#import "S2MLoginJSONObject.h" -@implementation S2MLoginJSONObject - -@end - diff --git a/test_data/test_string_options/_S2MLoginJSONObject.h b/test_data/test_string_options/_S2MLoginJSONObject.h index 2a371bd..a441645 100644 --- a/test_data/test_string_options/_S2MLoginJSONObject.h +++ b/test_data/test_string_options/_S2MLoginJSONObject.h @@ -10,7 +10,6 @@ @interface _S2MLoginJSONObject : NSObject <NSCoding> - @property (nonatomic, strong) NSString *emailString; @property (nonatomic, strong) NSString *password; @@ -19,4 +18,3 @@ - (NSDictionary *)propertyDictionary; @end - From 52800d46a0ad11ba60b9a55a092308dd4d6062af Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Franc=CC=A7ois=20Benaiteau?= <francois.benaiteau@sinnerschrader-mobile.com> Date: Wed, 16 Apr 2014 16:28:21 +0200 Subject: [PATCH 040/149] adjust spaces of generated file --- .../test_string_options/_S2MLoginJSONObject.m | 29 ++++++++++++------- 1 file changed, 19 insertions(+), 10 deletions(-) diff --git a/test_data/test_string_options/_S2MLoginJSONObject.m b/test_data/test_string_options/_S2MLoginJSONObject.m index 4f6fda2..3870807 100644 --- a/test_data/test_string_options/_S2MLoginJSONObject.m +++ b/test_data/test_string_options/_S2MLoginJSONObject.m @@ -4,7 +4,7 @@ // Created by MetaJSONParser. // Copyright (c) 2014 SinnerSchrader Mobile. All rights reserved. -#import "S2MAPIParser.h" +#import "APIParser.h" #import "NSString+RegExValidation.h" #import "S2MLoginJSONObject.h" @@ -13,13 +13,15 @@ @implementation _S2MLoginJSONObject #pragma mark - factory -+ (S2MLoginJSONObject *)loginWithDictionary:(NSDictionary *)dic withError:(NSError **)error { ++ (S2MLoginJSONObject *)loginWithDictionary:(NSDictionary *)dic withError:(NSError **)error +{ return [[S2MLoginJSONObject alloc] initWithDictionary:dic withError:error]; } #pragma mark - initialize -- (id)initWithDictionary:(NSDictionary *)dic withError:(NSError **)error { +- (id)initWithDictionary:(NSDictionary *)dic withError:(NSError **)error +{ self = [super init]; if (self) { self.emailString = [S2MAPIParser stringFromResponseDictionary:dic forKey:@"emailString" acceptNumber:NO acceptNil:YES error:error]; @@ -52,23 +54,28 @@ - (id)initWithDictionary:(NSDictionary *)dic withError:(NSError **)error { return self; } - #pragma mark - getter #pragma mark - NSCoding -- (void)encodeWithCoder:(NSCoder*)coder { + +- (void)encodeWithCoder:(NSCoder*)coder +{ + [super encodeWithCoder:coder]; [coder encodeObject:self.emailString forKey:@"emailString"]; [coder encodeObject:self.password forKey:@"password"]; } -- (id)initWithCoder:(NSCoder *)coder { - self = [super init]; + +- (id)initWithCoder:(NSCoder *)coder +{ + self = [super initWithCoder:coder]; self.emailString = [coder decodeObjectForKey:@"emailString"]; self.password = [coder decodeObjectForKey:@"password"]; return self; } #pragma mark - Object Info -- (NSDictionary *)propertyDictionary { +- (NSDictionary *)propertyDictionary +{ NSMutableDictionary *dic = [[NSMutableDictionary alloc] init]; if (self.emailString) { [dic setObject:self.emailString forKey:@"emailString"]; @@ -78,8 +85,10 @@ - (NSDictionary *)propertyDictionary { } return dic; } -- (NSString *)description { - return [NSString stringWithFormat:@"%@",[self propertyDictionary]]; + +- (NSString *)description +{ + return [[self propertyDictionary] description]; } @end From 5c64913d921bdf3f3585c24fa3bebf9a78a1be12 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Franc=CC=A7ois=20Benaiteau?= <francois.benaiteau@sinnerschrader-mobile.com> Date: Wed, 16 Apr 2014 18:19:53 +0200 Subject: [PATCH 041/149] Supports maxLength, minLength, regex options ObjectiveCCodeGenerator_test:TestSampleTestStringOptionsCase.test_machine_source_content passes --- ObjectiveCCodeGenerator.py | 17 ++++++-- templates/_source.m.mustache | 37 +++++++++-------- test_data/test_string_options.p | 41 ++++++++++--------- .../test_string_options/_S2MLoginJSONObject.m | 21 +++++++--- 4 files changed, 71 insertions(+), 45 deletions(-) diff --git a/ObjectiveCCodeGenerator.py b/ObjectiveCCodeGenerator.py index 5251d2a..b507560 100755 --- a/ObjectiveCCodeGenerator.py +++ b/ObjectiveCCodeGenerator.py @@ -64,13 +64,24 @@ def makeVarName(self,schemeObj) : return returnName def process_properties(self, propObj) : - propertyHash = {} + propertyHash = {'name' : propObj.type_name, 'varName' : self.makeVarName(propObj)} if propObj.type_description and len(propObj.type_description) : propertyHash["comment"] = propObj.type_description - propertyHash['name'] = propObj.type_name - propertyHash['varName'] = self.makeVarName(propObj) if propObj.required == 1: propertyHash['required'] = True + + hasRegex, regex = propObj.getRegex() + if hasRegex: + propertyHash['regex'] = {"value": regex} + + hasMax, maxLength = propObj.getMaxLength() + if hasMax: + propertyHash['maxLength'] = {"value": maxLength} + + hasMin, minLength = propObj.getMinLength() + if hasMin: + propertyHash['minLength'] = {"value": minLength} + return propertyHash def human_header_content(self, schemeObj) : diff --git a/templates/_source.m.mustache b/templates/_source.m.mustache index e5270d0..749cf9a 100644 --- a/templates/_source.m.mustache +++ b/templates/_source.m.mustache @@ -35,14 +35,18 @@ } {{/numberProperties}} {{#stringProperties}} - self.{{varName}} = [{{projectPrefix}}APIParser stringFromResponseDictionary:dic forKey:@"{{name}}" acceptNumber:YES acceptNil:{{#required}}NO{{/required}}{{^required}}YES{{/required}} error:error]; + self.{{varName}} = [{{projectPrefix}}APIParser stringFromResponseDictionary:dic forKey:@"{{name}}" acceptNumber:NO acceptNil:{{#required}}NO{{/required}}{{^required}}YES{{/required}} error:error]; + if (*error) { + return self; + } {{#regex}} - if (self.{{varName}} && [self.{{varName}} matchesRegExString:@"{{value}}"] == NO) { + if (self.{{varName}} && [self.{{varName}} matchesRegExString:@"{{& value}}"] == NO) { NSDictionary *userInfo = @{@"propertyName" : @"{{varName}}", - @"key" : @"{{name}}", - @"reason" : @"validation error", - @"objectClass" : NSStringFromClass([self class])}; - *error = [NSError errorWithDomain:kEGMErrorDomain_parser code:kEGMErrorDomain_parser_valueIsNotValid userInfo:userInfo]; + @"key" : @"{{name}}", + @"reason" : @"validation error", + @"objectClass" : NSStringFromClass([self class]) + }; + *error = [NSError errorWithDomain:k{{projectPrefix}}ErrorDomain_parser code:k{{projectPrefix}}ErrorDomain_parser_valueIsNotValid userInfo:userInfo]; NSLog(@"%@", *error); return self; } @@ -50,10 +54,11 @@ {{#maxLength}} if (self.{{varName}}.length > {{value}}) { NSDictionary *userInfo = @{@"propertyName" : @"{{varName}}", - @"key" : @"{{name}}", - @"reason" : @"max length validation error", - @"objectClass" : NSStringFromClass([self class])}; - *error = [NSError errorWithDomain:kEGMErrorDomain_parser code:kEGMErrorDomain_parser_valueIsNotValid userInfo:userInfo]; + @"key" : @"{{name}}", + @"reason" : @"max length validation error", + @"objectClass" : NSStringFromClass([self class]) + }; + *error = [NSError errorWithDomain:k{{projectPrefix}}ErrorDomain_parser code:k{{projectPrefix}}ErrorDomain_parser_valueIsNotValid userInfo:userInfo]; NSLog(@"%@", *error); return self; } @@ -61,17 +66,15 @@ {{#minLength}} if (self.{{varName}}.length < {{value}}) { NSDictionary *userInfo = @{@"propertyName" : @"{{varName}}", - @"key" : @"{{name}}", - @"reason" : @"min length validation error", - @"objectClass" : NSStringFromClass([self class])}; - *error = [NSError errorWithDomain:kEGMErrorDomain_parser code:kEGMErrorDomain_parser_valueIsNotValid userInfo:userInfo]; + @"key" : @"{{name}}", + @"reason" : @"min length validation error", + @"objectClass" : NSStringFromClass([self class]) + }; + *error = [NSError errorWithDomain:k{{projectPrefix}}ErrorDomain_parser code:k{{projectPrefix}}ErrorDomain_parser_valueIsNotValid userInfo:userInfo]; NSLog(@"%@", *error); return self; } {{/minLength}} - if (*error) { - return self; - } {{/stringProperties}} {{#booleanProperties}} {{/booleanProperties}} diff --git a/test_data/test_string_options.p b/test_data/test_string_options.p index 15a2710..cdbbcd0 100644 --- a/test_data/test_string_options.p +++ b/test_data/test_string_options.p @@ -38,48 +38,49 @@ asg4 S'emailString' p19 sg6 -g7 +S'S2M' +p20 sg8 S'string' -p20 +p21 sg2 -(lp21 +(lp22 sS'objectSuffix' -p22 -S'JSONObject' p23 +S'JSONObject' +p24 sba(iJSONScheme JSONScheme -p24 -(dp25 +p25 +(dp26 g16 -(lp26 +(lp27 g18 ag5 asS'hasMinLength' -p27 +p28 I01 sS'minLength' -p28 +p29 I3 sg4 S'password' -p29 +p30 sg6 -g7 +g20 sg8 S'string' -p30 +p31 sg2 -(lp31 -sg22 -g23 +(lp32 +sg23 +g24 sS'maxLength' -p32 +p33 I12 sS'hasMaxLength' -p33 +p34 I01 -sbasg22 -g23 +sbasg23 +g24 sb. \ No newline at end of file diff --git a/test_data/test_string_options/_S2MLoginJSONObject.m b/test_data/test_string_options/_S2MLoginJSONObject.m index 3870807..bd1d7d9 100644 --- a/test_data/test_string_options/_S2MLoginJSONObject.m +++ b/test_data/test_string_options/_S2MLoginJSONObject.m @@ -4,7 +4,7 @@ // Created by MetaJSONParser. // Copyright (c) 2014 SinnerSchrader Mobile. All rights reserved. -#import "APIParser.h" +#import "S2MAPIParser.h" #import "NSString+RegExValidation.h" #import "S2MLoginJSONObject.h" @@ -18,7 +18,6 @@ + (S2MLoginJSONObject *)loginWithDictionary:(NSDictionary *)dic withError:(NSErr return [[S2MLoginJSONObject alloc] initWithDictionary:dic withError:error]; } - #pragma mark - initialize - (id)initWithDictionary:(NSDictionary *)dic withError:(NSError **)error { @@ -29,7 +28,11 @@ - (id)initWithDictionary:(NSDictionary *)dic withError:(NSError **)error return self; } if (self.emailString && [self.emailString matchesRegExString:@"[a-z0-9!#$%&'*+/=?^_`{|}~-](?:\\.[a-z0-9!#$%&'*/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?"] == NO) { - NSDictionary *userInfo = [NSDictionary dictionaryWithObjectsAndKeys:@"emailString", @"propertyName", @"emailString", @"key", @"validation error", @"reason", NSStringFromClass([self class]), @"objectClass",nil]; + NSDictionary *userInfo = @{@"propertyName" : @"emailString", + @"key" : @"emailString", + @"reason" : @"validation error", + @"objectClass" : NSStringFromClass([self class]) + }; *error = [NSError errorWithDomain:kS2MErrorDomain_parser code:kS2MErrorDomain_parser_valueIsNotValid userInfo:userInfo]; NSLog(@"%@", *error); return self; @@ -39,13 +42,21 @@ - (id)initWithDictionary:(NSDictionary *)dic withError:(NSError **)error return self; } if (self.password.length > 12) { - NSDictionary *userInfo = [NSDictionary dictionaryWithObjectsAndKeys:@"password", @"propertyName", @"password", @"key", @"validation error", @"reason", NSStringFromClass([self class]), @"objectClass",nil]; + NSDictionary *userInfo = @{@"propertyName" : @"password", + @"key" : @"password", + @"reason" : @"max length validation error", + @"objectClass" : NSStringFromClass([self class]) + }; *error = [NSError errorWithDomain:kS2MErrorDomain_parser code:kS2MErrorDomain_parser_valueIsNotValid userInfo:userInfo]; NSLog(@"%@", *error); return self; } if (self.password.length < 3) { - NSDictionary *userInfo = [NSDictionary dictionaryWithObjectsAndKeys:@"password", @"propertyName", @"password", @"key", @"validation error", @"reason", NSStringFromClass([self class]), @"objectClass",nil]; + NSDictionary *userInfo = @{@"propertyName" : @"password", + @"key" : @"password", + @"reason" : @"min length validation error", + @"objectClass" : NSStringFromClass([self class]) + }; *error = [NSError errorWithDomain:kS2MErrorDomain_parser code:kS2MErrorDomain_parser_valueIsNotValid userInfo:userInfo]; NSLog(@"%@", *error); return self; From ca83933fbfcf098fbeab31acd37e9fa636fda4c9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Franc=CC=A7ois=20Benaiteau?= <francois.benaiteau@sinnerschrader-mobile.com> Date: Wed, 16 Apr 2014 18:21:09 +0200 Subject: [PATCH 042/149] acceptNumber is NO for string type by default. All tests passes --- ObjectiveCCodeGenerator_test.py | 3 +++ test_data/test_class/_S2MSenderJSONObject.m | 6 +++--- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/ObjectiveCCodeGenerator_test.py b/ObjectiveCCodeGenerator_test.py index 34cab1b..26d6d6f 100644 --- a/ObjectiveCCodeGenerator_test.py +++ b/ObjectiveCCodeGenerator_test.py @@ -57,6 +57,9 @@ def test_machine_source_content(self): def test_machine_header_content(self): result = self.gen.machine_header_content(self.scheme_object) self.assert_content_file(self.test_file_path + "/_S2MLoginJSONObject.h", result) + # def test_make(self): + # result = self.gen.machine_header_content(self.scheme_object) + # self.gen.make(self.scheme_object) # class TestSampleTestCase(TestObjectiveCCodeGenerator): # def setUp(self): diff --git a/test_data/test_class/_S2MSenderJSONObject.m b/test_data/test_class/_S2MSenderJSONObject.m index 9c34c2c..c4a9cb5 100644 --- a/test_data/test_class/_S2MSenderJSONObject.m +++ b/test_data/test_class/_S2MSenderJSONObject.m @@ -4,7 +4,7 @@ // Created by MetaJSONParser. // Copyright (c) 2014 SinnerSchrader Mobile. All rights reserved. -#import "APIParser.h" +#import "S2MAPIParser.h" #import "NSString+RegExValidation.h" #import "S2MSenderJSONObject.h" @@ -23,11 +23,11 @@ - (id)initWithDictionary:(NSDictionary *)dic withError:(NSError **)error { self = [super init]; if (self) { - self.senderName = [APIParser stringFromResponseDictionary:dic forKey:@"senderName" acceptNumber:YES acceptNil:NO error:error]; + self.senderName = [S2MAPIParser stringFromResponseDictionary:dic forKey:@"senderName" acceptNumber:NO acceptNil:NO error:error]; if (*error) { return self; } - self.previewImageURL = [APIParser stringFromResponseDictionary:dic forKey:@"previewImageURL" acceptNumber:YES acceptNil:NO error:error]; + self.previewImageURL = [S2MAPIParser stringFromResponseDictionary:dic forKey:@"previewImageURL" acceptNumber:NO acceptNil:NO error:error]; if (*error) { return self; } From c22000ab84e797f9e0f614515af9198949e94049 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Franc=CC=A7ois=20Benaiteau?= <francois.benaiteau@sinnerschrader-mobile.com> Date: Wed, 16 Apr 2014 18:27:41 +0200 Subject: [PATCH 043/149] Fixes space in header --- templates/_header.h.mustache | 1 + 1 file changed, 1 insertion(+) diff --git a/templates/_header.h.mustache b/templates/_header.h.mustache index e4a1aa1..55066ce 100644 --- a/templates/_header.h.mustache +++ b/templates/_header.h.mustache @@ -10,6 +10,7 @@ {{/baseTypeIsObject}} @class {{humanClassName}}; + {{#baseTypeIsObject}} @interface {{machineClassName}} : NSObject <NSCoding> {{/baseTypeIsObject}} From 5922e3e193890c9bdd00b4a81263826026b6d452 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Franc=CC=A7ois=20Benaiteau?= <francois.benaiteau@sinnerschrader-mobile.com> Date: Wed, 16 Apr 2014 18:28:29 +0200 Subject: [PATCH 044/149] add new extension to human file --- test_data/test_class/S2MSenderJSONObject.m | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/test_data/test_class/S2MSenderJSONObject.m b/test_data/test_class/S2MSenderJSONObject.m index f749b53..e3f593e 100644 --- a/test_data/test_class/S2MSenderJSONObject.m +++ b/test_data/test_class/S2MSenderJSONObject.m @@ -5,6 +5,11 @@ // Copyright (c) 2014 SinnerSchrader Mobile. All rights reserved. #import "S2MSenderJSONObject.h" + +@interface S2MSenderJSONObject () + +@end + @implementation S2MSenderJSONObject @end From 994571b5f0eceb2109e99bef63df783bea763740 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Franc=CC=A7ois=20Benaiteau?= <francois.benaiteau@sinnerschrader-mobile.com> Date: Wed, 16 Apr 2014 19:01:20 +0200 Subject: [PATCH 045/149] Fixes project Prefix --- ObjectiveCCodeGenerator.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ObjectiveCCodeGenerator.py b/ObjectiveCCodeGenerator.py index b507560..371a9a7 100755 --- a/ObjectiveCCodeGenerator.py +++ b/ObjectiveCCodeGenerator.py @@ -129,7 +129,7 @@ def machine_file_content(self, schemeObj, template_file) : if prop.rootBaseType() == "number": numberProps.append(self.process_properties(prop)) - hashParams = {"date": str(today.year), "machineClassName": schemeObj.getMachineClassName(), "humanClassName": schemeObj.getClassName(), "variableName": self.makeVarName(schemeObj), "stringProperties": stringProps, "numberProperties": numberProps} + hashParams = {"date": str(today.year), "projectPrefix": schemeObj.projectPrefix,"machineClassName": schemeObj.getMachineClassName(), "humanClassName": schemeObj.getClassName(), "variableName": self.makeVarName(schemeObj), "stringProperties": stringProps, "numberProperties": numberProps} if schemeObj.base_type == 'object': hashParams['baseTypeIsObject'] = True print hashParams From de8d70d0db04bb3444e5bf1f07a0724eed99cfca Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Franc=CC=A7ois=20Benaiteau?= <francois.benaiteau@sinnerschrader-mobile.com> Date: Wed, 16 Apr 2014 19:02:29 +0200 Subject: [PATCH 046/149] add new test case for subclasses --- ObjectiveCCodeGenerator.py | 2 - ObjectiveCCodeGenerator_test.py | 57 ++++++++++++---- samples/test_subclass.json | 28 ++++++++ test_data/save_motherClass.p | 52 +++++++++++++++ test_data/save_subClass.p | 56 ++++++++++++++++ .../test_subclass/MotherClassJSONObject.h | 10 +++ .../test_subclass/MotherClassJSONObject.m | 15 +++++ test_data/test_subclass/SubClassJSONObject.h | 10 +++ test_data/test_subclass/SubClassJSONObject.m | 15 +++++ .../test_subclass/_MotherClassJSONObject.h | 19 ++++++ .../test_subclass/_MotherClassJSONObject.m | 66 +++++++++++++++++++ test_data/test_subclass/_SubClassJSONObject.h | 19 ++++++ test_data/test_subclass/_SubClassJSONObject.m | 62 +++++++++++++++++ 13 files changed, 397 insertions(+), 14 deletions(-) create mode 100644 samples/test_subclass.json create mode 100644 test_data/save_motherClass.p create mode 100644 test_data/save_subClass.p create mode 100644 test_data/test_subclass/MotherClassJSONObject.h create mode 100644 test_data/test_subclass/MotherClassJSONObject.m create mode 100644 test_data/test_subclass/SubClassJSONObject.h create mode 100644 test_data/test_subclass/SubClassJSONObject.m create mode 100644 test_data/test_subclass/_MotherClassJSONObject.h create mode 100644 test_data/test_subclass/_MotherClassJSONObject.m create mode 100644 test_data/test_subclass/_SubClassJSONObject.h create mode 100644 test_data/test_subclass/_SubClassJSONObject.m diff --git a/ObjectiveCCodeGenerator.py b/ObjectiveCCodeGenerator.py index 371a9a7..df56e63 100755 --- a/ObjectiveCCodeGenerator.py +++ b/ObjectiveCCodeGenerator.py @@ -27,8 +27,6 @@ import os import sys from pystache import Renderer -# import pickle -# from cStringIO import StringIO class ObjectiveCCodeGenerator : diff --git a/ObjectiveCCodeGenerator_test.py b/ObjectiveCCodeGenerator_test.py index 26d6d6f..f43e5d5 100644 --- a/ObjectiveCCodeGenerator_test.py +++ b/ObjectiveCCodeGenerator_test.py @@ -57,18 +57,51 @@ def test_machine_source_content(self): def test_machine_header_content(self): result = self.gen.machine_header_content(self.scheme_object) self.assert_content_file(self.test_file_path + "/_S2MLoginJSONObject.h", result) - # def test_make(self): - # result = self.gen.machine_header_content(self.scheme_object) - # self.gen.make(self.scheme_object) - -# class TestSampleTestCase(TestObjectiveCCodeGenerator): -# def setUp(self): -# super(TestSampleTestCase, self).setUp() -# self.test_file_path = self.default_folder + 'test_json' -# self.scheme_object = pickle.load(open(self.test_file_path + '.p', 'rb')) -# -# def test_machine_source_content(self): -# self.gen.make(self.scheme_object) + +class TestSampleTestSubclassMotherCase(TestObjectiveCCodeGenerator): + def setUp(self): + super(TestSampleTestSubclassMotherCase, self).setUp() + self.test_file_path = self.default_folder + 'test_subclass' + self.scheme_object = pickle.load(open(self.default_folder + '/save_motherClass.p', 'rb')) + + def test_mother_human_header_content(self): + result = self.gen.human_header_content(self.scheme_object) + self.assert_content_file(self.test_file_path + "/MotherClassJSONObject.h", result) + + def test_mother_human_source_content(self): + result = self.gen.human_source_content(self.scheme_object) + self.assert_content_file(self.test_file_path + "/MotherClassJSONObject.m", result) + + def test_mother_machine_source_content(self): + result = self.gen.machine_source_content(self.scheme_object) + self.assert_content_file(self.test_file_path + "/_MotherClassJSONObject.m", result) + + def test_mother_machine_header_content(self): + result = self.gen.machine_header_content(self.scheme_object) + self.assert_content_file(self.test_file_path + "/_MotherClassJSONObject.h", result) + +class TestSampleTestSubclassSubclassCase(TestObjectiveCCodeGenerator): + def setUp(self): + super(TestSampleTestSubclassSubclassCase, self).setUp() + self.test_file_path = self.default_folder + 'test_subclass' + self.scheme_object = pickle.load(open(self.default_folder + '/save_subClass.p', 'rb')) + + def test_subclass_human_header_content(self): + result = self.gen.human_header_content(self.scheme_object) + self.assert_content_file(self.test_file_path + "/SubClassJSONObject.h", result) + + def test_subclass_human_source_content(self): + result = self.gen.human_source_content(self.scheme_object) + self.assert_content_file(self.test_file_path + "/SubClassJSONObject.m", result) + + def test_subclass_machine_source_content(self): + result = self.gen.machine_source_content(self.scheme_object) + self.assert_content_file(self.test_file_path + "/_SubClassJSONObject.m", result) + + def test_subclass_machine_header_content(self): + result = self.gen.machine_header_content(self.scheme_object) + self.assert_content_file(self.test_file_path + "/_SubClassJSONObject.h", result) + if __name__ == '__main__': unittest.main() diff --git a/samples/test_subclass.json b/samples/test_subclass.json new file mode 100644 index 0000000..24df52b --- /dev/null +++ b/samples/test_subclass.json @@ -0,0 +1,28 @@ +[ + { + "name" : "motherClass", + "base-type" : "object", + "property" : + [ + { + "name" : "id", + "base-type" : "string", + "required" : 1 + } + ] + }, + { + "name" : "subClass", + "base-type" : "motherClass", + "description" : "subclass of motherClass", + "property" : + [ + { + "name" : "name", + "base-type" : "string", + "required" : 0 + } + ] + } + +] diff --git a/test_data/save_motherClass.p b/test_data/save_motherClass.p new file mode 100644 index 0000000..3fb8f72 --- /dev/null +++ b/test_data/save_motherClass.p @@ -0,0 +1,52 @@ +(iJSONScheme +JSONScheme +p0 +(dp1 +S'base_type_list' +p2 +(lp3 +sS'type_name' +p4 +S'motherClass' +p5 +sS'projectPrefix' +p6 +S'' +p7 +sS'base_type' +p8 +S'object' +p9 +sS'props' +p10 +(lp11 +(iJSONScheme +JSONScheme +p12 +(dp13 +S'domain' +p14 +(lp15 +S'ROOT' +p16 +ag5 +asS'required' +p17 +I1 +sg4 +S'id' +p18 +sg6 +g7 +sg8 +S'string' +p19 +sg2 +(lp20 +sS'objectSuffix' +p21 +S'JSONObject' +p22 +sbasg21 +g22 +sb. \ No newline at end of file diff --git a/test_data/save_subClass.p b/test_data/save_subClass.p new file mode 100644 index 0000000..2263a5b --- /dev/null +++ b/test_data/save_subClass.p @@ -0,0 +1,56 @@ +(iJSONScheme +JSONScheme +p0 +(dp1 +S'type_description' +p2 +S'subclass of motherClass' +p3 +sS'type_name' +p4 +S'subClass' +p5 +sS'projectPrefix' +p6 +S'' +p7 +sS'base_type' +p8 +S'motherClass' +p9 +sS'base_type_list' +p10 +(lp11 +sS'objectSuffix' +p12 +S'JSONObject' +p13 +sS'props' +p14 +(lp15 +(iJSONScheme +JSONScheme +p16 +(dp17 +S'domain' +p18 +(lp19 +S'ROOT' +p20 +ag5 +asS'required' +p21 +I0 +sg4 +S'name' +p22 +sg6 +g7 +sg8 +S'string' +p23 +sg10 +(lp24 +sg12 +g13 +sbasb. \ No newline at end of file diff --git a/test_data/test_subclass/MotherClassJSONObject.h b/test_data/test_subclass/MotherClassJSONObject.h new file mode 100644 index 0000000..cf44b24 --- /dev/null +++ b/test_data/test_subclass/MotherClassJSONObject.h @@ -0,0 +1,10 @@ +// +// MotherClassJSONObject.h +// +// Created by MetaJSONParser. +// Copyright (c) 2014 SinnerSchrader Mobile. All rights reserved. + +#import "_MotherClassJSONObject.h" +@interface MotherClassJSONObject : _MotherClassJSONObject + +@end diff --git a/test_data/test_subclass/MotherClassJSONObject.m b/test_data/test_subclass/MotherClassJSONObject.m new file mode 100644 index 0000000..69a23ae --- /dev/null +++ b/test_data/test_subclass/MotherClassJSONObject.m @@ -0,0 +1,15 @@ +// +// MotherClassJSONObject.m +// +// Created by MetaJSONParser. +// Copyright (c) 2014 SinnerSchrader Mobile. All rights reserved. + +#import "MotherClassJSONObject.h" + +@interface MotherClassJSONObject () + +@end + +@implementation MotherClassJSONObject + +@end diff --git a/test_data/test_subclass/SubClassJSONObject.h b/test_data/test_subclass/SubClassJSONObject.h new file mode 100644 index 0000000..df686da --- /dev/null +++ b/test_data/test_subclass/SubClassJSONObject.h @@ -0,0 +1,10 @@ +// +// SubClassJSONObject.h +// +// Created by MetaJSONParser. +// Copyright (c) 2014 SinnerSchrader Mobile. All rights reserved. + +#import "_SubClassJSONObject.h" +@interface SubClassJSONObject : _SubClassJSONObject + +@end diff --git a/test_data/test_subclass/SubClassJSONObject.m b/test_data/test_subclass/SubClassJSONObject.m new file mode 100644 index 0000000..4d3af39 --- /dev/null +++ b/test_data/test_subclass/SubClassJSONObject.m @@ -0,0 +1,15 @@ +// +// SubClassJSONObject.m +// +// Created by MetaJSONParser. +// Copyright (c) 2014 SinnerSchrader Mobile. All rights reserved. + +#import "SubClassJSONObject.h" + +@interface SubClassJSONObject () + +@end + +@implementation SubClassJSONObject + +@end diff --git a/test_data/test_subclass/_MotherClassJSONObject.h b/test_data/test_subclass/_MotherClassJSONObject.h new file mode 100644 index 0000000..ad4e558 --- /dev/null +++ b/test_data/test_subclass/_MotherClassJSONObject.h @@ -0,0 +1,19 @@ +// +// _MotherClassJSONObject.h +// +// Created by MetaJSONParser. +// Copyright (c) 2014 SinnerSchrader Mobile. All rights reserved. + +#import <Foundation/Foundation.h> + +@class MotherClassJSONObject; + +@interface _MotherClassJSONObject : NSObject <NSCoding> + +@property (nonatomic, strong) NSString *id; + ++ (MotherClassJSONObject *)motherClassWithDictionary:(NSDictionary *)dic withError:(NSError **)error; +- (id)initWithDictionary:(NSDictionary *)dic withError:(NSError **)error; +- (NSDictionary *)propertyDictionary; + +@end diff --git a/test_data/test_subclass/_MotherClassJSONObject.m b/test_data/test_subclass/_MotherClassJSONObject.m new file mode 100644 index 0000000..8c1e097 --- /dev/null +++ b/test_data/test_subclass/_MotherClassJSONObject.m @@ -0,0 +1,66 @@ +// +// _MotherClassJSONObject.m +// +// Created by MetaJSONParser. +// Copyright (c) 2014 SinnerSchrader Mobile. All rights reserved. + +#import "APIParser.h" +#import "NSString+RegExValidation.h" +#import "MotherClassJSONObject.h" + + +@implementation _MotherClassJSONObject + +#pragma mark - factory + ++ (MotherClassJSONObject *)motherClassWithDictionary:(NSDictionary *)dic withError:(NSError **)error +{ + return [[MotherClassJSONObject alloc] initWithDictionary:dic withError:error]; +} + +#pragma mark - initialize +- (id)initWithDictionary:(NSDictionary *)dic withError:(NSError **)error +{ + self = [super init]; + if (self) { + self.Id = [APIParser stringFromResponseDictionary:dic forKey:@"id" acceptNumber:NO acceptNil:NO error:error]; + if (*error) { + return self; + } + } + return self; +} + +#pragma mark - getter + +#pragma mark - NSCoding + +- (void)encodeWithCoder:(NSCoder*)coder +{ + [super encodeWithCoder:coder]; + [coder encodeObject:self.Id forKey:@"id"]; +} + +- (id)initWithCoder:(NSCoder *)coder +{ + self = [super initWithCoder:coder]; + self.Id = [coder decodeObjectForKey:@"id"]; + return self; +} + +#pragma mark - Object Info +- (NSDictionary *)propertyDictionary +{ + NSMutableDictionary *dic = [[NSMutableDictionary alloc] init]; + if (self.Id) { + [dic setObject:self.Id forKey:@"id"]; + } + return dic; +} + +- (NSString *)description +{ + return [[self propertyDictionary] description]; +} + +@end diff --git a/test_data/test_subclass/_SubClassJSONObject.h b/test_data/test_subclass/_SubClassJSONObject.h new file mode 100644 index 0000000..b1d4066 --- /dev/null +++ b/test_data/test_subclass/_SubClassJSONObject.h @@ -0,0 +1,19 @@ +// +// _SubClassJSONObject.h +// +// Created by MetaJSONParser. +// Copyright (c) 2014 SinnerSchrader Mobile. All rights reserved. + +#import <Foundation/Foundation.h> +#import ".h" + +@class SubClassJSONObject; + +@interface _SubClassJSONObject : + +@property (nonatomic, strong) NSString *name; + ++ (SubClassJSONObject *)subClassWithDictionary:(NSDictionary *)dic withError:(NSError **)error; +- (id)initWithDictionary:(NSDictionary *)dic withError:(NSError **)error; + +@end diff --git a/test_data/test_subclass/_SubClassJSONObject.m b/test_data/test_subclass/_SubClassJSONObject.m new file mode 100644 index 0000000..ed00750 --- /dev/null +++ b/test_data/test_subclass/_SubClassJSONObject.m @@ -0,0 +1,62 @@ +// +// _SubClassJSONObject.m +// +// Created by MetaJSONParser. +// Copyright (c) 2014 SinnerSchrader Mobile. All rights reserved. + +#import "APIParser.h" +#import "NSString+RegExValidation.h" +#import "SubClassJSONObject.h" + + +@implementation _SubClassJSONObject + +#pragma mark - factory + ++ (SubClassJSONObject *)subClassWithDictionary:(NSDictionary *)dic withError:(NSError **)error +{ + return [[SubClassJSONObject alloc] initWithDictionary:dic withError:error]; +} + +#pragma mark - initialize +- (id)initWithDictionary:(NSDictionary *)dic withError:(NSError **)error +{ + self = [super initWithDictionary:dic withError:error]; + if (self) { + self.name = [APIParser stringFromResponseDictionary:dic forKey:@"name" acceptNumber:NO acceptNil:YES error:error]; + if (*error) { + return self; + } + } + return self; +} + +#pragma mark - getter + +#pragma mark - NSCoding + +- (void)encodeWithCoder:(NSCoder*)coder +{ + [super encodeWithCoder:coder]; + [coder encodeObject:self.name forKey:@"name"]; +} + +- (id)initWithCoder:(NSCoder *)coder +{ + self = [super initWithCoder:coder]; + self.name = [coder decodeObjectForKey:@"name"]; + return self; +} + +#pragma mark - Object Info +- (NSDictionary *)propertyDictionary +{ + NSMutableDictionary *dic = [[super propertyDictionary] mutableCopy]; + if (self.name) { + [dic setObject:self.name forKey:@"name"]; + } + return dic; +} + + +@end From 3e1ca31831e4fc7d6f484bdf0d8ce30e35ba53e3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Franc=CC=A7ois=20Benaiteau?= <francois.benaiteau@sinnerschrader-mobile.com> Date: Thu, 17 Apr 2014 11:52:09 +0200 Subject: [PATCH 047/149] Fixes new tests case subclass --- ObjectiveCCodeGenerator_test.py | 15 ++- ...herClass.p => test_subclass_motherClass.p} | 0 test_data/test_subclass_scheme.p | 111 ++++++++++++++++++ ...ve_subClass.p => test_subclass_subClass.p} | 0 4 files changed, 122 insertions(+), 4 deletions(-) rename test_data/{save_motherClass.p => test_subclass_motherClass.p} (100%) create mode 100644 test_data/test_subclass_scheme.p rename test_data/{save_subClass.p => test_subclass_subClass.p} (100%) diff --git a/ObjectiveCCodeGenerator_test.py b/ObjectiveCCodeGenerator_test.py index f43e5d5..8a4ebe1 100644 --- a/ObjectiveCCodeGenerator_test.py +++ b/ObjectiveCCodeGenerator_test.py @@ -58,11 +58,18 @@ def test_machine_header_content(self): result = self.gen.machine_header_content(self.scheme_object) self.assert_content_file(self.test_file_path + "/_S2MLoginJSONObject.h", result) -class TestSampleTestSubclassMotherCase(TestObjectiveCCodeGenerator): +class TestSampleTestSubclassCase(TestObjectiveCCodeGenerator): + def setUp(self): + super(TestSampleTestSubclassCase, self).setUp() + scheme = pickle.load(open(self.default_folder + '/test_subclass_scheme.p', 'rb')) + JSONScheme.JSONSchemeDic = scheme + + +class TestSampleTestSubclassMotherCase(TestSampleTestSubclassCase): def setUp(self): super(TestSampleTestSubclassMotherCase, self).setUp() self.test_file_path = self.default_folder + 'test_subclass' - self.scheme_object = pickle.load(open(self.default_folder + '/save_motherClass.p', 'rb')) + self.scheme_object = pickle.load(open(self.default_folder + '/test_subclass_motherClass.p', 'rb')) def test_mother_human_header_content(self): result = self.gen.human_header_content(self.scheme_object) @@ -80,11 +87,11 @@ def test_mother_machine_header_content(self): result = self.gen.machine_header_content(self.scheme_object) self.assert_content_file(self.test_file_path + "/_MotherClassJSONObject.h", result) -class TestSampleTestSubclassSubclassCase(TestObjectiveCCodeGenerator): +class TestSampleTestSubclassSubclassCase(TestSampleTestSubclassCase): def setUp(self): super(TestSampleTestSubclassSubclassCase, self).setUp() self.test_file_path = self.default_folder + 'test_subclass' - self.scheme_object = pickle.load(open(self.default_folder + '/save_subClass.p', 'rb')) + self.scheme_object = pickle.load(open(self.default_folder + '/test_subclass_subClass.p', 'rb')) def test_subclass_human_header_content(self): result = self.gen.human_header_content(self.scheme_object) diff --git a/test_data/save_motherClass.p b/test_data/test_subclass_motherClass.p similarity index 100% rename from test_data/save_motherClass.p rename to test_data/test_subclass_motherClass.p diff --git a/test_data/test_subclass_scheme.p b/test_data/test_subclass_scheme.p new file mode 100644 index 0000000..77ae713 --- /dev/null +++ b/test_data/test_subclass_scheme.p @@ -0,0 +1,111 @@ +(dp0 +S'ROOTmotherClass' +p1 +(dp2 +S'id' +p3 +(iJSONScheme +JSONScheme +p4 +(dp5 +S'domain' +p6 +(lp7 +S'ROOT' +p8 +aS'motherClass' +p9 +asS'required' +p10 +I1 +sS'type_name' +p11 +g3 +sS'projectPrefix' +p12 +S'' +p13 +sS'base_type' +p14 +S'string' +p15 +sS'base_type_list' +p16 +(lp17 +sS'objectSuffix' +p18 +S'JSONObject' +p19 +sbssS'ROOTsubClass' +p20 +(dp21 +S'name' +p22 +(iJSONScheme +JSONScheme +p23 +(dp24 +g6 +(lp25 +g8 +aS'subClass' +p26 +asg10 +I0 +sg11 +g22 +sg12 +g13 +sg14 +S'string' +p27 +sg16 +(lp28 +sg18 +g19 +sbssg8 +(dp29 +g9 +(iJSONScheme +JSONScheme +p30 +(dp31 +g16 +(lp32 +sg11 +g9 +sg12 +g13 +sg14 +S'object' +p33 +sS'props' +p34 +(lp35 +g4 +asg18 +g19 +sbsg26 +(iJSONScheme +JSONScheme +p36 +(dp37 +S'type_description' +p38 +S'subclass of motherClass' +p39 +sg11 +g26 +sg12 +g13 +sg14 +S'motherClass' +p40 +sg16 +(lp41 +sg18 +g19 +sg34 +(lp42 +g23 +asbss. \ No newline at end of file diff --git a/test_data/save_subClass.p b/test_data/test_subclass_subClass.p similarity index 100% rename from test_data/save_subClass.p rename to test_data/test_subclass_subClass.p From 3624a8fbf7b18d578485ccdd4ae0a694c741ba66 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Franc=CC=A7ois=20Benaiteau?= <francois.benaiteau@sinnerschrader-mobile.com> Date: Thu, 17 Apr 2014 12:10:31 +0200 Subject: [PATCH 048/149] Fixes properties name in header when using a protected name i.e. id or description --- templates/_header.h.mustache | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/templates/_header.h.mustache b/templates/_header.h.mustache index 55066ce..26d1d50 100644 --- a/templates/_header.h.mustache +++ b/templates/_header.h.mustache @@ -22,55 +22,55 @@ {{#comment}} //{{comment}} {{/comment}} -@property (nonatomic, strong) NSNumber *{{name}}; +@property (nonatomic, strong) NSNumber *{{varName}}; {{/numberProperties}} {{#stringProperties}} {{#comment}} //{{comment}} {{/comment}} -@property (nonatomic, strong) NSString *{{name}}; +@property (nonatomic, strong) NSString *{{varName}}; {{/stringProperties}} {{#booleanProperties}} {{#comment}} //{{comment}} {{/comment}} -@property (nonatomic, assign) BOOL {{name}}; +@property (nonatomic, assign) BOOL {{varName}}; {{/booleanProperties}} {{#dataProperties}} {{#comment}} //{{comment}} {{/comment}} -@property (nonatomic, strong) NSData *{{name}}; +@property (nonatomic, strong) NSData *{{varName}}; {{/dataProperties}} {{#dateProperties}} {{#comment}} //{{comment}} {{/comment}} -@property (nonatomic, strong) NSDate *{{name}}; +@property (nonatomic, strong) NSDate *{{varName}}; {{/dateProperties}} {{#msDateProperties}} {{#comment}} //{{comment}} {{/comment}} -@property (nonatomic, strong) NSDate *{{name}}; +@property (nonatomic, strong) NSDate *{{varName}}; {{/msDateProperties}} {{#arrayProperties}} {{#comment}} //{{comment}} {{/comment}} -@property (nonatomic, strong) NSArray *{{name}}; +@property (nonatomic, strong) NSArray *{{varName}}; {{/arrayProperties}} {{#objectProperties}} {{#comment}} //{{comment}} {{/comment}} -@property (nonatomic, strong) {{base_type}} *{{name}}; +@property (nonatomic, strong) {{base_type}} *{{varName}}; {{/objectProperties}} {{#undefinedProperties}} {{#comment}} //{{comment}} {{/comment}} -@property (nonatomic, strong) id {{name}}; +@property (nonatomic, strong) id {{varName}}; {{/undefinedProperties}} + ({{humanClassName}} *){{variableName}}WithDictionary:(NSDictionary *)dic withError:(NSError **)error; From e529c1f894230f3d7bebe1f0968c1d14f828b3bf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Franc=CC=A7ois=20Benaiteau?= <francois.benaiteau@sinnerschrader-mobile.com> Date: Thu, 17 Apr 2014 12:12:06 +0200 Subject: [PATCH 049/149] Fixes protected name, i.e 'id' without projectPrefix --- ObjectiveCCodeGenerator.py | 3 ++- test_data/test_subclass/_MotherClassJSONObject.h | 2 +- test_data/test_subclass/_MotherClassJSONObject.m | 10 +++++----- 3 files changed, 8 insertions(+), 7 deletions(-) diff --git a/ObjectiveCCodeGenerator.py b/ObjectiveCCodeGenerator.py index df56e63..aca6ea0 100755 --- a/ObjectiveCCodeGenerator.py +++ b/ObjectiveCCodeGenerator.py @@ -48,7 +48,8 @@ def makeVarName(self,schemeObj) : if str(schemeObj.type_name) == "id" or str(schemeObj.type_name) == "description" : titleName = schemeObj.type_name.upper() titleName = titleName[:1] + schemeObj.type_name[1:] - returnName = self.projectPrefix.lower() + titleName + prefix = self.projectPrefix.lower() if self.projectPrefix else 'meta' + returnName = prefix + titleName else : prefixes = ["new", "alloc", "copy"] for prefix in prefixes: diff --git a/test_data/test_subclass/_MotherClassJSONObject.h b/test_data/test_subclass/_MotherClassJSONObject.h index ad4e558..db99900 100644 --- a/test_data/test_subclass/_MotherClassJSONObject.h +++ b/test_data/test_subclass/_MotherClassJSONObject.h @@ -10,7 +10,7 @@ @interface _MotherClassJSONObject : NSObject <NSCoding> -@property (nonatomic, strong) NSString *id; +@property (nonatomic, strong) NSString *metaId; + (MotherClassJSONObject *)motherClassWithDictionary:(NSDictionary *)dic withError:(NSError **)error; - (id)initWithDictionary:(NSDictionary *)dic withError:(NSError **)error; diff --git a/test_data/test_subclass/_MotherClassJSONObject.m b/test_data/test_subclass/_MotherClassJSONObject.m index 8c1e097..4361cf7 100644 --- a/test_data/test_subclass/_MotherClassJSONObject.m +++ b/test_data/test_subclass/_MotherClassJSONObject.m @@ -23,7 +23,7 @@ - (id)initWithDictionary:(NSDictionary *)dic withError:(NSError **)error { self = [super init]; if (self) { - self.Id = [APIParser stringFromResponseDictionary:dic forKey:@"id" acceptNumber:NO acceptNil:NO error:error]; + self.metaId = [APIParser stringFromResponseDictionary:dic forKey:@"id" acceptNumber:NO acceptNil:NO error:error]; if (*error) { return self; } @@ -38,13 +38,13 @@ - (id)initWithDictionary:(NSDictionary *)dic withError:(NSError **)error - (void)encodeWithCoder:(NSCoder*)coder { [super encodeWithCoder:coder]; - [coder encodeObject:self.Id forKey:@"id"]; + [coder encodeObject:self.metaId forKey:@"id"]; } - (id)initWithCoder:(NSCoder *)coder { self = [super initWithCoder:coder]; - self.Id = [coder decodeObjectForKey:@"id"]; + self.metaId = [coder decodeObjectForKey:@"id"]; return self; } @@ -52,8 +52,8 @@ - (id)initWithCoder:(NSCoder *)coder - (NSDictionary *)propertyDictionary { NSMutableDictionary *dic = [[NSMutableDictionary alloc] init]; - if (self.Id) { - [dic setObject:self.Id forKey:@"id"]; + if (self.metaId) { + [dic setObject:self.metaId forKey:@"id"]; } return dic; } From 88a6cfd51a26a462f61cdb9cd110f32a0e5b442a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Franc=CC=A7ois=20Benaiteau?= <francois.benaiteau@sinnerschrader-mobile.com> Date: Thu, 17 Apr 2014 12:24:00 +0200 Subject: [PATCH 050/149] Fixes subclass expected generated file --- test_data/test_subclass/_SubClassJSONObject.h | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/test_data/test_subclass/_SubClassJSONObject.h b/test_data/test_subclass/_SubClassJSONObject.h index b1d4066..a72575e 100644 --- a/test_data/test_subclass/_SubClassJSONObject.h +++ b/test_data/test_subclass/_SubClassJSONObject.h @@ -5,11 +5,12 @@ // Copyright (c) 2014 SinnerSchrader Mobile. All rights reserved. #import <Foundation/Foundation.h> -#import ".h" +#import "MotherClassJSONObject.h" @class SubClassJSONObject; -@interface _SubClassJSONObject : +@interface _SubClassJSONObject : MotherClassJSONObject + @property (nonatomic, strong) NSString *name; From ab21faee34d9b787a6f985b5759c53410ee43b16 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Franc=CC=A7ois=20Benaiteau?= <francois.benaiteau@sinnerschrader-mobile.com> Date: Thu, 17 Apr 2014 12:42:40 +0200 Subject: [PATCH 051/149] Fixes subclass test case --- ObjectiveCCodeGenerator.py | 6 +++++- test_data/test_subclass/_SubClassJSONObject.h | 1 - 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/ObjectiveCCodeGenerator.py b/ObjectiveCCodeGenerator.py index aca6ea0..d93e2a3 100755 --- a/ObjectiveCCodeGenerator.py +++ b/ObjectiveCCodeGenerator.py @@ -129,9 +129,13 @@ def machine_file_content(self, schemeObj, template_file) : numberProps.append(self.process_properties(prop)) hashParams = {"date": str(today.year), "projectPrefix": schemeObj.projectPrefix,"machineClassName": schemeObj.getMachineClassName(), "humanClassName": schemeObj.getClassName(), "variableName": self.makeVarName(schemeObj), "stringProperties": stringProps, "numberProperties": numberProps} + + if schemeObj.getScheme(schemeObj.base_type): + hashParams['baseClassName'] = schemeObj.getScheme(schemeObj.base_type).getClassName() + if schemeObj.base_type == 'object': hashParams['baseTypeIsObject'] = True - print hashParams + # render sourceString = Renderer().render(template_file.read(), hashParams) return sourceString diff --git a/test_data/test_subclass/_SubClassJSONObject.h b/test_data/test_subclass/_SubClassJSONObject.h index a72575e..a3dde38 100644 --- a/test_data/test_subclass/_SubClassJSONObject.h +++ b/test_data/test_subclass/_SubClassJSONObject.h @@ -11,7 +11,6 @@ @interface _SubClassJSONObject : MotherClassJSONObject - @property (nonatomic, strong) NSString *name; + (SubClassJSONObject *)subClassWithDictionary:(NSDictionary *)dic withError:(NSError **)error; From 82045c3706c66f786285fad5ee6291ad87bd66f7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Franc=CC=A7ois=20Benaiteau?= <francois.benaiteau@sinnerschrader-mobile.com> Date: Thu, 17 Apr 2014 12:44:41 +0200 Subject: [PATCH 052/149] remove unused testcase files --- samples/test.json | 114 ---- .../_FBEMySessionSuffix.h | 24 - .../_FBEMySessionSuffix.m | 85 --- .../AbstractInterfaceFiles/_FBEPersonSuffix.h | 22 - .../AbstractInterfaceFiles/_FBEPersonSuffix.m | 67 -- .../_FBEUserAddressSuffix.h | 26 - .../_FBEUserAddressSuffix.m | 103 --- .../AbstractInterfaceFiles/_FBEUserSuffix.h | 33 - .../AbstractInterfaceFiles/_FBEUserSuffix.m | 158 ----- test_data/test_json/FBEMySessionSuffix.h | 11 - test_data/test_json/FBEMySessionSuffix.m | 11 - test_data/test_json/FBEPersonSuffix.h | 11 - test_data/test_json/FBEPersonSuffix.m | 11 - test_data/test_json/FBEUserAddressSuffix.h | 11 - test_data/test_json/FBEUserAddressSuffix.m | 11 - test_data/test_json/FBEUserSuffix.h | 11 - test_data/test_json/FBEUserSuffix.m | 11 - .../Utilities/APIParser/FBEAPIParser.h | 294 --------- .../Utilities/APIParser/FBEAPIParser.m | 590 ------------------ .../NSString/NSString+RegExValidation.h | 18 - .../NSString/NSString+RegExValidation.m | 32 - 21 files changed, 1654 deletions(-) delete mode 100644 samples/test.json delete mode 100644 test_data/test_json/AbstractInterfaceFiles/_FBEMySessionSuffix.h delete mode 100644 test_data/test_json/AbstractInterfaceFiles/_FBEMySessionSuffix.m delete mode 100644 test_data/test_json/AbstractInterfaceFiles/_FBEPersonSuffix.h delete mode 100644 test_data/test_json/AbstractInterfaceFiles/_FBEPersonSuffix.m delete mode 100644 test_data/test_json/AbstractInterfaceFiles/_FBEUserAddressSuffix.h delete mode 100644 test_data/test_json/AbstractInterfaceFiles/_FBEUserAddressSuffix.m delete mode 100644 test_data/test_json/AbstractInterfaceFiles/_FBEUserSuffix.h delete mode 100644 test_data/test_json/AbstractInterfaceFiles/_FBEUserSuffix.m delete mode 100644 test_data/test_json/FBEMySessionSuffix.h delete mode 100644 test_data/test_json/FBEMySessionSuffix.m delete mode 100644 test_data/test_json/FBEPersonSuffix.h delete mode 100644 test_data/test_json/FBEPersonSuffix.m delete mode 100644 test_data/test_json/FBEUserAddressSuffix.h delete mode 100644 test_data/test_json/FBEUserAddressSuffix.m delete mode 100644 test_data/test_json/FBEUserSuffix.h delete mode 100644 test_data/test_json/FBEUserSuffix.m delete mode 100644 test_data/test_json/Utilities/APIParser/FBEAPIParser.h delete mode 100644 test_data/test_json/Utilities/APIParser/FBEAPIParser.m delete mode 100644 test_data/test_json/Utilities/NSString/NSString+RegExValidation.h delete mode 100644 test_data/test_json/Utilities/NSString/NSString+RegExValidation.m diff --git a/samples/test.json b/samples/test.json deleted file mode 100644 index 5c40538..0000000 --- a/samples/test.json +++ /dev/null @@ -1,114 +0,0 @@ -[ - { - "name" : "mySession", - "base-type" : "object", - "description" : "session has session id and session expire date.", - "property" : - [ - { - "name" : "sessionID", - "base-type" : "string", - "description" : "session string after login", - "maxLength" : 50, - "minLength" : 20, - "required" : 1 - }, - { - "name" : "expirationDate", - "base-type" : "date", - "description" : "Experation date of session", - "maxValue" : 183759284, - "required" : 1 - } - ] - }, - { - "name" : "userAddress", - "base-type" : "object", - "description" : "user address type.", - "property" : - [ - { - "name" : "street", - "base-type" : "string", - "required" : 1 - }, - { - "name" : "houseNumber", - "base-type" : "string", - "required" : 1 - }, - { - "name" : "additionalAddress", - "base-type" : "string", - "required" : 0 - }, - { - "name" : "City", - "base-type" : "string", - "required" : 1 - }, - { - "name" : "Country", - "base-type" : "string", - "required" : 1 - }, - { - "name" : "zipCode", - "base-type" : "string", - "required" : 1 - } - ] - }, - { - "name" : "person", - "base-type" : "object", - "property" : - [ - { - "name" : "firstName", - "base-type" : "string", - "required" : 1 - }, - { - "name" : "lastName", - "base-type" : "string", - "required" : 1 - } - ] - }, - { - "name" : "user", - "base-type" : "person", - "description" : "test description of user type.", - "property" : - [ - { - "name" : "email", - "base-type" : "string", - "regex" : "[A-Z0-9._%+-]+@(?:[A-Z0-9-]+\\.)+[A-Z]{2,4}" - }, - { - "name" : "family", - "base-type" : "array", - "subType" : ["person", "userAddress", "string"], - "required" : 1 - }, - { - "name" : "userID", - "base-type" : "string", - "required" : 1 - }, - { - "name" : "address", - "base-type" : "userAddress", - "required" : 1 - }, - { - "name" : "session", - "base-type" : "mySession", - "required" : 1 - } - ] - } -] diff --git a/test_data/test_json/AbstractInterfaceFiles/_FBEMySessionSuffix.h b/test_data/test_json/AbstractInterfaceFiles/_FBEMySessionSuffix.h deleted file mode 100644 index 1248e08..0000000 --- a/test_data/test_json/AbstractInterfaceFiles/_FBEMySessionSuffix.h +++ /dev/null @@ -1,24 +0,0 @@ -// -// _FBEMySessionSuffix.h -// -// Created by MetaJSONParser. -// Copyright (c) 2013 SinnerSchrader Mobile. All rights reserved. - -#import <Foundation/Foundation.h> - -@class FBEMySessionSuffix; - -@interface _FBEMySessionSuffix : NSObject <NSCoding> - - -// session string after login -@property (nonatomic, strong) NSString *sessionID; -// Experation date of session -@property (nonatomic, strong) NSDate *expirationDate; - -+ (FBEMySessionSuffix *)mySessionWithDictionary:(NSDictionary *)dic withError:(NSError **)error; -- (id)initWithDictionary:(NSDictionary *)dic withError:(NSError **)error; -- (NSDictionary *)propertyDictionary; - -@end - diff --git a/test_data/test_json/AbstractInterfaceFiles/_FBEMySessionSuffix.m b/test_data/test_json/AbstractInterfaceFiles/_FBEMySessionSuffix.m deleted file mode 100644 index dce655e..0000000 --- a/test_data/test_json/AbstractInterfaceFiles/_FBEMySessionSuffix.m +++ /dev/null @@ -1,85 +0,0 @@ -// -// _FBEMySessionSuffix.m -// -// Created by MetaJSONParser. -// Copyright (c) 2013 SinnerSchrader Mobile. All rights reserved. - -#import "FBEAPIParser.h" -#import "NSString+RegExValidation.h" -#import "FBEMySessionSuffix.h" - - -@implementation _FBEMySessionSuffix - -#pragma mark - factory - -+ (FBEMySessionSuffix *)mySessionWithDictionary:(NSDictionary *)dic withError:(NSError **)error { - return [[FBEMySessionSuffix alloc] initWithDictionary:dic withError:error]; -} - - -#pragma mark - initialize -- (id)initWithDictionary:(NSDictionary *)dic withError:(NSError **)error { - self = [super init]; - if (self) { - self.sessionID = [FBEAPIParser stringFromResponseDictionary:dic forKey:@"sessionID" acceptNumber:NO acceptNil:NO error:error]; - if (*error) { - return self; - } - if (self.sessionID.length > 50) { - NSDictionary *userInfo = [NSDictionary dictionaryWithObjectsAndKeys:@"sessionID", @"propertyName", @"sessionID", @"key", @"validation error", @"reason", NSStringFromClass([self class]), @"objectClass",nil]; - *error = [NSError errorWithDomain:kFBEErrorDomain_parser code:kFBEErrorDomain_parser_valueIsNotValid userInfo:userInfo]; - NSLog(@"%@", *error); - return self; - } - if (self.sessionID.length < 20) { - NSDictionary *userInfo = [NSDictionary dictionaryWithObjectsAndKeys:@"sessionID", @"propertyName", @"sessionID", @"key", @"validation error", @"reason", NSStringFromClass([self class]), @"objectClass",nil]; - *error = [NSError errorWithDomain:kFBEErrorDomain_parser code:kFBEErrorDomain_parser_valueIsNotValid userInfo:userInfo]; - NSLog(@"%@", *error); - return self; - } - self.expirationDate = [FBEAPIParser dateWithTimeIntervalFromResponseDictionary:dic forKey:@"expirationDate" acceptNil:NO error:error]; - if (*error) { - return self; - } - if ([self.expirationDate timeIntervalSince1970] > 183759284) { - NSDictionary *userInfo = [NSDictionary dictionaryWithObjectsAndKeys:@"expirationDate", @"propertyName", @"expirationDate", @"key", @"validation error", @"reason", NSStringFromClass([self class]), @"objectClass",nil]; - *error = [NSError errorWithDomain:kFBEErrorDomain_parser code:kFBEErrorDomain_parser_valueIsNotValid userInfo:userInfo]; - NSLog(@"%@", *error); - return self; - } - } - return self; -} - - -#pragma mark - getter - -#pragma mark - NSCoding -- (void)encodeWithCoder:(NSCoder*)coder { - [coder encodeObject:self.sessionID forKey:@"sessionID"]; - [coder encodeObject:self.expirationDate forKey:@"expirationDate"]; -} -- (id)initWithCoder:(NSCoder *)coder { - self = [super init]; - self.sessionID = [coder decodeObjectForKey:@"sessionID"]; - self.expirationDate = [coder decodeObjectForKey:@"expirationDate"]; - return self; -} - -#pragma mark - Object Info -- (NSDictionary *)propertyDictionary { - NSMutableDictionary *dic = [[NSMutableDictionary alloc] init]; - if (self.sessionID) { - [dic setObject:self.sessionID forKey:@"sessionID"]; - } - if (self.expirationDate) { - [dic setObject:[NSNumber numberWithInteger:[[NSNumber numberWithDouble:[self.expirationDate timeIntervalSince1970]] longValue]] forKey:@"expirationDate"]; - } - return dic; -} -- (NSString *)description { - return [NSString stringWithFormat:@"%@",[self propertyDictionary]]; -} - -@end diff --git a/test_data/test_json/AbstractInterfaceFiles/_FBEPersonSuffix.h b/test_data/test_json/AbstractInterfaceFiles/_FBEPersonSuffix.h deleted file mode 100644 index 31d0651..0000000 --- a/test_data/test_json/AbstractInterfaceFiles/_FBEPersonSuffix.h +++ /dev/null @@ -1,22 +0,0 @@ -// -// _FBEPersonSuffix.h -// -// Created by MetaJSONParser. -// Copyright (c) 2013 SinnerSchrader Mobile. All rights reserved. - -#import <Foundation/Foundation.h> - -@class FBEPersonSuffix; - -@interface _FBEPersonSuffix : NSObject <NSCoding> - - -@property (nonatomic, strong) NSString *firstName; -@property (nonatomic, strong) NSString *lastName; - -+ (FBEPersonSuffix *)personWithDictionary:(NSDictionary *)dic withError:(NSError **)error; -- (id)initWithDictionary:(NSDictionary *)dic withError:(NSError **)error; -- (NSDictionary *)propertyDictionary; - -@end - diff --git a/test_data/test_json/AbstractInterfaceFiles/_FBEPersonSuffix.m b/test_data/test_json/AbstractInterfaceFiles/_FBEPersonSuffix.m deleted file mode 100644 index 963ee06..0000000 --- a/test_data/test_json/AbstractInterfaceFiles/_FBEPersonSuffix.m +++ /dev/null @@ -1,67 +0,0 @@ -// -// _FBEPersonSuffix.m -// -// Created by MetaJSONParser. -// Copyright (c) 2013 SinnerSchrader Mobile. All rights reserved. - -#import "FBEAPIParser.h" -#import "NSString+RegExValidation.h" -#import "FBEPersonSuffix.h" - - -@implementation _FBEPersonSuffix - -#pragma mark - factory - -+ (FBEPersonSuffix *)personWithDictionary:(NSDictionary *)dic withError:(NSError **)error { - return [[FBEPersonSuffix alloc] initWithDictionary:dic withError:error]; -} - - -#pragma mark - initialize -- (id)initWithDictionary:(NSDictionary *)dic withError:(NSError **)error { - self = [super init]; - if (self) { - self.firstName = [FBEAPIParser stringFromResponseDictionary:dic forKey:@"firstName" acceptNumber:NO acceptNil:NO error:error]; - if (*error) { - return self; - } - self.lastName = [FBEAPIParser stringFromResponseDictionary:dic forKey:@"lastName" acceptNumber:NO acceptNil:NO error:error]; - if (*error) { - return self; - } - } - return self; -} - - -#pragma mark - getter - -#pragma mark - NSCoding -- (void)encodeWithCoder:(NSCoder*)coder { - [coder encodeObject:self.firstName forKey:@"firstName"]; - [coder encodeObject:self.lastName forKey:@"lastName"]; -} -- (id)initWithCoder:(NSCoder *)coder { - self = [super init]; - self.firstName = [coder decodeObjectForKey:@"firstName"]; - self.lastName = [coder decodeObjectForKey:@"lastName"]; - return self; -} - -#pragma mark - Object Info -- (NSDictionary *)propertyDictionary { - NSMutableDictionary *dic = [[NSMutableDictionary alloc] init]; - if (self.firstName) { - [dic setObject:self.firstName forKey:@"firstName"]; - } - if (self.lastName) { - [dic setObject:self.lastName forKey:@"lastName"]; - } - return dic; -} -- (NSString *)description { - return [NSString stringWithFormat:@"%@",[self propertyDictionary]]; -} - -@end diff --git a/test_data/test_json/AbstractInterfaceFiles/_FBEUserAddressSuffix.h b/test_data/test_json/AbstractInterfaceFiles/_FBEUserAddressSuffix.h deleted file mode 100644 index 8defafc..0000000 --- a/test_data/test_json/AbstractInterfaceFiles/_FBEUserAddressSuffix.h +++ /dev/null @@ -1,26 +0,0 @@ -// -// _FBEUserAddressSuffix.h -// -// Created by MetaJSONParser. -// Copyright (c) 2013 SinnerSchrader Mobile. All rights reserved. - -#import <Foundation/Foundation.h> - -@class FBEUserAddressSuffix; - -@interface _FBEUserAddressSuffix : NSObject <NSCoding> - - -@property (nonatomic, strong) NSString *street; -@property (nonatomic, strong) NSString *houseNumber; -@property (nonatomic, strong) NSString *additionalAddress; -@property (nonatomic, strong) NSString *City; -@property (nonatomic, strong) NSString *Country; -@property (nonatomic, strong) NSString *zipCode; - -+ (FBEUserAddressSuffix *)userAddressWithDictionary:(NSDictionary *)dic withError:(NSError **)error; -- (id)initWithDictionary:(NSDictionary *)dic withError:(NSError **)error; -- (NSDictionary *)propertyDictionary; - -@end - diff --git a/test_data/test_json/AbstractInterfaceFiles/_FBEUserAddressSuffix.m b/test_data/test_json/AbstractInterfaceFiles/_FBEUserAddressSuffix.m deleted file mode 100644 index ee4a474..0000000 --- a/test_data/test_json/AbstractInterfaceFiles/_FBEUserAddressSuffix.m +++ /dev/null @@ -1,103 +0,0 @@ -// -// _FBEUserAddressSuffix.m -// -// Created by MetaJSONParser. -// Copyright (c) 2013 SinnerSchrader Mobile. All rights reserved. - -#import "FBEAPIParser.h" -#import "NSString+RegExValidation.h" -#import "FBEUserAddressSuffix.h" - - -@implementation _FBEUserAddressSuffix - -#pragma mark - factory - -+ (FBEUserAddressSuffix *)userAddressWithDictionary:(NSDictionary *)dic withError:(NSError **)error { - return [[FBEUserAddressSuffix alloc] initWithDictionary:dic withError:error]; -} - - -#pragma mark - initialize -- (id)initWithDictionary:(NSDictionary *)dic withError:(NSError **)error { - self = [super init]; - if (self) { - self.street = [FBEAPIParser stringFromResponseDictionary:dic forKey:@"street" acceptNumber:NO acceptNil:NO error:error]; - if (*error) { - return self; - } - self.houseNumber = [FBEAPIParser stringFromResponseDictionary:dic forKey:@"houseNumber" acceptNumber:NO acceptNil:NO error:error]; - if (*error) { - return self; - } - self.additionalAddress = [FBEAPIParser stringFromResponseDictionary:dic forKey:@"additionalAddress" acceptNumber:NO acceptNil:YES error:error]; - if (*error) { - return self; - } - self.City = [FBEAPIParser stringFromResponseDictionary:dic forKey:@"City" acceptNumber:NO acceptNil:NO error:error]; - if (*error) { - return self; - } - self.Country = [FBEAPIParser stringFromResponseDictionary:dic forKey:@"Country" acceptNumber:NO acceptNil:NO error:error]; - if (*error) { - return self; - } - self.zipCode = [FBEAPIParser stringFromResponseDictionary:dic forKey:@"zipCode" acceptNumber:NO acceptNil:NO error:error]; - if (*error) { - return self; - } - } - return self; -} - - -#pragma mark - getter - -#pragma mark - NSCoding -- (void)encodeWithCoder:(NSCoder*)coder { - [coder encodeObject:self.street forKey:@"street"]; - [coder encodeObject:self.houseNumber forKey:@"houseNumber"]; - [coder encodeObject:self.additionalAddress forKey:@"additionalAddress"]; - [coder encodeObject:self.City forKey:@"City"]; - [coder encodeObject:self.Country forKey:@"Country"]; - [coder encodeObject:self.zipCode forKey:@"zipCode"]; -} -- (id)initWithCoder:(NSCoder *)coder { - self = [super init]; - self.street = [coder decodeObjectForKey:@"street"]; - self.houseNumber = [coder decodeObjectForKey:@"houseNumber"]; - self.additionalAddress = [coder decodeObjectForKey:@"additionalAddress"]; - self.City = [coder decodeObjectForKey:@"City"]; - self.Country = [coder decodeObjectForKey:@"Country"]; - self.zipCode = [coder decodeObjectForKey:@"zipCode"]; - return self; -} - -#pragma mark - Object Info -- (NSDictionary *)propertyDictionary { - NSMutableDictionary *dic = [[NSMutableDictionary alloc] init]; - if (self.street) { - [dic setObject:self.street forKey:@"street"]; - } - if (self.houseNumber) { - [dic setObject:self.houseNumber forKey:@"houseNumber"]; - } - if (self.additionalAddress) { - [dic setObject:self.additionalAddress forKey:@"additionalAddress"]; - } - if (self.City) { - [dic setObject:self.City forKey:@"City"]; - } - if (self.Country) { - [dic setObject:self.Country forKey:@"Country"]; - } - if (self.zipCode) { - [dic setObject:self.zipCode forKey:@"zipCode"]; - } - return dic; -} -- (NSString *)description { - return [NSString stringWithFormat:@"%@",[self propertyDictionary]]; -} - -@end diff --git a/test_data/test_json/AbstractInterfaceFiles/_FBEUserSuffix.h b/test_data/test_json/AbstractInterfaceFiles/_FBEUserSuffix.h deleted file mode 100644 index 37b954b..0000000 --- a/test_data/test_json/AbstractInterfaceFiles/_FBEUserSuffix.h +++ /dev/null @@ -1,33 +0,0 @@ -// -// _FBEUserSuffix.h -// -// Created by MetaJSONParser. -// Copyright (c) 2013 SinnerSchrader Mobile. All rights reserved. - -#import <Foundation/Foundation.h> -#import "FBEPersonSuffix.h" - -@class FBEUserAddressSuffix; -@class FBEPersonSuffix; -@class FBEMySessionSuffix; - -@class FBEUserSuffix; - -@interface _FBEUserSuffix : FBEPersonSuffix - - -@property (nonatomic, strong) NSString *email; -@property (nonatomic, strong) NSArray *family; -@property (nonatomic, strong) NSString *userID; -@property (nonatomic, strong) FBEUserAddressSuffix *address; -@property (nonatomic, strong) FBEMySessionSuffix *session; - -+ (FBEUserSuffix *)userWithDictionary:(NSDictionary *)dic withError:(NSError **)error; -- (id)initWithDictionary:(NSDictionary *)dic withError:(NSError **)error; -- (NSDictionary *)propertyDictionary; -- (FBEPersonSuffix *)personInFamilyAtIndex:(NSUInteger)index withError:(NSError **)error; -- (FBEUserAddressSuffix *)userAddressInFamilyAtIndex:(NSUInteger)index withError:(NSError **)error; -- (NSString *)stringInFamilyAtIndex:(NSUInteger)index withError:(NSError **)error; - -@end - diff --git a/test_data/test_json/AbstractInterfaceFiles/_FBEUserSuffix.m b/test_data/test_json/AbstractInterfaceFiles/_FBEUserSuffix.m deleted file mode 100644 index b740869..0000000 --- a/test_data/test_json/AbstractInterfaceFiles/_FBEUserSuffix.m +++ /dev/null @@ -1,158 +0,0 @@ -// -// _FBEUserSuffix.m -// -// Created by MetaJSONParser. -// Copyright (c) 2013 SinnerSchrader Mobile. All rights reserved. - -#import "FBEAPIParser.h" -#import "NSString+RegExValidation.h" -#import "FBEUserSuffix.h" -#import "FBEUserAddressSuffix.h" -#import "FBEPersonSuffix.h" -#import "FBEMySessionSuffix.h" - - -@implementation _FBEUserSuffix - -#pragma mark - factory - -+ (FBEUserSuffix *)userWithDictionary:(NSDictionary *)dic withError:(NSError **)error { - return [[FBEUserSuffix alloc] initWithDictionary:dic withError:error]; -} - - -#pragma mark - initialize -- (id)initWithDictionary:(NSDictionary *)dic withError:(NSError **)error { - self = [super initWithDictionary:dic withError:error]; - if (self) { - self.email = [FBEAPIParser stringFromResponseDictionary:dic forKey:@"email" acceptNumber:NO acceptNil:YES error:error]; - if (*error) { - return self; - } - if (self.email && [self.email matchesRegExString:@"[A-Z0-9._%+-]+@(?:[A-Z0-9-]+\.)+[A-Z]{2,4}"] == NO) { - NSDictionary *userInfo = [NSDictionary dictionaryWithObjectsAndKeys:@"email", @"propertyName", @"email", @"key", @"validation error", @"reason", NSStringFromClass([self class]), @"objectClass",nil]; - *error = [NSError errorWithDomain:kFBEErrorDomain_parser code:kFBEErrorDomain_parser_valueIsNotValid userInfo:userInfo]; - NSLog(@"%@", *error); - return self; - } - self.family = [FBEAPIParser arrayFromResponseDictionary:dic forKey:@"family" acceptNil:NO error:error]; - if (*error) { - return self; - } - self.userID = [FBEAPIParser stringFromResponseDictionary:dic forKey:@"userID" acceptNumber:NO acceptNil:NO error:error]; - if (*error) { - return self; - } - NSDictionary *tmpAddress = [FBEAPIParser dictionaryFromResponseDictionary:dic forKey:@"address" acceptNil:NO error:error]; - if (*error) { - return self; - } - if (tmpAddress) { - self.address= [[FBEUserAddressSuffix alloc] initWithDictionary:tmpAddress withError:error]; - if (*error) { - return self; - } - } - NSDictionary *tmpSession = [FBEAPIParser dictionaryFromResponseDictionary:dic forKey:@"session" acceptNil:NO error:error]; - if (*error) { - return self; - } - if (tmpSession) { - self.session= [[FBEMySessionSuffix alloc] initWithDictionary:tmpSession withError:error]; - if (*error) { - return self; - } - } - } - return self; -} - - -#pragma mark - getter -- (FBEPersonSuffix *)personInFamilyAtIndex:(NSUInteger)index withError:(NSError **)error { - NSDictionary *tmpFamilyDic = [FBEAPIParser dictionaryFromResponseArray:self.family atIndex:index acceptNil:NO error:error]; - if (*error) { - return nil; - } - FBEPersonSuffix *tmpFamily = nil; - if (tmpFamilyDic == nil) { - return nil; - } - if (tmpFamilyDic) { - tmpFamily= [[FBEPersonSuffix alloc] initWithDictionary:tmpFamilyDic withError:error]; - if (*error) { - return nil; - } - } - return tmpFamily; -} -- (FBEUserAddressSuffix *)userAddressInFamilyAtIndex:(NSUInteger)index withError:(NSError **)error { - NSDictionary *tmpFamilyDic = [FBEAPIParser dictionaryFromResponseArray:self.family atIndex:index acceptNil:NO error:error]; - if (*error) { - return nil; - } - FBEUserAddressSuffix *tmpFamily = nil; - if (tmpFamilyDic == nil) { - return nil; - } - if (tmpFamilyDic) { - tmpFamily= [[FBEUserAddressSuffix alloc] initWithDictionary:tmpFamilyDic withError:error]; - if (*error) { - return nil; - } - } - return tmpFamily; -} -- (NSString *)stringInFamilyAtIndex:(NSUInteger)index withError:(NSError **)error { - NSString *tmpFamily = [FBEAPIParser stringFromResponseArray:self.family atIndex:index acceptNil:NO error:error]; - if (*error) { - return nil; - } - return tmpFamily; -} - -#pragma mark - NSCoding -- (void)encodeWithCoder:(NSCoder*)coder { - [super encodeWithCoder:coder]; - [coder encodeObject:self.email forKey:@"email"]; - [coder encodeObject:self.family forKey:@"family"]; - [coder encodeObject:self.userID forKey:@"userID"]; - [coder encodeObject:self.address forKey:@"address"]; - [coder encodeObject:self.session forKey:@"session"]; -} -- (id)initWithCoder:(NSCoder *)coder { - self = [super initWithCoder:coder]; - self.email = [coder decodeObjectForKey:@"email"]; - self.family = [coder decodeObjectForKey:@"family"]; - self.userID = [coder decodeObjectForKey:@"userID"]; - self.address = [coder decodeObjectForKey:@"address"]; - self.session = [coder decodeObjectForKey:@"session"]; - return self; -} - -#pragma mark - Object Info -- (NSDictionary *)propertyDictionary { - NSDictionary *parentDic = [super propertyDictionary]; - NSMutableDictionary *dic = [[NSMutableDictionary alloc] initWithDictionary:parentDic]; - if (self.email) { - [dic setObject:self.email forKey:@"email"]; - } - if (self.family) { - [dic setObject:self.family forKey:@"family"]; - } - if (self.userID) { - [dic setObject:self.userID forKey:@"userID"]; - } - if (self.address) { - [dic setObject:[self.address propertyDictionary] forKey:@"address"]; - } - if (self.session) { - [dic setObject:[self.session propertyDictionary] forKey:@"session"]; - } - return dic; -} -- (NSString *)description { - return [NSString stringWithFormat:@"%@",[self propertyDictionary]]; -} - -@end diff --git a/test_data/test_json/FBEMySessionSuffix.h b/test_data/test_json/FBEMySessionSuffix.h deleted file mode 100644 index bf5229d..0000000 --- a/test_data/test_json/FBEMySessionSuffix.h +++ /dev/null @@ -1,11 +0,0 @@ -// -// FBEMySessionSuffix.h -// -// Created by MetaJSONParser. -// Copyright (c) 2013 SinnerSchrader Mobile. All rights reserved. - -#import "_FBEMySessionSuffix.h" -@interface FBEMySessionSuffix : _FBEMySessionSuffix - -@end - diff --git a/test_data/test_json/FBEMySessionSuffix.m b/test_data/test_json/FBEMySessionSuffix.m deleted file mode 100644 index 7b5bea6..0000000 --- a/test_data/test_json/FBEMySessionSuffix.m +++ /dev/null @@ -1,11 +0,0 @@ -// -// FBEMySessionSuffix.m -// -// Created by MetaJSONParser. -// Copyright (c) 2013 SinnerSchrader Mobile. All rights reserved. - -#import "FBEMySessionSuffix.h" -@implementation FBEMySessionSuffix - -@end - diff --git a/test_data/test_json/FBEPersonSuffix.h b/test_data/test_json/FBEPersonSuffix.h deleted file mode 100644 index b948029..0000000 --- a/test_data/test_json/FBEPersonSuffix.h +++ /dev/null @@ -1,11 +0,0 @@ -// -// FBEPersonSuffix.h -// -// Created by MetaJSONParser. -// Copyright (c) 2013 SinnerSchrader Mobile. All rights reserved. - -#import "_FBEPersonSuffix.h" -@interface FBEPersonSuffix : _FBEPersonSuffix - -@end - diff --git a/test_data/test_json/FBEPersonSuffix.m b/test_data/test_json/FBEPersonSuffix.m deleted file mode 100644 index e87c108..0000000 --- a/test_data/test_json/FBEPersonSuffix.m +++ /dev/null @@ -1,11 +0,0 @@ -// -// FBEPersonSuffix.m -// -// Created by MetaJSONParser. -// Copyright (c) 2013 SinnerSchrader Mobile. All rights reserved. - -#import "FBEPersonSuffix.h" -@implementation FBEPersonSuffix - -@end - diff --git a/test_data/test_json/FBEUserAddressSuffix.h b/test_data/test_json/FBEUserAddressSuffix.h deleted file mode 100644 index fa6992c..0000000 --- a/test_data/test_json/FBEUserAddressSuffix.h +++ /dev/null @@ -1,11 +0,0 @@ -// -// FBEUserAddressSuffix.h -// -// Created by MetaJSONParser. -// Copyright (c) 2013 SinnerSchrader Mobile. All rights reserved. - -#import "_FBEUserAddressSuffix.h" -@interface FBEUserAddressSuffix : _FBEUserAddressSuffix - -@end - diff --git a/test_data/test_json/FBEUserAddressSuffix.m b/test_data/test_json/FBEUserAddressSuffix.m deleted file mode 100644 index 9771151..0000000 --- a/test_data/test_json/FBEUserAddressSuffix.m +++ /dev/null @@ -1,11 +0,0 @@ -// -// FBEUserAddressSuffix.m -// -// Created by MetaJSONParser. -// Copyright (c) 2013 SinnerSchrader Mobile. All rights reserved. - -#import "FBEUserAddressSuffix.h" -@implementation FBEUserAddressSuffix - -@end - diff --git a/test_data/test_json/FBEUserSuffix.h b/test_data/test_json/FBEUserSuffix.h deleted file mode 100644 index 9a0ee61..0000000 --- a/test_data/test_json/FBEUserSuffix.h +++ /dev/null @@ -1,11 +0,0 @@ -// -// FBEUserSuffix.h -// -// Created by MetaJSONParser. -// Copyright (c) 2013 SinnerSchrader Mobile. All rights reserved. - -#import "_FBEUserSuffix.h" -@interface FBEUserSuffix : _FBEUserSuffix - -@end - diff --git a/test_data/test_json/FBEUserSuffix.m b/test_data/test_json/FBEUserSuffix.m deleted file mode 100644 index 65383a2..0000000 --- a/test_data/test_json/FBEUserSuffix.m +++ /dev/null @@ -1,11 +0,0 @@ -// -// FBEUserSuffix.m -// -// Created by MetaJSONParser. -// Copyright (c) 2013 SinnerSchrader Mobile. All rights reserved. - -#import "FBEUserSuffix.h" -@implementation FBEUserSuffix - -@end - diff --git a/test_data/test_json/Utilities/APIParser/FBEAPIParser.h b/test_data/test_json/Utilities/APIParser/FBEAPIParser.h deleted file mode 100644 index 4c5d159..0000000 --- a/test_data/test_json/Utilities/APIParser/FBEAPIParser.h +++ /dev/null @@ -1,294 +0,0 @@ - -// -// Created by MetaJSONParser. -// Copyright (c) 2013 SinnerSchrader Mobile. All rights reserved. -// - -#import <Foundation/Foundation.h> - -extern NSInteger const kFBEErrorDomain_parser_protocolError; -extern NSInteger const kFBEErrorDomain_parser_dictionaryExpected; -extern NSInteger const kFBEErrorDomain_parser_arrayExpected; -extern NSInteger const kFBEErrorDomain_parser_numberExpected; -extern NSInteger const kFBEErrorDomain_parser_stringExpected; -extern NSInteger const kFBEErrorDomain_parser_dateExpected; -extern NSInteger const kFBEErrorDomain_parser_keyNotFound; -extern NSInteger const kFBEErrorDomain_parser_indexNotFound; -extern NSInteger const kFBEErrorDomain_parser_valueIsNull; -extern NSInteger const kFBEErrorDomain_parser_dataExpected; -extern NSInteger const kFBEErrorDomain_parser_valueIsNotValid; - -extern NSString * const kFBEErrorDomain_parser; - -/** - The APIParser facilitates parsing the fields of the JSON response. - - The ResponseObjects may be `NSDictionaries` or `NSArrays`, depending on the method. Each method performs type checking and returns an sets the `NSError` indirect reference to an `NSError` object. The `NSError` indirect reference will be guaranteed to be `nil` upon success, which is contrary to Cocoa conventions but necessary since `nil` or `FALSE` may be valid return values. - */ -@interface FBEAPIParser : NSObject - -#pragma mark - Response Parsing - -/** - Gets an `NSDictionary` object from the response array. - @param responseObject The JSON Array - @param key The key of the item of the responseObject to be read - @param acceptNil If set to YES, no error will be given if the item to be read is not available. Otherwise, an NSError is generated. - @param error `nil` if parsing was successful - @returns The dictionary read from the responseObject - */ -+(NSDictionary*)dictionaryFromResponseArray:(id)responseObject - atIndex:(NSUInteger)index - acceptNil:(BOOL)acceptNil - error:(NSError**)error; - -/** - Gets an `NSArray` object from the response array. - @param responseObject The JSON Array - @param key The key of the item of the responseObject to be read - @param acceptNil If set to YES, no error will be given if the item to be read is not available. Otherwise, an NSError is generated. - @param error `nil` if parsing was successful - @returns The array read from the responseObject - */ -+(NSArray*)arrayFromResponseArray:(id)responseObject - atIndex:(NSUInteger)index - acceptNil:(BOOL)acceptNil - error:(NSError**)error; - -/** - Gets an `NSString` object from the response array. - @param responseObject The JSON Array - @param key The key of the item of the responseObject to be read - @param acceptNil If set to YES, no error will be given if the item to be read is not available. Otherwise, an NSError is generated. - @param error `nil` if parsing was successful - @returns The string read from the responseObject - */ - -+(NSString *)stringFromResponseArray:(id)responseObject - atIndex:(NSUInteger)index - acceptNil:(BOOL)acceptNil - error:(NSError**)error; - -/** - Gets an `NSNumber` object from the response array. - @param responseObject The JSON Array - @param key The key of the item of the responseObject to be read - @param acceptNil If set to YES, no error will be given if the item to be read is not available. Otherwise, an NSError is generated. - @param error `nil` if parsing was successful - @returns The object read from the responseObject - */ -+(NSNumber *)numberFromResponseArray:(id)responseObject - atIndex:(NSUInteger)index - acceptNil:(BOOL)acceptNil - error:(NSError**)error; - -/** - Gets a `BOOL` value from the response array. - @param responseObject The JSON Array - @param key The key of the item of the responseObject to be read - @param acceptNil If set to YES, no error will be given if the item to be read is not available. Otherwise, an NSError is generated. - @param error `nil` if parsing was successful - @returns The value read from the responseObject. Will be `NO` if the item to be read is not available. - */ -+(BOOL)boolFromResponseArray:(id)responseObject - atIndex:(NSUInteger)index - acceptNil:(BOOL)acceptNil - error:(NSError**)error; - -/** - Gets an `NSDate` object from the response array. - @param responseObject The JSON Array - @param key The key of the item of the responseObject to be read (the value for this key should be time interval since 1970) - @param acceptNil If set to YES, no error will be given if the item to be read is not available. Otherwise, an NSError is generated. - @param error `nil` if parsing was successful - @returns The date read from the responseObject - */ -+(NSDate *)dateWithTimeIntervalFromResponseArray:(id)responseObject - atIndex:(NSUInteger)index - acceptNil:(BOOL)acceptNil - error:(NSError**)error; - - - -/** - Gets an `NSData` object from the response array. - @param responseObject The JSON Array - @param key The key of the item of the responseObject to be read - @param acceptNil If set to YES, no error will be given if the item to be read is not available. Otherwise, an NSError is generated. - @param error `nil` if parsing was successful - @returns The data read from the responseObject - */ -+ (NSData*)dataFromResponseArray:(NSDictionary*)responseObject - atIndex:(NSUInteger)index - acceptNil:(BOOL)acceptNil - error:(NSError**)error; - -/** - Gets an Objective-C object of an anonymous type from the response object. - @param responseObject The JSON Dictionary - @param key The key of the item of the responseObject to be read - @param acceptNil If set to YES, no error will be given if the item to be read is not available. Otherwise, an NSError is generated. - @param error `nil` if parsing was successful - @returns The object read from the responseObject - */ -+(id)objectFromResponseDictionary:(id)responseObject - forKey:(NSString*)key - acceptNil:(BOOL)acceptNil - error:(NSError**)error; - - -/** - Gets an Objective-C object of an anonymous type from the response array. - @param responseObject The JSON Array - @param index The index of the item of the responseObject to be read - @param acceptNil If set to YES, no error will be given if the item to be read is not available. Otherwise, an NSError is generated. - @param error `nil` if parsing was successful - @returns The object read from the responseObject - */ -+(id)objectFromResponseArray:(id)responseObject - atIndex:(NSUInteger)index - acceptNil:(BOOL)acceptNil - error:(NSError**)error; - - -/** - Gets an `NSNumber` object from the response object. - @param responseObject The JSON Dictionary - @param key The key of the item of the responseObject to be read - @param acceptNil If set to YES, no error will be given if the item to be read is not available. Otherwise, an NSError is generated. - @param error `nil` if parsing was successful - @returns The object read from the responseObject - */ -+(NSNumber*)numberFromResponseDictionary:(id)responseObject - forKey:(NSString*)key - acceptNil:(BOOL)acceptNil - error:(NSError**)error; - - -/** - Gets a `BOOL` value from the response object. - @param responseObject The JSON Dictionary - @param key The key of the item of the responseObject to be read - @param acceptNil If set to YES, no error will be given if the item to be read is not available. Otherwise, an NSError is generated. - @param error `nil` if parsing was successful - @returns The value read from the responseObject. Will be `NO` if the item to be read is not available. - */ -+(BOOL)boolFromResponseDictionary:(id)responseObject - forKey:(NSString*)key - acceptNil:(BOOL)acceptNil - error:(NSError**)error -; - -/** - Gets an `NSDictionary` object from the response object. - @param responseObject The JSON Dictionary - @param key The key of the item of the responseObject to be read - @param acceptNil If set to YES, no error will be given if the item to be read is not available. Otherwise, an NSError is generated. - @param error `nil` if parsing was successful - @returns The dictionary read from the responseObject - */ -+(NSDictionary*)dictionaryFromResponseDictionary:(id)responseObject - forKey:(NSString*)key - acceptNil:(BOOL)acceptNil - error:(NSError**)error; - - -/** - Gets an `NSArray` object from the response object. - @param responseObject The JSON Dictionary - @param key The key of the item of the responseObject to be read - @param acceptNil If set to YES, no error will be given if the item to be read is not available. Otherwise, an NSError is generated. - @param error `nil` if parsing was successful - @returns The array read from the responseObject - */ -+(NSArray*)arrayFromResponseDictionary:(id)responseObject - forKey:(NSString*)key - acceptNil:(BOOL)acceptNil - error:(NSError**)error -; - -/** - Gets an `NSString` object from the response object. - @param responseObject The JSON Dictionary - @param key The key of the item of the responseObject to be read - @param acceptNumber If yes, the string will be generated by invocing -desription on the responseObject if it is kind of an NSNumber. - @param acceptNil If set to YES, no error will be given if the item to be read is not available. Otherwise, an NSError is generated. - @param error `nil` if parsing was successful - @returns The string read from the responseObject - */ -+(NSString*)stringFromResponseDictionary:(id)responseObject - forKey:(NSString*)key - acceptNumber:(BOOL)acceptNumber - acceptNil:(BOOL)acceptNil - error:(NSError**)error -; - -/** - Gets an `NSDate` object from the response object. The JSON data for the `key` may be either an iso8601 date string or a number. In case of a string, the formatting must be `yyyy-MM-dd'T'HHmmssZZZ`; in case of a number it must be a Unix time stamp (since 1970). - @param responseObject The JSON Dictionary - @param key The key of the item of the responseObject to be read - @param acceptNil If set to YES, no error will be given if the item to be read is not available. Otherwise, an NSError is generated. - @param error `nil` if parsing was successful - @returns The date read from the responseObject - */ -+(NSDate*)dateFromResponseDictionary:(id)responseObject - forKey:(NSString*)key - acceptNil:(BOOL)acceptNil - error:(NSError**)error -; - -/** - Gets an `NSData` object from the response object. - @param responseObject The JSON Dictionary - @param key The key of the item of the responseObject to be read - @param acceptNil If set to YES, no error will be given if the item to be read is not available. Otherwise, an NSError is generated. - @param error `nil` if parsing was successful - @returns The data read from the responseObject - */ -+ (NSData*)dataFromResponseDictionary:(NSDictionary*)responseObject - forKey:(NSString*)key - acceptNil:(BOOL)acceptNil - error:(NSError**)error -; - -/** - Gets an `NSDate` object from the response object. - @param responseObject The JSON Dictionary - @param key The key of the item of the responseObject to be read (the value for this key should be time interval since 1970) - @param acceptNil If set to YES, no error will be given if the item to be read is not available. Otherwise, an NSError is generated. - @param error `nil` if parsing was successful - @returns The date read from the responseObject - */ -+(NSDate*)dateWithTimeIntervalFromResponseDictionary:(id)responseObject - forKey:(NSString*)key - acceptNil:(BOOL)acceptNil - error:(NSError**)error -; - -/** - Gets an `NSDate` object from the response object (milliseconds -> seconds). - @param responseObject The JSON Dictionary - @param key The key of the item of the responseObject to be read (the value for this key should be time interval since 1970) - @param acceptNil If set to YES, no error will be given if the item to be read is not available. Otherwise, an NSError is generated. - @param error `nil` if parsing was successful - @returns The date read from the responseObject - */ -+(NSDate*)dateWithMilliSecondsTimeIntervalFromResponseDictionary:(id)responseObject - forKey:(NSString*)key - acceptNil:(BOOL)acceptNil - error:(NSError**)error -; - - -/** - The `NSString` is generated using a predefined `NSDateFormatter`. - - The date formatter is cached after the first invocation. - The date formatter is currently hardcoded to use the locale `en_US_POSIX`and date format `yyyy'-'MM'-'dd'T'HH':'mm':'ssZZZ'`. - TODO: This will likely have to change! - @param date - @returns The formatted date string - */ -+(NSString*)iso8601StringFromDate:(NSDate *)date; - -@end diff --git a/test_data/test_json/Utilities/APIParser/FBEAPIParser.m b/test_data/test_json/Utilities/APIParser/FBEAPIParser.m deleted file mode 100644 index 32f6427..0000000 --- a/test_data/test_json/Utilities/APIParser/FBEAPIParser.m +++ /dev/null @@ -1,590 +0,0 @@ - -// -// Created by MetaJSONParser. -// Copyright (c) 2013 SinnerSchrader Mobile. All rights reserved. -// - -#import "FBEAPIParser.h" - -NSInteger const kFBEErrorDomain_parser_protocolError = 1; -NSInteger const kFBEErrorDomain_parser_dictionaryExpected = 2; -NSInteger const kFBEErrorDomain_parser_arrayExpected = 3; -NSInteger const kFBEErrorDomain_parser_numberExpected = 4; -NSInteger const kFBEErrorDomain_parser_stringExpected = 5; -NSInteger const kFBEErrorDomain_parser_dateExpected = 6; -NSInteger const kFBEErrorDomain_parser_keyNotFound = 7; -NSInteger const kFBEErrorDomain_parser_indexNotFound = 8; -NSInteger const kFBEErrorDomain_parser_valueIsNull = 9; -NSInteger const kFBEErrorDomain_parser_dataExpected = 10; -NSInteger const kFBEErrorDomain_parser_valueIsNotValid = 11; - -NSString * const kFBEErrorDomain_parser = @"FBEParser"; - -#ifndef FBE_ASSURE_ERROR -#define FBE_ASSURE_ERROR(error) \ -if (!(error)) (error) = (NSError*__autoreleasing*)alloca(sizeof(NSError*)); \ -*(error) = nil; -#endif - -@implementation FBEAPIParser - -#pragma mark - respone parsing - -//date Parsing -+(NSString *)iso8601StringFromDate:(NSDate *)date { - static NSDateFormatter * iso8601DateFormatter; - - // If the date formatters aren't already set up, do that now and cache them - // for subsequence reuse. - static dispatch_once_t onceToken; - dispatch_once(&onceToken, ^{ - iso8601DateFormatter = [[NSDateFormatter alloc] init]; - - // TODO: use the system locale! Also, adapt the documentation in the declaration. - NSLocale *enUSPOSIXLocale = [[NSLocale alloc] initWithLocaleIdentifier:@"en_US_POSIX"]; - [iso8601DateFormatter setLocale:enUSPOSIXLocale]; -#if !__has_feature(objc_arc) - [enUSPOSIXLocale release]; -#endif - // !!!: Adapt the documentation if the format string is modified. - [iso8601DateFormatter setDateFormat:@"yyyy'-'MM'-'dd'T'HH':'mm':'ssZZZ'"]; - }); - - if (!date) { - return nil; - } - - return [iso8601DateFormatter stringFromDate:date]; -} - -+(NSDate *)dateFromISO8601String:(NSString *)timeString error:(NSError**)error { - FBE_ASSURE_ERROR(error); - - static NSDateFormatter * iso8601DateFormatter; - - // If the date formatters aren't already set up, do that now and cache them - // for subsequent reuse. - static dispatch_once_t onceToken; - dispatch_once(&onceToken, ^{ - iso8601DateFormatter = [[NSDateFormatter alloc] init]; - NSLocale *enUSPOSIXLocale = [[NSLocale alloc] initWithLocaleIdentifier:@"en_US_POSIX"]; - [iso8601DateFormatter setLocale:enUSPOSIXLocale]; -#if !__has_feature(objc_arc) - [enUSPOSIXLocale release]; -#endif - // [iso8601DateFormatter setDateFormat:@"yyyy'-'MM'-'dd'T'HH':'mm':'ss'+00:00'"]; - // [iso8601DateFormatter setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:0]]; - [iso8601DateFormatter setDateFormat:@"yyyy-MM-dd'T'HHmmssZZZ"]; - }); - - if (!timeString) { - return nil; - } - - timeString = [timeString stringByReplacingOccurrencesOfString:@":" withString:@""]; - NSDate *date = [iso8601DateFormatter dateFromString:timeString]; - if (!date) { - *error = [NSError errorWithDomain:kFBEErrorDomain_parser code:kFBEErrorDomain_parser_dateExpected userInfo:nil]; - return nil; - } - - return date; -} - -+(id)objectFromResponseArray:(id)responseObject - atIndex:(NSUInteger)index - acceptNil:(BOOL)acceptNil - error:(NSError**)error { - FBE_ASSURE_ERROR(error); - - if (![responseObject isKindOfClass:[NSArray class]]) - { - *error = [NSError errorWithDomain:kFBEErrorDomain_parser code:kFBEErrorDomain_parser_arrayExpected userInfo:nil]; - return nil; - } - NSArray *responseArray = (NSArray*)responseObject; - - if (index >= [responseArray count]) { - if (!acceptNil) { - *error =[NSError errorWithDomain:kFBEErrorDomain_parser code:kFBEErrorDomain_parser_indexNotFound userInfo:nil]; - } - return nil; - } - - id object = [responseArray objectAtIndex:index]; - if (!object || object == [NSNull null]) { - if (!acceptNil) { - *error =[NSError errorWithDomain:kFBEErrorDomain_parser code:kFBEErrorDomain_parser_valueIsNull userInfo:nil]; - } - return nil; - } - - return object; -} - -+(NSDictionary*)dictionaryFromResponseArray:(id)responseObject - atIndex:(NSUInteger)index - acceptNil:(BOOL)acceptNil - error:(NSError**)error { - FBE_ASSURE_ERROR(error); - - id dictionary = [self objectFromResponseArray:responseObject atIndex:index acceptNil:acceptNil error:error]; - if (*error || !dictionary) - { - // pass unchanged error from objectFromResponseDictionary - return nil; - } - - if (![dictionary isKindOfClass:[NSDictionary class]]) - { - *error = [NSError errorWithDomain:kFBEErrorDomain_parser code:kFBEErrorDomain_parser_dictionaryExpected userInfo:nil]; - return nil; - } - - return (NSDictionary*)dictionary; -} - -+(NSArray*)arrayFromResponseArray:(id)responseObject - atIndex:(NSUInteger)index - acceptNil:(BOOL)acceptNil - error:(NSError**)error { - FBE_ASSURE_ERROR(error); - - id array = [self objectFromResponseArray:responseObject atIndex:index acceptNil:acceptNil error:error]; - - if (*error || !array) - { - // pass unchanged error from objectFromResponseDictionary - return nil; - } - - if (![array isKindOfClass:[NSArray class]]) - { - *error = [NSError errorWithDomain:kFBEErrorDomain_parser code:kFBEErrorDomain_parser_arrayExpected userInfo:nil]; - return nil; - } - - return (NSArray*)array; -} - -+(NSString *)stringFromResponseArray:(id)responseObject - atIndex:(NSUInteger)index - acceptNil:(BOOL)acceptNil - error:(NSError**)error { - FBE_ASSURE_ERROR(error); - - id string = [self objectFromResponseArray:responseObject atIndex:index acceptNil:acceptNil error:error]; - - if (*error || !string) - { - // pass unchanged error from objectFromResponseDictionary - return nil; - } - - if (![string isKindOfClass:[NSString class]]) - { - *error = [NSError errorWithDomain:kFBEErrorDomain_parser code:kFBEErrorDomain_parser_stringExpected userInfo:nil]; - return nil; - } - - return (NSString*)string; -} - -+(NSNumber *)numberFromResponseArray:(id)responseObject - atIndex:(NSUInteger)index - acceptNil:(BOOL)acceptNil - error:(NSError**)error { - FBE_ASSURE_ERROR(error); - - id number = [self objectFromResponseArray:responseObject atIndex:index acceptNil:acceptNil error:error]; - - if (*error || !number) - { - // pass unchanged error from objectFromResponseDictionary - return nil; - } - - if ([number isKindOfClass:[NSString class]]) { - - NSString *numberString = (NSString *)number; -#if !__has_feature(objc_arc) - NSNumberFormatter * formatter = [[[NSNumberFormatter alloc] init] autorelease]; -#else - NSNumberFormatter * formatter = [[NSNumberFormatter alloc] init]; -#endif - [formatter setNumberStyle:NSNumberFormatterNoStyle]; - number = [formatter numberFromString:numberString]; - - } - - if (![number isKindOfClass:[NSNumber class]]) - { - *error = [NSError errorWithDomain:kFBEErrorDomain_parser code:kFBEErrorDomain_parser_numberExpected userInfo:nil]; - return nil; - } - - NSNumber *FBENumber = [NSNumber numberWithLongLong:[number longLongValue]]; - return (NSNumber*)FBENumber; -} - -+(BOOL)boolFromResponseArray:(id)responseObject - atIndex:(NSUInteger)index - acceptNil:(BOOL)acceptNil - error:(NSError**)error { - FBE_ASSURE_ERROR(error); - - NSNumber *number = [self numberFromResponseArray:responseObject atIndex:index acceptNil:acceptNil error:error]; - - if (*error || !number) - { - // pass unchanged error from objectFromResponseDictionary - return NO; - } - - return [number boolValue]; -} - -+(NSDate *)dateWithTimeIntervalFromResponseArray:(id)responseObject - atIndex:(NSUInteger)index - acceptNil:(BOOL)acceptNil - error:(NSError**)error { - FBE_ASSURE_ERROR(error); - - NSNumber *timeInterval = [self numberFromResponseArray:responseObject atIndex:index acceptNil:acceptNil error:error]; - - if (*error || !timeInterval || ![timeInterval isKindOfClass:[NSNumber class]]) - { - // pass unchanged error from stringFromResponseDictionary - *error = [NSError errorWithDomain:kFBEErrorDomain_parser code:kFBEErrorDomain_parser_dateExpected userInfo:nil]; - return nil; - } - - NSDate *date = [NSDate dateWithTimeIntervalSince1970:[timeInterval doubleValue]]; - - return date; -} - -+ (NSData*)dataFromResponseArray:(NSDictionary*)responseObject - atIndex:(NSUInteger)index - acceptNil:(BOOL)acceptNil - error:(NSError**)error -{ - FBE_ASSURE_ERROR(error); - - id data = [self objectFromResponseArray:responseObject atIndex:index acceptNil:acceptNil error:error]; - - if (*error || !data) - { - // pass unchanged error from objectFromResponseDictionary - return nil; - } - - if ([data isKindOfClass:[NSString class]]) { - NSString *dataString = (NSString *)data; - data = [dataString dataUsingEncoding:NSUTF8StringEncoding]; - } - - if (![data isKindOfClass:[NSData class]]) { - *error = [NSError errorWithDomain:kFBEErrorDomain_parser code:kFBEErrorDomain_parser_dataExpected userInfo:nil]; - return nil; - } - - return (NSData*)data; -} - -+(id)objectFromResponseDictionary:(id)responseObject - forKey:(NSString*)key - acceptNil:(BOOL)acceptNil - error:(NSError**)error -{ - FBE_ASSURE_ERROR(error); - - if (![responseObject isKindOfClass:[NSDictionary class]]) - { - *error = [NSError errorWithDomain:kFBEErrorDomain_parser code:kFBEErrorDomain_parser_dictionaryExpected userInfo:nil]; - return nil; - } - NSDictionary *responseDict = responseObject; - - id object = [responseDict objectForKey:key]; - if (!object) { - if (!acceptNil) { - *error =[NSError errorWithDomain:kFBEErrorDomain_parser code:kFBEErrorDomain_parser_keyNotFound userInfo:nil]; - } - return nil; - } - if (object == [NSNull null]) { - if (!acceptNil) { - *error =[NSError errorWithDomain:kFBEErrorDomain_parser code:kFBEErrorDomain_parser_valueIsNull userInfo:nil]; - } - return nil; - } - - return object; -} - -+(NSDictionary*)dictionaryFromResponseDictionary:(id)responseObject - forKey:(NSString*)key - acceptNil:(BOOL)acceptNil - error:(NSError**)error -{ - FBE_ASSURE_ERROR(error); - - id dictionary = [self objectFromResponseDictionary:responseObject - forKey:key - acceptNil:acceptNil - error:error]; - if (*error || !dictionary) - { - // pass unchanged error from objectFromResponseDictionary - return nil; - } - - if (![dictionary isKindOfClass:[NSDictionary class]]) - { - *error = [NSError errorWithDomain:kFBEErrorDomain_parser code:kFBEErrorDomain_parser_dictionaryExpected userInfo:nil]; - return nil; - } - - return (NSDictionary*)dictionary; -} - -+(NSArray*)arrayFromResponseDictionary:(id)responseObject - forKey:(NSString*)key - acceptNil:(BOOL)acceptNil - error:(NSError**)error -{ - FBE_ASSURE_ERROR(error); - - id array = [self objectFromResponseDictionary:responseObject - forKey:key - acceptNil:acceptNil - error:error]; - if (*error || !array) - { - // pass unchanged error from objectFromResponseDictionary - return nil; - } - - if (![array isKindOfClass:[NSArray class]]) - { - *error = [NSError errorWithDomain:kFBEErrorDomain_parser code:kFBEErrorDomain_parser_arrayExpected userInfo:nil]; - return nil; - } - - return (NSArray*)array; -} - -+(NSNumber*)numberFromResponseDictionary:(id)responseObject - forKey:(NSString*)key - acceptNil:(BOOL)acceptNil - error:(NSError**)error -{ - FBE_ASSURE_ERROR(error); - - id number = [self objectFromResponseDictionary:responseObject - forKey:key - acceptNil:acceptNil - error:error]; - if (*error || !number) - { - // pass unchanged error from objectFromResponseDictionary - return nil; - } - - if ([number isKindOfClass:[NSString class]]) { - - NSString *numberString = (NSString *)number; - -#if !__has_feature(objc_arc) - NSNumberFormatter * formatter = [[[NSNumberFormatter alloc] init] autorelease]; -#else - NSNumberFormatter * formatter = [[NSNumberFormatter alloc] init]; -#endif - [formatter setNumberStyle:NSNumberFormatterNoStyle]; - number = [formatter numberFromString:numberString]; - - } - - if (![number isKindOfClass:[NSNumber class]]) - { - *error = [NSError errorWithDomain:kFBEErrorDomain_parser code:kFBEErrorDomain_parser_numberExpected userInfo:nil]; - return nil; - } - - NSNumber *FBENumber = [NSNumber numberWithLongLong:[number longLongValue]]; - return (NSNumber*)FBENumber; -} - -+(BOOL)boolFromResponseDictionary:(id)responseObject - forKey:(NSString*)key - acceptNil:(BOOL)acceptNil - error:(NSError**)error { - FBE_ASSURE_ERROR(error); - - NSNumber *number = [self numberFromResponseDictionary:responseObject - forKey:key - acceptNil:acceptNil - error:error]; - if (*error || !number) - { - // pass unchanged error from objectFromResponseDictionary - return NO; - } - - return [number boolValue]; -} - -+(NSString*)stringFromResponseDictionary:(id)responseObject - forKey:(NSString*)key - acceptNumber:(BOOL)acceptNumber - acceptNil:(BOOL)acceptNil - error:(NSError**)error -{ - FBE_ASSURE_ERROR(error); - - id string = [self objectFromResponseDictionary:responseObject - forKey:key - acceptNil:acceptNil - error:error]; - if (*error || !string) - { - // pass unchanged error from objectFromResponseDictionary - return nil; - } - - if (acceptNumber && [string isKindOfClass:[NSNumber class]]) { - string = [string description]; - } - - if (![string isKindOfClass:[NSString class]]) - { - *error = [NSError errorWithDomain:kFBEErrorDomain_parser code:kFBEErrorDomain_parser_stringExpected userInfo:nil]; - return nil; - } - - return (NSString*)string; -} - -+(NSDate*)dateFromResponseDictionary:(id)responseObject - forKey:(NSString*)key - acceptNil:(BOOL)acceptNil - error:(NSError**)error -{ - FBE_ASSURE_ERROR(error); - - id dateObject = [self stringFromResponseDictionary:responseObject - forKey:key - acceptNumber:YES - acceptNil:acceptNil - error:error]; - if (*error || !dateObject) - { - // pass unchanged error from stringFromResponseDictionary - return nil; - } - - NSDate *date = nil; - if ([dateObject isKindOfClass:[NSString class]]) { - NSString *dateString = (NSString *)dateObject; - date = [self dateFromISO8601String:dateString error:error]; - if (*error) { - return nil; - } - } else { - NSNumber *dateNumber = (NSNumber *)dateObject; - date = [NSDate dateWithTimeIntervalSince1970:[dateNumber longValue]]; - } - - return date; -} - -+ (NSData*)dataFromResponseDictionary:(NSDictionary*)responseObject - forKey:(NSString*)key - acceptNil:(BOOL)acceptNil - error:(NSError**)error -{ - FBE_ASSURE_ERROR(error); - - id data = [self objectFromResponseDictionary:responseObject - forKey:key - acceptNil:acceptNil - error:error]; - if (*error || !data) - { - // pass unchanged error from objectFromResponseDictionary - return nil; - } - - if ([data isKindOfClass:[NSString class]]) { - NSString *dataString = (NSString *)data; - data = [dataString dataUsingEncoding:NSUTF8StringEncoding]; - } - - if (![data isKindOfClass:[NSData class]]) { - *error = [NSError errorWithDomain:kFBEErrorDomain_parser code:kFBEErrorDomain_parser_dataExpected userInfo:nil]; - return nil; - } - - return (NSData*)data; -} - - -+(NSDate*)dateWithTimeIntervalFromResponseDictionary:(id)responseObject - forKey:(NSString*)key - acceptNil:(BOOL)acceptNil - error:(NSError**)error -{ - FBE_ASSURE_ERROR(error); - - NSNumber *timeInterval = [self numberFromResponseDictionary:responseObject - forKey:key - acceptNil:acceptNil - error:error]; - if (!timeInterval && acceptNil) { - return nil; - } - - if (*error || !timeInterval || ![timeInterval isKindOfClass:[NSNumber class]]) - { - // pass unchanged error from stringFromResponseDictionary - *error = [NSError errorWithDomain:kFBEErrorDomain_parser code:kFBEErrorDomain_parser_dateExpected userInfo:nil]; - return nil; - } - - NSDate *date = [NSDate dateWithTimeIntervalSince1970:[timeInterval doubleValue]]; - - return date; -} - -+(NSDate*)dateWithMilliSecondsTimeIntervalFromResponseDictionary:(id)responseObject - forKey:(NSString*)key - acceptNil:(BOOL)acceptNil - error:(NSError**)error -{ - FBE_ASSURE_ERROR(error); - - NSNumber *dateNumber = [self numberFromResponseDictionary:responseObject - forKey:key - acceptNil:acceptNil - error:error]; - if (!dateNumber && acceptNil) { - return nil; - } - - NSNumber *timeInterval = [NSNumber numberWithLongLong:(dateNumber.longLongValue / 1000)]; - - if (*error || !timeInterval || ![timeInterval isKindOfClass:[NSNumber class]]) - { - // pass unchanged error from stringFromResponseDictionary - *error = [NSError errorWithDomain:kFBEErrorDomain_parser code:kFBEErrorDomain_parser_dateExpected userInfo:nil]; - return nil; - } - - NSDate *date = [NSDate dateWithTimeIntervalSince1970:[timeInterval longLongValue]]; - - return date; -} - - -@end diff --git a/test_data/test_json/Utilities/NSString/NSString+RegExValidation.h b/test_data/test_json/Utilities/NSString/NSString+RegExValidation.h deleted file mode 100644 index 3d967dc..0000000 --- a/test_data/test_json/Utilities/NSString/NSString+RegExValidation.h +++ /dev/null @@ -1,18 +0,0 @@ -// -// NSString+RegExValidation.h -// -// Created by MetaJSONParser. -// Copyright (c) 2013 SinnerSchrader Mobile. All rights reserved. - -#import <Foundation/Foundation.h> - -@interface NSString (RegExValidation) - -#define emailRegex @"^[_a-z0-9-]+(\\.[_a-z0-9-]+)*@[a-z0-9-]+(\\.[a-z0-9-]+)*(\\.[a-z]{2,4})$" - -- (NSUInteger) numberOfMatchesWithRegExString:(NSString *)regExString; - -- (BOOL) matchesRegExString:(NSString *)regExString; - -- (BOOL) isValidEmailFormatString; -@end diff --git a/test_data/test_json/Utilities/NSString/NSString+RegExValidation.m b/test_data/test_json/Utilities/NSString/NSString+RegExValidation.m deleted file mode 100644 index 41d68dc..0000000 --- a/test_data/test_json/Utilities/NSString/NSString+RegExValidation.m +++ /dev/null @@ -1,32 +0,0 @@ -// -// NSString+RegExValidation.m -// -// Created by MetaJSONParser. -// Copyright (c) 2013 SinnerSchrader Mobile. All rights reserved. - -#import "NSString+RegExValidation.h" - -@implementation NSString (RegExValidation) - -- (NSUInteger) numberOfMatchesWithRegExString:(NSString *)regExString { - if (regExString == nil || [regExString isKindOfClass:[NSString class]] == NO || regExString.length == 0) { - return 0; - } - NSError *error = nil; - NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:regExString options:NSRegularExpressionCaseInsensitive error:&error]; - if (error) { - NSLog(@"Regular expression match error : %@", error); - return 0; - } - return [regex numberOfMatchesInString:self options:0 range:NSMakeRange(0, self.length)]; -} - -- (BOOL) matchesRegExString:(NSString *)regExString { - return ([self numberOfMatchesWithRegExString:regExString] > 0); -} - -- (BOOL) isValidEmailFormatString { - return [self matchesRegExString:emailRegex]; -} - -@end From ad07b47062d342a0f9cd7ae0be291803eed04b3d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Franc=CC=A7ois=20Benaiteau?= <francois.benaiteau@sinnerschrader-mobile.com> Date: Thu, 17 Apr 2014 17:04:50 +0200 Subject: [PATCH 053/149] add new testCase data --- samples/test_types.json | 56 ++++ .../test_types/_S2MSuperObjectJSONObject.h | 33 ++ .../test_types/_S2MSuperObjectJSONObject.m | 190 ++++++++++++ test_data/test_types_superObject.p | 234 ++++++++++++++ test_data/test_types_superObject_scheme.p | 288 ++++++++++++++++++ 5 files changed, 801 insertions(+) create mode 100644 samples/test_types.json create mode 100644 test_data/test_types/_S2MSuperObjectJSONObject.h create mode 100644 test_data/test_types/_S2MSuperObjectJSONObject.m create mode 100644 test_data/test_types_superObject.p create mode 100644 test_data/test_types_superObject_scheme.p diff --git a/samples/test_types.json b/samples/test_types.json new file mode 100644 index 0000000..6babd50 --- /dev/null +++ b/samples/test_types.json @@ -0,0 +1,56 @@ +[ + { + "name": "customNumber", + "base-type": "number", + "minLength": 1, + "maxLength": 10 + }, + { + "name": "superObject", + "base-type": "object", + "property": [ + { + "name": "isBoolean", + "base-type": "boolean" + }, + { + "name": "myData", + "base-type": "data" + }, + { + "name": "creationDate", + "base-type": "date" + }, + { + "name": "updateDate", + "base-type": "date", + "subType": "ms" + }, + { + "name": "objectWithoutSubtypes", + "base-type": "array" + }, + { + "name": "numbers", + "base-type": "array", + "subType": "number" + }, + { + "name": "stringsAndDates", + "base-type": "array", + "subType": ["string", "date"] + }, + { + "name": "customNumbers", + "base-type": "array", + "subType": "customNumber" + }, + { + "name": "stringsAndCustomNumbers", + "base-type": "array", + "subType": ["string", "customNumber"] + } + + ] + } +] diff --git a/test_data/test_types/_S2MSuperObjectJSONObject.h b/test_data/test_types/_S2MSuperObjectJSONObject.h new file mode 100644 index 0000000..d70573d --- /dev/null +++ b/test_data/test_types/_S2MSuperObjectJSONObject.h @@ -0,0 +1,33 @@ +// +// _S2MSuperObjectJSONObject.h +// +// Created by MetaJSONParser. +// Copyright (c) 2014 SinnerSchrader Mobile. All rights reserved. + +#import <Foundation/Foundation.h> + +@class S2MSuperObjectJSONObject; + +@interface _S2MSuperObjectJSONObject : NSObject <NSCoding> + + +@property (nonatomic, assign) BOOL isBoolean; +@property (nonatomic, strong) NSData *myData; +@property (nonatomic, strong) NSDate *creationDate; +@property (nonatomic, strong) NSDate *updateDate; +@property (nonatomic, strong) NSArray *objectWithoutSubtypes; +@property (nonatomic, strong) NSArray *numbers; +@property (nonatomic, strong) NSArray *stringsAndDates; +@property (nonatomic, strong) NSArray *customNumbers; +@property (nonatomic, strong) NSArray *stringsAndCustomNumbers; + ++ (S2MSuperObjectJSONObject *)superObjectWithDictionary:(NSDictionary *)dic withError:(NSError **)error; +- (id)initWithDictionary:(NSDictionary *)dic withError:(NSError **)error; +- (NSDictionary *)propertyDictionary; +- (NSString *)stringInStringsAndDatesAtIndex:(NSUInteger)index withError:(NSError **)error; +- (NSDate *)dateInStringsAndDatesAtIndex:(NSUInteger)index withError:(NSError **)error; +- (NSString *)stringInStringsAndCustomNumbersAtIndex:(NSUInteger)index withError:(NSError **)error; +- (NSNumber *)customNumberInStringsAndCustomNumbersAtIndex:(NSUInteger)index withError:(NSError **)error; + +@end + diff --git a/test_data/test_types/_S2MSuperObjectJSONObject.m b/test_data/test_types/_S2MSuperObjectJSONObject.m new file mode 100644 index 0000000..6084598 --- /dev/null +++ b/test_data/test_types/_S2MSuperObjectJSONObject.m @@ -0,0 +1,190 @@ +// +// _S2MSuperObjectJSONObject.m +// +// Created by MetaJSONParser. +// Copyright (c) 2014 SinnerSchrader Mobile. All rights reserved. + +#import "S2MAPIParser.h" +#import "NSString+RegExValidation.h" +#import "S2MSuperObjectJSONObject.h" + + +@implementation _S2MSuperObjectJSONObject + +#pragma mark - factory + ++ (S2MSuperObjectJSONObject *)superObjectWithDictionary:(NSDictionary *)dic withError:(NSError **)error { + return [[S2MSuperObjectJSONObject alloc] initWithDictionary:dic withError:error]; +} + + +#pragma mark - initialize +- (id)initWithDictionary:(NSDictionary *)dic withError:(NSError **)error { + self = [super init]; + if (self) { + self.isBoolean = [S2MAPIParser boolFromResponseDictionary:dic forKey:@"isBoolean" acceptNil:YES error:error]; + if (*error) { + return self; + } + self.myData = [S2MAPIParser dataFromResponseDictionary:dic forKey:@"myData" acceptNil:YES error:error]; + if (*error) { + return self; + } + self.creationDate = [S2MAPIParser dateWithTimeIntervalFromResponseDictionary:dic forKey:@"creationDate" acceptNil:YES error:error]; + if (*error) { + return self; + } + self.updateDate = [S2MAPIParser dateWithMilliSecondsTimeIntervalFromResponseDictionary:dic forKey:@"updateDate" acceptNil:YES error:error]; + if (*error) { + return self; + } + self.objectWithoutSubtypes = [S2MAPIParser arrayFromResponseDictionary:dic forKey:@"objectWithoutSubtypes" acceptNil:YES error:error]; + if (*error) { + return self; + } + NSArray *tmpNumbersArray = [S2MAPIParser arrayFromResponseDictionary:dic forKey:@"numbers" acceptNil:YES error:error]; + if (*error) { + return self; + } + NSMutableArray *tmpNumbers = [[NSMutableArray alloc] initWithCapacity:tmpNumbersArray.count]; + for (NSUInteger loop = 0; loop < tmpNumbersArray.count; loop++) { + NSNumber *tmpValue = [S2MAPIParser numberFromResponseArray:tmpNumbersArray atIndex:loop acceptNil:YES error:error]; + if (*error) { + return self; + } + if (tmpValue) { + [tmpNumbers addObject:tmpValue]; + } + } + self.numbers = [NSArray arrayWithArray:tmpNumbers]; + self.stringsAndDates = [S2MAPIParser arrayFromResponseDictionary:dic forKey:@"stringsAndDates" acceptNil:YES error:error]; + if (*error) { + return self; + } + NSArray *tmpCustomNumbersArray = [S2MAPIParser arrayFromResponseDictionary:dic forKey:@"customNumbers" acceptNil:YES error:error]; + if (*error) { + return self; + } + NSMutableArray *tmpCustomNumbers = [[NSMutableArray alloc] initWithCapacity:tmpCustomNumbersArray.count]; + for (NSUInteger loop = 0; loop < tmpCustomNumbersArray.count; loop++) { + NSNumber *tmpValue = [S2MAPIParser numberFromResponseArray:tmpCustomNumbersArray atIndex:loop acceptNil:YES error:error]; + if (*error) { + return self; + } + if (tmpValue) { + [tmpCustomNumbers addObject:tmpValue]; + } + } + self.customNumbers = [NSArray arrayWithArray:tmpCustomNumbers]; + self.stringsAndCustomNumbers = [S2MAPIParser arrayFromResponseDictionary:dic forKey:@"stringsAndCustomNumbers" acceptNil:YES error:error]; + if (*error) { + return self; + } + } + return self; +} + + +#pragma mark - getter +- (NSString *)stringInStringsAndDatesAtIndex:(NSUInteger)index withError:(NSError **)error { + NSString *tmpStringsAndDates = [S2MAPIParser stringFromResponseArray:self.stringsAndDates atIndex:index acceptNil:YES error:error]; + if (*error) { + return nil; + } + return tmpStringsAndDates; +} +- (NSDate *)dateInStringsAndDatesAtIndex:(NSUInteger)index withError:(NSError **)error { + NSDate *tmpStringsAndDates = [S2MAPIParser dateWithTimeIntervalFromResponseArray:self.stringsAndDates atIndex:index acceptNil:YES error:error]; + if (*error) { + return nil; + } + return tmpStringsAndDates; +} +- (NSString *)stringInStringsAndCustomNumbersAtIndex:(NSUInteger)index withError:(NSError **)error { + NSString *tmpStringsAndCustomNumbers = [S2MAPIParser stringFromResponseArray:self.stringsAndCustomNumbers atIndex:index acceptNil:YES error:error]; + if (*error) { + return nil; + } + return tmpStringsAndCustomNumbers; +} +- (NSNumber *)customNumberInStringsAndCustomNumbersAtIndex:(NSUInteger)index withError:(NSError **)error { + NSNumber *tmpStringsAndCustomNumbers = [S2MAPIParser numberFromResponseArray:self.stringsAndCustomNumbers atIndex:index acceptNil:YES error:error]; + if (*error) { + return nil; + } + return tmpStringsAndCustomNumbers; +} + +#pragma mark - NSCoding +- (void)encodeWithCoder:(NSCoder*)coder { + [coder encodeBool:self.isBoolean forKey:@"isBoolean"]; + [coder encodeObject:self.myData forKey:@"myData"]; + [coder encodeObject:self.creationDate forKey:@"creationDate"]; + [coder encodeObject:self.updateDate forKey:@"updateDate"]; + [coder encodeObject:self.objectWithoutSubtypes forKey:@"objectWithoutSubtypes"]; + [coder encodeObject:self.numbers forKey:@"numbers"]; + [coder encodeObject:self.stringsAndDates forKey:@"stringsAndDates"]; + [coder encodeObject:self.customNumbers forKey:@"customNumbers"]; + [coder encodeObject:self.stringsAndCustomNumbers forKey:@"stringsAndCustomNumbers"]; +} +- (id)initWithCoder:(NSCoder *)coder { + self = [super init]; + self.isBoolean = [coder decodeBoolForKey:@"isBoolean"]; + self.myData = [coder decodeObjectForKey:@"myData"]; + self.creationDate = [coder decodeObjectForKey:@"creationDate"]; + self.updateDate = [coder decodeObjectForKey:@"updateDate"]; + self.objectWithoutSubtypes = [coder decodeObjectForKey:@"objectWithoutSubtypes"]; + self.numbers = [coder decodeObjectForKey:@"numbers"]; + self.stringsAndDates = [coder decodeObjectForKey:@"stringsAndDates"]; + self.customNumbers = [coder decodeObjectForKey:@"customNumbers"]; + self.stringsAndCustomNumbers = [coder decodeObjectForKey:@"stringsAndCustomNumbers"]; + return self; +} + +#pragma mark - Object Info +- (NSDictionary *)propertyDictionary { + NSMutableDictionary *dic = [[NSMutableDictionary alloc] init]; + if (self.isBoolean) { + [dic setObject:[NSNumber numberWithBool:self.isBoolean] forKey:@"isBoolean"]; + } + if (self.myData) { + [dic setObject:self.myData forKey:@"myData"]; + } + if (self.creationDate) { + [dic setObject:[NSNumber numberWithInteger:[[NSNumber numberWithDouble:[self.creationDate timeIntervalSince1970]] longValue]] forKey:@"creationDate"]; + } + if (self.updateDate) { + NSNumber* number = @([self.updateDate timeIntervalSince1970] * 1000); + NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init]; + [formatter setNumberStyle:NSNumberFormatterNoStyle]; + [formatter setNegativeFormat:@"0"]; + NSString *value = [formatter stringFromNumber:number]; + NSNumber *convertedNumber = [formatter numberFromString:value]; + [dic setObject:convertedNumber forKey:@"updateDate"]; + } + if (self.objectWithoutSubtypes) { + [dic setObject:self.objectWithoutSubtypes forKey:@"objectWithoutSubtypes"]; + } + if (self.numbers) { + [dic setObject:self.numbers forKey:@"numbers"]; + } + if (self.stringsAndDates) { + [dic setObject:self.stringsAndDates forKey:@"stringsAndDates"]; + } + if (self.customNumbers) { + NSMutableArray *tmpArray = [[NSMutableArray alloc] init]; + for (id tmpObj in self.customNumbers) { + [tmpArray addObject:tmpObj]; + } + [dic setObject:tmpArray forKey:@"customNumbers"]; + } + if (self.stringsAndCustomNumbers) { + [dic setObject:self.stringsAndCustomNumbers forKey:@"stringsAndCustomNumbers"]; + } + return dic; +} +- (NSString *)description { + return [NSString stringWithFormat:@"%@",[self propertyDictionary]]; +} + +@end diff --git a/test_data/test_types_superObject.p b/test_data/test_types_superObject.p new file mode 100644 index 0000000..194c9ca --- /dev/null +++ b/test_data/test_types_superObject.p @@ -0,0 +1,234 @@ +(iJSONScheme +JSONScheme +p0 +(dp1 +S'base_type_list' +p2 +(lp3 +sS'type_name' +p4 +S'superObject' +p5 +sS'projectPrefix' +p6 +S'S2M' +p7 +sS'base_type' +p8 +S'object' +p9 +sS'props' +p10 +(lp11 +(iJSONScheme +JSONScheme +p12 +(dp13 +S'domain' +p14 +(lp15 +S'ROOT' +p16 +ag5 +asg4 +S'isBoolean' +p17 +sg6 +g7 +sg8 +S'boolean' +p18 +sg2 +(lp19 +sS'objectSuffix' +p20 +S'JSONObject' +p21 +sba(iJSONScheme +JSONScheme +p22 +(dp23 +g14 +(lp24 +g16 +ag5 +asg4 +S'myData' +p25 +sg6 +g7 +sg8 +S'data' +p26 +sg2 +(lp27 +sg20 +g21 +sba(iJSONScheme +JSONScheme +p28 +(dp29 +g14 +(lp30 +g16 +ag5 +asg4 +S'creationDate' +p31 +sg6 +g7 +sg8 +S'date' +p32 +sg2 +(lp33 +sg20 +g21 +sba(iJSONScheme +JSONScheme +p34 +(dp35 +g14 +(lp36 +g16 +ag5 +asg4 +S'updateDate' +p37 +sg6 +g7 +sg8 +S'date' +p38 +sg2 +(lp39 +sg20 +g21 +sS'sub_type' +p40 +(lp41 +S'ms' +p42 +asba(iJSONScheme +JSONScheme +p43 +(dp44 +g14 +(lp45 +g16 +ag5 +asg4 +S'objectWithoutSubtypes' +p46 +sg6 +g7 +sg8 +S'array' +p47 +sg2 +(lp48 +sg20 +g21 +sba(iJSONScheme +JSONScheme +p49 +(dp50 +g14 +(lp51 +g16 +ag5 +asg4 +S'numbers' +p52 +sg6 +g7 +sg8 +S'array' +p53 +sg2 +(lp54 +sg20 +g21 +sg40 +(lp55 +S'number' +p56 +asba(iJSONScheme +JSONScheme +p57 +(dp58 +g14 +(lp59 +g16 +ag5 +asg4 +S'stringsAndDates' +p60 +sg6 +g7 +sg8 +S'array' +p61 +sg2 +(lp62 +sg20 +g21 +sg40 +(lp63 +S'string' +p64 +aS'date' +p65 +asba(iJSONScheme +JSONScheme +p66 +(dp67 +g14 +(lp68 +g16 +ag5 +asg4 +S'customNumbers' +p69 +sg6 +g7 +sg8 +S'array' +p70 +sg2 +(lp71 +sg20 +g21 +sg40 +(lp72 +S'customNumber' +p73 +asba(iJSONScheme +JSONScheme +p74 +(dp75 +g14 +(lp76 +g16 +ag5 +asg4 +S'stringsAndCustomNumbers' +p77 +sg6 +g7 +sg8 +S'array' +p78 +sg2 +(lp79 +sg20 +g21 +sg40 +(lp80 +S'string' +p81 +aS'customNumber' +p82 +asbasg20 +g21 +sb. \ No newline at end of file diff --git a/test_data/test_types_superObject_scheme.p b/test_data/test_types_superObject_scheme.p new file mode 100644 index 0000000..7a52922 --- /dev/null +++ b/test_data/test_types_superObject_scheme.p @@ -0,0 +1,288 @@ +(dp0 +S'ROOT' +p1 +(dp2 +S'customNumber' +p3 +(iJSONScheme +JSONScheme +p4 +(dp5 +S'base_type_list' +p6 +(lp7 +sS'hasMinLength' +p8 +I01 +sS'minLength' +p9 +I1 +sS'type_name' +p10 +g3 +sS'projectPrefix' +p11 +S'S2M' +p12 +sS'base_type' +p13 +S'number' +p14 +sS'maxLength' +p15 +I10 +sS'objectSuffix' +p16 +S'JSONObject' +p17 +sS'hasMaxLength' +p18 +I01 +sbsS'superObject' +p19 +(iJSONScheme +JSONScheme +p20 +(dp21 +g6 +(lp22 +sg10 +g19 +sg11 +g12 +sg13 +S'object' +p23 +sS'props' +p24 +(lp25 +(iJSONScheme +JSONScheme +p26 +(dp27 +S'domain' +p28 +(lp29 +g1 +ag19 +asg10 +S'isBoolean' +p30 +sg11 +g12 +sg13 +S'boolean' +p31 +sg6 +(lp32 +sg16 +g17 +sba(iJSONScheme +JSONScheme +p33 +(dp34 +g28 +(lp35 +g1 +ag19 +asg10 +S'myData' +p36 +sg11 +g12 +sg13 +S'data' +p37 +sg6 +(lp38 +sg16 +g17 +sba(iJSONScheme +JSONScheme +p39 +(dp40 +g28 +(lp41 +g1 +ag19 +asg10 +S'creationDate' +p42 +sg11 +g12 +sg13 +S'date' +p43 +sg6 +(lp44 +sg16 +g17 +sba(iJSONScheme +JSONScheme +p45 +(dp46 +g28 +(lp47 +g1 +ag19 +asg10 +S'updateDate' +p48 +sg11 +g12 +sg13 +S'date' +p49 +sg6 +(lp50 +sg16 +g17 +sS'sub_type' +p51 +(lp52 +S'ms' +p53 +asba(iJSONScheme +JSONScheme +p54 +(dp55 +g28 +(lp56 +g1 +ag19 +asg10 +S'objectWithoutSubtypes' +p57 +sg11 +g12 +sg13 +S'array' +p58 +sg6 +(lp59 +sg16 +g17 +sba(iJSONScheme +JSONScheme +p60 +(dp61 +g28 +(lp62 +g1 +ag19 +asg10 +S'numbers' +p63 +sg11 +g12 +sg13 +S'array' +p64 +sg6 +(lp65 +sg16 +g17 +sg51 +(lp66 +S'number' +p67 +asba(iJSONScheme +JSONScheme +p68 +(dp69 +g28 +(lp70 +g1 +ag19 +asg10 +S'stringsAndDates' +p71 +sg11 +g12 +sg13 +S'array' +p72 +sg6 +(lp73 +sg16 +g17 +sg51 +(lp74 +S'string' +p75 +aS'date' +p76 +asba(iJSONScheme +JSONScheme +p77 +(dp78 +g28 +(lp79 +g1 +ag19 +asg10 +S'customNumbers' +p80 +sg11 +g12 +sg13 +S'array' +p81 +sg6 +(lp82 +sg16 +g17 +sg51 +(lp83 +S'customNumber' +p84 +asba(iJSONScheme +JSONScheme +p85 +(dp86 +g28 +(lp87 +g1 +ag19 +asg10 +S'stringsAndCustomNumbers' +p88 +sg11 +g12 +sg13 +S'array' +p89 +sg6 +(lp90 +sg16 +g17 +sg51 +(lp91 +S'string' +p92 +aS'customNumber' +p93 +asbasg16 +g17 +sbssS'ROOTsuperObject' +p94 +(dp95 +g30 +g26 +sg36 +g33 +sg88 +g85 +sg80 +g77 +sg63 +g60 +sg48 +g45 +sg71 +g68 +sg42 +g39 +sg57 +g54 +ss. \ No newline at end of file From c7405252abb41cae1c143241a73af3e859687e5e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Franc=CC=A7ois=20Benaiteau?= <francois.benaiteau@sinnerschrader-mobile.com> Date: Thu, 17 Apr 2014 17:10:50 +0200 Subject: [PATCH 054/149] rename test methods for subclass testcase --- ObjectiveCCodeGenerator_test.py | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/ObjectiveCCodeGenerator_test.py b/ObjectiveCCodeGenerator_test.py index 8a4ebe1..8020590 100644 --- a/ObjectiveCCodeGenerator_test.py +++ b/ObjectiveCCodeGenerator_test.py @@ -71,19 +71,19 @@ def setUp(self): self.test_file_path = self.default_folder + 'test_subclass' self.scheme_object = pickle.load(open(self.default_folder + '/test_subclass_motherClass.p', 'rb')) - def test_mother_human_header_content(self): + def test_human_header_content(self): result = self.gen.human_header_content(self.scheme_object) self.assert_content_file(self.test_file_path + "/MotherClassJSONObject.h", result) - def test_mother_human_source_content(self): + def test_human_source_content(self): result = self.gen.human_source_content(self.scheme_object) self.assert_content_file(self.test_file_path + "/MotherClassJSONObject.m", result) - def test_mother_machine_source_content(self): + def test_machine_source_content(self): result = self.gen.machine_source_content(self.scheme_object) self.assert_content_file(self.test_file_path + "/_MotherClassJSONObject.m", result) - def test_mother_machine_header_content(self): + def test_machine_header_content(self): result = self.gen.machine_header_content(self.scheme_object) self.assert_content_file(self.test_file_path + "/_MotherClassJSONObject.h", result) @@ -93,19 +93,19 @@ def setUp(self): self.test_file_path = self.default_folder + 'test_subclass' self.scheme_object = pickle.load(open(self.default_folder + '/test_subclass_subClass.p', 'rb')) - def test_subclass_human_header_content(self): + def test_human_header_content(self): result = self.gen.human_header_content(self.scheme_object) self.assert_content_file(self.test_file_path + "/SubClassJSONObject.h", result) - def test_subclass_human_source_content(self): + def test_human_source_content(self): result = self.gen.human_source_content(self.scheme_object) self.assert_content_file(self.test_file_path + "/SubClassJSONObject.m", result) - def test_subclass_machine_source_content(self): + def test_machine_source_content(self): result = self.gen.machine_source_content(self.scheme_object) self.assert_content_file(self.test_file_path + "/_SubClassJSONObject.m", result) - def test_subclass_machine_header_content(self): + def test_machine_header_content(self): result = self.gen.machine_header_content(self.scheme_object) self.assert_content_file(self.test_file_path + "/_SubClassJSONObject.h", result) From 3c89c9c3e864655f29a475112f92416579409600 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Franc=CC=A7ois=20Benaiteau?= <francois.benaiteau@sinnerschrader-mobile.com> Date: Thu, 17 Apr 2014 17:11:19 +0200 Subject: [PATCH 055/149] testcase for property types --- ObjectiveCCodeGenerator_test.py | 17 +++ samples/test_types.json | 5 - .../test_types/_S2MSuperObjectJSONObject.h | 1 - .../test_types/_S2MSuperObjectJSONObject.m | 15 --- ...perObject_scheme.p => test_types_scheme.p} | 116 +++++++----------- test_data/test_types_superObject.p | 94 ++++++-------- 6 files changed, 97 insertions(+), 151 deletions(-) rename test_data/{test_types_superObject_scheme.p => test_types_scheme.p} (87%) diff --git a/ObjectiveCCodeGenerator_test.py b/ObjectiveCCodeGenerator_test.py index 8020590..f18c81a 100644 --- a/ObjectiveCCodeGenerator_test.py +++ b/ObjectiveCCodeGenerator_test.py @@ -109,6 +109,23 @@ def test_machine_header_content(self): result = self.gen.machine_header_content(self.scheme_object) self.assert_content_file(self.test_file_path + "/_SubClassJSONObject.h", result) +class TestSampleTestTypesCase(TestObjectiveCCodeGenerator): + def setUp(self): + super(TestSampleTestTypesCase, self).setUp() + scheme = pickle.load(open(self.default_folder + '/test_types_scheme.p', 'rb')) + JSONScheme.JSONSchemeDic = scheme + + self.test_file_path = self.default_folder + 'test_types' + self.scheme_object = pickle.load(open(self.default_folder + '/test_types_superObject.p', 'rb')) + + def test_machine_header_content(self): + result = self.gen.machine_header_content(self.scheme_object) + self.assert_content_file(self.test_file_path + "/_S2MSuperObjectJSONObject.h", result) + + def test_machine_source_content(self): + result = self.gen.machine_source_content(self.scheme_object) + self.assert_content_file(self.test_file_path + "/_S2MSuperObjectJSONObject.m", result) + if __name__ == '__main__': unittest.main() diff --git a/samples/test_types.json b/samples/test_types.json index 6babd50..833edf0 100644 --- a/samples/test_types.json +++ b/samples/test_types.json @@ -21,11 +21,6 @@ "name": "creationDate", "base-type": "date" }, - { - "name": "updateDate", - "base-type": "date", - "subType": "ms" - }, { "name": "objectWithoutSubtypes", "base-type": "array" diff --git a/test_data/test_types/_S2MSuperObjectJSONObject.h b/test_data/test_types/_S2MSuperObjectJSONObject.h index d70573d..55f1b50 100644 --- a/test_data/test_types/_S2MSuperObjectJSONObject.h +++ b/test_data/test_types/_S2MSuperObjectJSONObject.h @@ -14,7 +14,6 @@ @property (nonatomic, assign) BOOL isBoolean; @property (nonatomic, strong) NSData *myData; @property (nonatomic, strong) NSDate *creationDate; -@property (nonatomic, strong) NSDate *updateDate; @property (nonatomic, strong) NSArray *objectWithoutSubtypes; @property (nonatomic, strong) NSArray *numbers; @property (nonatomic, strong) NSArray *stringsAndDates; diff --git a/test_data/test_types/_S2MSuperObjectJSONObject.m b/test_data/test_types/_S2MSuperObjectJSONObject.m index 6084598..37d5059 100644 --- a/test_data/test_types/_S2MSuperObjectJSONObject.m +++ b/test_data/test_types/_S2MSuperObjectJSONObject.m @@ -34,10 +34,6 @@ - (id)initWithDictionary:(NSDictionary *)dic withError:(NSError **)error { if (*error) { return self; } - self.updateDate = [S2MAPIParser dateWithMilliSecondsTimeIntervalFromResponseDictionary:dic forKey:@"updateDate" acceptNil:YES error:error]; - if (*error) { - return self; - } self.objectWithoutSubtypes = [S2MAPIParser arrayFromResponseDictionary:dic forKey:@"objectWithoutSubtypes" acceptNil:YES error:error]; if (*error) { return self; @@ -120,7 +116,6 @@ - (void)encodeWithCoder:(NSCoder*)coder { [coder encodeBool:self.isBoolean forKey:@"isBoolean"]; [coder encodeObject:self.myData forKey:@"myData"]; [coder encodeObject:self.creationDate forKey:@"creationDate"]; - [coder encodeObject:self.updateDate forKey:@"updateDate"]; [coder encodeObject:self.objectWithoutSubtypes forKey:@"objectWithoutSubtypes"]; [coder encodeObject:self.numbers forKey:@"numbers"]; [coder encodeObject:self.stringsAndDates forKey:@"stringsAndDates"]; @@ -132,7 +127,6 @@ - (id)initWithCoder:(NSCoder *)coder { self.isBoolean = [coder decodeBoolForKey:@"isBoolean"]; self.myData = [coder decodeObjectForKey:@"myData"]; self.creationDate = [coder decodeObjectForKey:@"creationDate"]; - self.updateDate = [coder decodeObjectForKey:@"updateDate"]; self.objectWithoutSubtypes = [coder decodeObjectForKey:@"objectWithoutSubtypes"]; self.numbers = [coder decodeObjectForKey:@"numbers"]; self.stringsAndDates = [coder decodeObjectForKey:@"stringsAndDates"]; @@ -153,15 +147,6 @@ - (NSDictionary *)propertyDictionary { if (self.creationDate) { [dic setObject:[NSNumber numberWithInteger:[[NSNumber numberWithDouble:[self.creationDate timeIntervalSince1970]] longValue]] forKey:@"creationDate"]; } - if (self.updateDate) { - NSNumber* number = @([self.updateDate timeIntervalSince1970] * 1000); - NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init]; - [formatter setNumberStyle:NSNumberFormatterNoStyle]; - [formatter setNegativeFormat:@"0"]; - NSString *value = [formatter stringFromNumber:number]; - NSNumber *convertedNumber = [formatter numberFromString:value]; - [dic setObject:convertedNumber forKey:@"updateDate"]; - } if (self.objectWithoutSubtypes) { [dic setObject:self.objectWithoutSubtypes forKey:@"objectWithoutSubtypes"]; } diff --git a/test_data/test_types_superObject_scheme.p b/test_data/test_types_scheme.p similarity index 87% rename from test_data/test_types_superObject_scheme.p rename to test_data/test_types_scheme.p index 7a52922..842a805 100644 --- a/test_data/test_types_superObject_scheme.p +++ b/test_data/test_types_scheme.p @@ -126,43 +126,43 @@ g28 g1 ag19 asg10 -S'updateDate' +S'objectWithoutSubtypes' p48 sg11 g12 sg13 -S'date' +S'array' p49 sg6 (lp50 sg16 g17 -sS'sub_type' -p51 -(lp52 -S'ms' -p53 -asba(iJSONScheme +sba(iJSONScheme JSONScheme -p54 -(dp55 +p51 +(dp52 g28 -(lp56 +(lp53 g1 ag19 asg10 -S'objectWithoutSubtypes' -p57 +S'numbers' +p54 sg11 g12 sg13 S'array' -p58 +p55 sg6 -(lp59 +(lp56 sg16 g17 -sba(iJSONScheme +sS'sub_type' +p57 +(lp58 +S'number' +p59 +asba(iJSONScheme JSONScheme p60 (dp61 @@ -171,7 +171,7 @@ g28 g1 ag19 asg10 -S'numbers' +S'stringsAndDates' p63 sg11 g12 @@ -182,35 +182,35 @@ sg6 (lp65 sg16 g17 -sg51 +sg57 (lp66 -S'number' +S'string' p67 +aS'date' +p68 asba(iJSONScheme JSONScheme -p68 -(dp69 +p69 +(dp70 g28 -(lp70 +(lp71 g1 ag19 asg10 -S'stringsAndDates' -p71 +S'customNumbers' +p72 sg11 g12 sg13 S'array' -p72 +p73 sg6 -(lp73 +(lp74 sg16 g17 -sg51 -(lp74 -S'string' -p75 -aS'date' +sg57 +(lp75 +S'customNumber' p76 asba(iJSONScheme JSONScheme @@ -221,7 +221,7 @@ g28 g1 ag19 asg10 -S'customNumbers' +S'stringsAndCustomNumbers' p80 sg11 g12 @@ -232,57 +232,31 @@ sg6 (lp82 sg16 g17 -sg51 +sg57 (lp83 -S'customNumber' -p84 -asba(iJSONScheme -JSONScheme -p85 -(dp86 -g28 -(lp87 -g1 -ag19 -asg10 -S'stringsAndCustomNumbers' -p88 -sg11 -g12 -sg13 -S'array' -p89 -sg6 -(lp90 -sg16 -g17 -sg51 -(lp91 S'string' -p92 +p84 aS'customNumber' -p93 +p85 asbasg16 g17 sbssS'ROOTsuperObject' -p94 -(dp95 +p86 +(dp87 g30 g26 +sg48 +g45 sg36 g33 -sg88 -g85 sg80 g77 -sg63 -g60 -sg48 -g45 -sg71 -g68 +sg72 +g69 +sg54 +g51 sg42 g39 -sg57 -g54 +sg63 +g60 ss. \ No newline at end of file diff --git a/test_data/test_types_superObject.p b/test_data/test_types_superObject.p index 194c9ca..12960a6 100644 --- a/test_data/test_types_superObject.p +++ b/test_data/test_types_superObject.p @@ -93,43 +93,43 @@ g14 g16 ag5 asg4 -S'updateDate' +S'objectWithoutSubtypes' p37 sg6 g7 sg8 -S'date' +S'array' p38 sg2 (lp39 sg20 g21 -sS'sub_type' -p40 -(lp41 -S'ms' -p42 -asba(iJSONScheme +sba(iJSONScheme JSONScheme -p43 -(dp44 +p40 +(dp41 g14 -(lp45 +(lp42 g16 ag5 asg4 -S'objectWithoutSubtypes' -p46 +S'numbers' +p43 sg6 g7 sg8 S'array' -p47 +p44 sg2 -(lp48 +(lp45 sg20 g21 -sba(iJSONScheme +sS'sub_type' +p46 +(lp47 +S'number' +p48 +asba(iJSONScheme JSONScheme p49 (dp50 @@ -138,7 +138,7 @@ g14 g16 ag5 asg4 -S'numbers' +S'stringsAndDates' p52 sg6 g7 @@ -149,35 +149,35 @@ sg2 (lp54 sg20 g21 -sg40 +sg46 (lp55 -S'number' +S'string' p56 +aS'date' +p57 asba(iJSONScheme JSONScheme -p57 -(dp58 +p58 +(dp59 g14 -(lp59 +(lp60 g16 ag5 asg4 -S'stringsAndDates' -p60 +S'customNumbers' +p61 sg6 g7 sg8 S'array' -p61 +p62 sg2 -(lp62 +(lp63 sg20 g21 -sg40 -(lp63 -S'string' -p64 -aS'date' +sg46 +(lp64 +S'customNumber' p65 asba(iJSONScheme JSONScheme @@ -188,7 +188,7 @@ g14 g16 ag5 asg4 -S'customNumbers' +S'stringsAndCustomNumbers' p69 sg6 g7 @@ -199,36 +199,12 @@ sg2 (lp71 sg20 g21 -sg40 +sg46 (lp72 -S'customNumber' -p73 -asba(iJSONScheme -JSONScheme -p74 -(dp75 -g14 -(lp76 -g16 -ag5 -asg4 -S'stringsAndCustomNumbers' -p77 -sg6 -g7 -sg8 -S'array' -p78 -sg2 -(lp79 -sg20 -g21 -sg40 -(lp80 S'string' -p81 +p73 aS'customNumber' -p82 +p74 asbasg20 g21 sb. \ No newline at end of file From 851508984a4a019a8357c1b5a453ead7d1be567f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Franc=CC=A7ois=20Benaiteau?= <francois.benaiteau@sinnerschrader-mobile.com> Date: Tue, 22 Apr 2014 14:45:31 +0200 Subject: [PATCH 056/149] Start handling array properties - generate methods if multiple Subtypes - handle custom subtypes and classes --- ObjectiveCCodeGenerator.py | 34 +++++++++++++++++-- templates/_header.h.mustache | 24 +++++++++---- .../test_types/_S2MSuperObjectJSONObject.h | 5 +-- 3 files changed, 50 insertions(+), 13 deletions(-) diff --git a/ObjectiveCCodeGenerator.py b/ObjectiveCCodeGenerator.py index d93e2a3..9531cf0 100755 --- a/ObjectiveCCodeGenerator.py +++ b/ObjectiveCCodeGenerator.py @@ -63,7 +63,9 @@ def makeVarName(self,schemeObj) : return returnName def process_properties(self, propObj) : - propertyHash = {'name' : propObj.type_name, 'varName' : self.makeVarName(propObj)} + capitalizeVarName = self.makeVarName(propObj) + capitalizeVarName = capitalizeVarName[:1].upper() + capitalizeVarName[1:] + propertyHash = {'name' : propObj.type_name, 'varName' : self.makeVarName(propObj), 'capitalizeVarName': capitalizeVarName} if propObj.type_description and len(propObj.type_description) : propertyHash["comment"] = propObj.type_description if propObj.required == 1: @@ -81,6 +83,19 @@ def process_properties(self, propObj) : if hasMin: propertyHash['minLength'] = {"value": minLength} + # dealing with array property + propertyHash['hasMultipleSubtypes'] = len(propObj.getSubType()) > 1 + for subtype in propObj.getSubType(): + key = 'hasCustomType' + if subtype in propObj.naturalTypeList: + key = 'has'+ subtype.capitalize() + 'Type' + else: + if propObj.getScheme(subtype).base_type in propObj.naturalTypeList: + key = 'has'+ propObj.getScheme(subtype).base_type.capitalize() + 'Type' + else: + propertyHash[key]["className"] = propObj.getScheme(subtype).getClassName() + propertyHash[key] = {"subtype": subtype} + return propertyHash def human_header_content(self, schemeObj) : @@ -122,20 +137,33 @@ def machine_file_content(self, schemeObj, template_file) : numberProps = [] stringProps = [] + booleanProps = [] + dataProps = [] + dateProps = [] + arrayProps = [] + for prop in schemeObj.props: if prop.rootBaseType() == "string": stringProps.append(self.process_properties(prop)) if prop.rootBaseType() == "number": numberProps.append(self.process_properties(prop)) + if prop.rootBaseType() == "boolean": + booleanProps.append(self.process_properties(prop)) + if prop.rootBaseType() == "data": + dataProps.append(self.process_properties(prop)) + if prop.rootBaseType() == "date": + dateProps.append(self.process_properties(prop)) + if prop.rootBaseType() == "array": + arrayProps.append(self.process_properties(prop)) - hashParams = {"date": str(today.year), "projectPrefix": schemeObj.projectPrefix,"machineClassName": schemeObj.getMachineClassName(), "humanClassName": schemeObj.getClassName(), "variableName": self.makeVarName(schemeObj), "stringProperties": stringProps, "numberProperties": numberProps} + hashParams = {"date": str(today.year), "projectPrefix": schemeObj.projectPrefix,"machineClassName": schemeObj.getMachineClassName(), "humanClassName": schemeObj.getClassName(), "variableName": self.makeVarName(schemeObj), "stringProperties": stringProps, "numberProperties": numberProps, "booleanProperties": booleanProps, "dataProperties": dataProps, "dateProperties": dateProps, "arrayProperties": arrayProps} if schemeObj.getScheme(schemeObj.base_type): hashParams['baseClassName'] = schemeObj.getScheme(schemeObj.base_type).getClassName() if schemeObj.base_type == 'object': hashParams['baseTypeIsObject'] = True - + # render sourceString = Renderer().render(template_file.read(), hashParams) return sourceString diff --git a/templates/_header.h.mustache b/templates/_header.h.mustache index 26d1d50..d31113b 100644 --- a/templates/_header.h.mustache +++ b/templates/_header.h.mustache @@ -48,12 +48,6 @@ {{/comment}} @property (nonatomic, strong) NSDate *{{varName}}; {{/dateProperties}} -{{#msDateProperties}} -{{#comment}} -//{{comment}} -{{/comment}} -@property (nonatomic, strong) NSDate *{{varName}}; -{{/msDateProperties}} {{#arrayProperties}} {{#comment}} //{{comment}} @@ -79,8 +73,26 @@ - (NSDictionary *)propertyDictionary; {{/baseTypeIsObject}} {{#arrayProperties}} +{{#hasMultipleSubtypes}} +{{#hasCustomType}} +{{#className}} +- ({{className}} *){{subtype}}In{{capitalizeVarName}}AtIndex:(NSUInteger)index withError:(NSError **)error; +{{/className}} +{{/hasCustomType}} +{{#hasNumberType}} +- (NSNumber *){{subtype}}In{{capitalizeVarName}}AtIndex:(NSUInteger)index withError:(NSError **)error; +{{/hasNumberType}} +{{#hasStringType}} +- (NSString *){{subtype}}In{{capitalizeVarName}}AtIndex:(NSUInteger)index withError:(NSError **)error; +{{/hasStringType}} +{{#hasDateType}} +- (NSDate *){{subtype}}In{{capitalizeVarName}}AtIndex:(NSUInteger)index withError:(NSError **)error; +{{/hasDateType}} +{{/hasMultipleSubtypes}} {{/arrayProperties}} {{#undefinedProperties}} {{/undefinedProperties}} +{{^arrayProperties}} +{{/arrayProperties}} @end diff --git a/test_data/test_types/_S2MSuperObjectJSONObject.h b/test_data/test_types/_S2MSuperObjectJSONObject.h index 55f1b50..7c6d20a 100644 --- a/test_data/test_types/_S2MSuperObjectJSONObject.h +++ b/test_data/test_types/_S2MSuperObjectJSONObject.h @@ -10,7 +10,6 @@ @interface _S2MSuperObjectJSONObject : NSObject <NSCoding> - @property (nonatomic, assign) BOOL isBoolean; @property (nonatomic, strong) NSData *myData; @property (nonatomic, strong) NSDate *creationDate; @@ -25,8 +24,6 @@ - (NSDictionary *)propertyDictionary; - (NSString *)stringInStringsAndDatesAtIndex:(NSUInteger)index withError:(NSError **)error; - (NSDate *)dateInStringsAndDatesAtIndex:(NSUInteger)index withError:(NSError **)error; -- (NSString *)stringInStringsAndCustomNumbersAtIndex:(NSUInteger)index withError:(NSError **)error; - (NSNumber *)customNumberInStringsAndCustomNumbersAtIndex:(NSUInteger)index withError:(NSError **)error; - +- (NSString *)stringInStringsAndCustomNumbersAtIndex:(NSUInteger)index withError:(NSError **)error; @end - From 24bb7194a491dfb15b18d9b0140b8310fc2ffb03 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Franc=CC=A7ois=20Benaiteau?= <francois.benaiteau@sinnerschrader-mobile.com> Date: Tue, 22 Apr 2014 16:33:43 +0200 Subject: [PATCH 057/149] Support date, boolean, data types in machine source file --- templates/_source.m.mustache | 29 +++++++++++++++++------------ 1 file changed, 17 insertions(+), 12 deletions(-) diff --git a/templates/_source.m.mustache b/templates/_source.m.mustache index 749cf9a..20412ce 100644 --- a/templates/_source.m.mustache +++ b/templates/_source.m.mustache @@ -77,13 +77,23 @@ {{/minLength}} {{/stringProperties}} {{#booleanProperties}} + self.{{varName}} = [{{projectPrefix}}APIParser boolFromResponseDictionary:dic forKey:@"{{name}}" acceptNil:{{#required}}NO{{/required}}{{^required}}YES{{/required}} error:error]; + if (*error) { + return self; + } {{/booleanProperties}} {{#dataProperties}} + self.{{varName}} = [{{projectPrefix}}APIParser dataFromResponseDictionary:dic forKey:@"{{name}}" acceptNil:{{#required}}NO{{/required}}{{^required}}YES{{/required}} error:error]; + if (*error) { + return self; + } {{/dataProperties}} {{#dateProperties}} + self.{{varName}} = [{{projectPrefix}}APIParser dateWithTimeIntervalFromResponseDictionary:dic forKey:@"{{name}}" acceptNil:{{#required}}NO{{/required}}{{^required}}YES{{/required}} error:error]; + if (*error) { + return self; + } {{/dateProperties}} - {{#msDateProperties}} - {{/msDateProperties}} {{#arrayProperties}} {{/arrayProperties}} {{#objectProperties}} @@ -192,20 +202,15 @@ } {{/booleanProperties}} {{#dataProperties}} + if (self.{{varName}}) { + [dic setObject:self.{{varName}} forKey:@"{{name}}"]; + } {{/dataProperties}} {{#dateProperties}} - {{/dateProperties}} - {{#msDateProperties}} if (self.{{varName}}) { - NSNumber* number = @([self.lastModificationTimestamp timeIntervalSince1970] * 1000); - NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init]; - [formatter setNumberStyle:NSNumberFormatterNoStyle]; - [formatter setNegativeFormat:@"0"]; - NSString *value = [formatter stringFromNumber:number]; - NSNumber *convertedNumber = [formatter numberFromString:value]; - [dic setObject:convertedNumber forKey:@"{{name}}"]; + [dic setObject:[NSNumber numberWithInteger:[[NSNumber numberWithDouble:[self.{{varName}} timeIntervalSince1970]] longValue]] forKey:@"{{name}}"]; } - {{/msDateProperties}} + {{/dateProperties}} {{#arrayProperties}} {{/arrayProperties}} {{#objectProperties}} From b6e1fdf97b04b4d12cb3dc6135d0ff9d6c5efba8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Franc=CC=A7ois=20Benaiteau?= <francois.benaiteau@sinnerschrader-mobile.com> Date: Tue, 22 Apr 2014 17:53:33 +0200 Subject: [PATCH 058/149] Support init method and getter for array property --- ObjectiveCCodeGenerator.py | 8 +- templates/_source.m.mustache | 78 +++++++++++++++++++ .../test_types/_S2MSuperObjectJSONObject.m | 44 +++++++---- 3 files changed, 115 insertions(+), 15 deletions(-) diff --git a/ObjectiveCCodeGenerator.py b/ObjectiveCCodeGenerator.py index 9531cf0..0968cab 100755 --- a/ObjectiveCCodeGenerator.py +++ b/ObjectiveCCodeGenerator.py @@ -84,7 +84,13 @@ def process_properties(self, propObj) : propertyHash['minLength'] = {"value": minLength} # dealing with array property - propertyHash['hasMultipleSubtypes'] = len(propObj.getSubType()) > 1 + if len(propObj.getSubType()) == 1: + propertyHash['hasOneSubtype'] = True + elif len(propObj.getSubType()) > 1: + propertyHash['hasMultipleSubtypes'] = True + else: + propertyHash['hasNoSubtypes'] = True + for subtype in propObj.getSubType(): key = 'hasCustomType' if subtype in propObj.naturalTypeList: diff --git a/templates/_source.m.mustache b/templates/_source.m.mustache index 20412ce..7781ff5 100644 --- a/templates/_source.m.mustache +++ b/templates/_source.m.mustache @@ -95,6 +95,37 @@ } {{/dateProperties}} {{#arrayProperties}} + {{^hasOneSubtype}} + self.{{varName}} = [{{projectPrefix}}APIParser arrayFromResponseDictionary:dic forKey:@"{{name}}" acceptNil:{{#required}}NO{{/required}}{{^required}}YES{{/required}} error:error]; + if (*error) { + return self; + } + {{/hasOneSubtype}} + {{#hasOneSubtype}} + NSArray *tmp{{capitalizeVarName}}Array = [{{projectPrefix}}APIParser arrayFromResponseDictionary:dic forKey:@"{{name}}" acceptNil:{{#required}}NO{{/required}}{{^required}}YES{{/required}} error:error]; + if (*error) { + return self; + } + NSMutableArray *tmp{{capitalizeVarName}} = [[NSMutableArray alloc] initWithCapacity:tmp{{capitalizeVarName}}Array.count]; + for (NSUInteger loop = 0; loop < tmp{{capitalizeVarName}}Array.count; loop++) { + {{#hasStringType}} + NSString *tmpValue = [{{projectPrefix}}APIParser stringFromResponseArray:tmp{{capitalizeVarName}}Array atIndex:loop acceptNil:{{#required}}NO{{/required}}{{^required}}YES{{/required}} error:error]; + {{/hasStringType}} + {{#hasNumberType}} + NSNumber *tmpValue = [{{projectPrefix}}APIParser numberFromResponseArray:tmp{{capitalizeVarName}}Array atIndex:loop acceptNil:{{#required}}NO{{/required}}{{^required}}YES{{/required}} error:error]; + {{/hasNumberType}} + {{#hasDateType}} + NSDate *tmpValue = [{{projectPrefix}}APIParser dateFromResponseArray:tmp{{capitalizeVarName}}Array atIndex:loop acceptNil:{{#required}}NO{{/required}}{{^required}}YES{{/required}} error:error]; + {{/hasDateType}} + if (*error) { + return self; + } + if (tmpValue) { + [tmp{{capitalizeVarName}} addObject:tmpValue]; + } + } + self.{{varName}} = [NSArray arrayWithArray:tmp{{capitalizeVarName}}]; + {{/hasOneSubtype}} {{/arrayProperties}} {{#objectProperties}} {{/objectProperties}} @@ -106,6 +137,50 @@ #pragma mark - getter {{#arrayProperties}} +{{#hasMultipleSubtypes}} +{{#hasCustomType}} +{{#className}} + +- ({{className}} *){{subtype}}In{{capitalizeVarName}}AtIndex:(NSUInteger)index withError:(NSError **)error +{ + +} +{{/className}} +{{/hasCustomType}} +{{#hasStringType}} + +- (NSString *){{subtype}}In{{capitalizeVarName}}AtIndex:(NSUInteger)index withError:(NSError **)error +{ + NSString *tmp{{capitalizeVarName}} = [{{projectPrefix}}APIParser stringFromResponseArray:self.{{varName}} atIndex:index acceptNil:{{#required}}NO{{/required}}{{^required}}YES{{/required}} error:error]; + if (*error) { + return nil; + } + return tmp{{capitalizeVarName}}; +} +{{/hasStringType}} +{{#hasNumberType}} + +- (NSNumber *){{subtype}}In{{capitalizeVarName}}AtIndex:(NSUInteger)index withError:(NSError **)error +{ + NSNumber *tmp{{capitalizeVarName}} = [{{projectPrefix}}APIParser numberFromResponseArray:self.{{varName}} atIndex:index acceptNil:{{#required}}NO{{/required}}{{^required}}YES{{/required}} error:error]; + if (*error) { + return nil; + } + return tmp{{capitalizeVarName}}; +} +{{/hasNumberType}} +{{#hasDateType}} + +- (NSDate *){{subtype}}In{{capitalizeVarName}}AtIndex:(NSUInteger)index withError:(NSError **)error +{ + NSDate *tmp{{capitalizeVarName}} = [{{projectPrefix}}APIParser dateWithTimeIntervalFromResponseArray:self.{{varName}} atIndex:index acceptNil:{{#required}}NO{{/required}}{{^required}}YES{{/required}} error:error]; + if (*error) { + return nil; + } + return tmp{{capitalizeVarName}}; +} +{{/hasDateType}} +{{/hasMultipleSubtypes}} {{/arrayProperties}} {{#undefinedProperties}} {{/undefinedProperties}} @@ -212,6 +287,9 @@ } {{/dateProperties}} {{#arrayProperties}} + if (self.{{varName}}) { + [dic setObject:self.{{varName}} forKey:@"{{name}}"]; + } {{/arrayProperties}} {{#objectProperties}} {{/objectProperties}} diff --git a/test_data/test_types/_S2MSuperObjectJSONObject.m b/test_data/test_types/_S2MSuperObjectJSONObject.m index 37d5059..0ecf2c9 100644 --- a/test_data/test_types/_S2MSuperObjectJSONObject.m +++ b/test_data/test_types/_S2MSuperObjectJSONObject.m @@ -13,13 +13,14 @@ @implementation _S2MSuperObjectJSONObject #pragma mark - factory -+ (S2MSuperObjectJSONObject *)superObjectWithDictionary:(NSDictionary *)dic withError:(NSError **)error { ++ (S2MSuperObjectJSONObject *)superObjectWithDictionary:(NSDictionary *)dic withError:(NSError **)error +{ return [[S2MSuperObjectJSONObject alloc] initWithDictionary:dic withError:error]; } - #pragma mark - initialize -- (id)initWithDictionary:(NSDictionary *)dic withError:(NSError **)error { +- (id)initWithDictionary:(NSDictionary *)dic withError:(NSError **)error +{ self = [super init]; if (self) { self.isBoolean = [S2MAPIParser boolFromResponseDictionary:dic forKey:@"isBoolean" acceptNil:YES error:error]; @@ -80,30 +81,37 @@ - (id)initWithDictionary:(NSDictionary *)dic withError:(NSError **)error { return self; } - #pragma mark - getter -- (NSString *)stringInStringsAndDatesAtIndex:(NSUInteger)index withError:(NSError **)error { + +- (NSString *)stringInStringsAndDatesAtIndex:(NSUInteger)index withError:(NSError **)error +{ NSString *tmpStringsAndDates = [S2MAPIParser stringFromResponseArray:self.stringsAndDates atIndex:index acceptNil:YES error:error]; if (*error) { return nil; } return tmpStringsAndDates; } -- (NSDate *)dateInStringsAndDatesAtIndex:(NSUInteger)index withError:(NSError **)error { + +- (NSDate *)dateInStringsAndDatesAtIndex:(NSUInteger)index withError:(NSError **)error +{ NSDate *tmpStringsAndDates = [S2MAPIParser dateWithTimeIntervalFromResponseArray:self.stringsAndDates atIndex:index acceptNil:YES error:error]; if (*error) { return nil; } return tmpStringsAndDates; } -- (NSString *)stringInStringsAndCustomNumbersAtIndex:(NSUInteger)index withError:(NSError **)error { + +- (NSString *)stringInStringsAndCustomNumbersAtIndex:(NSUInteger)index withError:(NSError **)error +{ NSString *tmpStringsAndCustomNumbers = [S2MAPIParser stringFromResponseArray:self.stringsAndCustomNumbers atIndex:index acceptNil:YES error:error]; if (*error) { return nil; } return tmpStringsAndCustomNumbers; } -- (NSNumber *)customNumberInStringsAndCustomNumbersAtIndex:(NSUInteger)index withError:(NSError **)error { + +- (NSNumber *)customNumberInStringsAndCustomNumbersAtIndex:(NSUInteger)index withError:(NSError **)error +{ NSNumber *tmpStringsAndCustomNumbers = [S2MAPIParser numberFromResponseArray:self.stringsAndCustomNumbers atIndex:index acceptNil:YES error:error]; if (*error) { return nil; @@ -112,7 +120,10 @@ - (NSNumber *)customNumberInStringsAndCustomNumbersAtIndex:(NSUInteger)index wit } #pragma mark - NSCoding -- (void)encodeWithCoder:(NSCoder*)coder { + +- (void)encodeWithCoder:(NSCoder*)coder +{ + [super encodeWithCoder:coder]; [coder encodeBool:self.isBoolean forKey:@"isBoolean"]; [coder encodeObject:self.myData forKey:@"myData"]; [coder encodeObject:self.creationDate forKey:@"creationDate"]; @@ -122,8 +133,10 @@ - (void)encodeWithCoder:(NSCoder*)coder { [coder encodeObject:self.customNumbers forKey:@"customNumbers"]; [coder encodeObject:self.stringsAndCustomNumbers forKey:@"stringsAndCustomNumbers"]; } -- (id)initWithCoder:(NSCoder *)coder { - self = [super init]; + +- (id)initWithCoder:(NSCoder *)coder +{ + self = [super initWithCoder:coder]; self.isBoolean = [coder decodeBoolForKey:@"isBoolean"]; self.myData = [coder decodeObjectForKey:@"myData"]; self.creationDate = [coder decodeObjectForKey:@"creationDate"]; @@ -136,7 +149,8 @@ - (id)initWithCoder:(NSCoder *)coder { } #pragma mark - Object Info -- (NSDictionary *)propertyDictionary { +- (NSDictionary *)propertyDictionary +{ NSMutableDictionary *dic = [[NSMutableDictionary alloc] init]; if (self.isBoolean) { [dic setObject:[NSNumber numberWithBool:self.isBoolean] forKey:@"isBoolean"]; @@ -168,8 +182,10 @@ - (NSDictionary *)propertyDictionary { } return dic; } -- (NSString *)description { - return [NSString stringWithFormat:@"%@",[self propertyDictionary]]; + +- (NSString *)description +{ + return [[self propertyDictionary] description]; } @end From 8f8f78eab5a53a7f308a8e94655f7644c2c4cd73 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Franc=CC=A7ois=20Benaiteau?= <francois.benaiteau@sinnerschrader-mobile.com> Date: Tue, 22 Apr 2014 18:02:36 +0200 Subject: [PATCH 059/149] don't need temporary array for known types --- templates/_source.m.mustache | 2 ++ test_data/test_types/_S2MSuperObjectJSONObject.m | 6 +----- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/templates/_source.m.mustache b/templates/_source.m.mustache index 7781ff5..6e61440 100644 --- a/templates/_source.m.mustache +++ b/templates/_source.m.mustache @@ -287,9 +287,11 @@ } {{/dateProperties}} {{#arrayProperties}} + {{^hasCustomType}} if (self.{{varName}}) { [dic setObject:self.{{varName}} forKey:@"{{name}}"]; } + {{/hasCustomType}} {{/arrayProperties}} {{#objectProperties}} {{/objectProperties}} diff --git a/test_data/test_types/_S2MSuperObjectJSONObject.m b/test_data/test_types/_S2MSuperObjectJSONObject.m index 0ecf2c9..b7afb23 100644 --- a/test_data/test_types/_S2MSuperObjectJSONObject.m +++ b/test_data/test_types/_S2MSuperObjectJSONObject.m @@ -171,11 +171,7 @@ - (NSDictionary *)propertyDictionary [dic setObject:self.stringsAndDates forKey:@"stringsAndDates"]; } if (self.customNumbers) { - NSMutableArray *tmpArray = [[NSMutableArray alloc] init]; - for (id tmpObj in self.customNumbers) { - [tmpArray addObject:tmpObj]; - } - [dic setObject:tmpArray forKey:@"customNumbers"]; + [dic setObject:self.customNumbers forKey:@"customNumbers"]; } if (self.stringsAndCustomNumbers) { [dic setObject:self.stringsAndCustomNumbers forKey:@"stringsAndCustomNumbers"]; From 83e7b805e9afad8e23d53586a6ee96d09916fdb1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Franc=CC=A7ois=20Benaiteau?= <francois.benaiteau@sinnerschrader-mobile.com> Date: Wed, 23 Apr 2014 09:41:33 +0200 Subject: [PATCH 060/149] add new test case at the readJSON level with product.json sample --- readJSON_test.py | 16 ++ .../_ProductDetailJSONObject.h | 44 +++ .../_ProductDetailJSONObject.m | 221 +++++++++++++++ .../_SenderGroupJSONObject.h | 43 +++ .../_SenderGroupJSONObject.m | 253 ++++++++++++++++++ .../_SenderJSONObject.h | 22 ++ .../_SenderJSONObject.m | 67 +++++ .../_SenderList2JSONObject.h | 23 ++ .../_SenderList2JSONObject.m | 60 +++++ .../_SenderListJSONObject.h | 26 ++ .../_SenderListJSONObject.m | 90 +++++++ test_data/product/ProductDetailJSONObject.h | 11 + test_data/product/ProductDetailJSONObject.m | 11 + test_data/product/SenderGroupJSONObject.h | 11 + test_data/product/SenderGroupJSONObject.m | 11 + test_data/product/SenderJSONObject.h | 11 + test_data/product/SenderJSONObject.m | 11 + test_data/product/SenderList2JSONObject.h | 11 + test_data/product/SenderList2JSONObject.m | 11 + test_data/product/SenderListJSONObject.h | 11 + test_data/product/SenderListJSONObject.m | 11 + 21 files changed, 975 insertions(+) create mode 100644 readJSON_test.py create mode 100644 test_data/product/AbstractInterfaceFiles/_ProductDetailJSONObject.h create mode 100644 test_data/product/AbstractInterfaceFiles/_ProductDetailJSONObject.m create mode 100644 test_data/product/AbstractInterfaceFiles/_SenderGroupJSONObject.h create mode 100644 test_data/product/AbstractInterfaceFiles/_SenderGroupJSONObject.m create mode 100644 test_data/product/AbstractInterfaceFiles/_SenderJSONObject.h create mode 100644 test_data/product/AbstractInterfaceFiles/_SenderJSONObject.m create mode 100644 test_data/product/AbstractInterfaceFiles/_SenderList2JSONObject.h create mode 100644 test_data/product/AbstractInterfaceFiles/_SenderList2JSONObject.m create mode 100644 test_data/product/AbstractInterfaceFiles/_SenderListJSONObject.h create mode 100644 test_data/product/AbstractInterfaceFiles/_SenderListJSONObject.m create mode 100644 test_data/product/ProductDetailJSONObject.h create mode 100644 test_data/product/ProductDetailJSONObject.m create mode 100644 test_data/product/SenderGroupJSONObject.h create mode 100644 test_data/product/SenderGroupJSONObject.m create mode 100644 test_data/product/SenderJSONObject.h create mode 100644 test_data/product/SenderJSONObject.m create mode 100644 test_data/product/SenderList2JSONObject.h create mode 100644 test_data/product/SenderList2JSONObject.m create mode 100644 test_data/product/SenderListJSONObject.h create mode 100644 test_data/product/SenderListJSONObject.m diff --git a/readJSON_test.py b/readJSON_test.py new file mode 100644 index 0000000..bcf679c --- /dev/null +++ b/readJSON_test.py @@ -0,0 +1,16 @@ +import unittest +import os + +class TestReadJSON(unittest.TestCase): + def setUp(self): + os.system("rm -rf src") + + def test_command(self): + exit_status = self.execute_script("samples/product.json", "test_data/product") + self.assertEqual(exit_status, 0) # no difference + + def execute_script(self, json_file, output_dir): + os.system("python readJSON.py -i " + json_file) + # ignoring template files + os.system("rm -rf src/Utilities") + return os.system("diff src/ " + test_data/product) diff --git a/test_data/product/AbstractInterfaceFiles/_ProductDetailJSONObject.h b/test_data/product/AbstractInterfaceFiles/_ProductDetailJSONObject.h new file mode 100644 index 0000000..01df3d4 --- /dev/null +++ b/test_data/product/AbstractInterfaceFiles/_ProductDetailJSONObject.h @@ -0,0 +1,44 @@ +// +// _ProductDetailJSONObject.h +// +// Created by MetaJSONParser. +// Copyright (c) 2014 SinnerSchrader Mobile. All rights reserved. + +#import <Foundation/Foundation.h> + +@class SenderGroupJSONObject; + +@class ProductDetailJSONObject; + +@interface _ProductDetailJSONObject : NSObject <NSCoding> + + +// the title of product +@property (nonatomic, strong) id title; +// the type of product +@property (nonatomic, strong) NSNumber *type; +// teaser image url of product +@property (nonatomic, strong) NSString *teaserURL; +// download speed (Mbit/s) +@property (nonatomic, strong) id download; +// upload speed (Mbit/s) +@property (nonatomic, strong) id upload; +// telephone Flatrate option string +@property (nonatomic, strong) NSString *telephoneFlatrate; +@property (nonatomic, strong) SenderGroupJSONObject *senderInfo; +@property (nonatomic, assign) BOOL includeHardware; +@property (nonatomic, strong) id anyProperty; +@property (nonatomic, strong) NSNumber *advantage; + ++ (ProductDetailJSONObject *)ProductDetailWithDictionary:(NSDictionary *)dic withError:(NSError **)error; +- (id)initWithDictionary:(NSDictionary *)dic withError:(NSError **)error; +- (NSDictionary *)propertyDictionary; +- (NSString *)titleAsTitleString:(NSError **)error; +- (NSString *)titleAsString:(NSError **)error; +- (NSNumber *)downloadAsNumber:(NSError **)error; +- (NSString *)downloadAsString:(NSError **)error; +- (NSNumber *)uploadAsNumber:(NSError **)error; +- (NSString *)uploadAsString:(NSError **)error; + +@end + diff --git a/test_data/product/AbstractInterfaceFiles/_ProductDetailJSONObject.m b/test_data/product/AbstractInterfaceFiles/_ProductDetailJSONObject.m new file mode 100644 index 0000000..ac3a495 --- /dev/null +++ b/test_data/product/AbstractInterfaceFiles/_ProductDetailJSONObject.m @@ -0,0 +1,221 @@ +// +// _ProductDetailJSONObject.m +// +// Created by MetaJSONParser. +// Copyright (c) 2014 SinnerSchrader Mobile. All rights reserved. + +#import "APIParser.h" +#import "NSString+RegExValidation.h" +#import "ProductDetailJSONObject.h" +#import "SenderGroupJSONObject.h" + + +@implementation _ProductDetailJSONObject + +#pragma mark - factory + ++ (ProductDetailJSONObject *)ProductDetailWithDictionary:(NSDictionary *)dic withError:(NSError **)error { + return [[ProductDetailJSONObject alloc] initWithDictionary:dic withError:error]; +} + + +#pragma mark - initialize +- (id)initWithDictionary:(NSDictionary *)dic withError:(NSError **)error { + self = [super init]; + if (self) { + self.title = [APIParser objectFromResponseDictionary:dic forKey:@"title" acceptNil:NO error:error]; + if (*error) { + return nil; + } + self.type = [APIParser numberFromResponseDictionary:dic forKey:@"type" acceptNil:NO error:error]; + if (*error) { + return self; + } + self.teaserURL = [APIParser stringFromResponseDictionary:dic forKey:@"teaserURL" acceptNumber:NO acceptNil:NO error:error]; + if (*error) { + return self; + } + self.download = [APIParser objectFromResponseDictionary:dic forKey:@"download" acceptNil:NO error:error]; + if (*error) { + return nil; + } + self.upload = [APIParser objectFromResponseDictionary:dic forKey:@"upload" acceptNil:NO error:error]; + if (*error) { + return nil; + } + self.telephoneFlatrate = [APIParser stringFromResponseDictionary:dic forKey:@"telephoneFlatrate" acceptNumber:NO acceptNil:YES error:error]; + if (*error) { + return self; + } + NSDictionary *tmpSenderInfo = [APIParser dictionaryFromResponseDictionary:dic forKey:@"senderInfo" acceptNil:YES error:error]; + if (*error) { + return self; + } + if (tmpSenderInfo) { + self.senderInfo= [[SenderGroupJSONObject alloc] initWithDictionary:tmpSenderInfo withError:error]; + if (*error) { + return self; + } + } + self.includeHardware = [APIParser boolFromResponseDictionary:dic forKey:@"includeHardware" acceptNil:NO error:error]; + if (*error) { + return self; + } + self.anyProperty = [APIParser objectFromResponseDictionary:dic forKey:@"anyProperty" acceptNil:NO error:error]; + if (*error) { + return nil; + } + self.advantage = [APIParser numberFromResponseDictionary:dic forKey:@"advantage" acceptNil:NO error:error]; + if (*error) { + return self; + } + } + return self; +} + + +#pragma mark - getter +- (NSString *)titleAsTitleString:(NSError **)error { + if (!self.title) return nil; + NSDictionary *newtitleDic = @{@"title" : self.title}; + NSString *tmpTitle = [APIParser stringFromResponseDictionary:newtitleDic forKey:@"title" acceptNumber:NO acceptNil:NO error:error]; + if (*error) { + return nil; + } + if (tmpTitle == nil) { + return nil; + } + if (tmpTitle.length > 20) { + NSDictionary *userInfo = [NSDictionary dictionaryWithObjectsAndKeys:@"titleString", @"propertyName", @"titleString", @"key", @"validation error", @"reason", NSStringFromClass([self class]), @"objectClass",nil]; + *error = [NSError errorWithDomain:kErrorDomain_parser code:kErrorDomain_parser_valueIsNotValid userInfo:userInfo]; + NSLog(@"%@", *error); + return nil; + } + if (tmpTitle.length < 10) { + NSDictionary *userInfo = [NSDictionary dictionaryWithObjectsAndKeys:@"titleString", @"propertyName", @"titleString", @"key", @"validation error", @"reason", NSStringFromClass([self class]), @"objectClass",nil]; + *error = [NSError errorWithDomain:kErrorDomain_parser code:kErrorDomain_parser_valueIsNotValid userInfo:userInfo]; + NSLog(@"%@", *error); + return nil; + } + if (tmpTitle && [tmpTitle matchesRegExString:@"[a-z0-9]:10"] == NO) { + NSDictionary *userInfo = [NSDictionary dictionaryWithObjectsAndKeys:@"titleString", @"propertyName", @"titleString", @"key", @"validation error", @"reason", NSStringFromClass([self class]), @"objectClass",nil]; + *error = [NSError errorWithDomain:kErrorDomain_parser code:kErrorDomain_parser_valueIsNotValid userInfo:userInfo]; + NSLog(@"%@", *error); + return nil; + } + return tmpTitle; +} +- (NSString *)titleAsString:(NSError **)error { + if (!self.title) return nil; + NSDictionary *newtitleDic = @{@"title" : self.title}; + NSString *tmpTitle = [APIParser stringFromResponseDictionary:newtitleDic forKey:@"title" acceptNumber:NO acceptNil:NO error:error]; + if (*error) { + return nil; + } + return tmpTitle; +} +- (NSNumber *)downloadAsNumber:(NSError **)error { + if (!self.download) return nil; + NSDictionary *newdownloadDic = @{@"download" : self.download}; + NSNumber *tmpDownload = [APIParser numberFromResponseDictionary:newdownloadDic forKey:@"download" acceptNil:NO error:error]; + if (*error) { + return nil; + } + return tmpDownload; +} +- (NSString *)downloadAsString:(NSError **)error { + if (!self.download) return nil; + NSDictionary *newdownloadDic = @{@"download" : self.download}; + NSString *tmpDownload = [APIParser stringFromResponseDictionary:newdownloadDic forKey:@"download" acceptNumber:NO acceptNil:NO error:error]; + if (*error) { + return nil; + } + return tmpDownload; +} +- (NSNumber *)uploadAsNumber:(NSError **)error { + if (!self.upload) return nil; + NSDictionary *newuploadDic = @{@"upload" : self.upload}; + NSNumber *tmpUpload = [APIParser numberFromResponseDictionary:newuploadDic forKey:@"upload" acceptNil:NO error:error]; + if (*error) { + return nil; + } + return tmpUpload; +} +- (NSString *)uploadAsString:(NSError **)error { + if (!self.upload) return nil; + NSDictionary *newuploadDic = @{@"upload" : self.upload}; + NSString *tmpUpload = [APIParser stringFromResponseDictionary:newuploadDic forKey:@"upload" acceptNumber:NO acceptNil:NO error:error]; + if (*error) { + return nil; + } + return tmpUpload; +} + +#pragma mark - NSCoding +- (void)encodeWithCoder:(NSCoder*)coder { + [coder encodeObject:self.title forKey:@"title"]; + [coder encodeObject:self.type forKey:@"type"]; + [coder encodeObject:self.teaserURL forKey:@"teaserURL"]; + [coder encodeObject:self.download forKey:@"download"]; + [coder encodeObject:self.upload forKey:@"upload"]; + [coder encodeObject:self.telephoneFlatrate forKey:@"telephoneFlatrate"]; + [coder encodeObject:self.senderInfo forKey:@"senderInfo"]; + [coder encodeBool:self.includeHardware forKey:@"includeHardware"]; + [coder encodeObject:self.anyProperty forKey:@"anyProperty"]; + [coder encodeObject:self.advantage forKey:@"advantage"]; +} +- (id)initWithCoder:(NSCoder *)coder { + self = [super init]; + self.title = [coder decodeObjectForKey:@"title"]; + self.type = [coder decodeObjectForKey:@"type"]; + self.teaserURL = [coder decodeObjectForKey:@"teaserURL"]; + self.download = [coder decodeObjectForKey:@"download"]; + self.upload = [coder decodeObjectForKey:@"upload"]; + self.telephoneFlatrate = [coder decodeObjectForKey:@"telephoneFlatrate"]; + self.senderInfo = [coder decodeObjectForKey:@"senderInfo"]; + self.includeHardware = [coder decodeBoolForKey:@"includeHardware"]; + self.anyProperty = [coder decodeObjectForKey:@"anyProperty"]; + self.advantage = [coder decodeObjectForKey:@"advantage"]; + return self; +} + +#pragma mark - Object Info +- (NSDictionary *)propertyDictionary { + NSMutableDictionary *dic = [[NSMutableDictionary alloc] init]; + if (self.title) { + [dic setObject:self.title forKey:@"title"]; + } + if (self.type) { + [dic setObject:self.type forKey:@"type"]; + } + if (self.teaserURL) { + [dic setObject:self.teaserURL forKey:@"teaserURL"]; + } + if (self.download) { + [dic setObject:self.download forKey:@"download"]; + } + if (self.upload) { + [dic setObject:self.upload forKey:@"upload"]; + } + if (self.telephoneFlatrate) { + [dic setObject:self.telephoneFlatrate forKey:@"telephoneFlatrate"]; + } + if (self.senderInfo) { + [dic setObject:[self.senderInfo propertyDictionary] forKey:@"senderInfo"]; + } + if (self.includeHardware) { + [dic setObject:[NSNumber numberWithBool:self.includeHardware] forKey:@"includeHardware"]; + } + if (self.anyProperty) { + [dic setObject:self.anyProperty forKey:@"anyProperty"]; + } + if (self.advantage) { + [dic setObject:self.advantage forKey:@"advantage"]; + } + return dic; +} +- (NSString *)description { + return [NSString stringWithFormat:@"%@",[self propertyDictionary]]; +} + +@end diff --git a/test_data/product/AbstractInterfaceFiles/_SenderGroupJSONObject.h b/test_data/product/AbstractInterfaceFiles/_SenderGroupJSONObject.h new file mode 100644 index 0000000..92b4f8a --- /dev/null +++ b/test_data/product/AbstractInterfaceFiles/_SenderGroupJSONObject.h @@ -0,0 +1,43 @@ +// +// _SenderGroupJSONObject.h +// +// Created by MetaJSONParser. +// Copyright (c) 2014 SinnerSchrader Mobile. All rights reserved. + +#import <Foundation/Foundation.h> + +@class SenderList2JSONObject; +@class SenderListJSONObject; + +@class SenderGroupJSONObject; + +@interface _SenderGroupJSONObject : NSObject <NSCoding> + + +// the array of sender list +@property (nonatomic, strong) NSArray *digitalSenders; +// the array of sender list +@property (nonatomic, strong) NSArray *HDOptions; +// the array of sender list +@property (nonatomic, strong) NSArray *DTVHighlights; +// the array of sender list +@property (nonatomic, strong) NSArray *IPTVSenders; + ++ (SenderGroupJSONObject *)senderGroupWithDictionary:(NSDictionary *)dic withError:(NSError **)error; +- (id)initWithDictionary:(NSDictionary *)dic withError:(NSError **)error; +- (NSDictionary *)propertyDictionary; +- (SenderListJSONObject *)senderListInDigitalSendersAtIndex:(NSUInteger)index withError:(NSError **)error; +- (SenderList2JSONObject *)senderList2InDigitalSendersAtIndex:(NSUInteger)index withError:(NSError **)error; +- (NSNumber *)numberInDigitalSendersAtIndex:(NSUInteger)index withError:(NSError **)error; +- (NSString *)stringInDigitalSendersAtIndex:(NSUInteger)index withError:(NSError **)error; +- (BOOL )booleanInDigitalSendersAtIndex:(NSUInteger)index withError:(NSError **)error; +- (NSDate *)dateInDigitalSendersAtIndex:(NSUInteger)index withError:(NSError **)error; +- (NSData *)dataInDigitalSendersAtIndex:(NSUInteger)index withError:(NSError **)error; +- (SenderListJSONObject *)senderListInHDOptionsAtIndex:(NSUInteger)index withError:(NSError **)error; +- (SenderList2JSONObject *)senderList2InHDOptionsAtIndex:(NSUInteger)index withError:(NSError **)error; +- (NSString *)stringInDTVHighlightsAtIndex:(NSUInteger)index withError:(NSError **)error; +- (NSString *)titleStringInDTVHighlightsAtIndex:(NSUInteger)index withError:(NSError **)error; +- (id)objectInIPTVSendersAtIndex:(NSUInteger)index withError:(NSError **)error; + +@end + diff --git a/test_data/product/AbstractInterfaceFiles/_SenderGroupJSONObject.m b/test_data/product/AbstractInterfaceFiles/_SenderGroupJSONObject.m new file mode 100644 index 0000000..0fedd9c --- /dev/null +++ b/test_data/product/AbstractInterfaceFiles/_SenderGroupJSONObject.m @@ -0,0 +1,253 @@ +// +// _SenderGroupJSONObject.m +// +// Created by MetaJSONParser. +// Copyright (c) 2014 SinnerSchrader Mobile. All rights reserved. + +#import "APIParser.h" +#import "NSString+RegExValidation.h" +#import "SenderGroupJSONObject.h" +#import "SenderList2JSONObject.h" +#import "SenderListJSONObject.h" + + +@implementation _SenderGroupJSONObject + +#pragma mark - factory + ++ (SenderGroupJSONObject *)senderGroupWithDictionary:(NSDictionary *)dic withError:(NSError **)error { + return [[SenderGroupJSONObject alloc] initWithDictionary:dic withError:error]; +} + + +#pragma mark - initialize +- (id)initWithDictionary:(NSDictionary *)dic withError:(NSError **)error { + self = [super init]; + if (self) { + self.digitalSenders = [APIParser arrayFromResponseDictionary:dic forKey:@"digitalSenders" acceptNil:YES error:error]; + if (*error) { + return self; + } + self.HDOptions = [APIParser arrayFromResponseDictionary:dic forKey:@"HDOptions" acceptNil:YES error:error]; + if (*error) { + return self; + } + self.DTVHighlights = [APIParser arrayFromResponseDictionary:dic forKey:@"DTVHighlights" acceptNil:YES error:error]; + if (*error) { + return self; + } + if (self.DTVHighlights.count > 6) { + NSDictionary *userInfo = [NSDictionary dictionaryWithObjectsAndKeys:@"DTVHighlights", @"propertyName", @"DTVHighlights", @"key", @"validation error", @"reason", NSStringFromClass([self class]), @"objectClass",nil]; + *error = [NSError errorWithDomain:kErrorDomain_parser code:kErrorDomain_parser_valueIsNotValid userInfo:userInfo]; + NSLog(@"%@", *error); + return self; + } + if (self.DTVHighlights.count < 2) { + NSDictionary *userInfo = [NSDictionary dictionaryWithObjectsAndKeys:@"DTVHighlights", @"propertyName", @"DTVHighlights", @"key", @"validation error", @"reason", NSStringFromClass([self class]), @"objectClass",nil]; + *error = [NSError errorWithDomain:kErrorDomain_parser code:kErrorDomain_parser_valueIsNotValid userInfo:userInfo]; + NSLog(@"%@", *error); + return self; + } + self.IPTVSenders = [APIParser arrayFromResponseDictionary:dic forKey:@"IPTVSenders" acceptNil:YES error:error]; + if (*error) { + return self; + } + if (self.IPTVSenders.count > 6) { + NSDictionary *userInfo = [NSDictionary dictionaryWithObjectsAndKeys:@"IPTVSenders", @"propertyName", @"IPTVSenders", @"key", @"validation error", @"reason", NSStringFromClass([self class]), @"objectClass",nil]; + *error = [NSError errorWithDomain:kErrorDomain_parser code:kErrorDomain_parser_valueIsNotValid userInfo:userInfo]; + NSLog(@"%@", *error); + return self; + } + if (self.IPTVSenders.count < 2) { + NSDictionary *userInfo = [NSDictionary dictionaryWithObjectsAndKeys:@"IPTVSenders", @"propertyName", @"IPTVSenders", @"key", @"validation error", @"reason", NSStringFromClass([self class]), @"objectClass",nil]; + *error = [NSError errorWithDomain:kErrorDomain_parser code:kErrorDomain_parser_valueIsNotValid userInfo:userInfo]; + NSLog(@"%@", *error); + return self; + } + } + return self; +} + + +#pragma mark - getter +- (SenderListJSONObject *)senderListInDigitalSendersAtIndex:(NSUInteger)index withError:(NSError **)error { + NSDictionary *tmpDigitalSendersDic = [APIParser dictionaryFromResponseArray:self.digitalSenders atIndex:index acceptNil:YES error:error]; + if (*error) { + return nil; + } + SenderListJSONObject *tmpDigitalSenders = nil; + if (tmpDigitalSendersDic == nil) { + return nil; + } + if (tmpDigitalSendersDic) { + tmpDigitalSenders= [[SenderListJSONObject alloc] initWithDictionary:tmpDigitalSendersDic withError:error]; + if (*error) { + return nil; + } + } + return tmpDigitalSenders; +} +- (SenderList2JSONObject *)senderList2InDigitalSendersAtIndex:(NSUInteger)index withError:(NSError **)error { + NSDictionary *tmpDigitalSendersDic = [APIParser dictionaryFromResponseArray:self.digitalSenders atIndex:index acceptNil:YES error:error]; + if (*error) { + return nil; + } + SenderList2JSONObject *tmpDigitalSenders = nil; + if (tmpDigitalSendersDic == nil) { + return nil; + } + if (tmpDigitalSendersDic) { + tmpDigitalSenders= [[SenderList2JSONObject alloc] initWithDictionary:tmpDigitalSendersDic withError:error]; + if (*error) { + return nil; + } + } + return tmpDigitalSenders; +} +- (NSNumber *)numberInDigitalSendersAtIndex:(NSUInteger)index withError:(NSError **)error { + NSNumber *tmpDigitalSenders = [APIParser numberFromResponseArray:self.digitalSenders atIndex:index acceptNil:YES error:error]; + if (*error) { + return nil; + } + return tmpDigitalSenders; +} +- (NSString *)stringInDigitalSendersAtIndex:(NSUInteger)index withError:(NSError **)error { + NSString *tmpDigitalSenders = [APIParser stringFromResponseArray:self.digitalSenders atIndex:index acceptNil:YES error:error]; + if (*error) { + return nil; + } + return tmpDigitalSenders; +} +- (BOOL )booleanInDigitalSendersAtIndex:(NSUInteger)index withError:(NSError **)error { + BOOL tmpDigitalSenders = [APIParser boolFromResponseArray:self.digitalSenders atIndex:index acceptNil:YES error:error]; + if (*error) { + return nil; + } + return tmpDigitalSenders; +} +- (NSDate *)dateInDigitalSendersAtIndex:(NSUInteger)index withError:(NSError **)error { + NSDate *tmpDigitalSenders = [APIParser dateWithTimeIntervalFromResponseArray:self.digitalSenders atIndex:index acceptNil:YES error:error]; + if (*error) { + return nil; + } + return tmpDigitalSenders; +} +- (NSData *)dataInDigitalSendersAtIndex:(NSUInteger)index withError:(NSError **)error { + NSData *tmpDigitalSenders = [APIParser dataFromResponseArray:self.digitalSenders atIndex:index acceptNil:YES error:error]; + if (*error) { + return nil; + } + return tmpDigitalSenders; +} +- (SenderListJSONObject *)senderListInHDOptionsAtIndex:(NSUInteger)index withError:(NSError **)error { + NSDictionary *tmpHDOptionsDic = [APIParser dictionaryFromResponseArray:self.HDOptions atIndex:index acceptNil:YES error:error]; + if (*error) { + return nil; + } + SenderListJSONObject *tmpHDOptions = nil; + if (tmpHDOptionsDic == nil) { + return nil; + } + if (tmpHDOptionsDic) { + tmpHDOptions= [[SenderListJSONObject alloc] initWithDictionary:tmpHDOptionsDic withError:error]; + if (*error) { + return nil; + } + } + return tmpHDOptions; +} +- (SenderList2JSONObject *)senderList2InHDOptionsAtIndex:(NSUInteger)index withError:(NSError **)error { + NSDictionary *tmpHDOptionsDic = [APIParser dictionaryFromResponseArray:self.HDOptions atIndex:index acceptNil:YES error:error]; + if (*error) { + return nil; + } + SenderList2JSONObject *tmpHDOptions = nil; + if (tmpHDOptionsDic == nil) { + return nil; + } + if (tmpHDOptionsDic) { + tmpHDOptions= [[SenderList2JSONObject alloc] initWithDictionary:tmpHDOptionsDic withError:error]; + if (*error) { + return nil; + } + } + return tmpHDOptions; +} +- (NSString *)stringInDTVHighlightsAtIndex:(NSUInteger)index withError:(NSError **)error { + NSString *tmpDTVHighlights = [APIParser stringFromResponseArray:self.DTVHighlights atIndex:index acceptNil:YES error:error]; + if (*error) { + return nil; + } + return tmpDTVHighlights; +} +- (NSString *)titleStringInDTVHighlightsAtIndex:(NSUInteger)index withError:(NSError **)error { + NSString *tmpDTVHighlights = [APIParser stringFromResponseArray:self.DTVHighlights atIndex:index acceptNil:YES error:error]; + if (*error) { + return nil; + } + if (tmpDTVHighlights.length > 20) { + NSDictionary *userInfo = [NSDictionary dictionaryWithObjectsAndKeys:@"titleString", @"propertyName", @"titleString", @"key", @"validation error", @"reason", NSStringFromClass([self class]), @"objectClass",nil]; + *error = [NSError errorWithDomain:kErrorDomain_parser code:kErrorDomain_parser_valueIsNotValid userInfo:userInfo]; + NSLog(@"%@", *error); + return nil; + } + if (tmpDTVHighlights.length < 10) { + NSDictionary *userInfo = [NSDictionary dictionaryWithObjectsAndKeys:@"titleString", @"propertyName", @"titleString", @"key", @"validation error", @"reason", NSStringFromClass([self class]), @"objectClass",nil]; + *error = [NSError errorWithDomain:kErrorDomain_parser code:kErrorDomain_parser_valueIsNotValid userInfo:userInfo]; + NSLog(@"%@", *error); + return nil; + } + if (tmpDTVHighlights && [tmpDTVHighlights matchesRegExString:@"[a-z0-9]:10"] == NO) { + NSDictionary *userInfo = [NSDictionary dictionaryWithObjectsAndKeys:@"titleString", @"propertyName", @"titleString", @"key", @"validation error", @"reason", NSStringFromClass([self class]), @"objectClass",nil]; + *error = [NSError errorWithDomain:kErrorDomain_parser code:kErrorDomain_parser_valueIsNotValid userInfo:userInfo]; + NSLog(@"%@", *error); + return nil; + } + return tmpDTVHighlights; +} +- (id)objectInIPTVSendersAtIndex:(NSUInteger)index withError:(NSError **)error { + id tmpIPTVSenders = [APIParser objectFromResponseArray:self.IPTVSenders atIndex:index acceptNil:YES error:error]; + if (*error) { + return nil; + } + return tmpIPTVSenders; +} + +#pragma mark - NSCoding +- (void)encodeWithCoder:(NSCoder*)coder { + [coder encodeObject:self.digitalSenders forKey:@"digitalSenders"]; + [coder encodeObject:self.HDOptions forKey:@"HDOptions"]; + [coder encodeObject:self.DTVHighlights forKey:@"DTVHighlights"]; + [coder encodeObject:self.IPTVSenders forKey:@"IPTVSenders"]; +} +- (id)initWithCoder:(NSCoder *)coder { + self = [super init]; + self.digitalSenders = [coder decodeObjectForKey:@"digitalSenders"]; + self.HDOptions = [coder decodeObjectForKey:@"HDOptions"]; + self.DTVHighlights = [coder decodeObjectForKey:@"DTVHighlights"]; + self.IPTVSenders = [coder decodeObjectForKey:@"IPTVSenders"]; + return self; +} + +#pragma mark - Object Info +- (NSDictionary *)propertyDictionary { + NSMutableDictionary *dic = [[NSMutableDictionary alloc] init]; + if (self.digitalSenders) { + [dic setObject:self.digitalSenders forKey:@"digitalSenders"]; + } + if (self.HDOptions) { + [dic setObject:self.HDOptions forKey:@"HDOptions"]; + } + if (self.DTVHighlights) { + [dic setObject:self.DTVHighlights forKey:@"DTVHighlights"]; + } + if (self.IPTVSenders) { + [dic setObject:self.IPTVSenders forKey:@"IPTVSenders"]; + } + return dic; +} +- (NSString *)description { + return [NSString stringWithFormat:@"%@",[self propertyDictionary]]; +} + +@end diff --git a/test_data/product/AbstractInterfaceFiles/_SenderJSONObject.h b/test_data/product/AbstractInterfaceFiles/_SenderJSONObject.h new file mode 100644 index 0000000..1057748 --- /dev/null +++ b/test_data/product/AbstractInterfaceFiles/_SenderJSONObject.h @@ -0,0 +1,22 @@ +// +// _SenderJSONObject.h +// +// Created by MetaJSONParser. +// Copyright (c) 2014 SinnerSchrader Mobile. All rights reserved. + +#import <Foundation/Foundation.h> + +@class SenderJSONObject; + +@interface _SenderJSONObject : NSObject <NSCoding> + + +@property (nonatomic, strong) NSString *senderName; +@property (nonatomic, strong) NSString *previewImageURL; + ++ (SenderJSONObject *)senderWithDictionary:(NSDictionary *)dic withError:(NSError **)error; +- (id)initWithDictionary:(NSDictionary *)dic withError:(NSError **)error; +- (NSDictionary *)propertyDictionary; + +@end + diff --git a/test_data/product/AbstractInterfaceFiles/_SenderJSONObject.m b/test_data/product/AbstractInterfaceFiles/_SenderJSONObject.m new file mode 100644 index 0000000..fa1e0b7 --- /dev/null +++ b/test_data/product/AbstractInterfaceFiles/_SenderJSONObject.m @@ -0,0 +1,67 @@ +// +// _SenderJSONObject.m +// +// Created by MetaJSONParser. +// Copyright (c) 2014 SinnerSchrader Mobile. All rights reserved. + +#import "APIParser.h" +#import "NSString+RegExValidation.h" +#import "SenderJSONObject.h" + + +@implementation _SenderJSONObject + +#pragma mark - factory + ++ (SenderJSONObject *)senderWithDictionary:(NSDictionary *)dic withError:(NSError **)error { + return [[SenderJSONObject alloc] initWithDictionary:dic withError:error]; +} + + +#pragma mark - initialize +- (id)initWithDictionary:(NSDictionary *)dic withError:(NSError **)error { + self = [super init]; + if (self) { + self.senderName = [APIParser stringFromResponseDictionary:dic forKey:@"senderName" acceptNumber:NO acceptNil:NO error:error]; + if (*error) { + return self; + } + self.previewImageURL = [APIParser stringFromResponseDictionary:dic forKey:@"previewImageURL" acceptNumber:NO acceptNil:NO error:error]; + if (*error) { + return self; + } + } + return self; +} + + +#pragma mark - getter + +#pragma mark - NSCoding +- (void)encodeWithCoder:(NSCoder*)coder { + [coder encodeObject:self.senderName forKey:@"senderName"]; + [coder encodeObject:self.previewImageURL forKey:@"previewImageURL"]; +} +- (id)initWithCoder:(NSCoder *)coder { + self = [super init]; + self.senderName = [coder decodeObjectForKey:@"senderName"]; + self.previewImageURL = [coder decodeObjectForKey:@"previewImageURL"]; + return self; +} + +#pragma mark - Object Info +- (NSDictionary *)propertyDictionary { + NSMutableDictionary *dic = [[NSMutableDictionary alloc] init]; + if (self.senderName) { + [dic setObject:self.senderName forKey:@"senderName"]; + } + if (self.previewImageURL) { + [dic setObject:self.previewImageURL forKey:@"previewImageURL"]; + } + return dic; +} +- (NSString *)description { + return [NSString stringWithFormat:@"%@",[self propertyDictionary]]; +} + +@end diff --git a/test_data/product/AbstractInterfaceFiles/_SenderList2JSONObject.h b/test_data/product/AbstractInterfaceFiles/_SenderList2JSONObject.h new file mode 100644 index 0000000..f7eadfc --- /dev/null +++ b/test_data/product/AbstractInterfaceFiles/_SenderList2JSONObject.h @@ -0,0 +1,23 @@ +// +// _SenderList2JSONObject.h +// +// Created by MetaJSONParser. +// Copyright (c) 2014 SinnerSchrader Mobile. All rights reserved. + +#import <Foundation/Foundation.h> +#import "SenderListJSONObject.h" + +@class SenderList2JSONObject; + +@interface _SenderList2JSONObject : SenderListJSONObject + + +// the title of sender list +@property (nonatomic, strong) NSString *listSubTitle; + ++ (SenderList2JSONObject *)senderList2WithDictionary:(NSDictionary *)dic withError:(NSError **)error; +- (id)initWithDictionary:(NSDictionary *)dic withError:(NSError **)error; +- (NSDictionary *)propertyDictionary; + +@end + diff --git a/test_data/product/AbstractInterfaceFiles/_SenderList2JSONObject.m b/test_data/product/AbstractInterfaceFiles/_SenderList2JSONObject.m new file mode 100644 index 0000000..7a9561e --- /dev/null +++ b/test_data/product/AbstractInterfaceFiles/_SenderList2JSONObject.m @@ -0,0 +1,60 @@ +// +// _SenderList2JSONObject.m +// +// Created by MetaJSONParser. +// Copyright (c) 2014 SinnerSchrader Mobile. All rights reserved. + +#import "APIParser.h" +#import "NSString+RegExValidation.h" +#import "SenderList2JSONObject.h" + + +@implementation _SenderList2JSONObject + +#pragma mark - factory + ++ (SenderList2JSONObject *)senderList2WithDictionary:(NSDictionary *)dic withError:(NSError **)error { + return [[SenderList2JSONObject alloc] initWithDictionary:dic withError:error]; +} + + +#pragma mark - initialize +- (id)initWithDictionary:(NSDictionary *)dic withError:(NSError **)error { + self = [super initWithDictionary:dic withError:error]; + if (self) { + self.listSubTitle = [APIParser stringFromResponseDictionary:dic forKey:@"listSubTitle" acceptNumber:NO acceptNil:NO error:error]; + if (*error) { + return self; + } + } + return self; +} + + +#pragma mark - getter + +#pragma mark - NSCoding +- (void)encodeWithCoder:(NSCoder*)coder { + [super encodeWithCoder:coder]; + [coder encodeObject:self.listSubTitle forKey:@"listSubTitle"]; +} +- (id)initWithCoder:(NSCoder *)coder { + self = [super initWithCoder:coder]; + self.listSubTitle = [coder decodeObjectForKey:@"listSubTitle"]; + return self; +} + +#pragma mark - Object Info +- (NSDictionary *)propertyDictionary { + NSDictionary *parentDic = [super propertyDictionary]; + NSMutableDictionary *dic = [[NSMutableDictionary alloc] initWithDictionary:parentDic]; + if (self.listSubTitle) { + [dic setObject:self.listSubTitle forKey:@"listSubTitle"]; + } + return dic; +} +- (NSString *)description { + return [NSString stringWithFormat:@"%@",[self propertyDictionary]]; +} + +@end diff --git a/test_data/product/AbstractInterfaceFiles/_SenderListJSONObject.h b/test_data/product/AbstractInterfaceFiles/_SenderListJSONObject.h new file mode 100644 index 0000000..ada1fa3 --- /dev/null +++ b/test_data/product/AbstractInterfaceFiles/_SenderListJSONObject.h @@ -0,0 +1,26 @@ +// +// _SenderListJSONObject.h +// +// Created by MetaJSONParser. +// Copyright (c) 2014 SinnerSchrader Mobile. All rights reserved. + +#import <Foundation/Foundation.h> + +@class SenderJSONObject; + +@class SenderListJSONObject; + +@interface _SenderListJSONObject : NSObject <NSCoding> + + +// the title of sender list +@property (nonatomic, strong) NSString *listTitle; +// the array of Sender +@property (nonatomic, strong) NSArray *senders; + ++ (SenderListJSONObject *)senderListWithDictionary:(NSDictionary *)dic withError:(NSError **)error; +- (id)initWithDictionary:(NSDictionary *)dic withError:(NSError **)error; +- (NSDictionary *)propertyDictionary; + +@end + diff --git a/test_data/product/AbstractInterfaceFiles/_SenderListJSONObject.m b/test_data/product/AbstractInterfaceFiles/_SenderListJSONObject.m new file mode 100644 index 0000000..acef913 --- /dev/null +++ b/test_data/product/AbstractInterfaceFiles/_SenderListJSONObject.m @@ -0,0 +1,90 @@ +// +// _SenderListJSONObject.m +// +// Created by MetaJSONParser. +// Copyright (c) 2014 SinnerSchrader Mobile. All rights reserved. + +#import "APIParser.h" +#import "NSString+RegExValidation.h" +#import "SenderListJSONObject.h" +#import "SenderJSONObject.h" + + +@implementation _SenderListJSONObject + +#pragma mark - factory + ++ (SenderListJSONObject *)senderListWithDictionary:(NSDictionary *)dic withError:(NSError **)error { + return [[SenderListJSONObject alloc] initWithDictionary:dic withError:error]; +} + + +#pragma mark - initialize +- (id)initWithDictionary:(NSDictionary *)dic withError:(NSError **)error { + self = [super init]; + if (self) { + self.listTitle = [APIParser stringFromResponseDictionary:dic forKey:@"listTitle" acceptNumber:NO acceptNil:NO error:error]; + if (*error) { + return self; + } + NSArray *tmpSendersArray = [APIParser arrayFromResponseDictionary:dic forKey:@"senders" acceptNil:NO error:error]; + if (*error) { + return self; + } + NSMutableArray *tmpSenders = [[NSMutableArray alloc] initWithCapacity:tmpSendersArray.count]; + for (NSUInteger loop = 0; loop < tmpSendersArray.count; loop++) { + NSDictionary *tmpDic = [APIParser dictionaryFromResponseArray:tmpSendersArray atIndex:loop acceptNil:NO error:error]; + if (*error) { + return self; + } + SenderJSONObject*tmpObject = nil; + if (tmpDic) { + tmpObject= [[SenderJSONObject alloc] initWithDictionary:tmpDic withError:error]; + if (*error) { + return self; + } + } + if (tmpObject) { + [tmpSenders addObject:tmpObject]; + } + } + self.senders = [NSArray arrayWithArray:tmpSenders]; + } + return self; +} + + +#pragma mark - getter + +#pragma mark - NSCoding +- (void)encodeWithCoder:(NSCoder*)coder { + [coder encodeObject:self.listTitle forKey:@"listTitle"]; + [coder encodeObject:self.senders forKey:@"senders"]; +} +- (id)initWithCoder:(NSCoder *)coder { + self = [super init]; + self.listTitle = [coder decodeObjectForKey:@"listTitle"]; + self.senders = [coder decodeObjectForKey:@"senders"]; + return self; +} + +#pragma mark - Object Info +- (NSDictionary *)propertyDictionary { + NSMutableDictionary *dic = [[NSMutableDictionary alloc] init]; + if (self.listTitle) { + [dic setObject:self.listTitle forKey:@"listTitle"]; + } + if (self.senders) { + NSMutableArray *tmpArray = [[NSMutableArray alloc] init]; + for (SenderJSONObject *tmpObj in self.senders) { + [tmpArray addObject:[tmpObj propertyDictionary]]; + } + [dic setObject:tmpArray forKey:@"senders"]; + } + return dic; +} +- (NSString *)description { + return [NSString stringWithFormat:@"%@",[self propertyDictionary]]; +} + +@end diff --git a/test_data/product/ProductDetailJSONObject.h b/test_data/product/ProductDetailJSONObject.h new file mode 100644 index 0000000..3252ae7 --- /dev/null +++ b/test_data/product/ProductDetailJSONObject.h @@ -0,0 +1,11 @@ +// +// ProductDetailJSONObject.h +// +// Created by MetaJSONParser. +// Copyright (c) 2014 SinnerSchrader Mobile. All rights reserved. + +#import "_ProductDetailJSONObject.h" +@interface ProductDetailJSONObject : _ProductDetailJSONObject + +@end + diff --git a/test_data/product/ProductDetailJSONObject.m b/test_data/product/ProductDetailJSONObject.m new file mode 100644 index 0000000..df9fc9a --- /dev/null +++ b/test_data/product/ProductDetailJSONObject.m @@ -0,0 +1,11 @@ +// +// ProductDetailJSONObject.m +// +// Created by MetaJSONParser. +// Copyright (c) 2014 SinnerSchrader Mobile. All rights reserved. + +#import "ProductDetailJSONObject.h" +@implementation ProductDetailJSONObject + +@end + diff --git a/test_data/product/SenderGroupJSONObject.h b/test_data/product/SenderGroupJSONObject.h new file mode 100644 index 0000000..d2652d1 --- /dev/null +++ b/test_data/product/SenderGroupJSONObject.h @@ -0,0 +1,11 @@ +// +// SenderGroupJSONObject.h +// +// Created by MetaJSONParser. +// Copyright (c) 2014 SinnerSchrader Mobile. All rights reserved. + +#import "_SenderGroupJSONObject.h" +@interface SenderGroupJSONObject : _SenderGroupJSONObject + +@end + diff --git a/test_data/product/SenderGroupJSONObject.m b/test_data/product/SenderGroupJSONObject.m new file mode 100644 index 0000000..c3a640f --- /dev/null +++ b/test_data/product/SenderGroupJSONObject.m @@ -0,0 +1,11 @@ +// +// SenderGroupJSONObject.m +// +// Created by MetaJSONParser. +// Copyright (c) 2014 SinnerSchrader Mobile. All rights reserved. + +#import "SenderGroupJSONObject.h" +@implementation SenderGroupJSONObject + +@end + diff --git a/test_data/product/SenderJSONObject.h b/test_data/product/SenderJSONObject.h new file mode 100644 index 0000000..b92afec --- /dev/null +++ b/test_data/product/SenderJSONObject.h @@ -0,0 +1,11 @@ +// +// SenderJSONObject.h +// +// Created by MetaJSONParser. +// Copyright (c) 2014 SinnerSchrader Mobile. All rights reserved. + +#import "_SenderJSONObject.h" +@interface SenderJSONObject : _SenderJSONObject + +@end + diff --git a/test_data/product/SenderJSONObject.m b/test_data/product/SenderJSONObject.m new file mode 100644 index 0000000..db67dd6 --- /dev/null +++ b/test_data/product/SenderJSONObject.m @@ -0,0 +1,11 @@ +// +// SenderJSONObject.m +// +// Created by MetaJSONParser. +// Copyright (c) 2014 SinnerSchrader Mobile. All rights reserved. + +#import "SenderJSONObject.h" +@implementation SenderJSONObject + +@end + diff --git a/test_data/product/SenderList2JSONObject.h b/test_data/product/SenderList2JSONObject.h new file mode 100644 index 0000000..b3347f1 --- /dev/null +++ b/test_data/product/SenderList2JSONObject.h @@ -0,0 +1,11 @@ +// +// SenderList2JSONObject.h +// +// Created by MetaJSONParser. +// Copyright (c) 2014 SinnerSchrader Mobile. All rights reserved. + +#import "_SenderList2JSONObject.h" +@interface SenderList2JSONObject : _SenderList2JSONObject + +@end + diff --git a/test_data/product/SenderList2JSONObject.m b/test_data/product/SenderList2JSONObject.m new file mode 100644 index 0000000..af33763 --- /dev/null +++ b/test_data/product/SenderList2JSONObject.m @@ -0,0 +1,11 @@ +// +// SenderList2JSONObject.m +// +// Created by MetaJSONParser. +// Copyright (c) 2014 SinnerSchrader Mobile. All rights reserved. + +#import "SenderList2JSONObject.h" +@implementation SenderList2JSONObject + +@end + diff --git a/test_data/product/SenderListJSONObject.h b/test_data/product/SenderListJSONObject.h new file mode 100644 index 0000000..dc708c5 --- /dev/null +++ b/test_data/product/SenderListJSONObject.h @@ -0,0 +1,11 @@ +// +// SenderListJSONObject.h +// +// Created by MetaJSONParser. +// Copyright (c) 2014 SinnerSchrader Mobile. All rights reserved. + +#import "_SenderListJSONObject.h" +@interface SenderListJSONObject : _SenderListJSONObject + +@end + diff --git a/test_data/product/SenderListJSONObject.m b/test_data/product/SenderListJSONObject.m new file mode 100644 index 0000000..2114710 --- /dev/null +++ b/test_data/product/SenderListJSONObject.m @@ -0,0 +1,11 @@ +// +// SenderListJSONObject.m +// +// Created by MetaJSONParser. +// Copyright (c) 2014 SinnerSchrader Mobile. All rights reserved. + +#import "SenderListJSONObject.h" +@implementation SenderListJSONObject + +@end + From 6456b8eafcc91fb403fd5d89da06b7e126399202 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Franc=CC=A7ois=20Benaiteau?= <francois.benaiteau@sinnerschrader-mobile.com> Date: Wed, 23 Apr 2014 09:42:04 +0200 Subject: [PATCH 061/149] Fixes product.json syntax --- samples/product.json | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/samples/product.json b/samples/product.json index 2fb2761..a4a8c0a 100644 --- a/samples/product.json +++ b/samples/product.json @@ -60,7 +60,8 @@ [ { "name" : "digitalSenders", - "base-type" : ["senderList", "senderList2", "number", "string", "boolean", "date", "data"], + "base-type" : "array", + "subType" : ["senderList", "senderList2", "number", "string", "boolean", "date", "data"], "description" : "the array of sender list" }, { @@ -158,4 +159,4 @@ } ] } -] \ No newline at end of file +] From 80595e2053f7f534d386af4115916f304eb55f79 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Franc=CC=A7ois=20Benaiteau?= <francois.benaiteau@sinnerschrader-mobile.com> Date: Wed, 23 Apr 2014 09:51:57 +0200 Subject: [PATCH 062/149] Fixes readJSON_test --- readJSON_test.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/readJSON_test.py b/readJSON_test.py index bcf679c..43d609e 100644 --- a/readJSON_test.py +++ b/readJSON_test.py @@ -13,4 +13,4 @@ def execute_script(self, json_file, output_dir): os.system("python readJSON.py -i " + json_file) # ignoring template files os.system("rm -rf src/Utilities") - return os.system("diff src/ " + test_data/product) + return os.system("diff src/ " + output_dir) From eb73f49021e31d03a13baf33b32552be3f3749fb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Franc=CC=A7ois=20Benaiteau?= <francois.benaiteau@sinnerschrader-mobile.com> Date: Wed, 23 Apr 2014 10:02:19 +0200 Subject: [PATCH 063/149] Fixes human file expected output add extension code --- test_data/product/ProductDetailJSONObject.h | 1 - test_data/product/ProductDetailJSONObject.m | 6 +++++- test_data/product/SenderGroupJSONObject.h | 1 - test_data/product/SenderGroupJSONObject.m | 6 +++++- test_data/product/SenderJSONObject.h | 1 - test_data/product/SenderJSONObject.m | 6 +++++- test_data/product/SenderList2JSONObject.h | 1 - test_data/product/SenderList2JSONObject.m | 6 +++++- test_data/product/SenderListJSONObject.h | 1 - test_data/product/SenderListJSONObject.m | 6 +++++- 10 files changed, 25 insertions(+), 10 deletions(-) diff --git a/test_data/product/ProductDetailJSONObject.h b/test_data/product/ProductDetailJSONObject.h index 3252ae7..2d874b2 100644 --- a/test_data/product/ProductDetailJSONObject.h +++ b/test_data/product/ProductDetailJSONObject.h @@ -8,4 +8,3 @@ @interface ProductDetailJSONObject : _ProductDetailJSONObject @end - diff --git a/test_data/product/ProductDetailJSONObject.m b/test_data/product/ProductDetailJSONObject.m index df9fc9a..8be4033 100644 --- a/test_data/product/ProductDetailJSONObject.m +++ b/test_data/product/ProductDetailJSONObject.m @@ -5,7 +5,11 @@ // Copyright (c) 2014 SinnerSchrader Mobile. All rights reserved. #import "ProductDetailJSONObject.h" -@implementation ProductDetailJSONObject + +@interface ProductDetailJSONObject () @end +@implementation ProductDetailJSONObject + +@end diff --git a/test_data/product/SenderGroupJSONObject.h b/test_data/product/SenderGroupJSONObject.h index d2652d1..554285d 100644 --- a/test_data/product/SenderGroupJSONObject.h +++ b/test_data/product/SenderGroupJSONObject.h @@ -8,4 +8,3 @@ @interface SenderGroupJSONObject : _SenderGroupJSONObject @end - diff --git a/test_data/product/SenderGroupJSONObject.m b/test_data/product/SenderGroupJSONObject.m index c3a640f..33f6d09 100644 --- a/test_data/product/SenderGroupJSONObject.m +++ b/test_data/product/SenderGroupJSONObject.m @@ -5,7 +5,11 @@ // Copyright (c) 2014 SinnerSchrader Mobile. All rights reserved. #import "SenderGroupJSONObject.h" -@implementation SenderGroupJSONObject + +@interface SenderGroupJSONObject () @end +@implementation SenderGroupJSONObject + +@end diff --git a/test_data/product/SenderJSONObject.h b/test_data/product/SenderJSONObject.h index b92afec..f1a8c60 100644 --- a/test_data/product/SenderJSONObject.h +++ b/test_data/product/SenderJSONObject.h @@ -8,4 +8,3 @@ @interface SenderJSONObject : _SenderJSONObject @end - diff --git a/test_data/product/SenderJSONObject.m b/test_data/product/SenderJSONObject.m index db67dd6..9a03a1f 100644 --- a/test_data/product/SenderJSONObject.m +++ b/test_data/product/SenderJSONObject.m @@ -5,7 +5,11 @@ // Copyright (c) 2014 SinnerSchrader Mobile. All rights reserved. #import "SenderJSONObject.h" -@implementation SenderJSONObject + +@interface SenderJSONObject () @end +@implementation SenderJSONObject + +@end diff --git a/test_data/product/SenderList2JSONObject.h b/test_data/product/SenderList2JSONObject.h index b3347f1..cbca782 100644 --- a/test_data/product/SenderList2JSONObject.h +++ b/test_data/product/SenderList2JSONObject.h @@ -8,4 +8,3 @@ @interface SenderList2JSONObject : _SenderList2JSONObject @end - diff --git a/test_data/product/SenderList2JSONObject.m b/test_data/product/SenderList2JSONObject.m index af33763..34ea99d 100644 --- a/test_data/product/SenderList2JSONObject.m +++ b/test_data/product/SenderList2JSONObject.m @@ -5,7 +5,11 @@ // Copyright (c) 2014 SinnerSchrader Mobile. All rights reserved. #import "SenderList2JSONObject.h" -@implementation SenderList2JSONObject + +@interface SenderList2JSONObject () @end +@implementation SenderList2JSONObject + +@end diff --git a/test_data/product/SenderListJSONObject.h b/test_data/product/SenderListJSONObject.h index dc708c5..e42268f 100644 --- a/test_data/product/SenderListJSONObject.h +++ b/test_data/product/SenderListJSONObject.h @@ -8,4 +8,3 @@ @interface SenderListJSONObject : _SenderListJSONObject @end - diff --git a/test_data/product/SenderListJSONObject.m b/test_data/product/SenderListJSONObject.m index 2114710..fe9c8cb 100644 --- a/test_data/product/SenderListJSONObject.m +++ b/test_data/product/SenderListJSONObject.m @@ -5,7 +5,11 @@ // Copyright (c) 2014 SinnerSchrader Mobile. All rights reserved. #import "SenderListJSONObject.h" -@implementation SenderListJSONObject + +@interface SenderListJSONObject () @end +@implementation SenderListJSONObject + +@end From aef30362a6844cde41059b2ed8754c54eb6d2a77 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Franc=CC=A7ois=20Benaiteau?= <francois.benaiteau@sinnerschrader-mobile.com> Date: Wed, 23 Apr 2014 10:02:35 +0200 Subject: [PATCH 064/149] Diff all files --- readJSON_test.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/readJSON_test.py b/readJSON_test.py index 43d609e..9d578cf 100644 --- a/readJSON_test.py +++ b/readJSON_test.py @@ -13,4 +13,4 @@ def execute_script(self, json_file, output_dir): os.system("python readJSON.py -i " + json_file) # ignoring template files os.system("rm -rf src/Utilities") - return os.system("diff src/ " + output_dir) + return os.system("diff -r src/ " + output_dir) From 7f21ea8b3d62f50fa40aab3418fabca2ab1fdec8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Franc=CC=A7ois=20Benaiteau?= <francois.benaiteau@sinnerschrader-mobile.com> Date: Wed, 23 Apr 2014 10:03:03 +0200 Subject: [PATCH 065/149] Fixes crash on type 'any' --- ObjectiveCCodeGenerator.py | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/ObjectiveCCodeGenerator.py b/ObjectiveCCodeGenerator.py index 0968cab..5d9de8c 100755 --- a/ObjectiveCCodeGenerator.py +++ b/ObjectiveCCodeGenerator.py @@ -27,6 +27,7 @@ import os import sys from pystache import Renderer +from cStringIO import StringIO class ObjectiveCCodeGenerator : @@ -95,12 +96,17 @@ def process_properties(self, propObj) : key = 'hasCustomType' if subtype in propObj.naturalTypeList: key = 'has'+ subtype.capitalize() + 'Type' + propertyHash[key] = {"subtype": subtype} + elif subtype == "any": + print "skip 'any' type" else: + print subtype if propObj.getScheme(subtype).base_type in propObj.naturalTypeList: key = 'has'+ propObj.getScheme(subtype).base_type.capitalize() + 'Type' + propertyHash[key] = {"subtype": subtype} else: - propertyHash[key]["className"] = propObj.getScheme(subtype).getClassName() - propertyHash[key] = {"subtype": subtype} + propertyHash[key] = {"subtype": subtype, "className": propObj.getScheme(subtype).getClassName()} + return propertyHash From 36bc7ab3f46c457e88416b1a9c73c44b88490e8f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Franc=CC=A7ois=20Benaiteau?= <francois.benaiteau@sinnerschrader-mobile.com> Date: Wed, 23 Apr 2014 11:04:34 +0200 Subject: [PATCH 066/149] support for objectProperties --- ObjectiveCCodeGenerator.py | 34 +++++++++++++++++++++++++--------- templates/_header.h.mustache | 22 +++++++++++++--------- 2 files changed, 38 insertions(+), 18 deletions(-) diff --git a/ObjectiveCCodeGenerator.py b/ObjectiveCCodeGenerator.py index 5d9de8c..7ddf7c4 100755 --- a/ObjectiveCCodeGenerator.py +++ b/ObjectiveCCodeGenerator.py @@ -63,7 +63,7 @@ def makeVarName(self,schemeObj) : return returnName - def process_properties(self, propObj) : + def process_properties(self, propObj, undefined = False) : capitalizeVarName = self.makeVarName(propObj) capitalizeVarName = capitalizeVarName[:1].upper() + capitalizeVarName[1:] propertyHash = {'name' : propObj.type_name, 'varName' : self.makeVarName(propObj), 'capitalizeVarName': capitalizeVarName} @@ -72,6 +72,13 @@ def process_properties(self, propObj) : if propObj.required == 1: propertyHash['required'] = True + if propObj.rootBaseType() == "object": + propertyHash['className'] = propObj.getClassName() + return propertyHash + + if undefined: + return propertyHash + hasRegex, regex = propObj.getRegex() if hasRegex: propertyHash['regex'] = {"value": regex} @@ -98,7 +105,7 @@ def process_properties(self, propObj) : key = 'has'+ subtype.capitalize() + 'Type' propertyHash[key] = {"subtype": subtype} elif subtype == "any": - print "skip 'any' type" + print "skip 'any' type for" + propertyHash['name'] else: print subtype if propObj.getScheme(subtype).base_type in propObj.naturalTypeList: @@ -153,22 +160,31 @@ def machine_file_content(self, schemeObj, template_file) : dataProps = [] dateProps = [] arrayProps = [] + undefineProps = [] + objectProps = [] for prop in schemeObj.props: - if prop.rootBaseType() == "string": + if prop.rootBaseType() == "object": + objectProps.append(self.process_properties(prop)) + elif prop.rootBaseType() == "string": stringProps.append(self.process_properties(prop)) - if prop.rootBaseType() == "number": + elif prop.rootBaseType() == "number": numberProps.append(self.process_properties(prop)) - if prop.rootBaseType() == "boolean": + elif prop.rootBaseType() == "boolean": booleanProps.append(self.process_properties(prop)) - if prop.rootBaseType() == "data": + elif prop.rootBaseType() == "data": dataProps.append(self.process_properties(prop)) - if prop.rootBaseType() == "date": + elif prop.rootBaseType() == "date": dateProps.append(self.process_properties(prop)) - if prop.rootBaseType() == "array": + elif prop.rootBaseType() == "array": arrayProps.append(self.process_properties(prop)) + elif prop.rootBaseType() == "multi": + undefineProps.append(self.process_properties(prop, True)) + else: + undefineProps.append(self.process_properties(prop, True)) + - hashParams = {"date": str(today.year), "projectPrefix": schemeObj.projectPrefix,"machineClassName": schemeObj.getMachineClassName(), "humanClassName": schemeObj.getClassName(), "variableName": self.makeVarName(schemeObj), "stringProperties": stringProps, "numberProperties": numberProps, "booleanProperties": booleanProps, "dataProperties": dataProps, "dateProperties": dateProps, "arrayProperties": arrayProps} + hashParams = {"date": str(today.year), "projectPrefix": schemeObj.projectPrefix,"machineClassName": schemeObj.getMachineClassName(), "humanClassName": schemeObj.getClassName(), "variableName": self.makeVarName(schemeObj), "stringProperties": stringProps, "numberProperties": numberProps, "booleanProperties": booleanProps, "dataProperties": dataProps, "dateProperties": dateProps, "arrayProperties": arrayProps, "undefinedProperties": undefineProps, "objectProperties": objectProps} if schemeObj.getScheme(schemeObj.base_type): hashParams['baseClassName'] = schemeObj.getScheme(schemeObj.base_type).getClassName() diff --git a/templates/_header.h.mustache b/templates/_header.h.mustache index d31113b..36f9406 100644 --- a/templates/_header.h.mustache +++ b/templates/_header.h.mustache @@ -9,6 +9,10 @@ #import "{{baseClassName}}.h" {{/baseTypeIsObject}} +{{#objectProperties}} +@class {{className}}; +{{/objectProperties}} + @class {{humanClassName}}; {{#baseTypeIsObject}} @@ -20,49 +24,49 @@ {{#numberProperties}} {{#comment}} -//{{comment}} +// {{comment}} {{/comment}} @property (nonatomic, strong) NSNumber *{{varName}}; {{/numberProperties}} {{#stringProperties}} {{#comment}} -//{{comment}} +// {{comment}} {{/comment}} @property (nonatomic, strong) NSString *{{varName}}; {{/stringProperties}} {{#booleanProperties}} {{#comment}} -//{{comment}} +// {{comment}} {{/comment}} @property (nonatomic, assign) BOOL {{varName}}; {{/booleanProperties}} {{#dataProperties}} {{#comment}} -//{{comment}} +// {{comment}} {{/comment}} @property (nonatomic, strong) NSData *{{varName}}; {{/dataProperties}} {{#dateProperties}} {{#comment}} -//{{comment}} +// {{comment}} {{/comment}} @property (nonatomic, strong) NSDate *{{varName}}; {{/dateProperties}} {{#arrayProperties}} {{#comment}} -//{{comment}} +// {{comment}} {{/comment}} @property (nonatomic, strong) NSArray *{{varName}}; {{/arrayProperties}} {{#objectProperties}} {{#comment}} -//{{comment}} +// {{comment}} {{/comment}} -@property (nonatomic, strong) {{base_type}} *{{varName}}; +@property (nonatomic, strong) {{className}} *{{varName}}; {{/objectProperties}} {{#undefinedProperties}} {{#comment}} -//{{comment}} +// {{comment}} {{/comment}} @property (nonatomic, strong) id {{varName}}; {{/undefinedProperties}} From a1ef19d38a88b819ebffb0316adc41a4a1601d6c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Franc=CC=A7ois=20Benaiteau?= <francois.benaiteau@sinnerschrader-mobile.com> Date: Wed, 23 Apr 2014 11:05:36 +0200 Subject: [PATCH 067/149] Reorder json properties to match expected output --- samples/product.json | 48 ++++++------ .../_ProductDetailJSONObject.h | 16 ++-- .../_ProductDetailJSONObject.m | 78 +++++++++---------- 3 files changed, 72 insertions(+), 70 deletions(-) diff --git a/samples/product.json b/samples/product.json index a4a8c0a..71efdc1 100644 --- a/samples/product.json +++ b/samples/product.json @@ -104,15 +104,14 @@ "property" : [ { - "name" : "title", - "base-type" : ["titleString","string"], - "description" : "the title of product", + "name" : "type", + "base-type" : "number", + "description" : "the type of product", "required" : 1 }, { - "name" : "type", + "name" : "advantage", "base-type" : "number", - "description" : "the type of product", "required" : 1 }, { @@ -121,31 +120,19 @@ "description" : "teaser image url of product", "required" : 1 }, - { - "name" : "download", - "base-type" : ["number", "string"], - "description" : "download speed (Mbit/s)", - "required" : 1 - }, - { - "name" : "upload", - "base-type" : ["number", "string"], - "description" : "upload speed (Mbit/s)", - "required" : 1 - }, { "name" : "telephoneFlatrate", "base-type" : "string", "description" : "telephone Flatrate option string" }, - { - "name" : "senderInfo", - "base-type" : "senderGroup" - }, { "name" : "includeHardware", "base-type" : "boolean", "required" : 1 + }, + { + "name" : "senderInfo", + "base-type" : "senderGroup" }, { "name" : "anyProperty", @@ -153,10 +140,25 @@ "required" : 1 }, { - "name" : "advantage", - "base-type" : "number", + "name" : "title", + "base-type" : ["titleString","string"], + "description" : "the title of product", + "required" : 1 + }, + + { + "name" : "download", + "base-type" : ["number", "string"], + "description" : "download speed (Mbit/s)", + "required" : 1 + }, + { + "name" : "upload", + "base-type" : ["number", "string"], + "description" : "upload speed (Mbit/s)", "required" : 1 } + ] } ] diff --git a/test_data/product/AbstractInterfaceFiles/_ProductDetailJSONObject.h b/test_data/product/AbstractInterfaceFiles/_ProductDetailJSONObject.h index 01df3d4..5437e8c 100644 --- a/test_data/product/AbstractInterfaceFiles/_ProductDetailJSONObject.h +++ b/test_data/product/AbstractInterfaceFiles/_ProductDetailJSONObject.h @@ -13,22 +13,22 @@ @interface _ProductDetailJSONObject : NSObject <NSCoding> -// the title of product -@property (nonatomic, strong) id title; // the type of product @property (nonatomic, strong) NSNumber *type; +@property (nonatomic, strong) NSNumber *advantage; // teaser image url of product @property (nonatomic, strong) NSString *teaserURL; -// download speed (Mbit/s) -@property (nonatomic, strong) id download; -// upload speed (Mbit/s) -@property (nonatomic, strong) id upload; // telephone Flatrate option string @property (nonatomic, strong) NSString *telephoneFlatrate; -@property (nonatomic, strong) SenderGroupJSONObject *senderInfo; @property (nonatomic, assign) BOOL includeHardware; +@property (nonatomic, strong) SenderGroupJSONObject *senderInfo; @property (nonatomic, strong) id anyProperty; -@property (nonatomic, strong) NSNumber *advantage; +// the title of product +@property (nonatomic, strong) id title; +// download speed (Mbit/s) +@property (nonatomic, strong) id download; +// upload speed (Mbit/s) +@property (nonatomic, strong) id upload; + (ProductDetailJSONObject *)ProductDetailWithDictionary:(NSDictionary *)dic withError:(NSError **)error; - (id)initWithDictionary:(NSDictionary *)dic withError:(NSError **)error; diff --git a/test_data/product/AbstractInterfaceFiles/_ProductDetailJSONObject.m b/test_data/product/AbstractInterfaceFiles/_ProductDetailJSONObject.m index ac3a495..0431a59 100644 --- a/test_data/product/AbstractInterfaceFiles/_ProductDetailJSONObject.m +++ b/test_data/product/AbstractInterfaceFiles/_ProductDetailJSONObject.m @@ -23,27 +23,23 @@ + (ProductDetailJSONObject *)ProductDetailWithDictionary:(NSDictionary *)dic wit - (id)initWithDictionary:(NSDictionary *)dic withError:(NSError **)error { self = [super init]; if (self) { - self.title = [APIParser objectFromResponseDictionary:dic forKey:@"title" acceptNil:NO error:error]; - if (*error) { - return nil; - } self.type = [APIParser numberFromResponseDictionary:dic forKey:@"type" acceptNil:NO error:error]; if (*error) { return self; } - self.teaserURL = [APIParser stringFromResponseDictionary:dic forKey:@"teaserURL" acceptNumber:NO acceptNil:NO error:error]; + self.advantage = [APIParser numberFromResponseDictionary:dic forKey:@"advantage" acceptNil:NO error:error]; if (*error) { return self; } - self.download = [APIParser objectFromResponseDictionary:dic forKey:@"download" acceptNil:NO error:error]; + self.teaserURL = [APIParser stringFromResponseDictionary:dic forKey:@"teaserURL" acceptNumber:NO acceptNil:NO error:error]; if (*error) { - return nil; + return self; } - self.upload = [APIParser objectFromResponseDictionary:dic forKey:@"upload" acceptNil:NO error:error]; + self.telephoneFlatrate = [APIParser stringFromResponseDictionary:dic forKey:@"telephoneFlatrate" acceptNumber:NO acceptNil:YES error:error]; if (*error) { - return nil; + return self; } - self.telephoneFlatrate = [APIParser stringFromResponseDictionary:dic forKey:@"telephoneFlatrate" acceptNumber:NO acceptNil:YES error:error]; + self.includeHardware = [APIParser boolFromResponseDictionary:dic forKey:@"includeHardware" acceptNil:NO error:error]; if (*error) { return self; } @@ -57,17 +53,21 @@ - (id)initWithDictionary:(NSDictionary *)dic withError:(NSError **)error { return self; } } - self.includeHardware = [APIParser boolFromResponseDictionary:dic forKey:@"includeHardware" acceptNil:NO error:error]; + self.anyProperty = [APIParser objectFromResponseDictionary:dic forKey:@"anyProperty" acceptNil:NO error:error]; if (*error) { - return self; + return nil; } - self.anyProperty = [APIParser objectFromResponseDictionary:dic forKey:@"anyProperty" acceptNil:NO error:error]; + self.title = [APIParser objectFromResponseDictionary:dic forKey:@"title" acceptNil:NO error:error]; if (*error) { return nil; } - self.advantage = [APIParser numberFromResponseDictionary:dic forKey:@"advantage" acceptNil:NO error:error]; + self.download = [APIParser objectFromResponseDictionary:dic forKey:@"download" acceptNil:NO error:error]; if (*error) { - return self; + return nil; + } + self.upload = [APIParser objectFromResponseDictionary:dic forKey:@"upload" acceptNil:NO error:error]; + if (*error) { + return nil; } } return self; @@ -153,64 +153,64 @@ - (NSString *)uploadAsString:(NSError **)error { #pragma mark - NSCoding - (void)encodeWithCoder:(NSCoder*)coder { - [coder encodeObject:self.title forKey:@"title"]; [coder encodeObject:self.type forKey:@"type"]; + [coder encodeObject:self.advantage forKey:@"advantage"]; [coder encodeObject:self.teaserURL forKey:@"teaserURL"]; - [coder encodeObject:self.download forKey:@"download"]; - [coder encodeObject:self.upload forKey:@"upload"]; [coder encodeObject:self.telephoneFlatrate forKey:@"telephoneFlatrate"]; - [coder encodeObject:self.senderInfo forKey:@"senderInfo"]; [coder encodeBool:self.includeHardware forKey:@"includeHardware"]; + [coder encodeObject:self.senderInfo forKey:@"senderInfo"]; [coder encodeObject:self.anyProperty forKey:@"anyProperty"]; - [coder encodeObject:self.advantage forKey:@"advantage"]; + [coder encodeObject:self.title forKey:@"title"]; + [coder encodeObject:self.download forKey:@"download"]; + [coder encodeObject:self.upload forKey:@"upload"]; } - (id)initWithCoder:(NSCoder *)coder { self = [super init]; - self.title = [coder decodeObjectForKey:@"title"]; self.type = [coder decodeObjectForKey:@"type"]; + self.advantage = [coder decodeObjectForKey:@"advantage"]; self.teaserURL = [coder decodeObjectForKey:@"teaserURL"]; - self.download = [coder decodeObjectForKey:@"download"]; - self.upload = [coder decodeObjectForKey:@"upload"]; self.telephoneFlatrate = [coder decodeObjectForKey:@"telephoneFlatrate"]; - self.senderInfo = [coder decodeObjectForKey:@"senderInfo"]; self.includeHardware = [coder decodeBoolForKey:@"includeHardware"]; + self.senderInfo = [coder decodeObjectForKey:@"senderInfo"]; self.anyProperty = [coder decodeObjectForKey:@"anyProperty"]; - self.advantage = [coder decodeObjectForKey:@"advantage"]; + self.title = [coder decodeObjectForKey:@"title"]; + self.download = [coder decodeObjectForKey:@"download"]; + self.upload = [coder decodeObjectForKey:@"upload"]; return self; } #pragma mark - Object Info - (NSDictionary *)propertyDictionary { NSMutableDictionary *dic = [[NSMutableDictionary alloc] init]; - if (self.title) { - [dic setObject:self.title forKey:@"title"]; - } if (self.type) { [dic setObject:self.type forKey:@"type"]; } + if (self.advantage) { + [dic setObject:self.advantage forKey:@"advantage"]; + } if (self.teaserURL) { [dic setObject:self.teaserURL forKey:@"teaserURL"]; } - if (self.download) { - [dic setObject:self.download forKey:@"download"]; - } - if (self.upload) { - [dic setObject:self.upload forKey:@"upload"]; - } if (self.telephoneFlatrate) { [dic setObject:self.telephoneFlatrate forKey:@"telephoneFlatrate"]; } - if (self.senderInfo) { - [dic setObject:[self.senderInfo propertyDictionary] forKey:@"senderInfo"]; - } if (self.includeHardware) { [dic setObject:[NSNumber numberWithBool:self.includeHardware] forKey:@"includeHardware"]; } + if (self.senderInfo) { + [dic setObject:[self.senderInfo propertyDictionary] forKey:@"senderInfo"]; + } if (self.anyProperty) { [dic setObject:self.anyProperty forKey:@"anyProperty"]; } - if (self.advantage) { - [dic setObject:self.advantage forKey:@"advantage"]; + if (self.title) { + [dic setObject:self.title forKey:@"title"]; + } + if (self.download) { + [dic setObject:self.download forKey:@"download"]; + } + if (self.upload) { + [dic setObject:self.upload forKey:@"upload"]; } return dic; } From fad7f2f834ba9a4d66770976de2733a391490ac2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Franc=CC=A7ois=20Benaiteau?= <francois.benaiteau@sinnerschrader-mobile.com> Date: Wed, 23 Apr 2014 14:17:15 +0200 Subject: [PATCH 068/149] Fixes Objc tests --- templates/_header.h.mustache | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/templates/_header.h.mustache b/templates/_header.h.mustache index 36f9406..410802c 100644 --- a/templates/_header.h.mustache +++ b/templates/_header.h.mustache @@ -11,8 +11,8 @@ {{#objectProperties}} @class {{className}}; -{{/objectProperties}} +{{/objectProperties}} @class {{humanClassName}}; {{#baseTypeIsObject}} From 9634deecf587c8e07f2f2dd5d8abc37d18eebad9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Franc=CC=A7ois=20Benaiteau?= <francois.benaiteau@sinnerschrader-mobile.com> Date: Wed, 23 Apr 2014 18:17:59 +0200 Subject: [PATCH 069/149] Testing ProductDetailsJSONObject.h file --- readJSON_test.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/readJSON_test.py b/readJSON_test.py index 9d578cf..42a7cd0 100644 --- a/readJSON_test.py +++ b/readJSON_test.py @@ -13,4 +13,6 @@ def execute_script(self, json_file, output_dir): os.system("python readJSON.py -i " + json_file) # ignoring template files os.system("rm -rf src/Utilities") - return os.system("diff -r src/ " + output_dir) + # return os.system("diff -r src/ " + output_dir) + common_file = "/AbstractInterfaceFiles/_ProductDetailJSONObject.h" + return os.system("diff -r -B src" + common_file + " " + output_dir + common_file) From 6d6537522880955784f4d3269b733dfcaa99f38f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Franc=CC=A7ois=20Benaiteau?= <francois.benaiteau@sinnerschrader-mobile.com> Date: Wed, 23 Apr 2014 18:18:24 +0200 Subject: [PATCH 070/149] making test pass --- ObjectiveCCodeGenerator.py | 131 +++++++++++++++++++-------- templates/_header.h.mustache | 16 +--- templates/array_property.mustache | 14 +++ templates/multiple_property.mustache | 17 ++++ 4 files changed, 128 insertions(+), 50 deletions(-) create mode 100644 templates/array_property.mustache create mode 100644 templates/multiple_property.mustache diff --git a/ObjectiveCCodeGenerator.py b/ObjectiveCCodeGenerator.py index 7ddf7c4..e996987 100755 --- a/ObjectiveCCodeGenerator.py +++ b/ObjectiveCCodeGenerator.py @@ -26,6 +26,7 @@ import time import os import sys +import re from pystache import Renderer from cStringIO import StringIO @@ -38,6 +39,32 @@ class ObjectiveCCodeGenerator : def __init__(self): projectPrefix = "" dirPath = "classes" + self.mustache_renderer = Renderer() + + # BEGIN template available functions + def lambda_uppercase(self, text): + return text.upper() + def lambda_lowercase(self, text): + return text.lower() + + def lambda_capitalize(self, text): + return text.capitalize() + + def lambda_camelcase(self, text): + process_text = self.mustache_renderer.render(text, self.mustache_renderer.context) + words = process_text.split('_') + return ''.join(word.title() if i else word for i, word in enumerate(words)) + + def lambda_upper_camelcase(self, text): + camelcased_text = self.lambda_camelcase(text) + return camelcased_text[:1].upper() + camelcased_text[1:] + + def lambda_snakecase(self, text): + return re.sub('([a-z0-9])([A-Z])', r'\1_\2', string).lower() + def lambda_upper_snakecase(self, text): + return re.sub('([a-z0-9])([A-Z])', r'\1_\2', string).upper() + + # END template available functions def template_file_path(self, filename) : templatePath = os.path.realpath( __file__ ) @@ -60,37 +87,32 @@ def makeVarName(self,schemeObj) : returnName = self.projectPrefix.lower() + titleName #print returnName break - return returnName - def process_properties(self, propObj, undefined = False) : - capitalizeVarName = self.makeVarName(propObj) - capitalizeVarName = capitalizeVarName[:1].upper() + capitalizeVarName[1:] - propertyHash = {'name' : propObj.type_name, 'varName' : self.makeVarName(propObj), 'capitalizeVarName': capitalizeVarName} - if propObj.type_description and len(propObj.type_description) : - propertyHash["comment"] = propObj.type_description - if propObj.required == 1: - propertyHash['required'] = True - - if propObj.rootBaseType() == "object": - propertyHash['className'] = propObj.getClassName() - return propertyHash - - if undefined: - return propertyHash - - hasRegex, regex = propObj.getRegex() - if hasRegex: - propertyHash['regex'] = {"value": regex} - - hasMax, maxLength = propObj.getMaxLength() - if hasMax: - propertyHash['maxLength'] = {"value": maxLength} - - hasMin, minLength = propObj.getMinLength() - if hasMin: - propertyHash['minLength'] = {"value": minLength} + def process_basetypes(self, propObj, propertyHash) : + # dealing with array property + if len(propObj.getBaseTypes()) == 1: + propertyHash['hasOneBasetype'] = True + elif len(propObj.getBaseTypes()) > 1: + propertyHash['hasMultipleBasetypes'] = True + else: + propertyHash['hasNoBasetypes'] = True + for subtype in propObj.getBaseTypes(): + key = 'hasCustomType' + if subtype in propObj.naturalTypeList: + key = 'has'+ subtype.capitalize() + 'Type' + propertyHash[key] = {"type": subtype} + elif subtype == "any": + print "skip 'any' type for" + propertyHash['name'] + else: + # print subtype + if propObj.getScheme(subtype).base_type in propObj.naturalTypeList: + # key = 'has'+ propObj.getScheme(subtype).base_type.capitalize() + 'Type' + propertyHash[key] = {"type": subtype} + else: + propertyHash[key] = {"type": subtype, "className": propObj.getScheme(subtype).getClassName()} + def process_subtypes(self, propObj, propertyHash) : # dealing with array property if len(propObj.getSubType()) == 1: propertyHash['hasOneSubtype'] = True @@ -103,18 +125,46 @@ def process_properties(self, propObj, undefined = False) : key = 'hasCustomType' if subtype in propObj.naturalTypeList: key = 'has'+ subtype.capitalize() + 'Type' - propertyHash[key] = {"subtype": subtype} + propertyHash[key] = {"type": subtype} elif subtype == "any": print "skip 'any' type for" + propertyHash['name'] else: - print subtype if propObj.getScheme(subtype).base_type in propObj.naturalTypeList: key = 'has'+ propObj.getScheme(subtype).base_type.capitalize() + 'Type' - propertyHash[key] = {"subtype": subtype} + propertyHash[key] = {"type": subtype} else: - propertyHash[key] = {"subtype": subtype, "className": propObj.getScheme(subtype).getClassName()} + propertyHash[key] = {"type": subtype, "className": propObj.getScheme(subtype).getClassName()} + + def process_properties(self, propObj, undefined = False) : + capitalizeVarName = self.makeVarName(propObj) + capitalizeVarName = capitalizeVarName[:1].upper() + capitalizeVarName[1:] + propertyHash = {'name' : propObj.type_name, 'varName' : self.makeVarName(propObj), 'capitalizeVarName': capitalizeVarName} + if propObj.type_description and len(propObj.type_description) : + propertyHash["comment"] = propObj.type_description + if propObj.required == 1: + propertyHash['required'] = True + if propObj.rootBaseType() == "object": + propertyHash['className'] = propObj.getClassName() + return propertyHash + if not undefined: + hasRegex, regex = propObj.getRegex() + if hasRegex: + propertyHash['regex'] = {"value": regex} + + hasMax, maxLength = propObj.getMaxLength() + if hasMax: + propertyHash['maxLength'] = {"value": maxLength} + + hasMin, minLength = propObj.getMinLength() + if hasMin: + propertyHash['minLength'] = {"value": minLength} + + # dealing with array property + self.process_subtypes(propObj, propertyHash) + if propObj.rootBaseType() == "multi": + self.process_basetypes(propObj, propertyHash) return propertyHash def human_header_content(self, schemeObj) : @@ -122,14 +172,14 @@ def human_header_content(self, schemeObj) : today = datetime.date.fromtimestamp(time.time()) hashParams = {"date": str(today.year), "machineClassName": schemeObj.getMachineClassName(), "humanClassName": schemeObj.getClassName()} - return Renderer().render(templateFile.read(), hashParams) + return self.mustache_renderer.render(templateFile.read(), hashParams) def human_source_content(self, schemeObj) : templateFile = open(self.template_file_path("source.m.mustache"), "r") today = datetime.date.fromtimestamp(time.time()) hashParams = {"date": str(today.year), "machineClassName": schemeObj.getMachineClassName(), "humanClassName": schemeObj.getClassName()} - return Renderer().render(templateFile.read(), hashParams) + return self.mustache_renderer.render(templateFile.read(), hashParams) def machine_header_content(self, schemeObj) : template_file = open(self.template_file_path("_header.h.mustache"), "r") @@ -179,13 +229,22 @@ def machine_file_content(self, schemeObj, template_file) : elif prop.rootBaseType() == "array": arrayProps.append(self.process_properties(prop)) elif prop.rootBaseType() == "multi": - undefineProps.append(self.process_properties(prop, True)) + propHash = self.process_properties(prop, True) + undefineProps.append(propHash) else: undefineProps.append(self.process_properties(prop, True)) hashParams = {"date": str(today.year), "projectPrefix": schemeObj.projectPrefix,"machineClassName": schemeObj.getMachineClassName(), "humanClassName": schemeObj.getClassName(), "variableName": self.makeVarName(schemeObj), "stringProperties": stringProps, "numberProperties": numberProps, "booleanProperties": booleanProps, "dataProperties": dataProps, "dateProperties": dateProps, "arrayProperties": arrayProps, "undefinedProperties": undefineProps, "objectProperties": objectProps} + + hashParams["_uppercase"] = self.lambda_uppercase + hashParams["_lowercase"] = self.lambda_lowercase + hashParams["_capitalize"] = self.lambda_capitalize + hashParams["_upper_camelcase"] = self.lambda_upper_camelcase + hashParams["_camelcase"] = self.lambda_camelcase + hashParams["_snakecase"] = self.lambda_snakecase + hashParams["_upper_snakecase"] = self.lambda_upper_snakecase if schemeObj.getScheme(schemeObj.base_type): hashParams['baseClassName'] = schemeObj.getScheme(schemeObj.base_type).getClassName() @@ -193,7 +252,7 @@ def machine_file_content(self, schemeObj, template_file) : hashParams['baseTypeIsObject'] = True # render - sourceString = Renderer().render(template_file.read(), hashParams) + sourceString = self.mustache_renderer.render(template_file.read(), hashParams) return sourceString diff --git a/templates/_header.h.mustache b/templates/_header.h.mustache index 410802c..017b8a1 100644 --- a/templates/_header.h.mustache +++ b/templates/_header.h.mustache @@ -78,23 +78,11 @@ {{/baseTypeIsObject}} {{#arrayProperties}} {{#hasMultipleSubtypes}} -{{#hasCustomType}} -{{#className}} -- ({{className}} *){{subtype}}In{{capitalizeVarName}}AtIndex:(NSUInteger)index withError:(NSError **)error; -{{/className}} -{{/hasCustomType}} -{{#hasNumberType}} -- (NSNumber *){{subtype}}In{{capitalizeVarName}}AtIndex:(NSUInteger)index withError:(NSError **)error; -{{/hasNumberType}} -{{#hasStringType}} -- (NSString *){{subtype}}In{{capitalizeVarName}}AtIndex:(NSUInteger)index withError:(NSError **)error; -{{/hasStringType}} -{{#hasDateType}} -- (NSDate *){{subtype}}In{{capitalizeVarName}}AtIndex:(NSUInteger)index withError:(NSError **)error; -{{/hasDateType}} +{{> templates/array_property}} {{/hasMultipleSubtypes}} {{/arrayProperties}} {{#undefinedProperties}} +{{> templates/multiple_property}} {{/undefinedProperties}} {{^arrayProperties}} diff --git a/templates/array_property.mustache b/templates/array_property.mustache new file mode 100644 index 0000000..f18cc76 --- /dev/null +++ b/templates/array_property.mustache @@ -0,0 +1,14 @@ +{{#hasCustomType}} +{{#className}} +- ({{className}} *){{type}}In{{capitalizeVarName}}AtIndex:(NSUInteger)index withError:(NSError **)error; +{{/className}} +{{/hasCustomType}} +{{#hasNumberType}} +- (NSNumber *){{type}}In{{capitalizeVarName}}AtIndex:(NSUInteger)index withError:(NSError **)error; +{{/hasNumberType}} +{{#hasStringType}} +- (NSString *){{type}}In{{capitalizeVarName}}AtIndex:(NSUInteger)index withError:(NSError **)error; +{{/hasStringType}} +{{#hasDateType}} +- (NSDate *){{type}}In{{capitalizeVarName}}AtIndex:(NSUInteger)index withError:(NSError **)error; +{{/hasDateType}} diff --git a/templates/multiple_property.mustache b/templates/multiple_property.mustache new file mode 100644 index 0000000..851c21a --- /dev/null +++ b/templates/multiple_property.mustache @@ -0,0 +1,17 @@ +{{#hasCustomType}} +{{#className}} +- ({{className}} *){{name}}As{{#_upper_camelcase}}{{type}}{{/_upper_camelcase}}:(NSError **)error; +{{/className}} +{{^className}} +- (NSString *){{name}}As{{#_upper_camelcase}}{{type}}{{/_upper_camelcase}}:(NSError **)error; +{{/className}} +{{/hasCustomType}} +{{#hasNumberType}} +- (NSNumber *){{name}}AsNumber:(NSError **)error; +{{/hasNumberType}} +{{#hasStringType}} +- (NSString *){{name}}AsString:(NSError **)error; +{{/hasStringType}} +{{#hasDateType}} +- (NSDate *){{name}}AsDate:(NSError **)error; +{{/hasDateType}} From 701d4b2e05ebf3785348b48ee78e9acd080c9bff Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Franc=CC=A7ois=20Benaiteau?= <francois.benaiteau@sinnerschrader-mobile.com> Date: Wed, 23 Apr 2014 18:32:06 +0200 Subject: [PATCH 071/149] Fixes array property again --- ObjectiveCCodeGenerator.py | 6 +++--- templates/array_property.mustache | 8 ++++---- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/ObjectiveCCodeGenerator.py b/ObjectiveCCodeGenerator.py index e996987..d7415c8 100755 --- a/ObjectiveCCodeGenerator.py +++ b/ObjectiveCCodeGenerator.py @@ -125,15 +125,15 @@ def process_subtypes(self, propObj, propertyHash) : key = 'hasCustomType' if subtype in propObj.naturalTypeList: key = 'has'+ subtype.capitalize() + 'Type' - propertyHash[key] = {"type": subtype} + propertyHash[key] = {"subtype": subtype} elif subtype == "any": print "skip 'any' type for" + propertyHash['name'] else: if propObj.getScheme(subtype).base_type in propObj.naturalTypeList: key = 'has'+ propObj.getScheme(subtype).base_type.capitalize() + 'Type' - propertyHash[key] = {"type": subtype} + propertyHash[key] = {"subtype": subtype} else: - propertyHash[key] = {"type": subtype, "className": propObj.getScheme(subtype).getClassName()} + propertyHash[key] = {"subtype": subtype, "className": propObj.getScheme(subtype).getClassName()} def process_properties(self, propObj, undefined = False) : capitalizeVarName = self.makeVarName(propObj) diff --git a/templates/array_property.mustache b/templates/array_property.mustache index f18cc76..ca62b26 100644 --- a/templates/array_property.mustache +++ b/templates/array_property.mustache @@ -1,14 +1,14 @@ {{#hasCustomType}} {{#className}} -- ({{className}} *){{type}}In{{capitalizeVarName}}AtIndex:(NSUInteger)index withError:(NSError **)error; +- ({{className}} *){{subtype}}In{{capitalizeVarName}}AtIndex:(NSUInteger)index withError:(NSError **)error; {{/className}} {{/hasCustomType}} {{#hasNumberType}} -- (NSNumber *){{type}}In{{capitalizeVarName}}AtIndex:(NSUInteger)index withError:(NSError **)error; +- (NSNumber *){{subtype}}In{{capitalizeVarName}}AtIndex:(NSUInteger)index withError:(NSError **)error; {{/hasNumberType}} {{#hasStringType}} -- (NSString *){{type}}In{{capitalizeVarName}}AtIndex:(NSUInteger)index withError:(NSError **)error; +- (NSString *){{subtype}}In{{capitalizeVarName}}AtIndex:(NSUInteger)index withError:(NSError **)error; {{/hasStringType}} {{#hasDateType}} -- (NSDate *){{type}}In{{capitalizeVarName}}AtIndex:(NSUInteger)index withError:(NSError **)error; +- (NSDate *){{subtype}}In{{capitalizeVarName}}AtIndex:(NSUInteger)index withError:(NSError **)error; {{/hasDateType}} From 23f8679e00e39a961af07db4d1b0b93bafc4359e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Franc=CC=A7ois=20Benaiteau?= <francois.benaiteau@sinnerschrader-mobile.com> Date: Fri, 9 May 2014 16:55:52 +0200 Subject: [PATCH 072/149] WIP dealing with @class definition for properties --- ObjectiveCCodeGenerator.py | 6 +++++- readJSON_test.py | 3 ++- templates/_header.h.mustache | 12 ++++++++++-- templates/array_property.mustache | 12 ++++++++++++ 4 files changed, 29 insertions(+), 4 deletions(-) diff --git a/ObjectiveCCodeGenerator.py b/ObjectiveCCodeGenerator.py index d7415c8..d267939 100755 --- a/ObjectiveCCodeGenerator.py +++ b/ObjectiveCCodeGenerator.py @@ -128,12 +128,16 @@ def process_subtypes(self, propObj, propertyHash) : propertyHash[key] = {"subtype": subtype} elif subtype == "any": print "skip 'any' type for" + propertyHash['name'] + propertyHash['hasAnyType'] = {"subtype": "object"} else: if propObj.getScheme(subtype).base_type in propObj.naturalTypeList: key = 'has'+ propObj.getScheme(subtype).base_type.capitalize() + 'Type' propertyHash[key] = {"subtype": subtype} else: - propertyHash[key] = {"subtype": subtype, "className": propObj.getScheme(subtype).getClassName()} + if key in propertyHash: + propertyHash[key]["subtypes"].append({"subtype": subtype, "className": propObj.getScheme(subtype).getClassName()}) + else: + propertyHash[key] = { "subtypes": [{"subtype": subtype, "className": propObj.getScheme(subtype).getClassName()}]} def process_properties(self, propObj, undefined = False) : capitalizeVarName = self.makeVarName(propObj) diff --git a/readJSON_test.py b/readJSON_test.py index 42a7cd0..d727264 100644 --- a/readJSON_test.py +++ b/readJSON_test.py @@ -14,5 +14,6 @@ def execute_script(self, json_file, output_dir): # ignoring template files os.system("rm -rf src/Utilities") # return os.system("diff -r src/ " + output_dir) - common_file = "/AbstractInterfaceFiles/_ProductDetailJSONObject.h" + # common_file = "/AbstractInterfaceFiles/_ProductDetailJSONObject.h" + common_file = "/AbstractInterfaceFiles/_SenderGroupJSONObject.h" return os.system("diff -r -B src" + common_file + " " + output_dir + common_file) diff --git a/templates/_header.h.mustache b/templates/_header.h.mustache index 017b8a1..363412b 100644 --- a/templates/_header.h.mustache +++ b/templates/_header.h.mustache @@ -13,6 +13,16 @@ @class {{className}}; {{/objectProperties}} +{{#arrayProperties}} + +{{#hasCustomType}} +{{.}} +{{#subtypes}} +@class {{className}}; +{{/subtypes}} +{{/hasCustomType}} +{{/arrayProperties}} + @class {{humanClassName}}; {{#baseTypeIsObject}} @@ -77,9 +87,7 @@ - (NSDictionary *)propertyDictionary; {{/baseTypeIsObject}} {{#arrayProperties}} -{{#hasMultipleSubtypes}} {{> templates/array_property}} -{{/hasMultipleSubtypes}} {{/arrayProperties}} {{#undefinedProperties}} {{> templates/multiple_property}} diff --git a/templates/array_property.mustache b/templates/array_property.mustache index ca62b26..d21d7a5 100644 --- a/templates/array_property.mustache +++ b/templates/array_property.mustache @@ -1,3 +1,4 @@ +{{#hasMultipleSubtypes}} {{#hasCustomType}} {{#className}} - ({{className}} *){{subtype}}In{{capitalizeVarName}}AtIndex:(NSUInteger)index withError:(NSError **)error; @@ -9,6 +10,17 @@ {{#hasStringType}} - (NSString *){{subtype}}In{{capitalizeVarName}}AtIndex:(NSUInteger)index withError:(NSError **)error; {{/hasStringType}} +{{#hasBooleanType}} +- (BOOL ){{subtype}}In{{capitalizeVarName}}AtIndex:(NSUInteger)index withError:(NSError **)error; +{{/hasBooleanType}} {{#hasDateType}} - (NSDate *){{subtype}}In{{capitalizeVarName}}AtIndex:(NSUInteger)index withError:(NSError **)error; {{/hasDateType}} +{{#hasDataType}} +- (NSData *){{subtype}}In{{capitalizeVarName}}AtIndex:(NSUInteger)index withError:(NSError **)error; +{{/hasDataType}} +{{/hasMultipleSubtypes}} +{{#hasAnyType}} +- (id){{subtype}}In{{capitalizeVarName}}AtIndex:(NSUInteger)index withError:(NSError **)error; +{{/hasAnyType}} +{{.}} From 2970fa9c2484a6c3b3bcc5688bc8d5c93f31d0e2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Franc=CC=A7ois=20Benaiteau?= <francois.benaiteau@sinnerschrader-mobile.com> Date: Mon, 12 May 2014 14:42:57 +0200 Subject: [PATCH 073/149] Remove old methods --- ObjectiveCCodeGenerator.py | 580 ------------------------------------- 1 file changed, 580 deletions(-) diff --git a/ObjectiveCCodeGenerator.py b/ObjectiveCCodeGenerator.py index d267939..e4c8d9d 100755 --- a/ObjectiveCCodeGenerator.py +++ b/ObjectiveCCodeGenerator.py @@ -293,586 +293,6 @@ def write_file(self, filename, content) : writefile.close() - """ - getter method - """ - def getterMethodDefinitionStringInDictionary(self, returnTypeName, typeName, typeTitle, postFix) : - return "- (" + returnTypeName + ")" + typeName + "As" + typeTitle + postFix - - def getterMethodDefinitionStringInArray(self, returnTypeName, typeName, arrayName, postFix) : - return "- (" + returnTypeName + ")" + typeName + "In"+ arrayName + postFix - - def getTitledString(self, inputString) : - titledString = inputString.upper() - titledString = titledString[:1] + inputString[1:] - return titledString - - def getNaturalTypeClassTitleString(self,typeName) : - titleString = self.getTitledString(typeName) - if typeName == "boolean" or typeName == "string" or typeName == "date" or typeName == "data" or typeName == "number" or typeName == "array" : - return titleString - else : - return "Object" - - def getNaturalTypeClassString(self,typeName) : - if typeName == "boolean" : - return "BOOL " - elif typeName == "string" : - return "NSString *" - elif typeName == "date" : - return "NSDate *" - elif typeName == "data" : - return "NSData *" - elif typeName == "number" : - return "NSNumber *" - elif typeName == "array" : - return "NSArray *" - else : - return "id " - - def getterMethodDefinitionString(self, schemeObj) : - resultStringList= [] - - titleName = schemeObj.type_name.upper() - titleName = titleName[:1] + schemeObj.type_name[1:] - postFix = ":(NSError **)error;\n" - - if schemeObj.rootBaseType() == "multi" : - for schemeName in schemeObj.getBaseTypes() : - #print "(getterMethodDefinitionString : multi) : find scheme : " + schemeName + " from : " + schemeObj.type_name - if schemeObj.hasScheme(schemeName) : - baseSubTypeSchemeObj = schemeObj.getScheme(schemeName) - baseSubTypeTitle = baseSubTypeSchemeObj.type_name.upper() - baseSubTypeTitle = baseSubTypeTitle[:1] + baseSubTypeSchemeObj.type_name[1:] - - if baseSubTypeSchemeObj.isNaturalType() == False : - resultStringList.append(self.getterMethodDefinitionStringInDictionary(baseSubTypeSchemeObj.getClassName() + " *", schemeObj.type_name, baseSubTypeSchemeObj.getClassName(), postFix)) - else : - resultStringList.append(self.getterMethodDefinitionStringInDictionary(self.getNaturalTypeClassString(baseSubTypeSchemeObj.rootBaseType()), schemeObj.type_name, baseSubTypeTitle, postFix)) - - elif schemeName == "any" : - resultStringList.append(self.getterMethodDefinitionStringInDictionary("id", schemeObj.type_name, "Object", postFix)) - else : - resultStringList.append(self.getterMethodDefinitionStringInDictionary(self.getNaturalTypeClassString(schemeName), schemeObj.type_name, self.getNaturalTypeClassTitleString(schemeName),postFix)) - - elif schemeObj.rootBaseType() == "array" : - postFix = "AtIndex:(NSUInteger)index withError:(NSError **)error;\n"; - for schemeName in schemeObj.getSubType() : - #print "(getterMethodDefinitionString : array) : find scheme : " + schemeName + " from : " + schemeObj.type_name - if schemeObj.hasScheme(schemeName) : - baseSubTypeSchemeObj = schemeObj.getScheme(schemeName) - - if baseSubTypeSchemeObj.isNaturalType() == False : - resultStringList.append(self.getterMethodDefinitionStringInArray(baseSubTypeSchemeObj.getClassName() + " *", baseSubTypeSchemeObj.type_name, titleName, postFix)) - else : - resultStringList.append(self.getterMethodDefinitionStringInArray(self.getNaturalTypeClassString(baseSubTypeSchemeObj.rootBaseType()), baseSubTypeSchemeObj.type_name, titleName, postFix)) - - elif schemeName == "any" : - resultStringList.append(self.getterMethodDefinitionStringInArray("id", "object", titleName, postFix)) - else : - resultStringList.append(self.getterMethodDefinitionStringInArray(self.getNaturalTypeClassString(schemeName), schemeName, titleName, postFix)) - - elif schemeObj.base_type == "any" : - resultStringList.append(self.getterMethodDefinitionStringInDictionary("id", schemeObj.type_name, "Object", postFix)) - - elif schemeObj.isNaturalType() : - print "Error : " + schemeObj.type_name + " is Natural type. don't need to define getter method.\n" - resultStringList = [] - - else : - print "Error : " + schemeObj.type_name + " is Custom Object type. don't need to define getter method.\n" - resultStringList = [] - - return resultStringList - - def getterMethodString(self, schemeObj) : - resultString = "" - postFix = ":(NSError **)error {\n" - titleName = schemeObj.type_name.upper() - titleName = titleName[:1] + schemeObj.type_name[1:] - tmpVarName = "tmp" + self.getTitledString(schemeObj.type_name) - selfDicName = "self." + self.makeVarName(schemeObj) - - if schemeObj.rootBaseType() == "multi" : - for schemeName in schemeObj.getBaseTypes() : - #print "(getterMethodString : multi) : find scheme : " + schemeName + " from : " + schemeObj.type_name - if schemeObj.hasScheme(schemeName) : - baseSubTypeSchemeObj = schemeObj.getScheme(schemeName) - baseSubTypeTitle = baseSubTypeSchemeObj.type_name.upper() - baseSubTypeTitle = baseSubTypeTitle[:1] + baseSubTypeSchemeObj.type_name[1:] - - if baseSubTypeSchemeObj.isNaturalType() == False : - tmpDicName = "tmp" + self.getTitledString(schemeObj.type_name) + "Dic" - resultString += self.getterMethodDefinitionStringInDictionary(baseSubTypeSchemeObj.getClassName() + " *", schemeObj.type_name, baseSubTypeSchemeObj.getClassName(), postFix) - resultString += self.getDictionaryGetterFromDictionaryCode(tmpDicName, selfDicName, schemeObj.type_name, (schemeObj.required != True), 1, "nil") - resultString += self.getHandleErrorCode( tmpDicName +" == nil", "", "nil", 1) - resultString += " " + baseSubTypeSchemeObj.getClassName() + " *" + tmpVarName + " = nil;\n" - resultString += self.getObjectAllocatorFromDictionaryCode(False, baseSubTypeSchemeObj.getClassName(), tmpVarName, tmpDicName, (schemeObj.required != True), 1, "nil") - resultString += " return " + tmpVarName + ";\n}\n" - else : - resultString += self.getterMethodDefinitionStringInDictionary(self.getNaturalTypeClassString(baseSubTypeSchemeObj.rootBaseType()), schemeObj.type_name, baseSubTypeTitle, postFix) - resultString += self.getNaturalTypeGetterFromDictionaryCode(baseSubTypeSchemeObj, self.getNaturalTypeClassString(baseSubTypeSchemeObj.rootBaseType()), tmpVarName, selfDicName, schemeObj.type_name, (schemeObj.required != True), 1, "nil") - resultString += self.getHandleErrorCode( tmpVarName +" == nil", "", "nil", 1) - resultString += self.getNaturalTypeValidationCode(baseSubTypeSchemeObj, tmpVarName, 1, "nil") - resultString += " return " + tmpVarName + ";\n}\n" - - elif schemeName == "any" : - resultString += self.getterMethodDefinitionStringInDictionary("id", schemeObj.type_name, "Object", postFix) - resultString += self.getUndefinedTypeGetterFromDictionaryCode("id ", tmpVarName, selfDicName, schemeObj.type_name, (schemeObj.required != True), 1, "nil") - resultString += " return " + tmpVarName + ";\n}\n" - else : - resultString += self.getterMethodDefinitionStringInDictionary(self.getNaturalTypeClassString(schemeName), schemeObj.type_name, self.getNaturalTypeClassTitleString(schemeName),postFix) - resultString += self.getNaturalTypeGetterFromDictionaryCode(schemeName, self.getNaturalTypeClassString(schemeName), tmpVarName, selfDicName, schemeObj.type_name, (schemeObj.required != True), 1, "nil") - resultString += " return " + tmpVarName + ";\n}\n" - - elif schemeObj.rootBaseType() == "array" : - postFix = "AtIndex:(NSUInteger)index withError:(NSError **)error {\n"; - for schemeName in schemeObj.getSubType() : - if schemeObj.hasScheme(schemeName) : - #print "(getterMethodString : array) : find scheme : " + schemeName + " from : " + schemeObj.type_name - baseSubTypeSchemeObj = schemeObj.getScheme(schemeName) - - if baseSubTypeSchemeObj.isNaturalType() == False : - tmpDicName = "tmp" + self.getTitledString(schemeObj.type_name) + "Dic" - resultString += self.getterMethodDefinitionStringInArray(baseSubTypeSchemeObj.getClassName() + " *", baseSubTypeSchemeObj.type_name, titleName, postFix) - resultString += self.getDictionaryGetterFromArrayCode(tmpDicName, selfDicName, "index", (schemeObj.required != True), 1, "nil") - resultString += " " + baseSubTypeSchemeObj.getClassName() + " *" + tmpVarName + " = nil;\n" - resultString += self.getHandleErrorCode( tmpDicName +" == nil", "", "nil", 1) - resultString += self.getObjectAllocatorFromDictionaryCode(False, baseSubTypeSchemeObj.getClassName(), tmpVarName, tmpDicName, (schemeObj.required != True), 1, "nil") - resultString += " return " + tmpVarName + ";\n}\n" - - else : - resultString += self.getterMethodDefinitionStringInArray(self.getNaturalTypeClassString(baseSubTypeSchemeObj.rootBaseType()), baseSubTypeSchemeObj.type_name,titleName,postFix) - resultString += self.getNaturalTypeGetterFromArrayCode(baseSubTypeSchemeObj, self.getNaturalTypeClassString(baseSubTypeSchemeObj.rootBaseType()), tmpVarName, selfDicName, "index", (schemeObj.required != True), 1, "nil") - resultString += self.getNaturalTypeValidationCode(baseSubTypeSchemeObj, tmpVarName, 1, "nil") - resultString += " return " + tmpVarName + ";\n}\n" - - - elif schemeName == "any" : - resultString += self.getterMethodDefinitionStringInArray("id", "object", titleName, postFix) - resultString += self.getGetterFromArrayCode("id ", tmpVarName, selfDicName, "index", (schemeObj.required != True), 1, "nil") - resultString += " return " + tmpVarName + ";\n}\n" - else : - resultString += self.getterMethodDefinitionStringInArray(self.getNaturalTypeClassString(schemeName), schemeName, titleName, postFix) - resultString += self.getNaturalTypeGetterFromArrayCode(schemeName, self.getNaturalTypeClassString(schemeName), tmpVarName, selfDicName, "index", (schemeObj.required != True), 1, "nil") - resultString += " return " + tmpVarName + ";\n}\n" - - elif schemeObj.base_type == "any" : - resultString += self.getterMethodDefinitionStringInDictionary("id", schemeObj.type_name, "Object", postFix) - resultString += self.getUndefinedTypeGetterFromDictionaryCode("id ", tmpVarName, selfDicName, schemeObj.type_name, (schemeObj.required != True), 1, "nil") - resultString += " return " + tmpVarName + ";\n}\n" - - elif schemeObj.isNaturalType() : - print "Error : " + schemeObj.type_name + " is Natural type. don't need to implement getter method.\n" - return "#error " + schemeObj.type_name + " is Natural type. don't need to implement getter method.\n" - - else : - print "Error : " + schemeObj.type_name + " is Custom Object type. don't need to implement getter method.\n" - return "#error " + schemeObj.type_name + " is Custom Object type. don't need to implement getter method.\n" - - return resultString - - def getIndentString(self, indentDepth) : - resultString = "" - indentString = " " - for loop in range(indentDepth) : - resultString += indentString - - return resultString - - def getHandleErrorCode(self, statement, errorString, returnVarName, indentDepth) : - resultString = "" - firstIndent = self.getIndentString(indentDepth) - secondIndent = self.getIndentString(indentDepth+1) - resultString += firstIndent + "if ("+ statement + ") {\n" - if len(errorString) : - resultString += secondIndent + errorString - resultString += secondIndent + "return " + returnVarName + ";\n" + firstIndent + "}\n" - return resultString - - def getStringValidationCode(self, schemeObj, varName, indentDepth, returnVarName) : - resultString = "" - statementString = "" - firstIndent = self.getIndentString(indentDepth) - secondIndent = self.getIndentString(indentDepth+1) - errorString = "NSDictionary *userInfo = [NSDictionary dictionaryWithObjectsAndKeys:@\"" + self.makeVarName(schemeObj) + "\", @\"propertyName\", @\"" + schemeObj.type_name + "\", @\"key\", @\"validation error\", @\"reason\", NSStringFromClass([self class]), @\"objectClass\",nil];\n" - errorString += secondIndent + "*error = [NSError errorWithDomain:k" + self.projectPrefix + "ErrorDomain_parser code:k" + self.projectPrefix + "ErrorDomain_parser_valueIsNotValid userInfo:userInfo];\n" - errorString += secondIndent + "NSLog(@\"%@\", *error);\n" - - maxResult = schemeObj.getMaxLength() - - if maxResult[0] : - statementString = str(varName) + ".length > " + str(maxResult[1]) - resultString += self.getHandleErrorCode(statementString, errorString, returnVarName, indentDepth) - - minResult = schemeObj.getMinLength() - if minResult[0] : - statementString = varName + ".length < " + str(minResult[1]) - resultString += self.getHandleErrorCode(statementString, errorString, returnVarName, indentDepth) - - regExResult = schemeObj.getRegex() - if regExResult[0] : - statementString = varName + " && ["+varName+" matchesRegExString:@\"" +str(regExResult[1])+ "\"] == NO" - resultString += self.getHandleErrorCode(statementString, errorString, returnVarName, indentDepth) - - return resultString - - def getDateValidationCode(self, schemeObj, varName, indentDepth, returnVarName) : - resultString = "" - statementString = "" - firstIndent = self.getIndentString(indentDepth) - secondIndent = self.getIndentString(indentDepth+1) - errorString = "NSDictionary *userInfo = [NSDictionary dictionaryWithObjectsAndKeys:@\"" + self.makeVarName(schemeObj) + "\", @\"propertyName\", @\"" + schemeObj.type_name + "\", @\"key\", @\"validation error\", @\"reason\", NSStringFromClass([self class]), @\"objectClass\",nil];\n" - errorString += secondIndent + "*error = [NSError errorWithDomain:k" + self.projectPrefix + "ErrorDomain_parser code:k" + self.projectPrefix + "ErrorDomain_parser_valueIsNotValid userInfo:userInfo];\n" - errorString += secondIndent + "NSLog(@\"%@\", *error);\n" - - maxResult = schemeObj.getMaxValue() - if maxResult[0] : - statementString = "["+varName+" timeIntervalSince1970] > " + str(maxResult[1]) - resultString += self.getHandleErrorCode(statementString, errorString, returnVarName, indentDepth) - - minResult = schemeObj.getMinValue() - if minResult[0] : - statementString = "["+varName+" timeIntervalSince1970] < " + str(minResult[1]) - resultString += self.getHandleErrorCode(statementString, errorString, returnVarName, indentDepth) - - return resultString - - def getDataValidationCode(self, schemeObj, varName, indentDepth, returnVarName) : - resultString = "" - statementString = "" - firstIndent = self.getIndentString(indentDepth) - secondIndent = self.getIndentString(indentDepth+1) - errorString = "NSDictionary *userInfo = [NSDictionary dictionaryWithObjectsAndKeys:@\"" + self.makeVarName(schemeObj) + "\", @\"propertyName\", @\"" + schemeObj.type_name + "\", @\"key\", @\"validation error\", @\"reason\", NSStringFromClass([self class]), @\"objectClass\",nil];\n" - errorString += secondIndent + "*error = [NSError errorWithDomain:k" + self.projectPrefix + "ErrorDomain_parser code:k" + self.projectPrefix + "ErrorDomain_parser_valueIsNotValid userInfo:userInfo];\n" - errorString += secondIndent + "NSLog(@\"%@\", *error);\n" - - maxResult = schemeObj.getMaxLength() - if maxResult[0] : - statementString = varName+".length > " + str(maxResult[1]) - resultString += self.getHandleErrorCode(statementString, errorString, returnVarName, indentDepth) - - minResult = schemeObj.getMinLength() - if minResult[0] : - statementString = varName+".length < " + str(minResult[1]) - resultString += self.getHandleErrorCode(statementString, errorString, returnVarName, indentDepth) - - return resultString - - def getNumberValidationCode(self, schemeObj, varName, indentDepth, returnVarName) : - resultString = "" - statementString = "" - firstIndent = self.getIndentString(indentDepth) - secondIndent = self.getIndentString(indentDepth+1) - errorString = "NSDictionary *userInfo = [NSDictionary dictionaryWithObjectsAndKeys:@\"" + self.makeVarName(schemeObj) + "\", @\"propertyName\", @\"" + schemeObj.type_name + "\", @\"key\", @\"validation error\", @\"reason\", NSStringFromClass([self class]), @\"objectClass\",nil];\n" - errorString += secondIndent + "*error = [NSError errorWithDomain:k" + self.projectPrefix + "ErrorDomain_parser code:k" + self.projectPrefix + "ErrorDomain_parser_valueIsNotValid userInfo:userInfo];\n" - errorString += secondIndent + "NSLog(@\"%@\", *error);\n" - - maxResult = schemeObj.getMaxValue() - if maxResult[0] : - statementString = "["+varName+" floatValue] > " + str(maxResult[1]) - resultString += self.getHandleErrorCode(statementString, errorString, returnVarName, indentDepth) - - minResult = schemeObj.getMinValue() - if minResult[0] : - statementString = "["+varName+" floatValue] < " + str(minResult[1]) - resultString += self.getHandleErrorCode(statementString, errorString, returnVarName, indentDepth) - return resultString - - def getArrayValidationCode(self, schemeObj, varName, indentDepth, returnVarName) : - resultString = "" - statementString = "" - firstIndent = self.getIndentString(indentDepth) - secondIndent = self.getIndentString(indentDepth+1) - errorString = "NSDictionary *userInfo = [NSDictionary dictionaryWithObjectsAndKeys:@\"" + self.makeVarName(schemeObj) + "\", @\"propertyName\", @\"" + schemeObj.type_name + "\", @\"key\", @\"validation error\", @\"reason\", NSStringFromClass([self class]), @\"objectClass\",nil];\n" - errorString += secondIndent + "*error = [NSError errorWithDomain:k" + self.projectPrefix + "ErrorDomain_parser code:k" + self.projectPrefix + "ErrorDomain_parser_valueIsNotValid userInfo:userInfo];\n" - errorString += secondIndent + "NSLog(@\"%@\", *error);\n" - - maxResult = schemeObj.getMaxCount() - if maxResult[0] : - statementString = varName+".count > " + str(maxResult[1]) - resultString += self.getHandleErrorCode(statementString, errorString, returnVarName, indentDepth) - - minResult = schemeObj.getMinCount() - if minResult[0] : - statementString = varName+".count < " + str(minResult[1]) - resultString += self.getHandleErrorCode(statementString, errorString, returnVarName, indentDepth) - - return resultString - - def getNaturalTypeValidationCode(self, schemeObj, varName, indentDepth, returnVarName) : - if schemeObj.isNaturalType() : - if schemeObj.rootBaseType() == "array" : - return self.getArrayValidationCode(schemeObj, varName, indentDepth, returnVarName) - elif schemeObj.rootBaseType() == "string" : - return self.getStringValidationCode(schemeObj, varName, indentDepth, returnVarName) - elif schemeObj.rootBaseType() == "number" : - return self.getNumberValidationCode(schemeObj, varName, indentDepth, returnVarName) - elif schemeObj.rootBaseType() == "date" : - return self.getDateValidationCode(schemeObj, varName, indentDepth, returnVarName) - elif schemeObj.rootBaseType() == "data" : - return self.getDataValidationCode(schemeObj, varName, indentDepth, returnVarName) - - return "" - - - def getNaturalTypeGetterFromDictionaryCode(self, schemeObj, className, varName, dicName, keyName, allowNull, indentDepth, returnVarName) : - schemeBaseType = "" - if type(schemeObj) == str or type(schemeObj) == unicode: - schemeBaseType = str(schemeObj) - elif schemeObj.isNaturalType() : - schemeBaseType = str(schemeObj.rootBaseType()) - else : - print "Error (getNaturalTypeGetterFromDictionaryCode): undfined scheme base type " + schemeObj - return "#error - undfined scheme base type\n" - resultString = "" - firstIndent = self.getIndentString(indentDepth) - secondIndent = self.getIndentString(indentDepth+1) - - if schemeBaseType == "array" : - resultString += firstIndent + className + varName + " = [" + self.projectPrefix + "APIParser arrayFromResponseDictionary:" + dicName + " forKey:@\"" + keyName + "\" acceptNil:" - elif schemeBaseType == "string" : - resultString += firstIndent + className + varName + " = [" + self.projectPrefix + "APIParser stringFromResponseDictionary:" + dicName + " forKey:@\"" + keyName + "\" acceptNumber:NO acceptNil:" - elif schemeBaseType == "number" : - resultString += firstIndent + className + varName + " = [" + self.projectPrefix + "APIParser numberFromResponseDictionary:" + dicName + " forKey:@\"" + keyName + "\" acceptNil:" - elif schemeBaseType == "date" : - resultString += firstIndent + className + varName + " = [" + self.projectPrefix + "APIParser dateWithTimeIntervalFromResponseDictionary:" + dicName + " forKey:@\"" + keyName + "\" acceptNil:" - elif schemeBaseType == "data" : - resultString += firstIndent + className + varName + " = [" + self.projectPrefix + "APIParser dataFromResponseDictionary:" + dicName + " forKey:@\"" + keyName + "\" acceptNil:" - elif schemeBaseType == "boolean" : - resultString += firstIndent + className + varName + " = [" + self.projectPrefix + "APIParser boolFromResponseDictionary:" + dicName + " forKey:@\"" + keyName + "\" acceptNil:" - else : - print "Error (getNaturalTypeGetterFromDictionaryCode): undfined scheme natural base type " + schemeObj - return "#error - undfined scheme natural base type\n" - - if allowNull : - resultString += "YES" - else : - resultString += "NO" - resultString += " error:error];\n" - resultString += self.getHandleErrorCode("*error", "", returnVarName, indentDepth) - - return resultString - - def getUndefinedTypeGetterFromDictionaryCode(self, className, varName, dicName, keyName, allowNull, indentDepth, returnVarName) : - resultString = "" - firstIndent = self.getIndentString(indentDepth) - secondIndent = self.getIndentString(indentDepth+1) - - resultString += firstIndent - if className and len(className) : - resultString += className - resultString += varName + " = [" + self.projectPrefix + "APIParser objectFromResponseDictionary:" + dicName + " forKey:@\"" + keyName + "\" acceptNil:" - - if allowNull : - resultString += "YES" - else : - resultString += "NO" - resultString += " error:error];\n" - resultString += self.getHandleErrorCode("*error", "", returnVarName, indentDepth) - - return resultString - - def getNaturalTypeGetterFromArrayCode(self, schemeObj, className, varName, arrayName, indexVar, allowNull, indentDepth, returnVarName) : - schemeBaseType = "" - if type(schemeObj) == str or type(schemeObj) == unicode: - schemeBaseType = str(schemeObj) - elif schemeObj.isNaturalType() : - schemeBaseType = str(schemeObj.rootBaseType()) - else : - print "Error (getNaturalTypeGetterFromArrayCode): undfined scheme base type " + schemeObj - return "#error - undfined scheme base type\n" - - resultString = "" - firstIndent = self.getIndentString(indentDepth) - secondIndent = self.getIndentString(indentDepth+1) - - if schemeBaseType == "array" : - resultString += firstIndent + className + varName + " = [" + self.projectPrefix + "APIParser arrayFromResponseArray:" + arrayName + " atIndex:" + indexVar + " acceptNil:" - elif schemeBaseType == "string" : - resultString += firstIndent + className + varName + " = [" + self.projectPrefix + "APIParser stringFromResponseArray:" + arrayName + " atIndex:" + indexVar + " acceptNil:" - elif schemeBaseType == "number" : - resultString += firstIndent + className + varName + " = [" + self.projectPrefix + "APIParser numberFromResponseArray:" + arrayName + " atIndex:" + indexVar + " acceptNil:" - elif schemeBaseType == "date" : - resultString += firstIndent + className + varName + " = [" + self.projectPrefix + "APIParser dateWithTimeIntervalFromResponseArray:" + arrayName + " atIndex:" + indexVar + " acceptNil:" - elif schemeBaseType == "data" : - resultString += firstIndent + className + varName + " = [" + self.projectPrefix + "APIParser dataFromResponseArray:" + arrayName + " atIndex:" + indexVar + " acceptNil:" - elif schemeBaseType == "boolean" : - resultString += firstIndent + className + varName + " = [" + self.projectPrefix + "APIParser boolFromResponseArray:" + arrayName + " atIndex:" + indexVar + " acceptNil:" - else : - print "Error (getNaturalTypeGetterFromArrayCode): undfined scheme natural base type " + schemeObj - return "#error - undfined scheme natural base type\n" - - if allowNull : - resultString += "YES" - else : - resultString += "NO" - resultString += " error:error];\n" - resultString += self.getHandleErrorCode("*error", "", returnVarName, indentDepth) - - return resultString - - def getDictionaryGetterFromDictionaryCode(self, varName, dicName, keyName, allowNull, indentDepth, returnVarName) : - resultString = "" - firstIndent = self.getIndentString(indentDepth) - secondIndent = self.getIndentString(indentDepth+1) - - resultString += firstIndent + "NSDictionary *"+ varName + " = [" + self.projectPrefix + "APIParser dictionaryFromResponseDictionary:" + dicName + " forKey:@\"" + keyName + "\" acceptNil:" - if allowNull : - resultString += "YES" - else : - resultString += "NO" - resultString += " error:error];\n" - resultString += self.getHandleErrorCode("*error", "", returnVarName, indentDepth) - return resultString - - def getDictionaryGetterFromArrayCode(self, varName, arrayName, indexVar, allowNull, indentDepth, returnVarName) : - resultString = "" - firstIndent = self.getIndentString(indentDepth) - secondIndent = self.getIndentString(indentDepth+1) - - resultString += firstIndent + "NSDictionary *"+ varName + " = [" + self.projectPrefix + "APIParser dictionaryFromResponseArray:" + arrayName + " atIndex:" + indexVar + " acceptNil:" - if allowNull : - resultString += "YES" - else : - resultString += "NO" - resultString += " error:error];\n" - resultString += self.getHandleErrorCode("*error", "", returnVarName, indentDepth) - - return resultString - - def getObjectAllocatorFromDictionaryCode(self, defineClass, className, varName, dicName, allowNull, indentDepth, returnVarName) : - resultString = "" - firstIndent = self.getIndentString(indentDepth) - secondIndent = self.getIndentString(indentDepth+1) - resultString += firstIndent + "if (" + dicName + ") {\n" - resultString += secondIndent - if defineClass : - resultString += className+ " *" - resultString += varName + "= [[" + className + " alloc] initWithDictionary:" + dicName + " withError:error];\n" - resultString += self.getHandleErrorCode("*error", "", returnVarName, indentDepth + 1) - resultString += firstIndent + "}\n" - - return resultString - - def getDictionaryAllocatorCode(self, defineClass, varName, objectName, keyNmae, indentDepth, returnVarName) : - resultString = "" - firstIndent = self.getIndentString(indentDepth) - secondIndent = self.getIndentString(indentDepth+1) - - resultString += firstIndent - if defineClass : - resultString += "NSDictionary *" - resultString += varName + " = [NSDictionary dictionaryWithObjectsAndKeys:"+ objectName +", @\"" + keyNmae + "\", nil];\n" - - return resultString - - def getGetterFromDictionaryCode(self, className, varName, dicName, keyName, allowNull, indentDepth, returnVarName) : - resultString = "" - firstIndent = self.getIndentString(indentDepth) - secondIndent = self.getIndentString(indentDepth+1) - - resultString += firstIndent + className + varName + " = [" + self.projectPrefix + "APIParser objectFromResponseDictionary:" + dicName + " forKey:@\"" + keyName + "\" acceptNil:" - if allowNull : - resultString += "YES" - else : - resultString += "NO" - - resultString += " error:error];\n" - resultString += self.getHandleErrorCode("*error", "", returnVarName, indentDepth) - return resultString - - def getGetterFromArrayCode(self, className, varName, arrayName, indexVar, allowNull, indentDepth, returnVarName) : - resultString = "" - firstIndent = self.getIndentString(indentDepth) - secondIndent = self.getIndentString(indentDepth+1) - resultString += firstIndent + className + varName + " = [" + self.projectPrefix + "APIParser objectFromResponseArray:" + arrayName + " atIndex:" + indexVar - resultString += " acceptNil:" - if allowNull : - resultString += "YES" - else : - resultString += "NO" - resultString += " error:error];\n" - resultString += self.getHandleErrorCode("*error", "", returnVarName, indentDepth) - return resultString - - def propertyDefinitionString(self, schemeObj) : - resultString = "" - - if schemeObj.isNaturalType() : - if schemeObj.rootBaseType() == "boolean" : - return "@property (nonatomic, assign) BOOL " + self.makeVarName(schemeObj) + ";" - elif schemeObj.rootBaseType() == "string" : - return "@property (nonatomic, strong) NSString *" + self.makeVarName(schemeObj) + ";" - elif schemeObj.rootBaseType() == "date" : - return "@property (nonatomic, strong) NSDate *" + self.makeVarName(schemeObj) + ";" - elif schemeObj.rootBaseType() == "data" : - return "@property (nonatomic, strong) NSData *" + self.makeVarName(schemeObj) + ";" - elif schemeObj.rootBaseType() == "number" : - return "@property (nonatomic, strong) NSNumber *" + self.makeVarName(schemeObj) + ";" - elif schemeObj.rootBaseType() == "array" : - return "@property (nonatomic, strong) NSArray *" + self.makeVarName(schemeObj) + ";" - else : - return "@property (nonatomic, strong) id " + self.makeVarName(schemeObj) + ";" - - elif schemeObj.rootBaseType() == "multi" or schemeObj.rootBaseType() == "any" : - return "@property (nonatomic, strong) NSDictionary *" + self.makeVarName(schemeObj) + ";" - - - return "@property (nonatomic, strong) "+ schemeObj.getClassName() +" *" + self.makeVarName(schemeObj) + ";" - - def propertyDecodeString(self, schemeObj, indentDepth) : - firstIndent = self.getIndentString(indentDepth) - if schemeObj.isNaturalType() and schemeObj.rootBaseType() == "boolean" : - return firstIndent + "self." + self.makeVarName(schemeObj) + " = [coder decodeBoolForKey:@\"" + schemeObj.type_name + "\"];\n" - - return firstIndent + "self." + self.makeVarName(schemeObj) + " = [coder decodeObjectForKey:@\"" + schemeObj.type_name + "\"];\n" - - def propertyEncodeString(self, schemeObj, indentDepth) : - firstIndent = self.getIndentString(indentDepth) - if schemeObj.isNaturalType() and schemeObj.rootBaseType() == "boolean" : - return firstIndent + "[coder encodeBool:self." + self.makeVarName(schemeObj)+ " forKey:@\"" + schemeObj.type_name+"\"];\n" - - return firstIndent + "[coder encodeObject:self." + self.makeVarName(schemeObj)+ " forKey:@\"" + schemeObj.type_name+"\"];\n" - - def setPropertyDictionaryString(self, schemeObj, dicName, indentDepth) : - returnString = "" - firstIndent = self.getIndentString(indentDepth) - secondIndent = self.getIndentString(indentDepth + 1) - thirdIndent = self.getIndentString(indentDepth + 2) - returnString += firstIndent + "if (self." + self.makeVarName(schemeObj) + ") {\n" - if schemeObj.isNaturalType() : - if schemeObj.rootBaseType() == "boolean" : - returnString += secondIndent + "[" + dicName+ " setObject:[NSNumber numberWithBool:self." + self.makeVarName(schemeObj) + "] forKey:@\"" + schemeObj.type_name + "\"];\n" - elif schemeObj.rootBaseType() == "date" : - returnString += secondIndent + "[" + dicName+ " setObject:[NSNumber numberWithInteger:[[NSNumber numberWithDouble:[self." + self.makeVarName(schemeObj) + " timeIntervalSince1970]] longValue]] forKey:@\"" + schemeObj.type_name + "\"];\n"; - elif schemeObj.rootBaseType() == "array" : - arrayObjType = schemeObj.getSubType() - if arrayObjType and len(arrayObjType) == 1 and schemeObj.hasScheme(arrayObjType[0]) == True : - arraySchemeObj = schemeObj.getScheme(arrayObjType[0]) - returnString += secondIndent + "NSMutableArray *tmpArray = [[NSMutableArray alloc] init];\n" - if arraySchemeObj.rootBaseType() == "object" : - returnString += secondIndent + "for (" + arraySchemeObj.getClassName() + " *tmpObj in self." + self.makeVarName(schemeObj) + ") {\n" - returnString += thirdIndent + "[tmpArray addObject:[tmpObj propertyDictionary]];\n" - else : - returnString += secondIndent + "for (id tmpObj in self." + self.makeVarName(schemeObj) + ") {\n" - returnString += thirdIndent + "[tmpArray addObject:tmpObj];\n" - - returnString += secondIndent + "}\n" - returnString += secondIndent + "[" + dicName + " setObject:tmpArray forKey:@\"" + schemeObj.type_name + "\"];\n" - else : - returnString += secondIndent + "[" + dicName + " setObject:self." + self.makeVarName(schemeObj) + " forKey:@\"" + schemeObj.type_name + "\"];\n" - else : - returnString += secondIndent + "[" + dicName + " setObject:self." + self.makeVarName(schemeObj) + " forKey:@\"" + schemeObj.type_name + "\"];\n" - elif schemeObj.rootBaseType() == "multi" or schemeObj.rootBaseType() == "any" : - returnString += secondIndent + "[" + dicName + " setObject:self." + self.makeVarName(schemeObj) + " forKey:@\"" + schemeObj.type_name + "\"];\n" - else : - returnString += secondIndent + "[" + dicName + " setObject:[self." + self.makeVarName(schemeObj) + " propertyDictionary] forKey:@\"" + schemeObj.type_name + "\"];\n" - - returnString += firstIndent + "}\n" - return returnString - - class TemplateCodeGenerator : projectPrefix = "" From 9d1f94d61cfb4726d3a025178914676d29711be7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Franc=CC=A7ois=20Benaiteau?= <francois.benaiteau@sinnerschrader-mobile.com> Date: Mon, 12 May 2014 14:56:49 +0200 Subject: [PATCH 074/149] Fixes @class header definitions --- ObjectiveCCodeGenerator.py | 52 +++++++++++++------ templates/_header.h.mustache | 16 ++---- templates/array_property.mustache | 1 - .../_SenderGroupJSONObject.h | 3 +- 4 files changed, 41 insertions(+), 31 deletions(-) diff --git a/ObjectiveCCodeGenerator.py b/ObjectiveCCodeGenerator.py index e4c8d9d..1ff7891 100755 --- a/ObjectiveCCodeGenerator.py +++ b/ObjectiveCCodeGenerator.py @@ -51,7 +51,7 @@ def lambda_capitalize(self, text): return text.capitalize() def lambda_camelcase(self, text): - process_text = self.mustache_renderer.render(text, self.mustache_renderer.context) + process_text = Renderer().render(text, self.mustache_renderer.context) words = process_text.split('_') return ''.join(word.title() if i else word for i, word in enumerate(words)) @@ -113,6 +113,7 @@ def process_basetypes(self, propObj, propertyHash) : propertyHash[key] = {"type": subtype, "className": propObj.getScheme(subtype).getClassName()} def process_subtypes(self, propObj, propertyHash) : + classes = [] # dealing with array property if len(propObj.getSubType()) == 1: propertyHash['hasOneSubtype'] = True @@ -136,8 +137,12 @@ def process_subtypes(self, propObj, propertyHash) : else: if key in propertyHash: propertyHash[key]["subtypes"].append({"subtype": subtype, "className": propObj.getScheme(subtype).getClassName()}) + classes.append(propObj.getScheme(subtype).getClassName()) else: propertyHash[key] = { "subtypes": [{"subtype": subtype, "className": propObj.getScheme(subtype).getClassName()}]} + classes.append(propObj.getScheme(subtype).getClassName()) + + return classes def process_properties(self, propObj, undefined = False) : capitalizeVarName = self.makeVarName(propObj) @@ -150,7 +155,7 @@ def process_properties(self, propObj, undefined = False) : if propObj.rootBaseType() == "object": propertyHash['className'] = propObj.getClassName() - return propertyHash + return [], propertyHash if not undefined: hasRegex, regex = propObj.getRegex() @@ -166,10 +171,10 @@ def process_properties(self, propObj, undefined = False) : propertyHash['minLength'] = {"value": minLength} # dealing with array property - self.process_subtypes(propObj, propertyHash) + classes = self.process_subtypes(propObj, propertyHash) if propObj.rootBaseType() == "multi": self.process_basetypes(propObj, propertyHash) - return propertyHash + return classes, propertyHash def human_header_content(self, schemeObj) : templateFile = open(self.template_file_path("header.h.mustache"), "r") @@ -216,32 +221,45 @@ def machine_file_content(self, schemeObj, template_file) : arrayProps = [] undefineProps = [] objectProps = [] - + custom_classes = [] for prop in schemeObj.props: + classes = [] if prop.rootBaseType() == "object": - objectProps.append(self.process_properties(prop)) + classes, prop_hash = self.process_properties(prop) + objectProps.append(prop_hash) elif prop.rootBaseType() == "string": - stringProps.append(self.process_properties(prop)) + classes, prop_hash = self.process_properties(prop) + stringProps.append(prop_hash) elif prop.rootBaseType() == "number": - numberProps.append(self.process_properties(prop)) + classes, prop_hash = self.process_properties(prop) + numberProps.append(prop_hash) elif prop.rootBaseType() == "boolean": - booleanProps.append(self.process_properties(prop)) + classes, prop_hash = self.process_properties(prop) + booleanProps.append(prop_hash) elif prop.rootBaseType() == "data": - dataProps.append(self.process_properties(prop)) + classes, prop_hash = self.process_properties(prop) + dataProps.append(prop_hash) elif prop.rootBaseType() == "date": - dateProps.append(self.process_properties(prop)) + classes, prop_hash = self.process_properties(prop) + dateProps.append(prop_hash) elif prop.rootBaseType() == "array": - arrayProps.append(self.process_properties(prop)) + classes, prop_hash = self.process_properties(prop) + arrayProps.append(prop_hash) elif prop.rootBaseType() == "multi": - propHash = self.process_properties(prop, True) - undefineProps.append(propHash) + classes, prop_hash = self.process_properties(prop, True) + undefineProps.append(prop_hash) else: - undefineProps.append(self.process_properties(prop, True)) + classes, prop_hash = self.process_properties(prop, True) + undefineProps.append(prop_hash) + if(len(classes) > 0): + custom_classes.extend(classes) hashParams = {"date": str(today.year), "projectPrefix": schemeObj.projectPrefix,"machineClassName": schemeObj.getMachineClassName(), "humanClassName": schemeObj.getClassName(), "variableName": self.makeVarName(schemeObj), "stringProperties": stringProps, "numberProperties": numberProps, "booleanProperties": booleanProps, "dataProperties": dataProps, "dateProperties": dateProps, "arrayProperties": arrayProps, "undefinedProperties": undefineProps, "objectProperties": objectProps} - - + hashParams["custom_classes"] = [] + for classname in custom_classes: + if classname not in hashParams["custom_classes"]: + hashParams["custom_classes"].append(classname) hashParams["_uppercase"] = self.lambda_uppercase hashParams["_lowercase"] = self.lambda_lowercase hashParams["_capitalize"] = self.lambda_capitalize diff --git a/templates/_header.h.mustache b/templates/_header.h.mustache index 363412b..7299500 100644 --- a/templates/_header.h.mustache +++ b/templates/_header.h.mustache @@ -5,23 +5,17 @@ // Copyright (c) {{date}} SinnerSchrader Mobile. All rights reserved. #import <Foundation/Foundation.h> + {{^baseTypeIsObject}} #import "{{baseClassName}}.h" -{{/baseTypeIsObject}} +{{/baseTypeIsObject}} {{#objectProperties}} @class {{className}}; - {{/objectProperties}} -{{#arrayProperties}} - -{{#hasCustomType}} -{{.}} -{{#subtypes}} -@class {{className}}; -{{/subtypes}} -{{/hasCustomType}} -{{/arrayProperties}} +{{#custom_classes}} +@class {{.}}; +{{/custom_classes}} @class {{humanClassName}}; diff --git a/templates/array_property.mustache b/templates/array_property.mustache index d21d7a5..55674bf 100644 --- a/templates/array_property.mustache +++ b/templates/array_property.mustache @@ -23,4 +23,3 @@ {{#hasAnyType}} - (id){{subtype}}In{{capitalizeVarName}}AtIndex:(NSUInteger)index withError:(NSError **)error; {{/hasAnyType}} -{{.}} diff --git a/test_data/product/AbstractInterfaceFiles/_SenderGroupJSONObject.h b/test_data/product/AbstractInterfaceFiles/_SenderGroupJSONObject.h index 92b4f8a..9563228 100644 --- a/test_data/product/AbstractInterfaceFiles/_SenderGroupJSONObject.h +++ b/test_data/product/AbstractInterfaceFiles/_SenderGroupJSONObject.h @@ -6,8 +6,8 @@ #import <Foundation/Foundation.h> -@class SenderList2JSONObject; @class SenderListJSONObject; +@class SenderList2JSONObject; @class SenderGroupJSONObject; @@ -40,4 +40,3 @@ - (id)objectInIPTVSendersAtIndex:(NSUInteger)index withError:(NSError **)error; @end - From fdd4de2b1d7bbe18eecd69d6ae9d15211c396f01 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Franc=CC=A7ois=20Benaiteau?= <francois.benaiteau@sinnerschrader-mobile.com> Date: Mon, 12 May 2014 15:19:17 +0200 Subject: [PATCH 075/149] Fixes generation of custom methods for array --- ObjectiveCCodeGenerator.py | 12 +++++++++--- templates/array_property.mustache | 12 ++++++++++++ 2 files changed, 21 insertions(+), 3 deletions(-) diff --git a/ObjectiveCCodeGenerator.py b/ObjectiveCCodeGenerator.py index 1ff7891..68a9d26 100755 --- a/ObjectiveCCodeGenerator.py +++ b/ObjectiveCCodeGenerator.py @@ -126,14 +126,19 @@ def process_subtypes(self, propObj, propertyHash) : key = 'hasCustomType' if subtype in propObj.naturalTypeList: key = 'has'+ subtype.capitalize() + 'Type' - propertyHash[key] = {"subtype": subtype} + if key not in propertyHash: + propertyHash[key] = {"subtypes": [{"subtype": subtype}]} + else: + propertyHash[key]["subtypes"].append({"subtype": subtype}) elif subtype == "any": - print "skip 'any' type for" + propertyHash['name'] propertyHash['hasAnyType'] = {"subtype": "object"} else: if propObj.getScheme(subtype).base_type in propObj.naturalTypeList: key = 'has'+ propObj.getScheme(subtype).base_type.capitalize() + 'Type' - propertyHash[key] = {"subtype": subtype} + if key not in propertyHash: + propertyHash[key] = {"subtypes": [{"subtype": subtype}]} + else: + propertyHash[key]["subtypes"].append({"subtype": subtype}) else: if key in propertyHash: propertyHash[key]["subtypes"].append({"subtype": subtype, "className": propObj.getScheme(subtype).getClassName()}) @@ -244,6 +249,7 @@ def machine_file_content(self, schemeObj, template_file) : dateProps.append(prop_hash) elif prop.rootBaseType() == "array": classes, prop_hash = self.process_properties(prop) + print prop_hash arrayProps.append(prop_hash) elif prop.rootBaseType() == "multi": classes, prop_hash = self.process_properties(prop, True) diff --git a/templates/array_property.mustache b/templates/array_property.mustache index 55674bf..eea7456 100644 --- a/templates/array_property.mustache +++ b/templates/array_property.mustache @@ -1,23 +1,35 @@ {{#hasMultipleSubtypes}} {{#hasCustomType}} +{{#subtypes}} {{#className}} - ({{className}} *){{subtype}}In{{capitalizeVarName}}AtIndex:(NSUInteger)index withError:(NSError **)error; {{/className}} +{{/subtypes}} {{/hasCustomType}} {{#hasNumberType}} +{{#subtypes}} - (NSNumber *){{subtype}}In{{capitalizeVarName}}AtIndex:(NSUInteger)index withError:(NSError **)error; +{{/subtypes}} {{/hasNumberType}} {{#hasStringType}} +{{#subtypes}} - (NSString *){{subtype}}In{{capitalizeVarName}}AtIndex:(NSUInteger)index withError:(NSError **)error; +{{/subtypes}} {{/hasStringType}} {{#hasBooleanType}} +{{#subtypes}} - (BOOL ){{subtype}}In{{capitalizeVarName}}AtIndex:(NSUInteger)index withError:(NSError **)error; +{{/subtypes}} {{/hasBooleanType}} {{#hasDateType}} +{{#subtypes}} - (NSDate *){{subtype}}In{{capitalizeVarName}}AtIndex:(NSUInteger)index withError:(NSError **)error; +{{/subtypes}} {{/hasDateType}} {{#hasDataType}} +{{#subtypes}} - (NSData *){{subtype}}In{{capitalizeVarName}}AtIndex:(NSUInteger)index withError:(NSError **)error; +{{/subtypes}} {{/hasDataType}} {{/hasMultipleSubtypes}} {{#hasAnyType}} From 02365ca3fc8f819225ee87198bc41c4d1ae75bc9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Franc=CC=A7ois=20Benaiteau?= <francois.benaiteau@sinnerschrader-mobile.com> Date: Mon, 12 May 2014 15:24:52 +0200 Subject: [PATCH 076/149] make current tests pass --- templates/_header.h.mustache | 4 +--- templates/_source.m.mustache | 8 ++++++++ 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/templates/_header.h.mustache b/templates/_header.h.mustache index 7299500..afcf228 100644 --- a/templates/_header.h.mustache +++ b/templates/_header.h.mustache @@ -5,18 +5,16 @@ // Copyright (c) {{date}} SinnerSchrader Mobile. All rights reserved. #import <Foundation/Foundation.h> - {{^baseTypeIsObject}} #import "{{baseClassName}}.h" - {{/baseTypeIsObject}} + {{#objectProperties}} @class {{className}}; {{/objectProperties}} {{#custom_classes}} @class {{.}}; {{/custom_classes}} - @class {{humanClassName}}; {{#baseTypeIsObject}} diff --git a/templates/_source.m.mustache b/templates/_source.m.mustache index 6e61440..3b64f7f 100644 --- a/templates/_source.m.mustache +++ b/templates/_source.m.mustache @@ -139,6 +139,7 @@ {{#arrayProperties}} {{#hasMultipleSubtypes}} {{#hasCustomType}} +{{#subtypes}} {{#className}} - ({{className}} *){{subtype}}In{{capitalizeVarName}}AtIndex:(NSUInteger)index withError:(NSError **)error @@ -146,8 +147,10 @@ } {{/className}} +{{/subtypes}} {{/hasCustomType}} {{#hasStringType}} +{{#subtypes}} - (NSString *){{subtype}}In{{capitalizeVarName}}AtIndex:(NSUInteger)index withError:(NSError **)error { @@ -157,8 +160,10 @@ } return tmp{{capitalizeVarName}}; } +{{/subtypes}} {{/hasStringType}} {{#hasNumberType}} +{{#subtypes}} - (NSNumber *){{subtype}}In{{capitalizeVarName}}AtIndex:(NSUInteger)index withError:(NSError **)error { @@ -168,8 +173,10 @@ } return tmp{{capitalizeVarName}}; } +{{/subtypes}} {{/hasNumberType}} {{#hasDateType}} +{{#subtypes}} - (NSDate *){{subtype}}In{{capitalizeVarName}}AtIndex:(NSUInteger)index withError:(NSError **)error { @@ -179,6 +186,7 @@ } return tmp{{capitalizeVarName}}; } +{{/subtypes}} {{/hasDateType}} {{/hasMultipleSubtypes}} {{/arrayProperties}} From b6711528d39c986715b16dba572d1732a9ffa755 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Franc=CC=A7ois=20Benaiteau?= <francois.benaiteau@sinnerschrader-mobile.com> Date: Mon, 12 May 2014 15:30:48 +0200 Subject: [PATCH 077/149] all headers for product sample pass the tests --- readJSON_test.py | 4 +++- .../product/AbstractInterfaceFiles/_SenderList2JSONObject.h | 2 -- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/readJSON_test.py b/readJSON_test.py index d727264..4e98161 100644 --- a/readJSON_test.py +++ b/readJSON_test.py @@ -15,5 +15,7 @@ def execute_script(self, json_file, output_dir): os.system("rm -rf src/Utilities") # return os.system("diff -r src/ " + output_dir) # common_file = "/AbstractInterfaceFiles/_ProductDetailJSONObject.h" - common_file = "/AbstractInterfaceFiles/_SenderGroupJSONObject.h" + # common_file = "/AbstractInterfaceFiles/_SenderGroupJSONObject.h" + # common_file = "/AbstractInterfaceFiles/_SenderList2JSONObject.h" + common_file = "/AbstractInterfaceFiles/_SenderListJSONObject.h" return os.system("diff -r -B src" + common_file + " " + output_dir + common_file) diff --git a/test_data/product/AbstractInterfaceFiles/_SenderList2JSONObject.h b/test_data/product/AbstractInterfaceFiles/_SenderList2JSONObject.h index f7eadfc..d38477e 100644 --- a/test_data/product/AbstractInterfaceFiles/_SenderList2JSONObject.h +++ b/test_data/product/AbstractInterfaceFiles/_SenderList2JSONObject.h @@ -17,7 +17,5 @@ + (SenderList2JSONObject *)senderList2WithDictionary:(NSDictionary *)dic withError:(NSError **)error; - (id)initWithDictionary:(NSDictionary *)dic withError:(NSError **)error; -- (NSDictionary *)propertyDictionary; @end - From 856fa139140af6d3d8f8aef3531a3d54613ba930 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Franc=CC=A7ois=20Benaiteau?= <francois.benaiteau@sinnerschrader-mobile.com> Date: Mon, 12 May 2014 16:26:17 +0200 Subject: [PATCH 078/149] making tests pass for machine files --- readJSON_test.py | 4 +- templates/_source.m.mustache | 37 +++++++++++++++++++ .../_SenderJSONObject.m | 28 +++++++++----- .../_SenderListJSONObject.m | 23 ++++++++---- 4 files changed, 72 insertions(+), 20 deletions(-) diff --git a/readJSON_test.py b/readJSON_test.py index 4e98161..1e55e54 100644 --- a/readJSON_test.py +++ b/readJSON_test.py @@ -17,5 +17,5 @@ def execute_script(self, json_file, output_dir): # common_file = "/AbstractInterfaceFiles/_ProductDetailJSONObject.h" # common_file = "/AbstractInterfaceFiles/_SenderGroupJSONObject.h" # common_file = "/AbstractInterfaceFiles/_SenderList2JSONObject.h" - common_file = "/AbstractInterfaceFiles/_SenderListJSONObject.h" - return os.system("diff -r -B src" + common_file + " " + output_dir + common_file) + common_file = "/AbstractInterfaceFiles/_SenderListJSONObject.m" + return os.system("diff -r -w -b -B src" + common_file + " " + output_dir + common_file) diff --git a/templates/_source.m.mustache b/templates/_source.m.mustache index 3b64f7f..d26ad37 100644 --- a/templates/_source.m.mustache +++ b/templates/_source.m.mustache @@ -7,6 +7,9 @@ #import "{{projectPrefix}}APIParser.h" #import "NSString+RegExValidation.h" #import "{{humanClassName}}.h" +{{#custom_classes}} +#import "{{.}}.h" +{{/custom_classes}} @implementation {{machineClassName}} @@ -117,12 +120,32 @@ {{#hasDateType}} NSDate *tmpValue = [{{projectPrefix}}APIParser dateFromResponseArray:tmp{{capitalizeVarName}}Array atIndex:loop acceptNil:{{#required}}NO{{/required}}{{^required}}YES{{/required}} error:error]; {{/hasDateType}} + {{^hasCustomType}} if (*error) { return self; } if (tmpValue) { [tmp{{capitalizeVarName}} addObject:tmpValue]; } + {{/hasCustomType}} + {{#hasCustomType}} + NSDictionary *tmpDic = [APIParser dictionaryFromResponseArray:tmp{{capitalizeVarName}}Array atIndex:loop acceptNil:NO error:error]; + if (*error) { + return self; + } + {{#subtypes}} + {{className}}*tmpObject = nil; + if (tmpDic) { + tmpObject= [[{{className}} alloc] initWithDictionary:tmpDic withError:error]; + if (*error) { + return self; + } + } + if (tmpObject) { + [tmp{{capitalizeVarName}} addObject:tmpObject]; + } + {{/subtypes}} + {{/hasCustomType}} } self.{{varName}} = [NSArray arrayWithArray:tmp{{capitalizeVarName}}]; {{/hasOneSubtype}} @@ -295,6 +318,17 @@ } {{/dateProperties}} {{#arrayProperties}} + {{#hasCustomType}} + {{#subtypes}} + if (self.{{varName}}) { + NSMutableArray *tmpArray = [[NSMutableArray alloc] init]; + for ({{className}} *tmpObj in self.{{varName}}) { + [tmpArray addObject:[tmpObj propertyDictionary]]; + } + [dic setObject:tmpArray forKey:@"{{name}}"]; + } + {{/subtypes}} + {{/hasCustomType}} {{^hasCustomType}} if (self.{{varName}}) { [dic setObject:self.{{varName}} forKey:@"{{name}}"]; @@ -302,6 +336,9 @@ {{/hasCustomType}} {{/arrayProperties}} {{#objectProperties}} + if (self.{{varName}}) { + [dic setObject:self.{{varName}} forKey:@"{{name}}"]; + } {{/objectProperties}} {{#undefinedProperties}} {{/undefinedProperties}} diff --git a/test_data/product/AbstractInterfaceFiles/_SenderJSONObject.m b/test_data/product/AbstractInterfaceFiles/_SenderJSONObject.m index fa1e0b7..7a10297 100644 --- a/test_data/product/AbstractInterfaceFiles/_SenderJSONObject.m +++ b/test_data/product/AbstractInterfaceFiles/_SenderJSONObject.m @@ -13,13 +13,14 @@ @implementation _SenderJSONObject #pragma mark - factory -+ (SenderJSONObject *)senderWithDictionary:(NSDictionary *)dic withError:(NSError **)error { ++ (SenderJSONObject *)senderWithDictionary:(NSDictionary *)dic withError:(NSError **)error +{ return [[SenderJSONObject alloc] initWithDictionary:dic withError:error]; } - #pragma mark - initialize -- (id)initWithDictionary:(NSDictionary *)dic withError:(NSError **)error { +- (id)initWithDictionary:(NSDictionary *)dic withError:(NSError **)error +{ self = [super init]; if (self) { self.senderName = [APIParser stringFromResponseDictionary:dic forKey:@"senderName" acceptNumber:NO acceptNil:NO error:error]; @@ -34,23 +35,28 @@ - (id)initWithDictionary:(NSDictionary *)dic withError:(NSError **)error { return self; } - #pragma mark - getter #pragma mark - NSCoding -- (void)encodeWithCoder:(NSCoder*)coder { + +- (void)encodeWithCoder:(NSCoder*)coder +{ + [super encodeWithCoder:coder]; [coder encodeObject:self.senderName forKey:@"senderName"]; [coder encodeObject:self.previewImageURL forKey:@"previewImageURL"]; } -- (id)initWithCoder:(NSCoder *)coder { - self = [super init]; + +- (id)initWithCoder:(NSCoder *)coder +{ + self = [super initWithCoder:coder]; self.senderName = [coder decodeObjectForKey:@"senderName"]; self.previewImageURL = [coder decodeObjectForKey:@"previewImageURL"]; return self; } #pragma mark - Object Info -- (NSDictionary *)propertyDictionary { +- (NSDictionary *)propertyDictionary +{ NSMutableDictionary *dic = [[NSMutableDictionary alloc] init]; if (self.senderName) { [dic setObject:self.senderName forKey:@"senderName"]; @@ -60,8 +66,10 @@ - (NSDictionary *)propertyDictionary { } return dic; } -- (NSString *)description { - return [NSString stringWithFormat:@"%@",[self propertyDictionary]]; + +- (NSString *)description +{ + return [[self propertyDictionary] description]; } @end diff --git a/test_data/product/AbstractInterfaceFiles/_SenderListJSONObject.m b/test_data/product/AbstractInterfaceFiles/_SenderListJSONObject.m index acef913..db1d534 100644 --- a/test_data/product/AbstractInterfaceFiles/_SenderListJSONObject.m +++ b/test_data/product/AbstractInterfaceFiles/_SenderListJSONObject.m @@ -14,13 +14,15 @@ @implementation _SenderListJSONObject #pragma mark - factory -+ (SenderListJSONObject *)senderListWithDictionary:(NSDictionary *)dic withError:(NSError **)error { ++ (SenderListJSONObject *)senderListWithDictionary:(NSDictionary *)dic withError:(NSError **)error +{ return [[SenderListJSONObject alloc] initWithDictionary:dic withError:error]; } #pragma mark - initialize -- (id)initWithDictionary:(NSDictionary *)dic withError:(NSError **)error { +- (id)initWithDictionary:(NSDictionary *)dic withError:(NSError **)error +{ self = [super init]; if (self) { self.listTitle = [APIParser stringFromResponseDictionary:dic forKey:@"listTitle" acceptNumber:NO acceptNil:NO error:error]; @@ -57,19 +59,23 @@ - (id)initWithDictionary:(NSDictionary *)dic withError:(NSError **)error { #pragma mark - getter #pragma mark - NSCoding -- (void)encodeWithCoder:(NSCoder*)coder { +- (void)encodeWithCoder:(NSCoder*)coder +{ + [super encodeWithCoder:coder]; [coder encodeObject:self.listTitle forKey:@"listTitle"]; [coder encodeObject:self.senders forKey:@"senders"]; } -- (id)initWithCoder:(NSCoder *)coder { - self = [super init]; +- (id)initWithCoder:(NSCoder *)coder +{ + self = [super initWithCoder:coder]; self.listTitle = [coder decodeObjectForKey:@"listTitle"]; self.senders = [coder decodeObjectForKey:@"senders"]; return self; } #pragma mark - Object Info -- (NSDictionary *)propertyDictionary { +- (NSDictionary *)propertyDictionary +{ NSMutableDictionary *dic = [[NSMutableDictionary alloc] init]; if (self.listTitle) { [dic setObject:self.listTitle forKey:@"listTitle"]; @@ -83,8 +89,9 @@ - (NSDictionary *)propertyDictionary { } return dic; } -- (NSString *)description { - return [NSString stringWithFormat:@"%@",[self propertyDictionary]]; +- (NSString *)description +{ + return [[self propertyDictionary] description]; } @end From d34fa3446bb0b549d6645707d3192f3e46e61388 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Franc=CC=A7ois=20Benaiteau?= <francois.benaiteau@sinnerschrader-mobile.com> Date: Mon, 12 May 2014 16:44:01 +0200 Subject: [PATCH 079/149] make tests pass for senderList2 --- readJSON_test.py | 3 ++- .../_SenderList2JSONObject.m | 21 ++++++++++--------- 2 files changed, 13 insertions(+), 11 deletions(-) diff --git a/readJSON_test.py b/readJSON_test.py index 1e55e54..1c96dc4 100644 --- a/readJSON_test.py +++ b/readJSON_test.py @@ -17,5 +17,6 @@ def execute_script(self, json_file, output_dir): # common_file = "/AbstractInterfaceFiles/_ProductDetailJSONObject.h" # common_file = "/AbstractInterfaceFiles/_SenderGroupJSONObject.h" # common_file = "/AbstractInterfaceFiles/_SenderList2JSONObject.h" - common_file = "/AbstractInterfaceFiles/_SenderListJSONObject.m" + # common_file = "/AbstractInterfaceFiles/_SenderListJSONObject.m" + common_file = "/AbstractInterfaceFiles/_SenderList2JSONObject.m" return os.system("diff -r -w -b -B src" + common_file + " " + output_dir + common_file) diff --git a/test_data/product/AbstractInterfaceFiles/_SenderList2JSONObject.m b/test_data/product/AbstractInterfaceFiles/_SenderList2JSONObject.m index 7a9561e..fea7fdb 100644 --- a/test_data/product/AbstractInterfaceFiles/_SenderList2JSONObject.m +++ b/test_data/product/AbstractInterfaceFiles/_SenderList2JSONObject.m @@ -13,13 +13,15 @@ @implementation _SenderList2JSONObject #pragma mark - factory -+ (SenderList2JSONObject *)senderList2WithDictionary:(NSDictionary *)dic withError:(NSError **)error { ++ (SenderList2JSONObject *)senderList2WithDictionary:(NSDictionary *)dic withError:(NSError **)error +{ return [[SenderList2JSONObject alloc] initWithDictionary:dic withError:error]; } #pragma mark - initialize -- (id)initWithDictionary:(NSDictionary *)dic withError:(NSError **)error { +- (id)initWithDictionary:(NSDictionary *)dic withError:(NSError **)error +{ self = [super initWithDictionary:dic withError:error]; if (self) { self.listSubTitle = [APIParser stringFromResponseDictionary:dic forKey:@"listSubTitle" acceptNumber:NO acceptNil:NO error:error]; @@ -34,27 +36,26 @@ - (id)initWithDictionary:(NSDictionary *)dic withError:(NSError **)error { #pragma mark - getter #pragma mark - NSCoding -- (void)encodeWithCoder:(NSCoder*)coder { +- (void)encodeWithCoder:(NSCoder*)coder +{ [super encodeWithCoder:coder]; [coder encodeObject:self.listSubTitle forKey:@"listSubTitle"]; } -- (id)initWithCoder:(NSCoder *)coder { +- (id)initWithCoder:(NSCoder *)coder +{ self = [super initWithCoder:coder]; self.listSubTitle = [coder decodeObjectForKey:@"listSubTitle"]; return self; } #pragma mark - Object Info -- (NSDictionary *)propertyDictionary { - NSDictionary *parentDic = [super propertyDictionary]; - NSMutableDictionary *dic = [[NSMutableDictionary alloc] initWithDictionary:parentDic]; +- (NSDictionary *)propertyDictionary +{ + NSMutableDictionary *dic = [[super propertyDictionary] mutableCopy]; if (self.listSubTitle) { [dic setObject:self.listSubTitle forKey:@"listSubTitle"]; } return dic; } -- (NSString *)description { - return [NSString stringWithFormat:@"%@",[self propertyDictionary]]; -} @end From a9930ad33a8fa8c4de6a89f964675fde43044ffd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Franc=CC=A7ois=20Benaiteau?= <francois.benaiteau@sinnerschrader-mobile.com> Date: Mon, 12 May 2014 16:48:28 +0200 Subject: [PATCH 080/149] update expected file with new template syntax --- readJSON_test.py | 4 +- .../_SenderGroupJSONObject.m | 62 ++++++++++++------- 2 files changed, 44 insertions(+), 22 deletions(-) diff --git a/readJSON_test.py b/readJSON_test.py index 1c96dc4..8356f16 100644 --- a/readJSON_test.py +++ b/readJSON_test.py @@ -18,5 +18,7 @@ def execute_script(self, json_file, output_dir): # common_file = "/AbstractInterfaceFiles/_SenderGroupJSONObject.h" # common_file = "/AbstractInterfaceFiles/_SenderList2JSONObject.h" # common_file = "/AbstractInterfaceFiles/_SenderListJSONObject.m" - common_file = "/AbstractInterfaceFiles/_SenderList2JSONObject.m" + # common_file = "/AbstractInterfaceFiles/_SenderList2JSONObject.m" + # common_file = "/AbstractInterfaceFiles/_SenderJSONObject.m" + common_file = "/AbstractInterfaceFiles/_SenderGroupJSONObject.m" return os.system("diff -r -w -b -B src" + common_file + " " + output_dir + common_file) diff --git a/test_data/product/AbstractInterfaceFiles/_SenderGroupJSONObject.m b/test_data/product/AbstractInterfaceFiles/_SenderGroupJSONObject.m index 0fedd9c..5e3b788 100644 --- a/test_data/product/AbstractInterfaceFiles/_SenderGroupJSONObject.m +++ b/test_data/product/AbstractInterfaceFiles/_SenderGroupJSONObject.m @@ -7,21 +7,24 @@ #import "APIParser.h" #import "NSString+RegExValidation.h" #import "SenderGroupJSONObject.h" -#import "SenderList2JSONObject.h" #import "SenderListJSONObject.h" +#import "SenderList2JSONObject.h" + @implementation _SenderGroupJSONObject #pragma mark - factory -+ (SenderGroupJSONObject *)senderGroupWithDictionary:(NSDictionary *)dic withError:(NSError **)error { ++ (SenderGroupJSONObject *)senderGroupWithDictionary:(NSDictionary *)dic withError:(NSError **)error +{ return [[SenderGroupJSONObject alloc] initWithDictionary:dic withError:error]; } #pragma mark - initialize -- (id)initWithDictionary:(NSDictionary *)dic withError:(NSError **)error { +- (id)initWithDictionary:(NSDictionary *)dic withError:(NSError **)error +{ self = [super init]; if (self) { self.digitalSenders = [APIParser arrayFromResponseDictionary:dic forKey:@"digitalSenders" acceptNil:YES error:error]; @@ -70,7 +73,8 @@ - (id)initWithDictionary:(NSDictionary *)dic withError:(NSError **)error { #pragma mark - getter -- (SenderListJSONObject *)senderListInDigitalSendersAtIndex:(NSUInteger)index withError:(NSError **)error { +- (SenderListJSONObject *)senderListInDigitalSendersAtIndex:(NSUInteger)index withError:(NSError **)error +{ NSDictionary *tmpDigitalSendersDic = [APIParser dictionaryFromResponseArray:self.digitalSenders atIndex:index acceptNil:YES error:error]; if (*error) { return nil; @@ -87,7 +91,8 @@ - (SenderListJSONObject *)senderListInDigitalSendersAtIndex:(NSUInteger)index wi } return tmpDigitalSenders; } -- (SenderList2JSONObject *)senderList2InDigitalSendersAtIndex:(NSUInteger)index withError:(NSError **)error { +- (SenderList2JSONObject *)senderList2InDigitalSendersAtIndex:(NSUInteger)index withError:(NSError **)error +{ NSDictionary *tmpDigitalSendersDic = [APIParser dictionaryFromResponseArray:self.digitalSenders atIndex:index acceptNil:YES error:error]; if (*error) { return nil; @@ -104,42 +109,48 @@ - (SenderList2JSONObject *)senderList2InDigitalSendersAtIndex:(NSUInteger)index } return tmpDigitalSenders; } -- (NSNumber *)numberInDigitalSendersAtIndex:(NSUInteger)index withError:(NSError **)error { +- (NSNumber *)numberInDigitalSendersAtIndex:(NSUInteger)index withError:(NSError **)error +{ NSNumber *tmpDigitalSenders = [APIParser numberFromResponseArray:self.digitalSenders atIndex:index acceptNil:YES error:error]; if (*error) { return nil; } return tmpDigitalSenders; } -- (NSString *)stringInDigitalSendersAtIndex:(NSUInteger)index withError:(NSError **)error { +- (NSString *)stringInDigitalSendersAtIndex:(NSUInteger)index withError:(NSError **)error +{ NSString *tmpDigitalSenders = [APIParser stringFromResponseArray:self.digitalSenders atIndex:index acceptNil:YES error:error]; if (*error) { return nil; } return tmpDigitalSenders; } -- (BOOL )booleanInDigitalSendersAtIndex:(NSUInteger)index withError:(NSError **)error { +- (BOOL )booleanInDigitalSendersAtIndex:(NSUInteger)index withError:(NSError **)error +{ BOOL tmpDigitalSenders = [APIParser boolFromResponseArray:self.digitalSenders atIndex:index acceptNil:YES error:error]; if (*error) { return nil; } return tmpDigitalSenders; } -- (NSDate *)dateInDigitalSendersAtIndex:(NSUInteger)index withError:(NSError **)error { +- (NSDate *)dateInDigitalSendersAtIndex:(NSUInteger)index withError:(NSError **)error +{ NSDate *tmpDigitalSenders = [APIParser dateWithTimeIntervalFromResponseArray:self.digitalSenders atIndex:index acceptNil:YES error:error]; if (*error) { return nil; } return tmpDigitalSenders; } -- (NSData *)dataInDigitalSendersAtIndex:(NSUInteger)index withError:(NSError **)error { +- (NSData *)dataInDigitalSendersAtIndex:(NSUInteger)index withError:(NSError **)error +{ NSData *tmpDigitalSenders = [APIParser dataFromResponseArray:self.digitalSenders atIndex:index acceptNil:YES error:error]; if (*error) { return nil; } return tmpDigitalSenders; } -- (SenderListJSONObject *)senderListInHDOptionsAtIndex:(NSUInteger)index withError:(NSError **)error { +- (SenderListJSONObject *)senderListInHDOptionsAtIndex:(NSUInteger)index withError:(NSError **)error +{ NSDictionary *tmpHDOptionsDic = [APIParser dictionaryFromResponseArray:self.HDOptions atIndex:index acceptNil:YES error:error]; if (*error) { return nil; @@ -156,7 +167,8 @@ - (SenderListJSONObject *)senderListInHDOptionsAtIndex:(NSUInteger)index withErr } return tmpHDOptions; } -- (SenderList2JSONObject *)senderList2InHDOptionsAtIndex:(NSUInteger)index withError:(NSError **)error { +- (SenderList2JSONObject *)senderList2InHDOptionsAtIndex:(NSUInteger)index withError:(NSError **)error +{ NSDictionary *tmpHDOptionsDic = [APIParser dictionaryFromResponseArray:self.HDOptions atIndex:index acceptNil:YES error:error]; if (*error) { return nil; @@ -173,14 +185,16 @@ - (SenderList2JSONObject *)senderList2InHDOptionsAtIndex:(NSUInteger)index withE } return tmpHDOptions; } -- (NSString *)stringInDTVHighlightsAtIndex:(NSUInteger)index withError:(NSError **)error { +- (NSString *)stringInDTVHighlightsAtIndex:(NSUInteger)index withError:(NSError **)error +{ NSString *tmpDTVHighlights = [APIParser stringFromResponseArray:self.DTVHighlights atIndex:index acceptNil:YES error:error]; if (*error) { return nil; } return tmpDTVHighlights; } -- (NSString *)titleStringInDTVHighlightsAtIndex:(NSUInteger)index withError:(NSError **)error { +- (NSString *)titleStringInDTVHighlightsAtIndex:(NSUInteger)index withError:(NSError **)error +{ NSString *tmpDTVHighlights = [APIParser stringFromResponseArray:self.DTVHighlights atIndex:index acceptNil:YES error:error]; if (*error) { return nil; @@ -205,7 +219,8 @@ - (NSString *)titleStringInDTVHighlightsAtIndex:(NSUInteger)index withError:(NSE } return tmpDTVHighlights; } -- (id)objectInIPTVSendersAtIndex:(NSUInteger)index withError:(NSError **)error { +- (id)objectInIPTVSendersAtIndex:(NSUInteger)index withError:(NSError **)error +{ id tmpIPTVSenders = [APIParser objectFromResponseArray:self.IPTVSenders atIndex:index acceptNil:YES error:error]; if (*error) { return nil; @@ -214,14 +229,17 @@ - (id)objectInIPTVSendersAtIndex:(NSUInteger)index withError:(NSError **)error { } #pragma mark - NSCoding -- (void)encodeWithCoder:(NSCoder*)coder { +- (void)encodeWithCoder:(NSCoder*)coder +{ + [super encodeWithCoder:coder]; [coder encodeObject:self.digitalSenders forKey:@"digitalSenders"]; [coder encodeObject:self.HDOptions forKey:@"HDOptions"]; [coder encodeObject:self.DTVHighlights forKey:@"DTVHighlights"]; [coder encodeObject:self.IPTVSenders forKey:@"IPTVSenders"]; } -- (id)initWithCoder:(NSCoder *)coder { - self = [super init]; +- (id)initWithCoder:(NSCoder *)coder +{ + self = [super initWithCoder:coder]; self.digitalSenders = [coder decodeObjectForKey:@"digitalSenders"]; self.HDOptions = [coder decodeObjectForKey:@"HDOptions"]; self.DTVHighlights = [coder decodeObjectForKey:@"DTVHighlights"]; @@ -230,7 +248,8 @@ - (id)initWithCoder:(NSCoder *)coder { } #pragma mark - Object Info -- (NSDictionary *)propertyDictionary { +- (NSDictionary *)propertyDictionary +{ NSMutableDictionary *dic = [[NSMutableDictionary alloc] init]; if (self.digitalSenders) { [dic setObject:self.digitalSenders forKey:@"digitalSenders"]; @@ -246,8 +265,9 @@ - (NSDictionary *)propertyDictionary { } return dic; } -- (NSString *)description { - return [NSString stringWithFormat:@"%@",[self propertyDictionary]]; +- (NSString *)description +{ + return [[self propertyDictionary] description]; } @end From 8b7e0faf748437154ededcead9340429bd46e422 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Franc=CC=A7ois=20Benaiteau?= <francois.benaiteau@sinnerschrader-mobile.com> Date: Mon, 12 May 2014 17:27:27 +0200 Subject: [PATCH 081/149] handling min/maxCount and min/maxValue attributes --- ObjectiveCCodeGenerator.py | 20 ++++++- templates/_source.m.mustache | 56 +++++++++++++++++++ .../_SenderGroupJSONObject.m | 24 ++++++-- 3 files changed, 95 insertions(+), 5 deletions(-) diff --git a/ObjectiveCCodeGenerator.py b/ObjectiveCCodeGenerator.py index 68a9d26..e579fd6 100755 --- a/ObjectiveCCodeGenerator.py +++ b/ObjectiveCCodeGenerator.py @@ -162,7 +162,7 @@ def process_properties(self, propObj, undefined = False) : propertyHash['className'] = propObj.getClassName() return [], propertyHash - if not undefined: + if propObj.rootBaseType() == "string": hasRegex, regex = propObj.getRegex() if hasRegex: propertyHash['regex'] = {"value": regex} @@ -175,6 +175,24 @@ def process_properties(self, propObj, undefined = False) : if hasMin: propertyHash['minLength'] = {"value": minLength} + if propObj.rootBaseType() == "number": + hasMax, maxLength = propObj.getMaxValue() + if hasMax: + propertyHash['maxValue'] = {"value": maxLength} + + hasMin, minLength = propObj.getMinValue() + if hasMin: + propertyHash['minValue'] = {"value": minLength} + + if propObj.rootBaseType() == "array": + hasMax, maxLength = propObj.getMaxCount() + if hasMax: + propertyHash['maxCount'] = {"value": maxLength} + + hasMin, minLength = propObj.getMinCount() + if hasMin: + propertyHash['minCount'] = {"value": minLength} + # dealing with array property classes = self.process_subtypes(propObj, propertyHash) if propObj.rootBaseType() == "multi": diff --git a/templates/_source.m.mustache b/templates/_source.m.mustache index d26ad37..83cf9e7 100644 --- a/templates/_source.m.mustache +++ b/templates/_source.m.mustache @@ -36,6 +36,30 @@ if (*error) { return self; } + {{#maxValue}} + if (self.{{varName}}.length > {{value}}) { + NSDictionary *userInfo = @{@"propertyName" : @"{{varName}}", + @"key" : @"{{name}}", + @"reason" : @"max value validation error", + @"objectClass" : NSStringFromClass([self class]) + }; + *error = [NSError errorWithDomain:k{{projectPrefix}}ErrorDomain_parser code:k{{projectPrefix}}ErrorDomain_parser_valueIsNotValid userInfo:userInfo]; + NSLog(@"%@", *error); + return self; + } + {{/maxValue}} + {{#minValue}} + if (self.{{varName}}.length < {{value}}) { + NSDictionary *userInfo = @{@"propertyName" : @"{{varName}}", + @"key" : @"{{name}}", + @"reason" : @"min value validation error", + @"objectClass" : NSStringFromClass([self class]) + }; + *error = [NSError errorWithDomain:k{{projectPrefix}}ErrorDomain_parser code:k{{projectPrefix}}ErrorDomain_parser_valueIsNotValid userInfo:userInfo]; + NSLog(@"%@", *error); + return self; + } + {{/minValue}} {{/numberProperties}} {{#stringProperties}} self.{{varName}} = [{{projectPrefix}}APIParser stringFromResponseDictionary:dic forKey:@"{{name}}" acceptNumber:NO acceptNil:{{#required}}NO{{/required}}{{^required}}YES{{/required}} error:error]; @@ -105,6 +129,13 @@ } {{/hasOneSubtype}} {{#hasOneSubtype}} + {{#hasAnyType}} + self.{{varName}} = [{{projectPrefix}}APIParser arrayFromResponseDictionary:dic forKey:@"{{name}}" acceptNil:{{#required}}NO{{/required}}{{^required}}YES{{/required}} error:error]; + if (*error) { + return self; + } + {{/hasAnyType}} + {{^hasAnyType}} NSArray *tmp{{capitalizeVarName}}Array = [{{projectPrefix}}APIParser arrayFromResponseDictionary:dic forKey:@"{{name}}" acceptNil:{{#required}}NO{{/required}}{{^required}}YES{{/required}} error:error]; if (*error) { return self; @@ -148,7 +179,32 @@ {{/hasCustomType}} } self.{{varName}} = [NSArray arrayWithArray:tmp{{capitalizeVarName}}]; + {{/hasAnyType}} {{/hasOneSubtype}} + {{#maxCount}} + if (self.{{varName}}.count > {{value}}) { + NSDictionary *userInfo = @{@"propertyName" : @"{{varName}}", + @"key" : @"{{name}}", + @"reason" : @"max count validation error", + @"objectClass" : NSStringFromClass([self class]) + }; + *error = [NSError errorWithDomain:k{{projectPrefix}}ErrorDomain_parser code:k{{projectPrefix}}ErrorDomain_parser_valueIsNotValid userInfo:userInfo]; + NSLog(@"%@", *error); + return self; + } + {{/maxCount}} + {{#minCount}} + if (self.{{varName}}.count < {{value}}) { + NSDictionary *userInfo = @{@"propertyName" : @"{{varName}}", + @"key" : @"{{name}}", + @"reason" : @"min count validation error", + @"objectClass" : NSStringFromClass([self class]) + }; + *error = [NSError errorWithDomain:k{{projectPrefix}}ErrorDomain_parser code:k{{projectPrefix}}ErrorDomain_parser_valueIsNotValid userInfo:userInfo]; + NSLog(@"%@", *error); + return self; + } + {{/minCount}} {{/arrayProperties}} {{#objectProperties}} {{/objectProperties}} diff --git a/test_data/product/AbstractInterfaceFiles/_SenderGroupJSONObject.m b/test_data/product/AbstractInterfaceFiles/_SenderGroupJSONObject.m index 5e3b788..9e3e7ec 100644 --- a/test_data/product/AbstractInterfaceFiles/_SenderGroupJSONObject.m +++ b/test_data/product/AbstractInterfaceFiles/_SenderGroupJSONObject.m @@ -40,13 +40,21 @@ - (id)initWithDictionary:(NSDictionary *)dic withError:(NSError **)error return self; } if (self.DTVHighlights.count > 6) { - NSDictionary *userInfo = [NSDictionary dictionaryWithObjectsAndKeys:@"DTVHighlights", @"propertyName", @"DTVHighlights", @"key", @"validation error", @"reason", NSStringFromClass([self class]), @"objectClass",nil]; + NSDictionary *userInfo = @{@"propertyName" : @"DTVHighlights", + @"key" : @"DTVHighlights", + @"reason" : @"max count validation error", + @"objectClass" : NSStringFromClass([self class]) + }; *error = [NSError errorWithDomain:kErrorDomain_parser code:kErrorDomain_parser_valueIsNotValid userInfo:userInfo]; NSLog(@"%@", *error); return self; } if (self.DTVHighlights.count < 2) { - NSDictionary *userInfo = [NSDictionary dictionaryWithObjectsAndKeys:@"DTVHighlights", @"propertyName", @"DTVHighlights", @"key", @"validation error", @"reason", NSStringFromClass([self class]), @"objectClass",nil]; + NSDictionary *userInfo = @{@"propertyName" : @"DTVHighlights", + @"key" : @"DTVHighlights", + @"reason" : @"min count validation error", + @"objectClass" : NSStringFromClass([self class]) + }; *error = [NSError errorWithDomain:kErrorDomain_parser code:kErrorDomain_parser_valueIsNotValid userInfo:userInfo]; NSLog(@"%@", *error); return self; @@ -56,13 +64,21 @@ - (id)initWithDictionary:(NSDictionary *)dic withError:(NSError **)error return self; } if (self.IPTVSenders.count > 6) { - NSDictionary *userInfo = [NSDictionary dictionaryWithObjectsAndKeys:@"IPTVSenders", @"propertyName", @"IPTVSenders", @"key", @"validation error", @"reason", NSStringFromClass([self class]), @"objectClass",nil]; + NSDictionary *userInfo = @{@"propertyName" : @"IPTVSenders", + @"key" : @"IPTVSenders", + @"reason" : @"max count validation error", + @"objectClass" : NSStringFromClass([self class]) + }; *error = [NSError errorWithDomain:kErrorDomain_parser code:kErrorDomain_parser_valueIsNotValid userInfo:userInfo]; NSLog(@"%@", *error); return self; } if (self.IPTVSenders.count < 2) { - NSDictionary *userInfo = [NSDictionary dictionaryWithObjectsAndKeys:@"IPTVSenders", @"propertyName", @"IPTVSenders", @"key", @"validation error", @"reason", NSStringFromClass([self class]), @"objectClass",nil]; + NSDictionary *userInfo = @{@"propertyName" : @"IPTVSenders", + @"key" : @"IPTVSenders", + @"reason" : @"min count validation error", + @"objectClass" : NSStringFromClass([self class]) + }; *error = [NSError errorWithDomain:kErrorDomain_parser code:kErrorDomain_parser_valueIsNotValid userInfo:userInfo]; NSLog(@"%@", *error); return self; From 27ee205f45e64b9fea243b458de47e72946576dd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Franc=CC=A7ois=20Benaiteau?= <francois.benaiteau@sinnerschrader-mobile.com> Date: Mon, 12 May 2014 18:04:22 +0200 Subject: [PATCH 082/149] missing methods for array in implementation file --- templates/_source.m.mustache | 94 ++++++++++++++++++- .../_SenderGroupJSONObject.m | 16 +++- 2 files changed, 103 insertions(+), 7 deletions(-) diff --git a/templates/_source.m.mustache b/templates/_source.m.mustache index 83cf9e7..363a1a9 100644 --- a/templates/_source.m.mustache +++ b/templates/_source.m.mustache @@ -223,11 +223,38 @@ - ({{className}} *){{subtype}}In{{capitalizeVarName}}AtIndex:(NSUInteger)index withError:(NSError **)error { - + NSDictionary *tmp{{capitalizeVarName}}Dic = [APIParser dictionaryFromResponseArray:self.{{varName}} atIndex:index acceptNil:YES error:error]; + if (*error) { + return nil; + } + {{className}} *tmp{{capitalizeVarName}} = nil; + if (tmp{{capitalizeVarName}}Dic== nil) { + return nil; + } + if (tmp{{capitalizeVarName}}Dic) { + tmp{{capitalizeVarName}}= [[{{className}} alloc] initWithDictionary:tmp{{capitalizeVarName}}Dic withError:error]; + if (*error) { + return nil; + } + } + return tmp{{capitalizeVarName}}; } {{/className}} {{/subtypes}} {{/hasCustomType}} +{{#hasNumberType}} +{{#subtypes}} + +- (NSNumber *){{subtype}}In{{capitalizeVarName}}AtIndex:(NSUInteger)index withError:(NSError **)error +{ + NSNumber *tmp{{capitalizeVarName}} = [{{projectPrefix}}APIParser numberFromResponseArray:self.{{varName}} atIndex:index acceptNil:{{#required}}NO{{/required}}{{^required}}YES{{/required}} error:error]; + if (*error) { + return nil; + } + return tmp{{capitalizeVarName}}; +} +{{/subtypes}} +{{/hasNumberType}} {{#hasStringType}} {{#subtypes}} @@ -237,23 +264,60 @@ if (*error) { return nil; } + {{#maxLength}} + if (self.{{varName}}.length > {{value}}) { + NSDictionary *userInfo = @{@"propertyName" : @"{{varName}}", + @"key" : @"{{name}}", + @"reason" : @"max length validation error", + @"objectClass" : NSStringFromClass([self class]) + }; + *error = [NSError errorWithDomain:k{{projectPrefix}}ErrorDomain_parser code:k{{projectPrefix}}ErrorDomain_parser_valueIsNotValid userInfo:userInfo]; + NSLog(@"%@", *error); + return self; + } + {{/maxLength}} + {{#minLength}} + if (self.{{varName}}.length < {{value}}) { + NSDictionary *userInfo = @{@"propertyName" : @"{{varName}}", + @"key" : @"{{name}}", + @"reason" : @"min length validation error", + @"objectClass" : NSStringFromClass([self class]) + }; + *error = [NSError errorWithDomain:k{{projectPrefix}}ErrorDomain_parser code:k{{projectPrefix}}ErrorDomain_parser_valueIsNotValid userInfo:userInfo]; + NSLog(@"%@", *error); + return self; + } + {{/minLength}} + {{! to finish need to pass customClass regex...}} + {{#regex}} + if (self.{{varName}} && [self.{{varName}} matchesRegExString:@"{{& value}}"] == NO) { + NSDictionary *userInfo = @{@"propertyName" : @"{{varName}}", + @"key" : @"{{name}}", + @"reason" : @"validation error", + @"objectClass" : NSStringFromClass([self class]) + }; + *error = [NSError errorWithDomain:k{{projectPrefix}}ErrorDomain_parser code:k{{projectPrefix}}ErrorDomain_parser_valueIsNotValid userInfo:userInfo]; + NSLog(@"%@", *error); + return self; + } + {{/regex}} return tmp{{capitalizeVarName}}; } {{/subtypes}} {{/hasStringType}} -{{#hasNumberType}} +{{#hasBooleanType}} {{#subtypes}} -- (NSNumber *){{subtype}}In{{capitalizeVarName}}AtIndex:(NSUInteger)index withError:(NSError **)error +- (BOOL){{subtype}}In{{capitalizeVarName}}AtIndex:(NSUInteger)index withError:(NSError **)error { - NSNumber *tmp{{capitalizeVarName}} = [{{projectPrefix}}APIParser numberFromResponseArray:self.{{varName}} atIndex:index acceptNil:{{#required}}NO{{/required}}{{^required}}YES{{/required}} error:error]; + BOOL tmp{{capitalizeVarName}} = [{{projectPrefix}}APIParser boolFromResponseArray:self.{{varName}} atIndex:index acceptNil:{{#required}}NO{{/required}}{{^required}}YES{{/required}} error:error]; if (*error) { return nil; } return tmp{{capitalizeVarName}}; } {{/subtypes}} -{{/hasNumberType}} +{{/hasBooleanType}} {{#hasDateType}} {{#subtypes}} @@ -267,6 +331,19 @@ } {{/subtypes}} {{/hasDateType}} +{{#hasDataType}} +{{#subtypes}} + +- (NSData*){{subtype}}In{{capitalizeVarName}}AtIndex:(NSUInteger)index withError:(NSError **)error +{ + NSData* tmp{{capitalizeVarName}} = [{{projectPrefix}}APIParser dataFromResponseArray:self.{{varName}} atIndex:index acceptNil:{{#required}}NO{{/required}}{{^required}}YES{{/required}} error:error]; + if (*error) { + return nil; + } + return tmp{{capitalizeVarName}}; +} +{{/subtypes}} +{{/hasDataType}} {{/hasMultipleSubtypes}} {{/arrayProperties}} {{#undefinedProperties}} @@ -374,6 +451,12 @@ } {{/dateProperties}} {{#arrayProperties}} + {{#hasMultipleSubtypes}} + if (self.{{varName}}) { + [dic setObject:self.{{varName}} forKey:@"{{name}}"]; + } + {{/hasMultipleSubtypes}} + {{^hasMultipleSubtypes}} {{#hasCustomType}} {{#subtypes}} if (self.{{varName}}) { @@ -390,6 +473,7 @@ [dic setObject:self.{{varName}} forKey:@"{{name}}"]; } {{/hasCustomType}} + {{/hasMultipleSubtypes}} {{/arrayProperties}} {{#objectProperties}} if (self.{{varName}}) { diff --git a/test_data/product/AbstractInterfaceFiles/_SenderGroupJSONObject.m b/test_data/product/AbstractInterfaceFiles/_SenderGroupJSONObject.m index 9e3e7ec..7b65a15 100644 --- a/test_data/product/AbstractInterfaceFiles/_SenderGroupJSONObject.m +++ b/test_data/product/AbstractInterfaceFiles/_SenderGroupJSONObject.m @@ -87,8 +87,8 @@ - (id)initWithDictionary:(NSDictionary *)dic withError:(NSError **)error return self; } - #pragma mark - getter + - (SenderListJSONObject *)senderListInDigitalSendersAtIndex:(NSUInteger)index withError:(NSError **)error { NSDictionary *tmpDigitalSendersDic = [APIParser dictionaryFromResponseArray:self.digitalSenders atIndex:index acceptNil:YES error:error]; @@ -107,6 +107,7 @@ - (SenderListJSONObject *)senderListInDigitalSendersAtIndex:(NSUInteger)index wi } return tmpDigitalSenders; } + - (SenderList2JSONObject *)senderList2InDigitalSendersAtIndex:(NSUInteger)index withError:(NSError **)error { NSDictionary *tmpDigitalSendersDic = [APIParser dictionaryFromResponseArray:self.digitalSenders atIndex:index acceptNil:YES error:error]; @@ -125,6 +126,7 @@ - (SenderList2JSONObject *)senderList2InDigitalSendersAtIndex:(NSUInteger)index } return tmpDigitalSenders; } + - (NSNumber *)numberInDigitalSendersAtIndex:(NSUInteger)index withError:(NSError **)error { NSNumber *tmpDigitalSenders = [APIParser numberFromResponseArray:self.digitalSenders atIndex:index acceptNil:YES error:error]; @@ -133,6 +135,7 @@ - (NSNumber *)numberInDigitalSendersAtIndex:(NSUInteger)index withError:(NSError } return tmpDigitalSenders; } + - (NSString *)stringInDigitalSendersAtIndex:(NSUInteger)index withError:(NSError **)error { NSString *tmpDigitalSenders = [APIParser stringFromResponseArray:self.digitalSenders atIndex:index acceptNil:YES error:error]; @@ -141,7 +144,8 @@ - (NSString *)stringInDigitalSendersAtIndex:(NSUInteger)index withError:(NSError } return tmpDigitalSenders; } -- (BOOL )booleanInDigitalSendersAtIndex:(NSUInteger)index withError:(NSError **)error + +- (BOOL)booleanInDigitalSendersAtIndex:(NSUInteger)index withError:(NSError **)error { BOOL tmpDigitalSenders = [APIParser boolFromResponseArray:self.digitalSenders atIndex:index acceptNil:YES error:error]; if (*error) { @@ -149,6 +153,7 @@ - (BOOL )booleanInDigitalSendersAtIndex:(NSUInteger)index withError:(NSError **) } return tmpDigitalSenders; } + - (NSDate *)dateInDigitalSendersAtIndex:(NSUInteger)index withError:(NSError **)error { NSDate *tmpDigitalSenders = [APIParser dateWithTimeIntervalFromResponseArray:self.digitalSenders atIndex:index acceptNil:YES error:error]; @@ -157,6 +162,7 @@ - (NSDate *)dateInDigitalSendersAtIndex:(NSUInteger)index withError:(NSError **) } return tmpDigitalSenders; } + - (NSData *)dataInDigitalSendersAtIndex:(NSUInteger)index withError:(NSError **)error { NSData *tmpDigitalSenders = [APIParser dataFromResponseArray:self.digitalSenders atIndex:index acceptNil:YES error:error]; @@ -165,6 +171,7 @@ - (NSData *)dataInDigitalSendersAtIndex:(NSUInteger)index withError:(NSError **) } return tmpDigitalSenders; } + - (SenderListJSONObject *)senderListInHDOptionsAtIndex:(NSUInteger)index withError:(NSError **)error { NSDictionary *tmpHDOptionsDic = [APIParser dictionaryFromResponseArray:self.HDOptions atIndex:index acceptNil:YES error:error]; @@ -183,6 +190,7 @@ - (SenderListJSONObject *)senderListInHDOptionsAtIndex:(NSUInteger)index withErr } return tmpHDOptions; } + - (SenderList2JSONObject *)senderList2InHDOptionsAtIndex:(NSUInteger)index withError:(NSError **)error { NSDictionary *tmpHDOptionsDic = [APIParser dictionaryFromResponseArray:self.HDOptions atIndex:index acceptNil:YES error:error]; @@ -201,6 +209,7 @@ - (SenderList2JSONObject *)senderList2InHDOptionsAtIndex:(NSUInteger)index withE } return tmpHDOptions; } + - (NSString *)stringInDTVHighlightsAtIndex:(NSUInteger)index withError:(NSError **)error { NSString *tmpDTVHighlights = [APIParser stringFromResponseArray:self.DTVHighlights atIndex:index acceptNil:YES error:error]; @@ -209,6 +218,7 @@ - (NSString *)stringInDTVHighlightsAtIndex:(NSUInteger)index withError:(NSError } return tmpDTVHighlights; } + - (NSString *)titleStringInDTVHighlightsAtIndex:(NSUInteger)index withError:(NSError **)error { NSString *tmpDTVHighlights = [APIParser stringFromResponseArray:self.DTVHighlights atIndex:index acceptNil:YES error:error]; @@ -235,6 +245,7 @@ - (NSString *)titleStringInDTVHighlightsAtIndex:(NSUInteger)index withError:(NSE } return tmpDTVHighlights; } + - (id)objectInIPTVSendersAtIndex:(NSUInteger)index withError:(NSError **)error { id tmpIPTVSenders = [APIParser objectFromResponseArray:self.IPTVSenders atIndex:index acceptNil:YES error:error]; @@ -245,6 +256,7 @@ - (id)objectInIPTVSendersAtIndex:(NSUInteger)index withError:(NSError **)error } #pragma mark - NSCoding + - (void)encodeWithCoder:(NSCoder*)coder { [super encodeWithCoder:coder]; From 6e0a0eb8e27add47b627feebe21233b0b923770b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Franc=CC=A7ois=20Benaiteau?= <francois.benaiteau@sinnerschrader-mobile.com> Date: Mon, 12 May 2014 18:07:39 +0200 Subject: [PATCH 083/149] hasAnyType method for array --- templates/_source.m.mustache | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/templates/_source.m.mustache b/templates/_source.m.mustache index 363a1a9..185f6cd 100644 --- a/templates/_source.m.mustache +++ b/templates/_source.m.mustache @@ -345,6 +345,17 @@ {{/subtypes}} {{/hasDataType}} {{/hasMultipleSubtypes}} +{{#hasAnyType}} +- (id)objectIn{{capitalizeVarName}}AtIndex:(NSUInteger)index withError:(NSError **)error +{ + id tmp{{capitalizeVarName}} = [APIParser objectFromResponseArray:self.{{varName}} atIndex:index acceptNil:YES error:error]; + if (*error) { + return nil; + } + return tmp{{capitalizeVarName}}; +} + +{{/hasAnyType}} {{/arrayProperties}} {{#undefinedProperties}} {{/undefinedProperties}} From 47461a4d5fe6dafa5bc564d50181b8fec4c2b028 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Franc=CC=A7ois=20Benaiteau?= <francois.benaiteau@sinnerschrader-mobile.com> Date: Mon, 12 May 2014 18:46:16 +0200 Subject: [PATCH 084/149] handle string validation in custom method --- ObjectiveCCodeGenerator.py | 54 ++++++++++++++++++- templates/_source.m.mustache | 36 ++++++------- .../_SenderGroupJSONObject.m | 18 +++++-- 3 files changed, 85 insertions(+), 23 deletions(-) diff --git a/ObjectiveCCodeGenerator.py b/ObjectiveCCodeGenerator.py index e579fd6..2247eca 100755 --- a/ObjectiveCCodeGenerator.py +++ b/ObjectiveCCodeGenerator.py @@ -89,6 +89,48 @@ def makeVarName(self,schemeObj) : break return returnName + def meta_property(self, schemeObj): + meta_hash = {} + meta_hash['name'] = schemeObj.type_name + if schemeObj.base_type_list: + meta_hash['base-type'] = schemeObj.base_type_list + else: + meta_hash['base-type'] = schemeObj.base_type + meta_hash['description'] = schemeObj.type_description + meta_hash['subType'] = schemeObj.sub_type + if schemeObj.rootBaseType() == "string": + hasRegex, regex = schemeObj.getRegex() + if hasRegex: + meta_hash['regex'] = regex + + hasMax, maxLength = schemeObj.getMaxLength() + if hasMax: + meta_hash['maxLength'] = maxLength + + hasMin, minLength = schemeObj.getMinLength() + if hasMin: + meta_hash['minLength'] = minLength + + if schemeObj.rootBaseType() == "number": + hasMax, maxLength = schemeObj.getMaxValue() + if hasMax: + meta_hash['maxValue'] = maxLength + + hasMin, minLength = schemeObj.getMinValue() + if hasMin: + meta_hash['minValue'] = minLength + + if schemeObj.rootBaseType() == "array": + hasMax, maxLength = schemeObj.getMaxCount() + if hasMax: + meta_hash['maxCount'] = maxLength + + hasMin, minLength = schemeObj.getMinCount() + if hasMin: + meta_hash['minCount'] = minLength + + return meta_hash + def process_basetypes(self, propObj, propertyHash) : # dealing with array property if len(propObj.getBaseTypes()) == 1: @@ -133,12 +175,20 @@ def process_subtypes(self, propObj, propertyHash) : elif subtype == "any": propertyHash['hasAnyType'] = {"subtype": "object"} else: + # derivate baseType if propObj.getScheme(subtype).base_type in propObj.naturalTypeList: key = 'has'+ propObj.getScheme(subtype).base_type.capitalize() + 'Type' + subtype_infos = {"subtype": subtype} + # nothing, subtype_definition = self.process_properties(propObj.getScheme(subtype)) + subtype_definition = self.meta_property(propObj.getScheme(subtype)) + print "subtype_definition" + print subtype_definition + subtype_infos = {"subtype": subtype, "_subtype": subtype_definition} if key not in propertyHash: - propertyHash[key] = {"subtypes": [{"subtype": subtype}]} + propertyHash[key] = {"subtypes": [subtype_infos]} else: - propertyHash[key]["subtypes"].append({"subtype": subtype}) + propertyHash[key]["subtypes"].append(subtype_infos) + else: if key in propertyHash: propertyHash[key]["subtypes"].append({"subtype": subtype, "className": propObj.getScheme(subtype).getClassName()}) diff --git a/templates/_source.m.mustache b/templates/_source.m.mustache index 185f6cd..0932e03 100644 --- a/templates/_source.m.mustache +++ b/templates/_source.m.mustache @@ -264,43 +264,43 @@ if (*error) { return nil; } - {{#maxLength}} - if (self.{{varName}}.length > {{value}}) { - NSDictionary *userInfo = @{@"propertyName" : @"{{varName}}", - @"key" : @"{{name}}", + {{#_subtype.maxLength}} + if (tmp{{capitalizeVarName}}.length > {{_subtype.maxLength}}) { + NSDictionary *userInfo = @{@"propertyName" : @"{{_subtype.name}}", + @"key" : @"{{_subtype.name}}", @"reason" : @"max length validation error", @"objectClass" : NSStringFromClass([self class]) }; *error = [NSError errorWithDomain:k{{projectPrefix}}ErrorDomain_parser code:k{{projectPrefix}}ErrorDomain_parser_valueIsNotValid userInfo:userInfo]; NSLog(@"%@", *error); - return self; + return nil; } - {{/maxLength}} - {{#minLength}} - if (self.{{varName}}.length < {{value}}) { - NSDictionary *userInfo = @{@"propertyName" : @"{{varName}}", - @"key" : @"{{name}}", + {{/_subtype.maxLength}} + {{#_subtype.minLength}} + if (tmp{{capitalizeVarName}}.length < {{_subtype.minLength}}) { + NSDictionary *userInfo = @{@"propertyName" : @"{{_subtype.name}}", + @"key" : @"{{_subtype.name}}", @"reason" : @"min length validation error", @"objectClass" : NSStringFromClass([self class]) }; *error = [NSError errorWithDomain:k{{projectPrefix}}ErrorDomain_parser code:k{{projectPrefix}}ErrorDomain_parser_valueIsNotValid userInfo:userInfo]; NSLog(@"%@", *error); - return self; + return nil; } - {{/minLength}} + {{/_subtype.minLength}} {{! to finish need to pass customClass regex...}} - {{#regex}} - if (self.{{varName}} && [self.{{varName}} matchesRegExString:@"{{& value}}"] == NO) { - NSDictionary *userInfo = @{@"propertyName" : @"{{varName}}", - @"key" : @"{{name}}", + {{#_subtype.regex}} + if (tmp{{capitalizeVarName}} && [tmp{{capitalizeVarName}} matchesRegExString:@"{{& _subtype.regex}}"] == NO) { + NSDictionary *userInfo = @{@"propertyName" : @"{{_subtype.name}}", + @"key" : @"{{_subtype.name}}", @"reason" : @"validation error", @"objectClass" : NSStringFromClass([self class]) }; *error = [NSError errorWithDomain:k{{projectPrefix}}ErrorDomain_parser code:k{{projectPrefix}}ErrorDomain_parser_valueIsNotValid userInfo:userInfo]; NSLog(@"%@", *error); - return self; + return nil; } - {{/regex}} + {{/_subtype.regex}} return tmp{{capitalizeVarName}}; } {{/subtypes}} diff --git a/test_data/product/AbstractInterfaceFiles/_SenderGroupJSONObject.m b/test_data/product/AbstractInterfaceFiles/_SenderGroupJSONObject.m index 7b65a15..b86be5b 100644 --- a/test_data/product/AbstractInterfaceFiles/_SenderGroupJSONObject.m +++ b/test_data/product/AbstractInterfaceFiles/_SenderGroupJSONObject.m @@ -226,19 +226,31 @@ - (NSString *)titleStringInDTVHighlightsAtIndex:(NSUInteger)index withError:(NSE return nil; } if (tmpDTVHighlights.length > 20) { - NSDictionary *userInfo = [NSDictionary dictionaryWithObjectsAndKeys:@"titleString", @"propertyName", @"titleString", @"key", @"validation error", @"reason", NSStringFromClass([self class]), @"objectClass",nil]; + NSDictionary *userInfo = @{@"propertyName" : @"titleString", + @"key" : @"titleString", + @"reason" : @"max length validation error", + @"objectClass" : NSStringFromClass([self class]) + }; *error = [NSError errorWithDomain:kErrorDomain_parser code:kErrorDomain_parser_valueIsNotValid userInfo:userInfo]; NSLog(@"%@", *error); return nil; } if (tmpDTVHighlights.length < 10) { - NSDictionary *userInfo = [NSDictionary dictionaryWithObjectsAndKeys:@"titleString", @"propertyName", @"titleString", @"key", @"validation error", @"reason", NSStringFromClass([self class]), @"objectClass",nil]; + NSDictionary *userInfo = @{@"propertyName" : @"titleString", + @"key" : @"titleString", + @"reason" : @"min length validation error", + @"objectClass" : NSStringFromClass([self class]) + }; *error = [NSError errorWithDomain:kErrorDomain_parser code:kErrorDomain_parser_valueIsNotValid userInfo:userInfo]; NSLog(@"%@", *error); return nil; } if (tmpDTVHighlights && [tmpDTVHighlights matchesRegExString:@"[a-z0-9]:10"] == NO) { - NSDictionary *userInfo = [NSDictionary dictionaryWithObjectsAndKeys:@"titleString", @"propertyName", @"titleString", @"key", @"validation error", @"reason", NSStringFromClass([self class]), @"objectClass",nil]; + NSDictionary *userInfo = @{@"propertyName" : @"titleString", + @"key" : @"titleString", + @"reason" : @"validation error", + @"objectClass" : NSStringFromClass([self class]) + }; *error = [NSError errorWithDomain:kErrorDomain_parser code:kErrorDomain_parser_valueIsNotValid userInfo:userInfo]; NSLog(@"%@", *error); return nil; From fc410fe0d885d6d5889aad1479acf689fc45728c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Franc=CC=A7ois=20Benaiteau?= <francois.benaiteau@sinnerschrader-mobile.com> Date: Mon, 12 May 2014 18:50:09 +0200 Subject: [PATCH 085/149] Fixes minor syntax expectations --- readJSON_test.py | 4 +- .../_ProductDetailJSONObject.m | 37 ++++++++++++++----- 2 files changed, 30 insertions(+), 11 deletions(-) diff --git a/readJSON_test.py b/readJSON_test.py index 8356f16..96c55f7 100644 --- a/readJSON_test.py +++ b/readJSON_test.py @@ -15,10 +15,12 @@ def execute_script(self, json_file, output_dir): os.system("rm -rf src/Utilities") # return os.system("diff -r src/ " + output_dir) # common_file = "/AbstractInterfaceFiles/_ProductDetailJSONObject.h" + common_file = "/AbstractInterfaceFiles/_ProductDetailJSONObject.m" # common_file = "/AbstractInterfaceFiles/_SenderGroupJSONObject.h" # common_file = "/AbstractInterfaceFiles/_SenderList2JSONObject.h" # common_file = "/AbstractInterfaceFiles/_SenderListJSONObject.m" # common_file = "/AbstractInterfaceFiles/_SenderList2JSONObject.m" # common_file = "/AbstractInterfaceFiles/_SenderJSONObject.m" - common_file = "/AbstractInterfaceFiles/_SenderGroupJSONObject.m" + # common_file = "/AbstractInterfaceFiles/_SenderGroupJSONObject.m" + # return os.system("diff -r -w -b -B src " + output_dir) return os.system("diff -r -w -b -B src" + common_file + " " + output_dir + common_file) diff --git a/test_data/product/AbstractInterfaceFiles/_ProductDetailJSONObject.m b/test_data/product/AbstractInterfaceFiles/_ProductDetailJSONObject.m index 0431a59..c45f090 100644 --- a/test_data/product/AbstractInterfaceFiles/_ProductDetailJSONObject.m +++ b/test_data/product/AbstractInterfaceFiles/_ProductDetailJSONObject.m @@ -14,13 +14,15 @@ @implementation _ProductDetailJSONObject #pragma mark - factory -+ (ProductDetailJSONObject *)ProductDetailWithDictionary:(NSDictionary *)dic withError:(NSError **)error { ++ (ProductDetailJSONObject *)ProductDetailWithDictionary:(NSDictionary *)dic withError:(NSError **)error +{ return [[ProductDetailJSONObject alloc] initWithDictionary:dic withError:error]; } #pragma mark - initialize -- (id)initWithDictionary:(NSDictionary *)dic withError:(NSError **)error { +- (id)initWithDictionary:(NSDictionary *)dic withError:(NSError **)error +{ self = [super init]; if (self) { self.type = [APIParser numberFromResponseDictionary:dic forKey:@"type" acceptNil:NO error:error]; @@ -75,7 +77,9 @@ - (id)initWithDictionary:(NSDictionary *)dic withError:(NSError **)error { #pragma mark - getter -- (NSString *)titleAsTitleString:(NSError **)error { + +- (NSString *)titleAsTitleString:(NSError **)error +{ if (!self.title) return nil; NSDictionary *newtitleDic = @{@"title" : self.title}; NSString *tmpTitle = [APIParser stringFromResponseDictionary:newtitleDic forKey:@"title" acceptNumber:NO acceptNil:NO error:error]; @@ -105,7 +109,9 @@ - (NSString *)titleAsTitleString:(NSError **)error { } return tmpTitle; } -- (NSString *)titleAsString:(NSError **)error { + +- (NSString *)titleAsString:(NSError **)error +{ if (!self.title) return nil; NSDictionary *newtitleDic = @{@"title" : self.title}; NSString *tmpTitle = [APIParser stringFromResponseDictionary:newtitleDic forKey:@"title" acceptNumber:NO acceptNil:NO error:error]; @@ -114,6 +120,7 @@ - (NSString *)titleAsString:(NSError **)error { } return tmpTitle; } + - (NSNumber *)downloadAsNumber:(NSError **)error { if (!self.download) return nil; NSDictionary *newdownloadDic = @{@"download" : self.download}; @@ -123,6 +130,7 @@ - (NSNumber *)downloadAsNumber:(NSError **)error { } return tmpDownload; } + - (NSString *)downloadAsString:(NSError **)error { if (!self.download) return nil; NSDictionary *newdownloadDic = @{@"download" : self.download}; @@ -132,6 +140,7 @@ - (NSString *)downloadAsString:(NSError **)error { } return tmpDownload; } + - (NSNumber *)uploadAsNumber:(NSError **)error { if (!self.upload) return nil; NSDictionary *newuploadDic = @{@"upload" : self.upload}; @@ -141,6 +150,7 @@ - (NSNumber *)uploadAsNumber:(NSError **)error { } return tmpUpload; } + - (NSString *)uploadAsString:(NSError **)error { if (!self.upload) return nil; NSDictionary *newuploadDic = @{@"upload" : self.upload}; @@ -152,7 +162,10 @@ - (NSString *)uploadAsString:(NSError **)error { } #pragma mark - NSCoding -- (void)encodeWithCoder:(NSCoder*)coder { + +- (void)encodeWithCoder:(NSCoder*)coder +{ + [super encodeWithCoder:coder]; [coder encodeObject:self.type forKey:@"type"]; [coder encodeObject:self.advantage forKey:@"advantage"]; [coder encodeObject:self.teaserURL forKey:@"teaserURL"]; @@ -164,8 +177,10 @@ - (void)encodeWithCoder:(NSCoder*)coder { [coder encodeObject:self.download forKey:@"download"]; [coder encodeObject:self.upload forKey:@"upload"]; } -- (id)initWithCoder:(NSCoder *)coder { - self = [super init]; + +- (id)initWithCoder:(NSCoder *)coder +{ + self = [super initWithCoder:coder]; self.type = [coder decodeObjectForKey:@"type"]; self.advantage = [coder decodeObjectForKey:@"advantage"]; self.teaserURL = [coder decodeObjectForKey:@"teaserURL"]; @@ -180,7 +195,8 @@ - (id)initWithCoder:(NSCoder *)coder { } #pragma mark - Object Info -- (NSDictionary *)propertyDictionary { +- (NSDictionary *)propertyDictionary +{ NSMutableDictionary *dic = [[NSMutableDictionary alloc] init]; if (self.type) { [dic setObject:self.type forKey:@"type"]; @@ -214,8 +230,9 @@ - (NSDictionary *)propertyDictionary { } return dic; } -- (NSString *)description { - return [NSString stringWithFormat:@"%@",[self propertyDictionary]]; +- (NSString *)description +{ + return [[self propertyDictionary] description]; } @end From bb8d85d414118fce93aa5e16630ca22c64a8c98e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Franc=CC=A7ois=20Benaiteau?= <francois.benaiteau@sinnerschrader-mobile.com> Date: Mon, 12 May 2014 19:25:26 +0200 Subject: [PATCH 086/149] handling custom methods for undefinedProperties --- ObjectiveCCodeGenerator.py | 9 ++--- templates/_source.m.mustache | 21 ++++++++++- .../multiple_property_implementation.mustache | 37 +++++++++++++++++++ templates/string_property.mustache | 7 ++++ .../_ProductDetailJSONObject.m | 13 ++++--- 5 files changed, 75 insertions(+), 12 deletions(-) create mode 100644 templates/multiple_property_implementation.mustache create mode 100644 templates/string_property.mustache diff --git a/ObjectiveCCodeGenerator.py b/ObjectiveCCodeGenerator.py index 2247eca..ef42be5 100755 --- a/ObjectiveCCodeGenerator.py +++ b/ObjectiveCCodeGenerator.py @@ -181,8 +181,6 @@ def process_subtypes(self, propObj, propertyHash) : subtype_infos = {"subtype": subtype} # nothing, subtype_definition = self.process_properties(propObj.getScheme(subtype)) subtype_definition = self.meta_property(propObj.getScheme(subtype)) - print "subtype_definition" - print subtype_definition subtype_infos = {"subtype": subtype, "_subtype": subtype_definition} if key not in propertyHash: propertyHash[key] = {"subtypes": [subtype_infos]} @@ -210,7 +208,7 @@ def process_properties(self, propObj, undefined = False) : if propObj.rootBaseType() == "object": propertyHash['className'] = propObj.getClassName() - return [], propertyHash + return [propertyHash['className']], propertyHash if propObj.rootBaseType() == "string": hasRegex, regex = propObj.getRegex() @@ -317,7 +315,6 @@ def machine_file_content(self, schemeObj, template_file) : dateProps.append(prop_hash) elif prop.rootBaseType() == "array": classes, prop_hash = self.process_properties(prop) - print prop_hash arrayProps.append(prop_hash) elif prop.rootBaseType() == "multi": classes, prop_hash = self.process_properties(prop, True) @@ -327,7 +324,9 @@ def machine_file_content(self, schemeObj, template_file) : undefineProps.append(prop_hash) if(len(classes) > 0): custom_classes.extend(classes) - + if prop_hash['varName'] == 'senderInfo': + print prop_hash + print prop.rootBaseType() hashParams = {"date": str(today.year), "projectPrefix": schemeObj.projectPrefix,"machineClassName": schemeObj.getMachineClassName(), "humanClassName": schemeObj.getClassName(), "variableName": self.makeVarName(schemeObj), "stringProperties": stringProps, "numberProperties": numberProps, "booleanProperties": booleanProps, "dataProperties": dataProps, "dateProperties": dateProps, "arrayProperties": arrayProps, "undefinedProperties": undefineProps, "objectProperties": objectProps} hashParams["custom_classes"] = [] diff --git a/templates/_source.m.mustache b/templates/_source.m.mustache index 0932e03..d253aa2 100644 --- a/templates/_source.m.mustache +++ b/templates/_source.m.mustache @@ -207,8 +207,22 @@ {{/minCount}} {{/arrayProperties}} {{#objectProperties}} + NSDictionary *tmp{{capitalizeVarName}} = [APIParser dictionaryFromResponseDictionary:dic forKey:@"{{name}}" acceptNil:{{#required}}NO{{/required}}{{^required}}YES{{/required}} error:error]; + if (*error) { + return self; + } + if (tmp{{capitalizeVarName}}) { + self.{{varName}}= [[{{className}} alloc] initWithDictionary:tmp{{capitalizeVarName}} withError:error]; + if (*error) { + return self; + } + } {{/objectProperties}} {{#undefinedProperties}} + self.{{varName}} = [APIParser objectFromResponseDictionary:dic forKey:@"{{name}}" acceptNil:NO error:error]; + if (*error) { + return nil; + } {{/undefinedProperties}} } return self; @@ -358,8 +372,8 @@ {{/hasAnyType}} {{/arrayProperties}} {{#undefinedProperties}} +{{> templates/multiple_property_implementation}} {{/undefinedProperties}} - #pragma mark - NSCoding - (void)encodeWithCoder:(NSCoder*)coder @@ -488,10 +502,13 @@ {{/arrayProperties}} {{#objectProperties}} if (self.{{varName}}) { - [dic setObject:self.{{varName}} forKey:@"{{name}}"]; + [dic setObject:[self.{{varName}} propertyDictionary] forKey:@"{{name}}"]; } {{/objectProperties}} {{#undefinedProperties}} + if (self.{{varName}}) { + [dic setObject:self.{{varName}} forKey:@"{{name}}"]; + } {{/undefinedProperties}} return dic; } diff --git a/templates/multiple_property_implementation.mustache b/templates/multiple_property_implementation.mustache new file mode 100644 index 0000000..12b56bc --- /dev/null +++ b/templates/multiple_property_implementation.mustache @@ -0,0 +1,37 @@ +{{#hasCustomType}} +{{#className}} + +- ({{className}} *){{name}}As{{#_upper_camelcase}}{{type}}{{/_upper_camelcase}}:(NSError **)error +{ +d +} +{{/className}} +{{^className}} + +- (NSString *){{name}}As{{#_upper_camelcase}}{{type}}{{/_upper_camelcase}}:(NSError **)error +{ + {{> templates/string_property}} +} +{{/className}} +{{/hasCustomType}} +{{#hasNumberType}} + +- (NSNumber *){{name}}AsNumber:(NSError **)error +{ + +} +{{/hasNumberType}} +{{#hasStringType}} + +- (NSString *){{name}}AsString:(NSError **)error +{ + {{> templates/string_property}} +} +{{/hasStringType}} +{{#hasDateType}} + +- (NSDate *){{name}}AsDate:(NSError **)error +{ + +} +{{/hasDateType}} diff --git a/templates/string_property.mustache b/templates/string_property.mustache new file mode 100644 index 0000000..ead0935 --- /dev/null +++ b/templates/string_property.mustache @@ -0,0 +1,7 @@ +if (!self.{{varName}}) return nil; +NSDictionary *new{{varName}}Dic = @{@"{{varName}}" : self.{{varName}}}; +NSString *tmp{{capitalizeVarName}} = [APIParser stringFromResponseDictionary:new{{varName}}Dic forKey:@"{{name}}" acceptNumber:NO acceptNil:{{#required}}NO{{/required}}{{^required}}YES{{/required}} error:error]; +if (*error) { + return nil; +} +return tmp{{capitalizeVarName}}; diff --git a/test_data/product/AbstractInterfaceFiles/_ProductDetailJSONObject.m b/test_data/product/AbstractInterfaceFiles/_ProductDetailJSONObject.m index c45f090..73e37c8 100644 --- a/test_data/product/AbstractInterfaceFiles/_ProductDetailJSONObject.m +++ b/test_data/product/AbstractInterfaceFiles/_ProductDetailJSONObject.m @@ -75,7 +75,6 @@ - (id)initWithDictionary:(NSDictionary *)dic withError:(NSError **)error return self; } - #pragma mark - getter - (NSString *)titleAsTitleString:(NSError **)error @@ -121,7 +120,8 @@ - (NSString *)titleAsString:(NSError **)error return tmpTitle; } -- (NSNumber *)downloadAsNumber:(NSError **)error { +- (NSNumber *)downloadAsNumber:(NSError **)error +{ if (!self.download) return nil; NSDictionary *newdownloadDic = @{@"download" : self.download}; NSNumber *tmpDownload = [APIParser numberFromResponseDictionary:newdownloadDic forKey:@"download" acceptNil:NO error:error]; @@ -131,7 +131,8 @@ - (NSNumber *)downloadAsNumber:(NSError **)error { return tmpDownload; } -- (NSString *)downloadAsString:(NSError **)error { +- (NSString *)downloadAsString:(NSError **)error +{ if (!self.download) return nil; NSDictionary *newdownloadDic = @{@"download" : self.download}; NSString *tmpDownload = [APIParser stringFromResponseDictionary:newdownloadDic forKey:@"download" acceptNumber:NO acceptNil:NO error:error]; @@ -141,7 +142,8 @@ - (NSString *)downloadAsString:(NSError **)error { return tmpDownload; } -- (NSNumber *)uploadAsNumber:(NSError **)error { +- (NSNumber *)uploadAsNumber:(NSError **)error +{ if (!self.upload) return nil; NSDictionary *newuploadDic = @{@"upload" : self.upload}; NSNumber *tmpUpload = [APIParser numberFromResponseDictionary:newuploadDic forKey:@"upload" acceptNil:NO error:error]; @@ -151,7 +153,8 @@ - (NSNumber *)uploadAsNumber:(NSError **)error { return tmpUpload; } -- (NSString *)uploadAsString:(NSError **)error { +- (NSString *)uploadAsString:(NSError **)error +{ if (!self.upload) return nil; NSDictionary *newuploadDic = @{@"upload" : self.upload}; NSString *tmpUpload = [APIParser stringFromResponseDictionary:newuploadDic forKey:@"upload" acceptNumber:NO acceptNil:NO error:error]; From 7c57cf6ca1a19236ae977b9193ea2fb5fcb90a98 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Franc=CC=A7ois=20Benaiteau?= <francois.benaiteau@sinnerschrader-mobile.com> Date: Mon, 12 May 2014 20:14:36 +0200 Subject: [PATCH 087/149] multiple base-type properties implementation --- ObjectiveCCodeGenerator.py | 34 +++++++++++++---- readJSON_test.py | 2 +- .../multiple_property_implementation.mustache | 7 ++-- templates/number_property.mustache | 7 ++++ templates/string_property.mustache | 37 +++++++++++++++++++ .../_ProductDetailJSONObject.m | 18 +++++++-- 6 files changed, 91 insertions(+), 14 deletions(-) create mode 100644 templates/number_property.mustache diff --git a/ObjectiveCCodeGenerator.py b/ObjectiveCCodeGenerator.py index ef42be5..f400137 100755 --- a/ObjectiveCCodeGenerator.py +++ b/ObjectiveCCodeGenerator.py @@ -131,6 +131,7 @@ def meta_property(self, schemeObj): return meta_hash + def process_basetypes(self, propObj, propertyHash) : # dealing with array property if len(propObj.getBaseTypes()) == 1: @@ -139,20 +140,37 @@ def process_basetypes(self, propObj, propertyHash) : propertyHash['hasMultipleBasetypes'] = True else: propertyHash['hasNoBasetypes'] = True + for subtype in propObj.getBaseTypes(): key = 'hasCustomType' if subtype in propObj.naturalTypeList: key = 'has'+ subtype.capitalize() + 'Type' - propertyHash[key] = {"type": subtype} + if key not in propertyHash: + propertyHash[key] = {"types": [{"type": subtype}]} + else: + propertyHash[key]["types"].append({"type": subtype}) elif subtype == "any": - print "skip 'any' type for" + propertyHash['name'] + propertyHash['hasAnyType'] = {"type": "object"} else: - # print subtype + # derivate baseType if propObj.getScheme(subtype).base_type in propObj.naturalTypeList: - # key = 'has'+ propObj.getScheme(subtype).base_type.capitalize() + 'Type' - propertyHash[key] = {"type": subtype} + key = 'has'+ propObj.getScheme(subtype).base_type.capitalize() + 'Type' + subtype_infos = {"type": subtype} + # nothing, subtype_definition = self.process_properties(propObj.getScheme(subtype)) + subtype_definition = self.meta_property(propObj.getScheme(subtype)) + subtype_infos = {"type": subtype, "_type": subtype_definition} + if key not in propertyHash: + propertyHash[key] = {"types": [subtype_infos]} + else: + propertyHash[key]["types"].append(subtype_infos) + else: - propertyHash[key] = {"type": subtype, "className": propObj.getScheme(subtype).getClassName()} + if key in propertyHash: + propertyHash[key]["subtypes"].append({"type": subtype, "className": propObj.getScheme(subtype).getClassName()}) + classes.append(propObj.getScheme(subtype).getClassName()) + else: + propertyHash[key] = { "subtypes": [{"type": subtype, "className": propObj.getScheme(subtype).getClassName()}]} + classes.append(propObj.getScheme(subtype).getClassName()) def process_subtypes(self, propObj, propertyHash) : classes = [] @@ -242,9 +260,11 @@ def process_properties(self, propObj, undefined = False) : propertyHash['minCount'] = {"value": minLength} # dealing with array property - classes = self.process_subtypes(propObj, propertyHash) if propObj.rootBaseType() == "multi": self.process_basetypes(propObj, propertyHash) + + classes = self.process_subtypes(propObj, propertyHash) + print propertyHash return classes, propertyHash def human_header_content(self, schemeObj) : diff --git a/readJSON_test.py b/readJSON_test.py index 96c55f7..5b8d2c9 100644 --- a/readJSON_test.py +++ b/readJSON_test.py @@ -15,7 +15,7 @@ def execute_script(self, json_file, output_dir): os.system("rm -rf src/Utilities") # return os.system("diff -r src/ " + output_dir) # common_file = "/AbstractInterfaceFiles/_ProductDetailJSONObject.h" - common_file = "/AbstractInterfaceFiles/_ProductDetailJSONObject.m" + common_file = "/AbstractInterfaceFiles/_ProductDetailJSONObject.h" # common_file = "/AbstractInterfaceFiles/_SenderGroupJSONObject.h" # common_file = "/AbstractInterfaceFiles/_SenderList2JSONObject.h" # common_file = "/AbstractInterfaceFiles/_SenderListJSONObject.m" diff --git a/templates/multiple_property_implementation.mustache b/templates/multiple_property_implementation.mustache index 12b56bc..1a56b0e 100644 --- a/templates/multiple_property_implementation.mustache +++ b/templates/multiple_property_implementation.mustache @@ -3,7 +3,7 @@ - ({{className}} *){{name}}As{{#_upper_camelcase}}{{type}}{{/_upper_camelcase}}:(NSError **)error { -d + {{> templates/number_property}} } {{/className}} {{^className}} @@ -18,15 +18,16 @@ d - (NSNumber *){{name}}AsNumber:(NSError **)error { - + {{> templates/number_property}} } {{/hasNumberType}} {{#hasStringType}} - +{{#types}} - (NSString *){{name}}AsString:(NSError **)error { {{> templates/string_property}} } +{{/types}} {{/hasStringType}} {{#hasDateType}} diff --git a/templates/number_property.mustache b/templates/number_property.mustache new file mode 100644 index 0000000..48b5ce6 --- /dev/null +++ b/templates/number_property.mustache @@ -0,0 +1,7 @@ +if (!self.{{varName}}) return nil; +NSDictionary *new{{varName}}Dic = @{@"{{name}}" : self.{{varName}}}; +NSNumber *tmp{{capitalizeVarName}} = [APIParser numberFromResponseDictionary:new{{varName}}Dic forKey:@"{{name}}" acceptNil:NO error:error]; +if (*error) { + return nil; +} +return tmp{{capitalizeVarName}}; diff --git a/templates/string_property.mustache b/templates/string_property.mustache index ead0935..1cfd222 100644 --- a/templates/string_property.mustache +++ b/templates/string_property.mustache @@ -4,4 +4,41 @@ NSString *tmp{{capitalizeVarName}} = [APIParser stringFromResponseDictionary:new if (*error) { return nil; } +{{#_type.maxLength}} +if (tmp{{capitalizeVarName}}.length > {{_type.maxLength}}) { + NSDictionary *userInfo = @{@"propertyName" : @"{{_type.name}}", + @"key" : @"{{_type.name}}", + @"reason" : @"max length validation error", + @"objectClass" : NSStringFromClass([self class]) + }; + *error = [NSError errorWithDomain:k{{projectPrefix}}ErrorDomain_parser code:k{{projectPrefix}}ErrorDomain_parser_valueIsNotValid userInfo:userInfo]; + NSLog(@"%@", *error); + return nil; +} +{{/_type.maxLength}} +{{#_type.minLength}} +if (tmp{{capitalizeVarName}}.length < {{_type.minLength}}) { + NSDictionary *userInfo = @{@"propertyName" : @"{{_type.name}}", + @"key" : @"{{_type.name}}", + @"reason" : @"min length validation error", + @"objectClass" : NSStringFromClass([self class]) + }; + *error = [NSError errorWithDomain:k{{projectPrefix}}ErrorDomain_parser code:k{{projectPrefix}}ErrorDomain_parser_valueIsNotValid userInfo:userInfo]; + NSLog(@"%@", *error); + return nil; +} +{{/_type.minLength}} +{{! to finish need to pass customClass regex...}} +{{#_type.regex}} +if (tmp{{capitalizeVarName}} && [tmp{{capitalizeVarName}} matchesRegExString:@"{{& _type.regex}}"] == NO) { + NSDictionary *userInfo = @{@"propertyName" : @"{{_type.name}}", + @"key" : @"{{_type.name}}", + @"reason" : @"validation error", + @"objectClass" : NSStringFromClass([self class]) + }; + *error = [NSError errorWithDomain:k{{projectPrefix}}ErrorDomain_parser code:k{{projectPrefix}}ErrorDomain_parser_valueIsNotValid userInfo:userInfo]; + NSLog(@"%@", *error); + return nil; +} +{{/_type.regex}} return tmp{{capitalizeVarName}}; diff --git a/test_data/product/AbstractInterfaceFiles/_ProductDetailJSONObject.m b/test_data/product/AbstractInterfaceFiles/_ProductDetailJSONObject.m index 73e37c8..66b715b 100644 --- a/test_data/product/AbstractInterfaceFiles/_ProductDetailJSONObject.m +++ b/test_data/product/AbstractInterfaceFiles/_ProductDetailJSONObject.m @@ -89,19 +89,31 @@ - (NSString *)titleAsTitleString:(NSError **)error return nil; } if (tmpTitle.length > 20) { - NSDictionary *userInfo = [NSDictionary dictionaryWithObjectsAndKeys:@"titleString", @"propertyName", @"titleString", @"key", @"validation error", @"reason", NSStringFromClass([self class]), @"objectClass",nil]; + NSDictionary *userInfo = @{@"propertyName" : @"titleString", + @"key" : @"titleString", + @"reason" : @"max length validation error", + @"objectClass" : NSStringFromClass([self class]) + }; *error = [NSError errorWithDomain:kErrorDomain_parser code:kErrorDomain_parser_valueIsNotValid userInfo:userInfo]; NSLog(@"%@", *error); return nil; } if (tmpTitle.length < 10) { - NSDictionary *userInfo = [NSDictionary dictionaryWithObjectsAndKeys:@"titleString", @"propertyName", @"titleString", @"key", @"validation error", @"reason", NSStringFromClass([self class]), @"objectClass",nil]; + NSDictionary *userInfo = @{@"propertyName" : @"titleString", + @"key" : @"titleString", + @"reason" : @"min length validation error", + @"objectClass" : NSStringFromClass([self class]) + }; *error = [NSError errorWithDomain:kErrorDomain_parser code:kErrorDomain_parser_valueIsNotValid userInfo:userInfo]; NSLog(@"%@", *error); return nil; } if (tmpTitle && [tmpTitle matchesRegExString:@"[a-z0-9]:10"] == NO) { - NSDictionary *userInfo = [NSDictionary dictionaryWithObjectsAndKeys:@"titleString", @"propertyName", @"titleString", @"key", @"validation error", @"reason", NSStringFromClass([self class]), @"objectClass",nil]; + NSDictionary *userInfo = @{@"propertyName" : @"titleString", + @"key" : @"titleString", + @"reason" : @"validation error", + @"objectClass" : NSStringFromClass([self class]) + }; *error = [NSError errorWithDomain:kErrorDomain_parser code:kErrorDomain_parser_valueIsNotValid userInfo:userInfo]; NSLog(@"%@", *error); return nil; From 79eba63f0ce1fb76f2363be0d93ef1c8cfec5a88 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Franc=CC=A7ois=20Benaiteau?= <francois.benaiteau@sinnerschrader-mobile.com> Date: Mon, 12 May 2014 20:21:45 +0200 Subject: [PATCH 088/149] Fixes some failing tests --- templates/_source.m.mustache | 1 + 1 file changed, 1 insertion(+) diff --git a/templates/_source.m.mustache b/templates/_source.m.mustache index d253aa2..abd74a8 100644 --- a/templates/_source.m.mustache +++ b/templates/_source.m.mustache @@ -374,6 +374,7 @@ {{#undefinedProperties}} {{> templates/multiple_property_implementation}} {{/undefinedProperties}} + #pragma mark - NSCoding - (void)encodeWithCoder:(NSCoder*)coder From 42847f4ebae05665d8bb0bdafb2086b2bf5a098f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Franc=CC=A7ois=20Benaiteau?= <francois.benaiteau@sinnerschrader-mobile.com> Date: Mon, 12 May 2014 20:22:08 +0200 Subject: [PATCH 089/149] [WIP] Dealing with custom primitive types --- templates/multiple_property.mustache | 2 ++ 1 file changed, 2 insertions(+) diff --git a/templates/multiple_property.mustache b/templates/multiple_property.mustache index 851c21a..586a93a 100644 --- a/templates/multiple_property.mustache +++ b/templates/multiple_property.mustache @@ -1,10 +1,12 @@ {{#hasCustomType}} +{{#types}} {{#className}} - ({{className}} *){{name}}As{{#_upper_camelcase}}{{type}}{{/_upper_camelcase}}:(NSError **)error; {{/className}} {{^className}} - (NSString *){{name}}As{{#_upper_camelcase}}{{type}}{{/_upper_camelcase}}:(NSError **)error; {{/className}} +{{/types}} {{/hasCustomType}} {{#hasNumberType}} - (NSNumber *){{name}}AsNumber:(NSError **)error; From 432db4c68fe3a0c8843d3ef00dbe3b92a961d110 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Franc=CC=A7ois=20Benaiteau?= <francois.benaiteau@sinnerschrader-mobile.com> Date: Mon, 12 May 2014 20:25:01 +0200 Subject: [PATCH 090/149] add travis ci config --- .travis.yml | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 .travis.yml diff --git a/.travis.yml b/.travis.yml new file mode 100644 index 0000000..ceab200 --- /dev/null +++ b/.travis.yml @@ -0,0 +1,9 @@ +language: python +python: + - "2.7" + - "3.2" + - "3.3" +# command to install dependencies +install: "pip install -r requirements.txt" +# command to run tests +script: nosetests \ No newline at end of file From 2c7ab4373c718ea3d69bb0e301d3c172f401552a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Franc=CC=A7ois=20Benaiteau?= <francois.benaiteau@sinnerschrader-mobile.com> Date: Tue, 13 May 2014 11:12:33 +0200 Subject: [PATCH 091/149] external classes are listed under custom_classes --- templates/_header.h.mustache | 3 --- 1 file changed, 3 deletions(-) diff --git a/templates/_header.h.mustache b/templates/_header.h.mustache index afcf228..2d9bd11 100644 --- a/templates/_header.h.mustache +++ b/templates/_header.h.mustache @@ -9,9 +9,6 @@ #import "{{baseClassName}}.h" {{/baseTypeIsObject}} -{{#objectProperties}} -@class {{className}}; -{{/objectProperties}} {{#custom_classes}} @class {{.}}; {{/custom_classes}} From 474b6680ae1adf02fc5b20899522749f03e38fac Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Franc=CC=A7ois=20Benaiteau?= <francois.benaiteau@sinnerschrader-mobile.com> Date: Tue, 13 May 2014 11:13:21 +0200 Subject: [PATCH 092/149] Fixes missing custom method definition --- templates/multiple_property.mustache | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/templates/multiple_property.mustache b/templates/multiple_property.mustache index 586a93a..5292a88 100644 --- a/templates/multiple_property.mustache +++ b/templates/multiple_property.mustache @@ -1,18 +1,18 @@ {{#hasCustomType}} -{{#types}} {{#className}} - ({{className}} *){{name}}As{{#_upper_camelcase}}{{type}}{{/_upper_camelcase}}:(NSError **)error; {{/className}} {{^className}} - (NSString *){{name}}As{{#_upper_camelcase}}{{type}}{{/_upper_camelcase}}:(NSError **)error; {{/className}} -{{/types}} {{/hasCustomType}} {{#hasNumberType}} - (NSNumber *){{name}}AsNumber:(NSError **)error; {{/hasNumberType}} {{#hasStringType}} -- (NSString *){{name}}AsString:(NSError **)error; +{{#types}} +- (NSString *){{name}}As{{#_upper_camelcase}}{{type}}{{/_upper_camelcase}}:(NSError **)error; +{{/types}} {{/hasStringType}} {{#hasDateType}} - (NSDate *){{name}}AsDate:(NSError **)error; From c88e57c5ab70d8aae7ca7b79046890af4c2ed026 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Franc=CC=A7ois=20Benaiteau?= <francois.benaiteau@sinnerschrader-mobile.com> Date: Tue, 13 May 2014 11:14:40 +0200 Subject: [PATCH 093/149] Fixing ordering methods expectation --- test_data/test_types/_S2MSuperObjectJSONObject.m | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/test_data/test_types/_S2MSuperObjectJSONObject.m b/test_data/test_types/_S2MSuperObjectJSONObject.m index b7afb23..4f70e4c 100644 --- a/test_data/test_types/_S2MSuperObjectJSONObject.m +++ b/test_data/test_types/_S2MSuperObjectJSONObject.m @@ -101,18 +101,18 @@ - (NSDate *)dateInStringsAndDatesAtIndex:(NSUInteger)index withError:(NSError ** return tmpStringsAndDates; } -- (NSString *)stringInStringsAndCustomNumbersAtIndex:(NSUInteger)index withError:(NSError **)error +- (NSNumber *)customNumberInStringsAndCustomNumbersAtIndex:(NSUInteger)index withError:(NSError **)error { - NSString *tmpStringsAndCustomNumbers = [S2MAPIParser stringFromResponseArray:self.stringsAndCustomNumbers atIndex:index acceptNil:YES error:error]; + NSNumber *tmpStringsAndCustomNumbers = [S2MAPIParser numberFromResponseArray:self.stringsAndCustomNumbers atIndex:index acceptNil:YES error:error]; if (*error) { return nil; } return tmpStringsAndCustomNumbers; } -- (NSNumber *)customNumberInStringsAndCustomNumbersAtIndex:(NSUInteger)index withError:(NSError **)error +- (NSString *)stringInStringsAndCustomNumbersAtIndex:(NSUInteger)index withError:(NSError **)error { - NSNumber *tmpStringsAndCustomNumbers = [S2MAPIParser numberFromResponseArray:self.stringsAndCustomNumbers atIndex:index acceptNil:YES error:error]; + NSString *tmpStringsAndCustomNumbers = [S2MAPIParser stringFromResponseArray:self.stringsAndCustomNumbers atIndex:index acceptNil:YES error:error]; if (*error) { return nil; } From 6205209383b6e4bf1ab85432ea2deaa1e5f7c0b0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Franc=CC=A7ois=20Benaiteau?= <francois.benaiteau@sinnerschrader-mobile.com> Date: Tue, 13 May 2014 11:24:37 +0200 Subject: [PATCH 094/149] trying to fix print statement on 3.X version --- ObjectiveCCodeGenerator.py | 1 - readJSON.py | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/ObjectiveCCodeGenerator.py b/ObjectiveCCodeGenerator.py index f400137..80fa8db 100755 --- a/ObjectiveCCodeGenerator.py +++ b/ObjectiveCCodeGenerator.py @@ -264,7 +264,6 @@ def process_properties(self, propObj, undefined = False) : self.process_basetypes(propObj, propertyHash) classes = self.process_subtypes(propObj, propertyHash) - print propertyHash return classes, propertyHash def human_header_content(self, schemeObj) : diff --git a/readJSON.py b/readJSON.py index eba084b..34b1598 100755 --- a/readJSON.py +++ b/readJSON.py @@ -55,7 +55,7 @@ try: opts, args = getopt.getopt(argv,"ho:p:s:t:i:",["prefix=","suffix=","target=","input=","output="]) except getopt.GetoptError: - print usageString + print(usageString) sys.exit(2) for opt, arg in opts: From 9422beab9753457ea9a5a4d2e0e6d5c4d9724b18 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Franc=CC=A7ois=20Benaiteau?= <francois.benaiteau@sinnerschrader-mobile.com> Date: Tue, 13 May 2014 11:24:52 +0200 Subject: [PATCH 095/149] remove extra unused files --- mustache_test.py | 40 ------- templates/machine.m.mustache | 222 ----------------------------------- 2 files changed, 262 deletions(-) delete mode 100644 mustache_test.py delete mode 100644 templates/machine.m.mustache diff --git a/mustache_test.py b/mustache_test.py deleted file mode 100644 index ccf84c7..0000000 --- a/mustache_test.py +++ /dev/null @@ -1,40 +0,0 @@ -import unittest - -import datetime -import time -import os -import sys -from pystache import Renderer - -# run nosetests -s mustache_test.py -class TestMustache(unittest.TestCase): - - def assert_content_file(self, filename, content): - with open(filename, 'r') as content_file: - expected_result = content_file.read() - self.assertMultiLineEqual(content, expected_result) - - def test_mustache_machine_m(self): - templateFile = open(self.template_file_path("machine.m.mustache"), "r") - today = datetime.date.fromtimestamp(time.time()) - - idProp = {'varName': 's2mId', 'name': 'id'} - firstName = {'varName': 'firstName', 'name': 'firstName'} - myNumber = {'varName': 'myNumber', 'name': 'myNumber'} - - stringProperties = [idProp, firstName] - numberProperties = [myNumber] - hashParams = {"date": str(today.year), "machineClassName": "_MyObject", "projectPrefix": "S2M", "humanClassName": "MyObject", "variableName": "myObject", "stringProperties": stringProperties, 'numberProperties': numberProperties} - - result = Renderer().render(templateFile.read(), hashParams) - print result - # self.assert_content_file(self.test_file_path + "/_S2MSenderJSONObject.h", result) - - def template_file_path(self, filename) : - templatePath = os.path.realpath( __file__ ) - templatePath = templatePath.replace(os.path.basename( __file__ ), 'templates') - return os.path.join(templatePath, filename) - - -if __name__ == '__main__': - unittest.main() diff --git a/templates/machine.m.mustache b/templates/machine.m.mustache deleted file mode 100644 index 34f5578..0000000 --- a/templates/machine.m.mustache +++ /dev/null @@ -1,222 +0,0 @@ -// -// {{machineClassName}}.m -// -// Created by MetaJSONParser. -// Copyright (c) {{date}} SinnerSchrader Mobile. All rights reserved. - -#import "{{projectPrefix}}APIParser.h" -#import "NSString+RegExValidation.h" -#import "{{humanClassName}}.h" - - -@implementation {{machineClassName}} - -#pragma mark - factory - -+ ({{humanClassName}} *){{variableName}}WithDictionary:(NSDictionary *)dic withError:(NSError **)error { - return [[{{humanClassName}} alloc] initWithDictionary:dic withError:error]; -} - - -#pragma mark - initialize -- (id)initWithDictionary:(NSDictionary *)dic withError:(NSError **)error { - self = [super initWithDictionary:dic withError:error]; - if (self) { - {{#numberProperties}} - self.{{varName}} = [{{projectPrefix}}APIParser numberFromResponseDictionary:dic forKey:@"{{name}}" acceptNil:{{#required}}NO{{/required}}{{^required}}YES{{/required}} error:error]; - if (*error) { - return self; - } - {{/numberProperties}} - {{#stringProperties}} - self.{{varName}} = [{{projectPrefix}}APIParser numberFromResponseDictionary:dic forKey:@"{{name}}" acceptNumber:YES acceptNil:{{#required}}NO{{/required}}{{^required}}YES{{/required}} error:error]; - {{#regex}} - if (self.{{varName}} && [self.{{varName}} matchesRegExString:@"{{value}}"] == NO) { - NSDictionary *userInfo = @{@"propertyName" : @"{{varName}}", - @"key" : @"{{name}}", - @"reason" : @"validation error", - @"objectClass" : NSStringFromClass([self class])}; - *error = [NSError errorWithDomain:kEGMErrorDomain_parser code:kEGMErrorDomain_parser_valueIsNotValid userInfo:userInfo]; - NSLog(@"%@", *error); - return self; - } - {{/regex}} - {{#maxLength}} - if (self.{{varName}}.length > {{value}}) { - NSDictionary *userInfo = @{@"propertyName" : @"{{varName}}", - @"key" : @"{{name}}", - @"reason" : @"max length validation error", - @"objectClass" : NSStringFromClass([self class])}; - *error = [NSError errorWithDomain:kEGMErrorDomain_parser code:kEGMErrorDomain_parser_valueIsNotValid userInfo:userInfo]; - NSLog(@"%@", *error); - return self; - } - {{/maxLength}} - {{#minLength}} - if (self.{{varName}}.length < {{value}}) { - NSDictionary *userInfo = @{@"propertyName" : @"{{varName}}", - @"key" : @"{{name}}", - @"reason" : @"min length validation error", - @"objectClass" : NSStringFromClass([self class])}; - *error = [NSError errorWithDomain:kEGMErrorDomain_parser code:kEGMErrorDomain_parser_valueIsNotValid userInfo:userInfo]; - NSLog(@"%@", *error); - return self; - } - {{/minLength}} - if (*error) { - return self; - } - {{/stringProperties}} - {{#booleanProperties}} - {{/booleanProperties}} - {{#dataProperties}} - {{/dataProperties}} - {{#dateProperties}} - {{/dateProperties}} - {{#msDateProperties}} - {{/msDateProperties}} - {{#arrayProperties}} - {{/arrayProperties}} - {{#objectProperties}} - {{/objectProperties}} - {{#undefinedProperties}} - {{/undefinedProperties}} - } - return self; -} - -{{#baseObjectType}} -#pargma mark - clone --(instancetype) clone -{ - NSData *archivedData = [NSKeyedArchiver archivedDataWithRootObject:self]; - typeof(self) clone = [NSKeyedUnarchiver unarchiveObjectWithData:archivedData]; - return clone; -} -{{/baseObjectType}} -#pragma mark - getter - -{{#arrayProperties}} -{{/arrayProperties}} - -{{#undefinedProperties}} -{{/undefinedProperties}} - -#pragma mark - NSCoding -- (void)encodeWithCoder:(NSCoder*)coder { - [super encodeWithCoder:coder]; - {{#numberProperties}} - [coder encodeObject:self.{{varName}} forKey:@"{{name}}"]; - {{/numberProperties}} - {{#stringProperties}} - [coder encodeObject:self.{{varName}} forKey:@"{{name}}"]; - {{/stringProperties}} - {{#booleanProperties}} - [coder encodeBool:self.{{varName}} forKey:@"{{name}}"]; - {{/booleanProperties}} - {{#dataProperties}} - [coder encodeObject:self.{{varName}} forKey:@"{{name}}"]; - {{/dataProperties}} - {{#dateProperties}} - [coder encodeObject:self.{{varName}} forKey:@"{{name}}"]; - {{/dateProperties}} - {{#msDateProperties}} - [coder encodeObject:self.{{varName}} forKey:@"{{name}}"]; - {{/msDateProperties}} - {{#arrayProperties}} - [coder encodeObject:self.{{varName}} forKey:@"{{name}}"]; - {{/arrayProperties}} - {{#objectProperties}} - [coder encodeObject:self.{{varName}} forKey:@"{{name}}"]; - {{/objectProperties}} - {{#undefinedProperties}} - [coder encodeObject:self.{{varName}} forKey:@"{{name}}"]; - {{/undefinedProperties}} -} - -- (id)initWithCoder:(NSCoder *)coder { - self = [super initWithCoder:coder]; - {{#numberProperties}} - self.{{varName}} = [coder decodeObjectForKey:@"{{name}}"]; - {{/numberProperties}} - {{#stringProperties}} - self.{{varName}} = [coder decodeObjectForKey:@"{{name}}"]; - {{/stringProperties}} - {{#booleanProperties}} - self.{{varName}} = [coder decodeBoolForKey:@"{{name}}"]; - {{/booleanProperties}} - {{#dataProperties}} - self.{{varName}} = [coder decodeObjectForKey:@"{{name}}"]; - {{/dataProperties}} - {{#dateProperties}} - self.{{varName}} = [coder decodeObjectForKey:@"{{name}}"]; - {{/dateProperties}} - {{#msDateProperties}} - self.{{varName}} = [coder decodeObjectForKey:@"{{name}}"]; - {{/msDateProperties}} - {{#arrayProperties}} - self.{{varName}} = [coder decodeObjectForKey:@"{{name}}"]; - {{/arrayProperties}} - {{#objectProperties}} - self.{{varName}} = [coder decodeObjectForKey:@"{{name}}"]; - {{/objectProperties}} - {{#undefinedProperties}} - self.{{varName}} = [coder decodeObjectForKey:@"{{name}}"]; - {{/undefinedProperties}} - return self; -} - -#pragma mark - Object Info -- (NSDictionary *)propertyDictionary { - {{#baseTypeIsObject}} - NSMutableDictionary *dic = [[super propertyDictionary] mutableCopy]; - {{/baseTypeIsObject}} - {{^baseTypeIsObject}} - NSMutableDictionary *dic = [[NSMutableDictionary alloc] init]; - {{/baseTypeIsObject}} - {{#numberProperties}} - if (self.{{varName}}) { - [dic setObject:self.{{varName}} forKey:@"{{name}}"]; - } - {{/numberProperties}} - {{#stringProperties}} - if (self.{{varName}}) { - [dic setObject:self.{{varName}} forKey:@"{{name}}"]; - } - {{/stringProperties}} - {{#booleanProperties}} - if (self.{{varName}}) { - [dic setObject:[NSNumber numberWithBool:self.{{varName}}] forKey:@"{{name}}"]; - } - {{/booleanProperties}} - {{#dataProperties}} - {{/dataProperties}} - {{#dateProperties}} - {{/dateProperties}} - {{#msDateProperties}} - if (self.{{varName}}) { - NSNumber* number = @([self.lastModificationTimestamp timeIntervalSince1970] * 1000); - NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init]; - [formatter setNumberStyle:NSNumberFormatterNoStyle]; - [formatter setNegativeFormat:@"0"]; - NSString *value = [formatter stringFromNumber:number]; - NSNumber *convertedNumber = [formatter numberFromString:value]; - [dic setObject:convertedNumber forKey:@"{{name}}"]; - } - {{/msDateProperties}} - {{#arrayProperties}} - {{/arrayProperties}} - {{#objectProperties}} - {{/objectProperties}} - {{#undefinedProperties}} - {{/undefinedProperties}} - return dic; -} - -{{#baseObjectType}} -- (NSString *)description -{ - return [[self propertyDictionary] description]; -} -{{/baseObjectType}} -@end From 2ac8961aa0a31abec26bb34b678f13133717856b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Franc=CC=A7ois=20Benaiteau?= <francois.benaiteau@sinnerschrader-mobile.com> Date: Tue, 13 May 2014 11:27:42 +0200 Subject: [PATCH 096/149] open class per file, TemplateCodeGenerator has its own file --- ObjectiveCCodeGenerator.py | 83 +------------------------------------- template_code_generator.py | 80 ++++++++++++++++++++++++++++++++++++ 2 files changed, 82 insertions(+), 81 deletions(-) create mode 100644 template_code_generator.py diff --git a/ObjectiveCCodeGenerator.py b/ObjectiveCCodeGenerator.py index 80fa8db..0b27a64 100755 --- a/ObjectiveCCodeGenerator.py +++ b/ObjectiveCCodeGenerator.py @@ -22,14 +22,13 @@ THE SOFTWARE. ''' -import datetime -import time -import os + import sys import re from pystache import Renderer from cStringIO import StringIO +from template_code_generator import * class ObjectiveCCodeGenerator : @@ -401,81 +400,3 @@ def write_file(self, filename, content) : writefile.write(content) # Write a string to a file finally : writefile.close() - - -class TemplateCodeGenerator : - - projectPrefix = "" - dirPath = "" - templatePath = "./templates" - - def __init__(self): - projectPrefix = "S2M" - dirPath = "classes" - templatePath = "./templates" - def writeNSStringCategory(self) : - today = datetime.date.fromtimestamp(time.time()) - if not os.path.exists(self.dirPath): - os.makedirs(self.dirPath) - - headerDstFile = open(self.dirPath + "/NSString+RegExValidation.h", "w") - headerSrcFile = self.templatePath + "/NSString+RegExValidation.h" - - try: - for line in open(headerSrcFile): - newLine = line.replace('_DATE_', "") - newLine = newLine.replace('_YEAR_', str(today.year)) - headerDstFile.write(newLine) - finally : - headerDstFile.close() - - implDstFile = open(self.dirPath + "/NSString+RegExValidation.m", "w") - implSrcFile = self.templatePath + "/NSString+RegExValidation.m" - - try: - for line in open(implSrcFile): - newLine = line.replace('_DATE_', "") - newLine = newLine.replace('_YEAR_', str(today.year)) - implDstFile.write(newLine) - finally : - implDstFile.close() - - def writeAPIParser(self) : - today = datetime.date.fromtimestamp(time.time()) - if not os.path.exists(self.dirPath): - os.makedirs(self.dirPath) - - headerDstFile = open(self.dirPath + "/"+self.projectPrefix+"APIParser.h", "w") - headerSrcFile = self.templatePath + "/APIParser/APIParser.h" - - - try: - for line in open(headerSrcFile): - newLine = line.replace('_DATE_', "") - newLine = newLine.replace('_YEAR_', str(today.year)) - newLine = newLine.replace('_PREFIX_', self.projectPrefix) - headerDstFile.write(newLine) - finally : - headerDstFile.close() - - implDstFile = open(self.dirPath + "/"+self.projectPrefix+"APIParser.m", "w") - implSrcFile = self.templatePath + "/APIParser/APIParser.m" - - try: - for line in open(implSrcFile): - newLine = line.replace('_DATE_', "") - newLine = newLine.replace('_YEAR_', str(today.year)) - newLine = newLine.replace('_PREFIX_', self.projectPrefix) - implDstFile.write(newLine) - finally : - implDstFile.close() - - def writeTemplates(self) : - - if self.dirPath.endswith("/") : - self.dirPath = self.dirPath[:-1] - baseDirPath = self.dirPath - self.dirPath = baseDirPath + "/Utilities/NSString" - self.writeNSStringCategory() - self.dirPath = baseDirPath + "/Utilities/APIParser" - self.writeAPIParser() diff --git a/template_code_generator.py b/template_code_generator.py new file mode 100644 index 0000000..c2d1d26 --- /dev/null +++ b/template_code_generator.py @@ -0,0 +1,80 @@ +import os +import datetime +import time + +class TemplateCodeGenerator : + + projectPrefix = "" + dirPath = "" + templatePath = "./templates" + + def __init__(self): + projectPrefix = "S2M" + dirPath = "classes" + templatePath = "./templates" + def writeNSStringCategory(self) : + today = datetime.date.fromtimestamp(time.time()) + if not os.path.exists(self.dirPath): + os.makedirs(self.dirPath) + + headerDstFile = open(self.dirPath + "/NSString+RegExValidation.h", "w") + headerSrcFile = self.templatePath + "/NSString+RegExValidation.h" + + try: + for line in open(headerSrcFile): + newLine = line.replace('_DATE_', "") + newLine = newLine.replace('_YEAR_', str(today.year)) + headerDstFile.write(newLine) + finally : + headerDstFile.close() + + implDstFile = open(self.dirPath + "/NSString+RegExValidation.m", "w") + implSrcFile = self.templatePath + "/NSString+RegExValidation.m" + + try: + for line in open(implSrcFile): + newLine = line.replace('_DATE_', "") + newLine = newLine.replace('_YEAR_', str(today.year)) + implDstFile.write(newLine) + finally : + implDstFile.close() + + def writeAPIParser(self) : + today = datetime.date.fromtimestamp(time.time()) + if not os.path.exists(self.dirPath): + os.makedirs(self.dirPath) + + headerDstFile = open(self.dirPath + "/"+self.projectPrefix+"APIParser.h", "w") + headerSrcFile = self.templatePath + "/APIParser/APIParser.h" + + + try: + for line in open(headerSrcFile): + newLine = line.replace('_DATE_', "") + newLine = newLine.replace('_YEAR_', str(today.year)) + newLine = newLine.replace('_PREFIX_', self.projectPrefix) + headerDstFile.write(newLine) + finally : + headerDstFile.close() + + implDstFile = open(self.dirPath + "/"+self.projectPrefix+"APIParser.m", "w") + implSrcFile = self.templatePath + "/APIParser/APIParser.m" + + try: + for line in open(implSrcFile): + newLine = line.replace('_DATE_', "") + newLine = newLine.replace('_YEAR_', str(today.year)) + newLine = newLine.replace('_PREFIX_', self.projectPrefix) + implDstFile.write(newLine) + finally : + implDstFile.close() + + def writeTemplates(self) : + + if self.dirPath.endswith("/") : + self.dirPath = self.dirPath[:-1] + baseDirPath = self.dirPath + self.dirPath = baseDirPath + "/Utilities/NSString" + self.writeNSStringCategory() + self.dirPath = baseDirPath + "/Utilities/APIParser" + self.writeAPIParser() From 4a77992987dc3b61f4104be3ba7e434d912dcf5e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Franc=CC=A7ois=20Benaiteau?= <francois.benaiteau@sinnerschrader-mobile.com> Date: Tue, 13 May 2014 11:31:52 +0200 Subject: [PATCH 097/149] Fixing breaking syntax on python 3.X --- readJSON.py | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/readJSON.py b/readJSON.py index 34b1598..0339407 100755 --- a/readJSON.py +++ b/readJSON.py @@ -31,7 +31,7 @@ import sys, getopt from JSONScheme import * from ObjectiveCCodeGenerator import * -from JavaCodeGenerator import * +from JavaCodeGenerator import * jsonfiles = [] @@ -60,7 +60,7 @@ for opt, arg in opts: if opt in ("-h", "--help"): - print usageString + print(usageString) sys.exit() elif opt in ("-p", "--prefix"): projectPrefix = arg @@ -91,12 +91,12 @@ if target == 'none' : print 'error - target platform is not defined' - print usageString + print(usageString) sys.exit() if len(jsonfiles) == 0 : print 'error - meta JSON file is not defined' - print usageString + print(usageString) sys.exit() @@ -114,7 +114,7 @@ def openFileAndParseJSON(filePath): obj = json.load(f) finally: f.close() - + return obj iOS = False @@ -125,7 +125,7 @@ def openFileAndParseJSON(filePath): Android = True else : print 'error - unknown target platform : ' + target - print usageString + print(usageString) sys.exit() @@ -148,13 +148,13 @@ def openFileAndParseJSON(filePath): JSONScheme.objectSuffix = objectSuffix print "\nGenerate source codes for " + target + ", with Project Prefix \'" + projectPrefix + "\' and suffix \'" + objectSuffix + "\'" -print "Output path : \'" + dirPathToSaveCodes + "\'\n" +print "Output path : \'" + dirPathToSaveCodes + "\'\n" for filePath in jsonfiles : print "read " + filePath + " to parse ...." - + jsonObj = openFileAndParseJSON(filePath) - + if type(jsonObj) == list : for dic in jsonObj : schemeObj = JSONScheme() @@ -194,7 +194,7 @@ def openFileAndParseJSON(filePath): codeGen.objectSuffix = objectSuffix allSchemes = JSONScheme.JSONSchemeDic codeGen.JSONSchemeDic = allSchemes - + rootDic = allSchemes["ROOT"] allRootKeys = rootDic.keys() for typeName in rootDic : From b0e4d76f7a10c11f4fbd42ae3f32bab78f72bf4a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Franc=CC=A7ois=20Benaiteau?= <francois.benaiteau@sinnerschrader-mobile.com> Date: Tue, 13 May 2014 11:35:29 +0200 Subject: [PATCH 098/149] Disable support of newer python versions --- .travis.yml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index ceab200..714bbd0 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,8 +1,7 @@ language: python python: - "2.7" - - "3.2" - - "3.3" + # command to install dependencies install: "pip install -r requirements.txt" # command to run tests From 3aa870c701092bf9727ce49c0911591f5378d31e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Franc=CC=A7ois=20Benaiteau?= <francois.benaiteau@sinnerschrader-mobile.com> Date: Tue, 13 May 2014 16:11:06 +0200 Subject: [PATCH 099/149] reorganise files into package --- Development.md => doc/Development.md | 0 JSONScheme.py => metajson/JSONScheme.py | 0 JavaCodeGenerator.py => metajson/JavaCodeGenerator.py | 0 .../ObjectiveCCodeGenerator.py | 0 metajson/__init__.py | 0 readJSON.py => metajson/readJSON.py | 0 .../template_code_generator.py | 0 setup.py | 11 +++++++++++ .../ObjectiveCCodeGenerator_test.py | 0 readJSON_test.py => test/readJSON_test.py | 0 10 files changed, 11 insertions(+) rename Development.md => doc/Development.md (100%) rename JSONScheme.py => metajson/JSONScheme.py (100%) rename JavaCodeGenerator.py => metajson/JavaCodeGenerator.py (100%) rename ObjectiveCCodeGenerator.py => metajson/ObjectiveCCodeGenerator.py (100%) create mode 100644 metajson/__init__.py rename readJSON.py => metajson/readJSON.py (100%) rename template_code_generator.py => metajson/template_code_generator.py (100%) create mode 100644 setup.py rename ObjectiveCCodeGenerator_test.py => test/ObjectiveCCodeGenerator_test.py (100%) rename readJSON_test.py => test/readJSON_test.py (100%) diff --git a/Development.md b/doc/Development.md similarity index 100% rename from Development.md rename to doc/Development.md diff --git a/JSONScheme.py b/metajson/JSONScheme.py similarity index 100% rename from JSONScheme.py rename to metajson/JSONScheme.py diff --git a/JavaCodeGenerator.py b/metajson/JavaCodeGenerator.py similarity index 100% rename from JavaCodeGenerator.py rename to metajson/JavaCodeGenerator.py diff --git a/ObjectiveCCodeGenerator.py b/metajson/ObjectiveCCodeGenerator.py similarity index 100% rename from ObjectiveCCodeGenerator.py rename to metajson/ObjectiveCCodeGenerator.py diff --git a/metajson/__init__.py b/metajson/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/readJSON.py b/metajson/readJSON.py similarity index 100% rename from readJSON.py rename to metajson/readJSON.py diff --git a/template_code_generator.py b/metajson/template_code_generator.py similarity index 100% rename from template_code_generator.py rename to metajson/template_code_generator.py diff --git a/setup.py b/setup.py new file mode 100644 index 0000000..2f534af --- /dev/null +++ b/setup.py @@ -0,0 +1,11 @@ +#!/usr/bin/env python + +from distutils.core import setup + +setup(name='metaJSON', + version='1.0.0', + description='metaJSON provides a meta language to generate object models for several languages. The generated classes can easily be used for the client-server communication.', + url='https://github.com/sinnerschrader-mobile/metaJSON.git', + license='MIT', + scripts=['readJSON.py'] + ) diff --git a/ObjectiveCCodeGenerator_test.py b/test/ObjectiveCCodeGenerator_test.py similarity index 100% rename from ObjectiveCCodeGenerator_test.py rename to test/ObjectiveCCodeGenerator_test.py diff --git a/readJSON_test.py b/test/readJSON_test.py similarity index 100% rename from readJSON_test.py rename to test/readJSON_test.py From 906f7ad3ad964cea6114430d182b463cd684d619 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Franc=CC=A7ois=20Benaiteau?= <francois.benaiteau@sinnerschrader-mobile.com> Date: Tue, 13 May 2014 16:48:02 +0200 Subject: [PATCH 100/149] add files to run metajson as a script i.e: - ./metajson-runner.py - python -m metajson --- metajson-runner.py | 12 ++++++++++++ metajson/__main__.py | 6 ++++++ 2 files changed, 18 insertions(+) create mode 100755 metajson-runner.py create mode 100644 metajson/__main__.py diff --git a/metajson-runner.py b/metajson-runner.py new file mode 100755 index 0000000..6124665 --- /dev/null +++ b/metajson-runner.py @@ -0,0 +1,12 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +"""Convenience wrapper for running metajson directly from source tree.""" + + + +import sys + +if __name__ == '__main__': + from metajson.readJSON import main + sys.exit(main(sys.argv)) diff --git a/metajson/__main__.py b/metajson/__main__.py new file mode 100644 index 0000000..e37764c --- /dev/null +++ b/metajson/__main__.py @@ -0,0 +1,6 @@ + # -*- coding: utf-8 -*- + +"""metajson.__main__: executed when metajson directory is called as script.""" + +from .readJSON import main +main() From 1569eba6a1dac645fe3fed69760aadcbb7963d36 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Franc=CC=A7ois=20Benaiteau?= <francois.benaiteau@sinnerschrader-mobile.com> Date: Tue, 13 May 2014 16:49:31 +0200 Subject: [PATCH 101/149] update readJSON with main method --- metajson/readJSON.py | 213 ++++++++++++++++++++++--------------------- 1 file changed, 108 insertions(+), 105 deletions(-) diff --git a/metajson/readJSON.py b/metajson/readJSON.py index 0339407..aa535de 100755 --- a/metajson/readJSON.py +++ b/metajson/readJSON.py @@ -29,28 +29,29 @@ import glob import shutil import sys, getopt + from JSONScheme import * from ObjectiveCCodeGenerator import * from JavaCodeGenerator import * - -jsonfiles = [] -inputfile = 'do you have files?' -projectPrefix = '' -target = 'iOS' -dirPathToSaveCodes = './src' -objectSuffix = "JSONObject" - -usageString = '\nreadJSON.py [ -p | -t | -o | -s ] [-i]\n' -usageString += 'Options:\n' -usageString += ' -h, --help shows help\n' -usageString += ' -p, --prefix= project prefix (default: S2M)\n' -usageString += ' -s, --suffix= classname suffix (default: JSONObject). Use "-s false" for no suffix\n' -usageString += ' -t, --target= target platform iOS or Android (default: iOS)\n' -usageString += ' -i, --input= meta-JSON file to read\n' -usageString += ' -o, --output= ouput path of generated source codes\n' - -if __name__ == "__main__": +def main(argv=sys.argv): + jsonfiles = [] + inputfile = 'do you have files?' + projectPrefix = '' + target = 'iOS' + dirPathToSaveCodes = './src' + objectSuffix = "JSONObject" + + usageString = '\nreadJSON.py [ -p | -t | -o | -s ] [-i]\n' + usageString += 'Options:\n' + usageString += ' -h, --help shows help\n' + usageString += ' -p, --prefix= project prefix (default: S2M)\n' + usageString += ' -s, --suffix= classname suffix (default: JSONObject). Use "-s false" for no suffix\n' + usageString += ' -t, --target= target platform iOS or Android (default: iOS)\n' + usageString += ' -i, --input= meta-JSON file to read\n' + usageString += ' -o, --output= ouput path of generated source codes\n' + + print("Executing metajson version %s." % __version__) argv = sys.argv[1:] try: opts, args = getopt.getopt(argv,"ho:p:s:t:i:",["prefix=","suffix=","target=","input=","output="]) @@ -89,115 +90,117 @@ if addFiles : jsonfiles.append(arg) -if target == 'none' : - print 'error - target platform is not defined' - print(usageString) - sys.exit() - -if len(jsonfiles) == 0 : - print 'error - meta JSON file is not defined' - print(usageString) - sys.exit() - - + if target == 'none' : + print 'error - target platform is not defined' + print(usageString) + sys.exit() -templatePath = os.path.abspath( __file__ ) -templatePath = templatePath.replace('/readJSON.py', '/templates') + if len(jsonfiles) == 0 : + print 'error - meta JSON file is not defined' + print(usageString) + sys.exit() -if not os.path.exists(dirPathToSaveCodes): - os.makedirs(dirPathToSaveCodes) -def openFileAndParseJSON(filePath): - f = open(filePath) - try: - obj = json.load(f) - finally: - f.close() + templatePath = os.path.abspath( __file__ ) + templatePath = templatePath.replace('/readJSON.py', '/templates') - return obj + if not os.path.exists(dirPathToSaveCodes): + os.makedirs(dirPathToSaveCodes) + iOS = False + Android = False + if target == 'iOS' : + iOS = True + elif target == 'Android' : + Android = True + else : + print 'error - unknown target platform : ' + target + print(usageString) + sys.exit() -iOS = False -Android = False -if target == 'iOS' : - iOS = True -elif target == 'Android' : - Android = True -else : - print 'error - unknown target platform : ' + target - print(usageString) - sys.exit() + hasError = False -hasError = False + if iOS : + if dirPathToSaveCodes.endswith("/") : + dirPathToSaveCodes = dirPathToSaveCodes[:-1] -if iOS : - if dirPathToSaveCodes.endswith("/") : - dirPathToSaveCodes = dirPathToSaveCodes[:-1] + if os.path.exists(dirPathToSaveCodes+ "/abstractInterfaceFiles"): + shutil.rmtree(dirPathToSaveCodes + "/abstractInterfaceFiles") - if os.path.exists(dirPathToSaveCodes+ "/abstractInterfaceFiles"): - shutil.rmtree(dirPathToSaveCodes + "/abstractInterfaceFiles") + templateCodeGen = TemplateCodeGenerator() + templateCodeGen.templatePath = templatePath + templateCodeGen.projectPrefix = projectPrefix + templateCodeGen.dirPath = dirPathToSaveCodes + templateCodeGen.writeTemplates() - templateCodeGen = TemplateCodeGenerator() - templateCodeGen.templatePath = templatePath - templateCodeGen.projectPrefix = projectPrefix - templateCodeGen.dirPath = dirPathToSaveCodes - templateCodeGen.writeTemplates() + JSONScheme.projectPrefix = projectPrefix + JSONScheme.objectSuffix = objectSuffix -JSONScheme.projectPrefix = projectPrefix -JSONScheme.objectSuffix = objectSuffix + print "\nGenerate source codes for " + target + ", with Project Prefix \'" + projectPrefix + "\' and suffix \'" + objectSuffix + "\'" + print "Output path : \'" + dirPathToSaveCodes + "\'\n" -print "\nGenerate source codes for " + target + ", with Project Prefix \'" + projectPrefix + "\' and suffix \'" + objectSuffix + "\'" -print "Output path : \'" + dirPathToSaveCodes + "\'\n" + for filePath in jsonfiles : + print "read " + filePath + " to parse ...." -for filePath in jsonfiles : - print "read " + filePath + " to parse ...." + jsonObj = openFileAndParseJSON(filePath) - jsonObj = openFileAndParseJSON(filePath) + if type(jsonObj) == list : + for dic in jsonObj : + schemeObj = JSONScheme() + schemeObj.projectPrefix = projectPrefix + schemeObj.objectSuffix = objectSuffix + if schemeObj.parseDictionary(dic) == False: + hasError = True + break - if type(jsonObj) == list : - for dic in jsonObj : + elif type(jsonObj) == dict : schemeObj = JSONScheme() - schemeObj.projectPrefix = projectPrefix - schemeObj.objectSuffix = objectSuffix - if schemeObj.parseDictionary(dic) == False: + if schemeObj.parseDictionary(jsonObj) == False : hasError = True - break - elif type(jsonObj) == dict : - schemeObj = JSONScheme() - if schemeObj.parseDictionary(jsonObj) == False : + else : hasError = True + print "error : no JSON Scheme" + break; - else : - hasError = True - print "error : no JSON Scheme" - break; + if hasError : + print "error - Fail to make scheme object." + break; + + if hasError : + break - if hasError : - print "error - Fail to make scheme object." - break; + if not hasError: + codeGen = 0 - if hasError : - break + if Android : + codeGen = JavaCodeGenerator() + else : + codeGen = ObjectiveCCodeGenerator() - if not hasError: - codeGen = 0 + codeGen.projectPrefix = projectPrefix + codeGen.dirPath = dirPathToSaveCodes + codeGen.objectSuffix = objectSuffix + allSchemes = JSONScheme.JSONSchemeDic + codeGen.JSONSchemeDic = allSchemes - if Android : - codeGen = JavaCodeGenerator() - else : - codeGen = ObjectiveCCodeGenerator() - - codeGen.projectPrefix = projectPrefix - codeGen.dirPath = dirPathToSaveCodes - codeGen.objectSuffix = objectSuffix - allSchemes = JSONScheme.JSONSchemeDic - codeGen.JSONSchemeDic = allSchemes - - rootDic = allSchemes["ROOT"] - allRootKeys = rootDic.keys() - for typeName in rootDic : - obj = rootDic[typeName]; - if obj.isNaturalType() == False : - codeGen.make(obj) + rootDic = allSchemes["ROOT"] + allRootKeys = rootDic.keys() + for typeName in rootDic : + obj = rootDic[typeName]; + if obj.isNaturalType() == False : + codeGen.make(obj) + +def openFileAndParseJSON(filePath): + f = open(filePath) + + try: + obj = json.load(f) + finally: + f.close() + + return obj + +if __name__ == '__main__': + sys.exit(main(sys.argv)) From d25b554c30e7794cc5ec53af18058848090b756b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Franc=CC=A7ois=20Benaiteau?= <francois.benaiteau@sinnerschrader-mobile.com> Date: Tue, 13 May 2014 16:52:58 +0200 Subject: [PATCH 102/149] move templates inside package --- {templates => metajson/templates}/APIParser/APIParser.h | 0 {templates => metajson/templates}/APIParser/APIParser.m | 0 {templates => metajson/templates}/NSString+RegExValidation.h | 0 {templates => metajson/templates}/NSString+RegExValidation.m | 0 {templates => metajson/templates}/_header.h.mustache | 0 {templates => metajson/templates}/_source.m.mustache | 0 {templates => metajson/templates}/array_property.mustache | 0 {templates => metajson/templates}/header.h.mustache | 0 {templates => metajson/templates}/multiple_property.mustache | 0 .../templates}/multiple_property_implementation.mustache | 0 {templates => metajson/templates}/number_property.mustache | 0 {templates => metajson/templates}/source.m.mustache | 0 {templates => metajson/templates}/string_property.mustache | 0 13 files changed, 0 insertions(+), 0 deletions(-) rename {templates => metajson/templates}/APIParser/APIParser.h (100%) rename {templates => metajson/templates}/APIParser/APIParser.m (100%) rename {templates => metajson/templates}/NSString+RegExValidation.h (100%) rename {templates => metajson/templates}/NSString+RegExValidation.m (100%) rename {templates => metajson/templates}/_header.h.mustache (100%) rename {templates => metajson/templates}/_source.m.mustache (100%) rename {templates => metajson/templates}/array_property.mustache (100%) rename {templates => metajson/templates}/header.h.mustache (100%) rename {templates => metajson/templates}/multiple_property.mustache (100%) rename {templates => metajson/templates}/multiple_property_implementation.mustache (100%) rename {templates => metajson/templates}/number_property.mustache (100%) rename {templates => metajson/templates}/source.m.mustache (100%) rename {templates => metajson/templates}/string_property.mustache (100%) diff --git a/templates/APIParser/APIParser.h b/metajson/templates/APIParser/APIParser.h similarity index 100% rename from templates/APIParser/APIParser.h rename to metajson/templates/APIParser/APIParser.h diff --git a/templates/APIParser/APIParser.m b/metajson/templates/APIParser/APIParser.m similarity index 100% rename from templates/APIParser/APIParser.m rename to metajson/templates/APIParser/APIParser.m diff --git a/templates/NSString+RegExValidation.h b/metajson/templates/NSString+RegExValidation.h similarity index 100% rename from templates/NSString+RegExValidation.h rename to metajson/templates/NSString+RegExValidation.h diff --git a/templates/NSString+RegExValidation.m b/metajson/templates/NSString+RegExValidation.m similarity index 100% rename from templates/NSString+RegExValidation.m rename to metajson/templates/NSString+RegExValidation.m diff --git a/templates/_header.h.mustache b/metajson/templates/_header.h.mustache similarity index 100% rename from templates/_header.h.mustache rename to metajson/templates/_header.h.mustache diff --git a/templates/_source.m.mustache b/metajson/templates/_source.m.mustache similarity index 100% rename from templates/_source.m.mustache rename to metajson/templates/_source.m.mustache diff --git a/templates/array_property.mustache b/metajson/templates/array_property.mustache similarity index 100% rename from templates/array_property.mustache rename to metajson/templates/array_property.mustache diff --git a/templates/header.h.mustache b/metajson/templates/header.h.mustache similarity index 100% rename from templates/header.h.mustache rename to metajson/templates/header.h.mustache diff --git a/templates/multiple_property.mustache b/metajson/templates/multiple_property.mustache similarity index 100% rename from templates/multiple_property.mustache rename to metajson/templates/multiple_property.mustache diff --git a/templates/multiple_property_implementation.mustache b/metajson/templates/multiple_property_implementation.mustache similarity index 100% rename from templates/multiple_property_implementation.mustache rename to metajson/templates/multiple_property_implementation.mustache diff --git a/templates/number_property.mustache b/metajson/templates/number_property.mustache similarity index 100% rename from templates/number_property.mustache rename to metajson/templates/number_property.mustache diff --git a/templates/source.m.mustache b/metajson/templates/source.m.mustache similarity index 100% rename from templates/source.m.mustache rename to metajson/templates/source.m.mustache diff --git a/templates/string_property.mustache b/metajson/templates/string_property.mustache similarity index 100% rename from templates/string_property.mustache rename to metajson/templates/string_property.mustache From a1fd32cc7421d79ce022f6bd528c2bde36e46e60 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Franc=CC=A7ois=20Benaiteau?= <francois.benaiteau@sinnerschrader-mobile.com> Date: Tue, 13 May 2014 17:22:50 +0200 Subject: [PATCH 103/149] Fixes running readJSON_test --- metajson/readJSON.py | 16 ++++++---------- metajson/template_code_generator.py | 6 ++++-- test/readJSON_test.py | 6 +++--- 3 files changed, 13 insertions(+), 15 deletions(-) diff --git a/metajson/readJSON.py b/metajson/readJSON.py index aa535de..1029579 100755 --- a/metajson/readJSON.py +++ b/metajson/readJSON.py @@ -51,7 +51,6 @@ def main(argv=sys.argv): usageString += ' -i, --input= meta-JSON file to read\n' usageString += ' -o, --output= ouput path of generated source codes\n' - print("Executing metajson version %s." % __version__) argv = sys.argv[1:] try: opts, args = getopt.getopt(argv,"ho:p:s:t:i:",["prefix=","suffix=","target=","input=","output="]) @@ -100,13 +99,9 @@ def main(argv=sys.argv): print(usageString) sys.exit() - - - templatePath = os.path.abspath( __file__ ) - templatePath = templatePath.replace('/readJSON.py', '/templates') - if not os.path.exists(dirPathToSaveCodes): os.makedirs(dirPathToSaveCodes) + iOS = False Android = False if target == 'iOS' : @@ -118,18 +113,16 @@ def main(argv=sys.argv): print(usageString) sys.exit() - hasError = False if iOS : if dirPathToSaveCodes.endswith("/") : dirPathToSaveCodes = dirPathToSaveCodes[:-1] - if os.path.exists(dirPathToSaveCodes+ "/abstractInterfaceFiles"): - shutil.rmtree(dirPathToSaveCodes + "/abstractInterfaceFiles") + if os.path.exists(dirPathToSaveCodes + "/AbstractInterfaceFiles"): + shutil.rmtree(dirPathToSaveCodes + "/AbstractInterfaceFiles") templateCodeGen = TemplateCodeGenerator() - templateCodeGen.templatePath = templatePath templateCodeGen.projectPrefix = projectPrefix templateCodeGen.dirPath = dirPathToSaveCodes templateCodeGen.writeTemplates() @@ -202,5 +195,8 @@ def openFileAndParseJSON(filePath): return obj +def version(): + print("Running metajson version %s." % __version__) + if __name__ == '__main__': sys.exit(main(sys.argv)) diff --git a/metajson/template_code_generator.py b/metajson/template_code_generator.py index c2d1d26..14d5281 100644 --- a/metajson/template_code_generator.py +++ b/metajson/template_code_generator.py @@ -6,14 +6,16 @@ class TemplateCodeGenerator : projectPrefix = "" dirPath = "" - templatePath = "./templates" + templatePath = "./metajson/templates" def __init__(self): projectPrefix = "S2M" dirPath = "classes" - templatePath = "./templates" + templatePath = "./metajson/templates" + def writeNSStringCategory(self) : today = datetime.date.fromtimestamp(time.time()) + if not os.path.exists(self.dirPath): os.makedirs(self.dirPath) diff --git a/test/readJSON_test.py b/test/readJSON_test.py index 5b8d2c9..96fb4dd 100644 --- a/test/readJSON_test.py +++ b/test/readJSON_test.py @@ -3,16 +3,16 @@ class TestReadJSON(unittest.TestCase): def setUp(self): - os.system("rm -rf src") + os.system("rm -rf ./src") def test_command(self): exit_status = self.execute_script("samples/product.json", "test_data/product") self.assertEqual(exit_status, 0) # no difference def execute_script(self, json_file, output_dir): - os.system("python readJSON.py -i " + json_file) + os.system("python -m metajson -i " + json_file) # ignoring template files - os.system("rm -rf src/Utilities") + os.system("rm -rf ./src/Utilities") # return os.system("diff -r src/ " + output_dir) # common_file = "/AbstractInterfaceFiles/_ProductDetailJSONObject.h" common_file = "/AbstractInterfaceFiles/_ProductDetailJSONObject.h" From 9985a566ff984d7fbc845757763d578895776be5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Franc=CC=A7ois=20Benaiteau?= <francois.benaiteau@sinnerschrader-mobile.com> Date: Tue, 13 May 2014 17:23:02 +0200 Subject: [PATCH 104/149] trim white space --- metajson/JSONScheme.py | 174 +++++++++++++++++++---------------------- 1 file changed, 81 insertions(+), 93 deletions(-) diff --git a/metajson/JSONScheme.py b/metajson/JSONScheme.py index 701f4de..b0ed9a1 100755 --- a/metajson/JSONScheme.py +++ b/metajson/JSONScheme.py @@ -42,14 +42,14 @@ class JSONScheme : hasMaxLength = False hasMinLength = False required = False - + maxCount = 0 minCount = 0 maxValue = 0 minValue = 0 maxLength = 0 minLength = 0 - + domain = ["ROOT"] def __init__(self): @@ -85,12 +85,12 @@ def hasScheme(self, schemeName) : tmpDomainList = list(self.domain) tmpDomainList.append(self.type_name) #print "find : " + schemeName + ", at : " + str(tmpDomainList) - + for nn in range(0,len(tmpDomainList)) : tmpDomainKey = "" for mm in range(0,len(tmpDomainList) - nn) : tmpDomainKey += str(tmpDomainList[mm]) - + if JSONScheme.JSONSchemeDic.has_key(tmpDomainKey) : tmpDomainDic = JSONScheme.JSONSchemeDic[tmpDomainKey] if tmpDomainDic.has_key(schemeName) : @@ -109,7 +109,7 @@ def getScheme(self, schemeName) : tmpDomainKey = "" for mm in range(0,len(tmpDomainList) - nn) : tmpDomainKey += str(tmpDomainList[mm]) - + if JSONScheme.JSONSchemeDic.has_key(tmpDomainKey) : tmpDomainDic = JSONScheme.JSONSchemeDic[tmpDomainKey] if tmpDomainDic.has_key(schemeName) : @@ -117,16 +117,16 @@ def getScheme(self, schemeName) : return False - + def getDomainString(self) : domainString = "" for index in range(0, len(self.domain)) : domainString += self.domain[index] if index in range(0,len(self.domain) - 1) : domainString += "." - + return domainString - + def getDomain(self) : domainString = "" for index in range(0, len(self.domain)) : @@ -136,114 +136,114 @@ def getDomain(self) : def setMaxValue(self, maxVal): self.maxValue = maxVal self.hasMaxValue = True - + def setMinValue(self, minVal): self.minValue = minVal self.hasMinValue = True - + def setMaxLength(self, maxLen): self.maxLength = maxLen self.hasMaxLength = True - + def setMinLength(self, minLen): self.minLength = minLen self.hasMinLength = True - + def setMaxCount(self, maxCnt): self.maxCount = maxCnt self.hasMaxCount = True - + def setMinCount(self, minCnt): self.minCount = minCnt self.hasMinCount = True - + def getMaxValue(self) : if self.hasMaxValue : return [True, self.maxValue] - + if self.base_type in self.naturalTypeList : return [False, 0]; - + parentSchemeObj = self.getScheme(self.base_type) - + return parentSchemeObj.getMaxValue() - + def getMinValue(self) : if self.hasMinValue : return [True, self.minValue] - + if self.base_type in self.naturalTypeList : return [False, 0]; - + parentSchemeObj = self.getScheme(self.base_type) - + return parentSchemeObj.getMinValue() - + def getMaxCount(self) : if self.hasMaxCount : return [True, self.maxCount] - + if self.base_type in self.naturalTypeList : return [False, 0]; - + parentSchemeObj = self.getScheme(self.base_type) - + return parentSchemeObj.getMaxCount() - + def getMinCount(self) : if self.hasMinCount : return [True, self.minCount] - + if self.base_type in self.naturalTypeList : return [False, 0]; - + parentSchemeObj = self.getScheme(self.base_type) - + return parentSchemeObj.getMinCount() - + def getMaxLength(self) : if self.hasMaxLength : return [True, self.maxLength] - + if self.base_type in self.naturalTypeList : return [False, 0]; - + parentSchemeObj = self.getScheme(self.base_type) - + return parentSchemeObj.getMaxLength() - + def getMinLength(self) : if self.hasMinLength : return [True, self.minLength] - + if self.base_type in self.naturalTypeList : return [False, 0]; - + parentSchemeObj = self.getScheme(self.base_type) - + return parentSchemeObj.getMinLength() - + def getRegex(self) : if len(self.regex) > 0 : return [True, self.regex] - + if self.base_type in self.naturalTypeList : return [False, 0]; - + parentSchemeObj = self.getScheme(self.base_type) if parentSchemeObj : return parentSchemeObj.getRegex() else : return [False, 0]; - + def getClassName(self): - + if self.rootBaseType() == "object" : - if self.props : + if self.props : className = self.type_name.upper() className = self.projectPrefix + className[:1] + self.type_name[1:] + self.objectSuffix - else : # it means, this scheme descripe just property info, not class info. + else : # it means, this scheme descripe just property info, not class info. className = self.base_type.upper() className = self.projectPrefix + className[:1] + self.base_type[1:] + self.objectSuffix return className @@ -252,15 +252,15 @@ def getClassName(self): return "" def getMachineClassName(self): - + className = self.getClassName() if len(className) : - machineClassName = "_" + className + machineClassName = "_" + className return machineClassName print "error : " + self.type_name + " has no Class Name." return "" - + def rootBaseType(self) : if self.base_type in JSONScheme.naturalTypeList or self.base_type == "object" or self.base_type == "multi" or self.base_type == "any": return self.base_type @@ -268,24 +268,24 @@ def rootBaseType(self) : if self.hasScheme(self.base_type) : parentTypeScheme = self.getScheme(self.base_type) return parentTypeScheme.rootBaseType() - + return self.base_type def isNaturalType(self) : - + root = self.rootBaseType() - + if root in JSONScheme.naturalTypeList : return True - + return False - + def canHaveProperty(self) : if self.rootBaseType() == "object" : return True return False - + def getSubType(self) : if self.isNaturalType() : return self.sub_type @@ -298,12 +298,12 @@ def getSubType(self) : return parentTypeScheme.getSubType() return self.sub_type - + def getBaseTypes(self) : - + if self.isNaturalType() : return self.base_type_list - + if len(self.base_type_list) : return self.base_type_list @@ -316,7 +316,7 @@ def getBaseTypes(self) : """ make new Scheme Object """ - + def makeNewScheme(self, jsonDic): newScheme = JSONScheme() newScheme.projectPrefix = self.projectPrefix @@ -349,10 +349,10 @@ def parseBaseType(self, jsonObj) : elif type(jsonObj) == list : self.base_type = "multi" - for multiType in jsonObj : + for multiType in jsonObj : if type(multiType) == dict : newScheme = self.makeNewScheme(multiType) - + if newScheme : tmpList.append(newScheme.type_name) else : @@ -368,16 +368,16 @@ def parseBaseType(self, jsonObj) : self.base_type = any tmpList = [] return tmpList - + tmpList.append(multiType) - - + + elif type(jsonObj) == str or type(jsonObj) == unicode: self.base_type = str(jsonObj) - + return tmpList - + """ read sub type """ @@ -385,7 +385,7 @@ def parseSubType(self, jsonObj) : tmpList = [] if type(jsonObj) == dict : newScheme = self.makeNewScheme(jsonObj) - + if newScheme : tmpList.append(newScheme.type_name) else : @@ -396,7 +396,7 @@ def parseSubType(self, jsonObj) : for multiType in jsonObj : if type(multiType) == dict : newScheme = self.makeNewScheme(multiType) - + if newScheme : if newScheme.type_name in tmpList : print "warning - ignore same type ("+ newScheme.type_name +") in subTypes of ", self.type_name @@ -414,8 +414,8 @@ def parseSubType(self, jsonObj) : return tmpList tmpList.append(str(multiType)) - - + + else : if str(jsonObj) == "any" : tmpList = ["any"] @@ -463,7 +463,7 @@ def parseDictionary(self, jsonDic): return False tmpDomainDic[self.type_name] = self - + if jsonDic.has_key('base-type') : tmpBaseType = jsonDic['base-type'] tmpBaseTypeList = self.parseBaseType(tmpBaseType) @@ -473,37 +473,37 @@ def parseDictionary(self, jsonDic): self.base_type_list = tmpBaseTypeList else : print "error - no base-type : ", self.type_name - return False - + return False + if jsonDic.has_key('description') : self.type_description = str(jsonDic['description']) - + if jsonDic.has_key('required') : self.required = jsonDic['required'] - + if jsonDic.has_key('maxValue') : self.setMaxValue(jsonDic['maxValue']) - + if jsonDic.has_key('minValue') : self.setMinValue(jsonDic['minValue']) - + if jsonDic.has_key('maxCount') : self.setMaxCount(jsonDic['maxCount']) - + if jsonDic.has_key('minCount') : self.setMinCount(jsonDic['minCount']) - + if jsonDic.has_key('maxLength') : self.setMaxLength(jsonDic['maxLength']) - + if jsonDic.has_key('minLength') : self.setMinLength(jsonDic['minLength']) - + if jsonDic.has_key('regex') : self.regex = str(jsonDic['regex']) tmpPropList = [] - + if jsonDic.has_key('property') : tmpPropList = self.parseProperty(jsonDic['property']) if tmpPropList == False : @@ -517,20 +517,8 @@ def parseDictionary(self, jsonDic): if tmpSubTypeList == False: return False self.sub_type = tmpSubTypeList - + if self.base_type == "array" and not jsonDic.has_key('subType') : print "warning - " + self.type_name + "(array type) has no subType. treat as any. " return True - - - - - - - - - - - - From a2cbe96efa6414d04f75822c4cdda799b6e73ea1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Franc=CC=A7ois=20Benaiteau?= <francois.benaiteau@sinnerschrader-mobile.com> Date: Tue, 13 May 2014 17:44:46 +0200 Subject: [PATCH 105/149] modify definition of JSONScheme to metajson.JSONScheme --- test/ObjectiveCCodeGenerator_test.py | 4 ++-- test_data/test_class.p | 8 ++++---- test_data/test_json.p | 14 +++++++------- test_data/test_string_options.p | 8 ++++---- test_data/test_subclass_motherClass.p | 6 +++--- test_data/test_subclass_scheme.p | 10 +++++----- test_data/test_subclass_subClass.p | 4 ++-- test_data/test_types_scheme.p | 20 ++++++++++---------- test_data/test_types_superObject.p | 18 +++++++++--------- 9 files changed, 46 insertions(+), 46 deletions(-) diff --git a/test/ObjectiveCCodeGenerator_test.py b/test/ObjectiveCCodeGenerator_test.py index f18c81a..e95c291 100644 --- a/test/ObjectiveCCodeGenerator_test.py +++ b/test/ObjectiveCCodeGenerator_test.py @@ -1,5 +1,5 @@ -from ObjectiveCCodeGenerator import * -from JSONScheme import * +from metajson.ObjectiveCCodeGenerator import ObjectiveCCodeGenerator +from metajson.JSONScheme import * import pickle import unittest diff --git a/test_data/test_class.p b/test_data/test_class.p index 840aae4..780fe61 100644 --- a/test_data/test_class.p +++ b/test_data/test_class.p @@ -1,4 +1,4 @@ -(iJSONScheme +(imetajson.JSONScheme JSONScheme p0 (dp1 @@ -28,7 +28,7 @@ p13 sS'props' p14 (lp15 -(iJSONScheme +(imetajson.JSONScheme JSONScheme p16 (dp17 @@ -53,7 +53,7 @@ sg10 (lp24 sg12 g13 -sba(iJSONScheme +sba(imetajson.JSONScheme JSONScheme p25 (dp26 @@ -75,4 +75,4 @@ sg10 (lp30 sg12 g13 -sbasb. \ No newline at end of file +sbasb. diff --git a/test_data/test_json.p b/test_data/test_json.p index 995e096..833fb92 100644 --- a/test_data/test_json.p +++ b/test_data/test_json.p @@ -1,4 +1,4 @@ -(iJSONScheme +(imetajson.JSONScheme JSONScheme p0 (dp1 @@ -28,7 +28,7 @@ p13 sS'props' p14 (lp15 -(iJSONScheme +(imetajson.JSONScheme JSONScheme p16 (dp17 @@ -54,7 +54,7 @@ sg10 (lp25 sg12 g13 -sba(iJSONScheme +sba(imetajson.JSONScheme JSONScheme p26 (dp27 @@ -86,7 +86,7 @@ aS'userAddress' p36 aS'string' p37 -asba(iJSONScheme +asba(imetajson.JSONScheme JSONScheme p38 (dp39 @@ -108,7 +108,7 @@ sg10 (lp43 sg12 g13 -sba(iJSONScheme +sba(imetajson.JSONScheme JSONScheme p44 (dp45 @@ -130,7 +130,7 @@ sg10 (lp49 sg12 g13 -sba(iJSONScheme +sba(imetajson.JSONScheme JSONScheme p50 (dp51 @@ -152,4 +152,4 @@ sg10 (lp55 sg12 g13 -sbasb. \ No newline at end of file +sbasb. diff --git a/test_data/test_string_options.p b/test_data/test_string_options.p index cdbbcd0..370eb13 100644 --- a/test_data/test_string_options.p +++ b/test_data/test_string_options.p @@ -1,4 +1,4 @@ -(iJSONScheme +(imetajson.JSONScheme JSONScheme p0 (dp1 @@ -20,7 +20,7 @@ p9 sS'props' p10 (lp11 -(iJSONScheme +(imetajson.JSONScheme JSONScheme p12 (dp13 @@ -49,7 +49,7 @@ sS'objectSuffix' p23 S'JSONObject' p24 -sba(iJSONScheme +sba(imetajson.JSONScheme JSONScheme p25 (dp26 @@ -83,4 +83,4 @@ p34 I01 sbasg23 g24 -sb. \ No newline at end of file +sb. diff --git a/test_data/test_subclass_motherClass.p b/test_data/test_subclass_motherClass.p index 3fb8f72..604fe98 100644 --- a/test_data/test_subclass_motherClass.p +++ b/test_data/test_subclass_motherClass.p @@ -1,4 +1,4 @@ -(iJSONScheme +(imetajson.JSONScheme JSONScheme p0 (dp1 @@ -20,7 +20,7 @@ p9 sS'props' p10 (lp11 -(iJSONScheme +(imetajson.JSONScheme JSONScheme p12 (dp13 @@ -49,4 +49,4 @@ S'JSONObject' p22 sbasg21 g22 -sb. \ No newline at end of file +sb. diff --git a/test_data/test_subclass_scheme.p b/test_data/test_subclass_scheme.p index 77ae713..095ba03 100644 --- a/test_data/test_subclass_scheme.p +++ b/test_data/test_subclass_scheme.p @@ -4,7 +4,7 @@ p1 (dp2 S'id' p3 -(iJSONScheme +(imetajson.JSONScheme JSONScheme p4 (dp5 @@ -41,7 +41,7 @@ p20 (dp21 S'name' p22 -(iJSONScheme +(imetajson.JSONScheme JSONScheme p23 (dp24 @@ -66,7 +66,7 @@ g19 sbssg8 (dp29 g9 -(iJSONScheme +(imetajson.JSONScheme JSONScheme p30 (dp31 @@ -86,7 +86,7 @@ g4 asg18 g19 sbsg26 -(iJSONScheme +(imetajson.JSONScheme JSONScheme p36 (dp37 @@ -108,4 +108,4 @@ g19 sg34 (lp42 g23 -asbss. \ No newline at end of file +asbss. diff --git a/test_data/test_subclass_subClass.p b/test_data/test_subclass_subClass.p index 2263a5b..be13ea2 100644 --- a/test_data/test_subclass_subClass.p +++ b/test_data/test_subclass_subClass.p @@ -1,4 +1,4 @@ -(iJSONScheme +(imetajson.JSONScheme JSONScheme p0 (dp1 @@ -28,7 +28,7 @@ p13 sS'props' p14 (lp15 -(iJSONScheme +(imetajson.JSONScheme JSONScheme p16 (dp17 diff --git a/test_data/test_types_scheme.p b/test_data/test_types_scheme.p index 842a805..ec8e5a2 100644 --- a/test_data/test_types_scheme.p +++ b/test_data/test_types_scheme.p @@ -4,7 +4,7 @@ p1 (dp2 S'customNumber' p3 -(iJSONScheme +(imetajson.JSONScheme JSONScheme p4 (dp5 @@ -40,7 +40,7 @@ p18 I01 sbsS'superObject' p19 -(iJSONScheme +(imetajson.JSONScheme JSONScheme p20 (dp21 @@ -56,7 +56,7 @@ p23 sS'props' p24 (lp25 -(iJSONScheme +(imetajson.JSONScheme JSONScheme p26 (dp27 @@ -77,7 +77,7 @@ sg6 (lp32 sg16 g17 -sba(iJSONScheme +sba(imetajson.JSONScheme JSONScheme p33 (dp34 @@ -97,7 +97,7 @@ sg6 (lp38 sg16 g17 -sba(iJSONScheme +sba(imetajson.JSONScheme JSONScheme p39 (dp40 @@ -117,7 +117,7 @@ sg6 (lp44 sg16 g17 -sba(iJSONScheme +sba(imetajson.JSONScheme JSONScheme p45 (dp46 @@ -137,7 +137,7 @@ sg6 (lp50 sg16 g17 -sba(iJSONScheme +sba(imetajson.JSONScheme JSONScheme p51 (dp52 @@ -162,7 +162,7 @@ p57 (lp58 S'number' p59 -asba(iJSONScheme +asba(imetajson.JSONScheme JSONScheme p60 (dp61 @@ -188,7 +188,7 @@ S'string' p67 aS'date' p68 -asba(iJSONScheme +asba(imetajson.JSONScheme JSONScheme p69 (dp70 @@ -212,7 +212,7 @@ sg57 (lp75 S'customNumber' p76 -asba(iJSONScheme +asba(imetajson.JSONScheme JSONScheme p77 (dp78 diff --git a/test_data/test_types_superObject.p b/test_data/test_types_superObject.p index 12960a6..ebad16d 100644 --- a/test_data/test_types_superObject.p +++ b/test_data/test_types_superObject.p @@ -1,4 +1,4 @@ -(iJSONScheme +(imetajson.JSONScheme JSONScheme p0 (dp1 @@ -20,7 +20,7 @@ p9 sS'props' p10 (lp11 -(iJSONScheme +(imetajson.JSONScheme JSONScheme p12 (dp13 @@ -44,7 +44,7 @@ sS'objectSuffix' p20 S'JSONObject' p21 -sba(iJSONScheme +sba(imetajson.JSONScheme JSONScheme p22 (dp23 @@ -64,7 +64,7 @@ sg2 (lp27 sg20 g21 -sba(iJSONScheme +sba(imetajson.JSONScheme JSONScheme p28 (dp29 @@ -84,7 +84,7 @@ sg2 (lp33 sg20 g21 -sba(iJSONScheme +sba(imetajson.JSONScheme JSONScheme p34 (dp35 @@ -104,7 +104,7 @@ sg2 (lp39 sg20 g21 -sba(iJSONScheme +sba(imetajson.JSONScheme JSONScheme p40 (dp41 @@ -129,7 +129,7 @@ p46 (lp47 S'number' p48 -asba(iJSONScheme +asba(imetajson.JSONScheme JSONScheme p49 (dp50 @@ -155,7 +155,7 @@ S'string' p56 aS'date' p57 -asba(iJSONScheme +asba(imetajson.JSONScheme JSONScheme p58 (dp59 @@ -179,7 +179,7 @@ sg46 (lp64 S'customNumber' p65 -asba(iJSONScheme +asba(imetajson.JSONScheme JSONScheme p66 (dp67 From 65ca094b713ea942aac08cb9465c4abf5fe7e27c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Franc=CC=A7ois=20Benaiteau?= <francois.benaiteau@sinnerschrader-mobile.com> Date: Tue, 13 May 2014 17:48:11 +0200 Subject: [PATCH 106/149] change location of test_data to test/data --- test/ObjectiveCCodeGenerator_test.py | 2 +- .../product/AbstractInterfaceFiles/_ProductDetailJSONObject.h | 0 .../product/AbstractInterfaceFiles/_ProductDetailJSONObject.m | 0 .../product/AbstractInterfaceFiles/_SenderGroupJSONObject.h | 0 .../product/AbstractInterfaceFiles/_SenderGroupJSONObject.m | 0 .../data}/product/AbstractInterfaceFiles/_SenderJSONObject.h | 0 .../data}/product/AbstractInterfaceFiles/_SenderJSONObject.m | 0 .../product/AbstractInterfaceFiles/_SenderList2JSONObject.h | 0 .../product/AbstractInterfaceFiles/_SenderList2JSONObject.m | 0 .../product/AbstractInterfaceFiles/_SenderListJSONObject.h | 0 .../product/AbstractInterfaceFiles/_SenderListJSONObject.m | 0 {test_data => test/data}/product/ProductDetailJSONObject.h | 0 {test_data => test/data}/product/ProductDetailJSONObject.m | 0 {test_data => test/data}/product/SenderGroupJSONObject.h | 0 {test_data => test/data}/product/SenderGroupJSONObject.m | 0 {test_data => test/data}/product/SenderJSONObject.h | 0 {test_data => test/data}/product/SenderJSONObject.m | 0 {test_data => test/data}/product/SenderList2JSONObject.h | 0 {test_data => test/data}/product/SenderList2JSONObject.m | 0 {test_data => test/data}/product/SenderListJSONObject.h | 0 {test_data => test/data}/product/SenderListJSONObject.m | 0 {test_data => test/data}/test_class.p | 0 {test_data => test/data}/test_class/S2MSenderJSONObject.h | 0 {test_data => test/data}/test_class/S2MSenderJSONObject.m | 0 {test_data => test/data}/test_class/_S2MSenderJSONObject.h | 0 {test_data => test/data}/test_class/_S2MSenderJSONObject.m | 0 {test_data => test/data}/test_json.p | 0 {test_data => test/data}/test_string_options.p | 0 .../data}/test_string_options/_S2MLoginJSONObject.h | 0 .../data}/test_string_options/_S2MLoginJSONObject.m | 0 {test_data => test/data}/test_subclass/MotherClassJSONObject.h | 0 {test_data => test/data}/test_subclass/MotherClassJSONObject.m | 0 {test_data => test/data}/test_subclass/SubClassJSONObject.h | 0 {test_data => test/data}/test_subclass/SubClassJSONObject.m | 0 {test_data => test/data}/test_subclass/_MotherClassJSONObject.h | 0 {test_data => test/data}/test_subclass/_MotherClassJSONObject.m | 0 {test_data => test/data}/test_subclass/_SubClassJSONObject.h | 0 {test_data => test/data}/test_subclass/_SubClassJSONObject.m | 0 {test_data => test/data}/test_subclass_motherClass.p | 0 {test_data => test/data}/test_subclass_scheme.p | 0 {test_data => test/data}/test_subclass_subClass.p | 0 {test_data => test/data}/test_types/_S2MSuperObjectJSONObject.h | 0 {test_data => test/data}/test_types/_S2MSuperObjectJSONObject.m | 0 {test_data => test/data}/test_types_scheme.p | 0 {test_data => test/data}/test_types_superObject.p | 0 test/readJSON_test.py | 2 +- 46 files changed, 2 insertions(+), 2 deletions(-) rename {test_data => test/data}/product/AbstractInterfaceFiles/_ProductDetailJSONObject.h (100%) rename {test_data => test/data}/product/AbstractInterfaceFiles/_ProductDetailJSONObject.m (100%) rename {test_data => test/data}/product/AbstractInterfaceFiles/_SenderGroupJSONObject.h (100%) rename {test_data => test/data}/product/AbstractInterfaceFiles/_SenderGroupJSONObject.m (100%) rename {test_data => test/data}/product/AbstractInterfaceFiles/_SenderJSONObject.h (100%) rename {test_data => test/data}/product/AbstractInterfaceFiles/_SenderJSONObject.m (100%) rename {test_data => test/data}/product/AbstractInterfaceFiles/_SenderList2JSONObject.h (100%) rename {test_data => test/data}/product/AbstractInterfaceFiles/_SenderList2JSONObject.m (100%) rename {test_data => test/data}/product/AbstractInterfaceFiles/_SenderListJSONObject.h (100%) rename {test_data => test/data}/product/AbstractInterfaceFiles/_SenderListJSONObject.m (100%) rename {test_data => test/data}/product/ProductDetailJSONObject.h (100%) rename {test_data => test/data}/product/ProductDetailJSONObject.m (100%) rename {test_data => test/data}/product/SenderGroupJSONObject.h (100%) rename {test_data => test/data}/product/SenderGroupJSONObject.m (100%) rename {test_data => test/data}/product/SenderJSONObject.h (100%) rename {test_data => test/data}/product/SenderJSONObject.m (100%) rename {test_data => test/data}/product/SenderList2JSONObject.h (100%) rename {test_data => test/data}/product/SenderList2JSONObject.m (100%) rename {test_data => test/data}/product/SenderListJSONObject.h (100%) rename {test_data => test/data}/product/SenderListJSONObject.m (100%) rename {test_data => test/data}/test_class.p (100%) rename {test_data => test/data}/test_class/S2MSenderJSONObject.h (100%) rename {test_data => test/data}/test_class/S2MSenderJSONObject.m (100%) rename {test_data => test/data}/test_class/_S2MSenderJSONObject.h (100%) rename {test_data => test/data}/test_class/_S2MSenderJSONObject.m (100%) rename {test_data => test/data}/test_json.p (100%) rename {test_data => test/data}/test_string_options.p (100%) rename {test_data => test/data}/test_string_options/_S2MLoginJSONObject.h (100%) rename {test_data => test/data}/test_string_options/_S2MLoginJSONObject.m (100%) rename {test_data => test/data}/test_subclass/MotherClassJSONObject.h (100%) rename {test_data => test/data}/test_subclass/MotherClassJSONObject.m (100%) rename {test_data => test/data}/test_subclass/SubClassJSONObject.h (100%) rename {test_data => test/data}/test_subclass/SubClassJSONObject.m (100%) rename {test_data => test/data}/test_subclass/_MotherClassJSONObject.h (100%) rename {test_data => test/data}/test_subclass/_MotherClassJSONObject.m (100%) rename {test_data => test/data}/test_subclass/_SubClassJSONObject.h (100%) rename {test_data => test/data}/test_subclass/_SubClassJSONObject.m (100%) rename {test_data => test/data}/test_subclass_motherClass.p (100%) rename {test_data => test/data}/test_subclass_scheme.p (100%) rename {test_data => test/data}/test_subclass_subClass.p (100%) rename {test_data => test/data}/test_types/_S2MSuperObjectJSONObject.h (100%) rename {test_data => test/data}/test_types/_S2MSuperObjectJSONObject.m (100%) rename {test_data => test/data}/test_types_scheme.p (100%) rename {test_data => test/data}/test_types_superObject.p (100%) diff --git a/test/ObjectiveCCodeGenerator_test.py b/test/ObjectiveCCodeGenerator_test.py index e95c291..c02a4c1 100644 --- a/test/ObjectiveCCodeGenerator_test.py +++ b/test/ObjectiveCCodeGenerator_test.py @@ -10,7 +10,7 @@ def setUp(self): self.gen = ObjectiveCCodeGenerator() self.gen.dirPath = './src' self.maxDiff = None - self.default_folder = 'test_data/' + self.default_folder = 'test/data/' def tearDown(self): del self.gen diff --git a/test_data/product/AbstractInterfaceFiles/_ProductDetailJSONObject.h b/test/data/product/AbstractInterfaceFiles/_ProductDetailJSONObject.h similarity index 100% rename from test_data/product/AbstractInterfaceFiles/_ProductDetailJSONObject.h rename to test/data/product/AbstractInterfaceFiles/_ProductDetailJSONObject.h diff --git a/test_data/product/AbstractInterfaceFiles/_ProductDetailJSONObject.m b/test/data/product/AbstractInterfaceFiles/_ProductDetailJSONObject.m similarity index 100% rename from test_data/product/AbstractInterfaceFiles/_ProductDetailJSONObject.m rename to test/data/product/AbstractInterfaceFiles/_ProductDetailJSONObject.m diff --git a/test_data/product/AbstractInterfaceFiles/_SenderGroupJSONObject.h b/test/data/product/AbstractInterfaceFiles/_SenderGroupJSONObject.h similarity index 100% rename from test_data/product/AbstractInterfaceFiles/_SenderGroupJSONObject.h rename to test/data/product/AbstractInterfaceFiles/_SenderGroupJSONObject.h diff --git a/test_data/product/AbstractInterfaceFiles/_SenderGroupJSONObject.m b/test/data/product/AbstractInterfaceFiles/_SenderGroupJSONObject.m similarity index 100% rename from test_data/product/AbstractInterfaceFiles/_SenderGroupJSONObject.m rename to test/data/product/AbstractInterfaceFiles/_SenderGroupJSONObject.m diff --git a/test_data/product/AbstractInterfaceFiles/_SenderJSONObject.h b/test/data/product/AbstractInterfaceFiles/_SenderJSONObject.h similarity index 100% rename from test_data/product/AbstractInterfaceFiles/_SenderJSONObject.h rename to test/data/product/AbstractInterfaceFiles/_SenderJSONObject.h diff --git a/test_data/product/AbstractInterfaceFiles/_SenderJSONObject.m b/test/data/product/AbstractInterfaceFiles/_SenderJSONObject.m similarity index 100% rename from test_data/product/AbstractInterfaceFiles/_SenderJSONObject.m rename to test/data/product/AbstractInterfaceFiles/_SenderJSONObject.m diff --git a/test_data/product/AbstractInterfaceFiles/_SenderList2JSONObject.h b/test/data/product/AbstractInterfaceFiles/_SenderList2JSONObject.h similarity index 100% rename from test_data/product/AbstractInterfaceFiles/_SenderList2JSONObject.h rename to test/data/product/AbstractInterfaceFiles/_SenderList2JSONObject.h diff --git a/test_data/product/AbstractInterfaceFiles/_SenderList2JSONObject.m b/test/data/product/AbstractInterfaceFiles/_SenderList2JSONObject.m similarity index 100% rename from test_data/product/AbstractInterfaceFiles/_SenderList2JSONObject.m rename to test/data/product/AbstractInterfaceFiles/_SenderList2JSONObject.m diff --git a/test_data/product/AbstractInterfaceFiles/_SenderListJSONObject.h b/test/data/product/AbstractInterfaceFiles/_SenderListJSONObject.h similarity index 100% rename from test_data/product/AbstractInterfaceFiles/_SenderListJSONObject.h rename to test/data/product/AbstractInterfaceFiles/_SenderListJSONObject.h diff --git a/test_data/product/AbstractInterfaceFiles/_SenderListJSONObject.m b/test/data/product/AbstractInterfaceFiles/_SenderListJSONObject.m similarity index 100% rename from test_data/product/AbstractInterfaceFiles/_SenderListJSONObject.m rename to test/data/product/AbstractInterfaceFiles/_SenderListJSONObject.m diff --git a/test_data/product/ProductDetailJSONObject.h b/test/data/product/ProductDetailJSONObject.h similarity index 100% rename from test_data/product/ProductDetailJSONObject.h rename to test/data/product/ProductDetailJSONObject.h diff --git a/test_data/product/ProductDetailJSONObject.m b/test/data/product/ProductDetailJSONObject.m similarity index 100% rename from test_data/product/ProductDetailJSONObject.m rename to test/data/product/ProductDetailJSONObject.m diff --git a/test_data/product/SenderGroupJSONObject.h b/test/data/product/SenderGroupJSONObject.h similarity index 100% rename from test_data/product/SenderGroupJSONObject.h rename to test/data/product/SenderGroupJSONObject.h diff --git a/test_data/product/SenderGroupJSONObject.m b/test/data/product/SenderGroupJSONObject.m similarity index 100% rename from test_data/product/SenderGroupJSONObject.m rename to test/data/product/SenderGroupJSONObject.m diff --git a/test_data/product/SenderJSONObject.h b/test/data/product/SenderJSONObject.h similarity index 100% rename from test_data/product/SenderJSONObject.h rename to test/data/product/SenderJSONObject.h diff --git a/test_data/product/SenderJSONObject.m b/test/data/product/SenderJSONObject.m similarity index 100% rename from test_data/product/SenderJSONObject.m rename to test/data/product/SenderJSONObject.m diff --git a/test_data/product/SenderList2JSONObject.h b/test/data/product/SenderList2JSONObject.h similarity index 100% rename from test_data/product/SenderList2JSONObject.h rename to test/data/product/SenderList2JSONObject.h diff --git a/test_data/product/SenderList2JSONObject.m b/test/data/product/SenderList2JSONObject.m similarity index 100% rename from test_data/product/SenderList2JSONObject.m rename to test/data/product/SenderList2JSONObject.m diff --git a/test_data/product/SenderListJSONObject.h b/test/data/product/SenderListJSONObject.h similarity index 100% rename from test_data/product/SenderListJSONObject.h rename to test/data/product/SenderListJSONObject.h diff --git a/test_data/product/SenderListJSONObject.m b/test/data/product/SenderListJSONObject.m similarity index 100% rename from test_data/product/SenderListJSONObject.m rename to test/data/product/SenderListJSONObject.m diff --git a/test_data/test_class.p b/test/data/test_class.p similarity index 100% rename from test_data/test_class.p rename to test/data/test_class.p diff --git a/test_data/test_class/S2MSenderJSONObject.h b/test/data/test_class/S2MSenderJSONObject.h similarity index 100% rename from test_data/test_class/S2MSenderJSONObject.h rename to test/data/test_class/S2MSenderJSONObject.h diff --git a/test_data/test_class/S2MSenderJSONObject.m b/test/data/test_class/S2MSenderJSONObject.m similarity index 100% rename from test_data/test_class/S2MSenderJSONObject.m rename to test/data/test_class/S2MSenderJSONObject.m diff --git a/test_data/test_class/_S2MSenderJSONObject.h b/test/data/test_class/_S2MSenderJSONObject.h similarity index 100% rename from test_data/test_class/_S2MSenderJSONObject.h rename to test/data/test_class/_S2MSenderJSONObject.h diff --git a/test_data/test_class/_S2MSenderJSONObject.m b/test/data/test_class/_S2MSenderJSONObject.m similarity index 100% rename from test_data/test_class/_S2MSenderJSONObject.m rename to test/data/test_class/_S2MSenderJSONObject.m diff --git a/test_data/test_json.p b/test/data/test_json.p similarity index 100% rename from test_data/test_json.p rename to test/data/test_json.p diff --git a/test_data/test_string_options.p b/test/data/test_string_options.p similarity index 100% rename from test_data/test_string_options.p rename to test/data/test_string_options.p diff --git a/test_data/test_string_options/_S2MLoginJSONObject.h b/test/data/test_string_options/_S2MLoginJSONObject.h similarity index 100% rename from test_data/test_string_options/_S2MLoginJSONObject.h rename to test/data/test_string_options/_S2MLoginJSONObject.h diff --git a/test_data/test_string_options/_S2MLoginJSONObject.m b/test/data/test_string_options/_S2MLoginJSONObject.m similarity index 100% rename from test_data/test_string_options/_S2MLoginJSONObject.m rename to test/data/test_string_options/_S2MLoginJSONObject.m diff --git a/test_data/test_subclass/MotherClassJSONObject.h b/test/data/test_subclass/MotherClassJSONObject.h similarity index 100% rename from test_data/test_subclass/MotherClassJSONObject.h rename to test/data/test_subclass/MotherClassJSONObject.h diff --git a/test_data/test_subclass/MotherClassJSONObject.m b/test/data/test_subclass/MotherClassJSONObject.m similarity index 100% rename from test_data/test_subclass/MotherClassJSONObject.m rename to test/data/test_subclass/MotherClassJSONObject.m diff --git a/test_data/test_subclass/SubClassJSONObject.h b/test/data/test_subclass/SubClassJSONObject.h similarity index 100% rename from test_data/test_subclass/SubClassJSONObject.h rename to test/data/test_subclass/SubClassJSONObject.h diff --git a/test_data/test_subclass/SubClassJSONObject.m b/test/data/test_subclass/SubClassJSONObject.m similarity index 100% rename from test_data/test_subclass/SubClassJSONObject.m rename to test/data/test_subclass/SubClassJSONObject.m diff --git a/test_data/test_subclass/_MotherClassJSONObject.h b/test/data/test_subclass/_MotherClassJSONObject.h similarity index 100% rename from test_data/test_subclass/_MotherClassJSONObject.h rename to test/data/test_subclass/_MotherClassJSONObject.h diff --git a/test_data/test_subclass/_MotherClassJSONObject.m b/test/data/test_subclass/_MotherClassJSONObject.m similarity index 100% rename from test_data/test_subclass/_MotherClassJSONObject.m rename to test/data/test_subclass/_MotherClassJSONObject.m diff --git a/test_data/test_subclass/_SubClassJSONObject.h b/test/data/test_subclass/_SubClassJSONObject.h similarity index 100% rename from test_data/test_subclass/_SubClassJSONObject.h rename to test/data/test_subclass/_SubClassJSONObject.h diff --git a/test_data/test_subclass/_SubClassJSONObject.m b/test/data/test_subclass/_SubClassJSONObject.m similarity index 100% rename from test_data/test_subclass/_SubClassJSONObject.m rename to test/data/test_subclass/_SubClassJSONObject.m diff --git a/test_data/test_subclass_motherClass.p b/test/data/test_subclass_motherClass.p similarity index 100% rename from test_data/test_subclass_motherClass.p rename to test/data/test_subclass_motherClass.p diff --git a/test_data/test_subclass_scheme.p b/test/data/test_subclass_scheme.p similarity index 100% rename from test_data/test_subclass_scheme.p rename to test/data/test_subclass_scheme.p diff --git a/test_data/test_subclass_subClass.p b/test/data/test_subclass_subClass.p similarity index 100% rename from test_data/test_subclass_subClass.p rename to test/data/test_subclass_subClass.p diff --git a/test_data/test_types/_S2MSuperObjectJSONObject.h b/test/data/test_types/_S2MSuperObjectJSONObject.h similarity index 100% rename from test_data/test_types/_S2MSuperObjectJSONObject.h rename to test/data/test_types/_S2MSuperObjectJSONObject.h diff --git a/test_data/test_types/_S2MSuperObjectJSONObject.m b/test/data/test_types/_S2MSuperObjectJSONObject.m similarity index 100% rename from test_data/test_types/_S2MSuperObjectJSONObject.m rename to test/data/test_types/_S2MSuperObjectJSONObject.m diff --git a/test_data/test_types_scheme.p b/test/data/test_types_scheme.p similarity index 100% rename from test_data/test_types_scheme.p rename to test/data/test_types_scheme.p diff --git a/test_data/test_types_superObject.p b/test/data/test_types_superObject.p similarity index 100% rename from test_data/test_types_superObject.p rename to test/data/test_types_superObject.p diff --git a/test/readJSON_test.py b/test/readJSON_test.py index 96fb4dd..fd10e60 100644 --- a/test/readJSON_test.py +++ b/test/readJSON_test.py @@ -6,7 +6,7 @@ def setUp(self): os.system("rm -rf ./src") def test_command(self): - exit_status = self.execute_script("samples/product.json", "test_data/product") + exit_status = self.execute_script("samples/product.json", "test/data/product") self.assertEqual(exit_status, 0) # no difference def execute_script(self, json_file, output_dir): From cd9ca08d4a9dd5642d4bed4c536a420905843ed5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Franc=CC=A7ois=20Benaiteau?= <francois.benaiteau@sinnerschrader-mobile.com> Date: Tue, 13 May 2014 18:03:40 +0200 Subject: [PATCH 107/149] fixing last templates issues and enable all tests --- metajson/templates/_header.h.mustache | 4 ++-- metajson/templates/_source.m.mustache | 2 +- .../multiple_property_implementation.mustache | 15 ++++----------- metajson/templates/string_property.mustache | 5 +++++ test/readJSON_test.py | 6 +++--- 5 files changed, 15 insertions(+), 17 deletions(-) diff --git a/metajson/templates/_header.h.mustache b/metajson/templates/_header.h.mustache index 2d9bd11..41c3eb9 100644 --- a/metajson/templates/_header.h.mustache +++ b/metajson/templates/_header.h.mustache @@ -76,10 +76,10 @@ - (NSDictionary *)propertyDictionary; {{/baseTypeIsObject}} {{#arrayProperties}} -{{> templates/array_property}} +{{> metajson/templates/array_property}} {{/arrayProperties}} {{#undefinedProperties}} -{{> templates/multiple_property}} +{{> metajson/templates/multiple_property}} {{/undefinedProperties}} {{^arrayProperties}} diff --git a/metajson/templates/_source.m.mustache b/metajson/templates/_source.m.mustache index abd74a8..51b4770 100644 --- a/metajson/templates/_source.m.mustache +++ b/metajson/templates/_source.m.mustache @@ -372,7 +372,7 @@ {{/hasAnyType}} {{/arrayProperties}} {{#undefinedProperties}} -{{> templates/multiple_property_implementation}} +{{> metajson/templates/multiple_property_implementation}} {{/undefinedProperties}} #pragma mark - NSCoding diff --git a/metajson/templates/multiple_property_implementation.mustache b/metajson/templates/multiple_property_implementation.mustache index 1a56b0e..3b524f5 100644 --- a/metajson/templates/multiple_property_implementation.mustache +++ b/metajson/templates/multiple_property_implementation.mustache @@ -3,14 +3,7 @@ - ({{className}} *){{name}}As{{#_upper_camelcase}}{{type}}{{/_upper_camelcase}}:(NSError **)error { - {{> templates/number_property}} -} -{{/className}} -{{^className}} - -- (NSString *){{name}}As{{#_upper_camelcase}}{{type}}{{/_upper_camelcase}}:(NSError **)error -{ - {{> templates/string_property}} + {{> metajson/templates/number_property}} } {{/className}} {{/hasCustomType}} @@ -18,14 +11,14 @@ - (NSNumber *){{name}}AsNumber:(NSError **)error { - {{> templates/number_property}} + {{> metajson/templates/number_property}} } {{/hasNumberType}} {{#hasStringType}} {{#types}} -- (NSString *){{name}}AsString:(NSError **)error +- (NSString *){{name}}As{{#_upper_camelcase}}{{type}}{{/_upper_camelcase}}:(NSError **)error { - {{> templates/string_property}} + {{> metajson/templates/string_property}} } {{/types}} {{/hasStringType}} diff --git a/metajson/templates/string_property.mustache b/metajson/templates/string_property.mustache index 1cfd222..a31186f 100644 --- a/metajson/templates/string_property.mustache +++ b/metajson/templates/string_property.mustache @@ -4,6 +4,11 @@ NSString *tmp{{capitalizeVarName}} = [APIParser stringFromResponseDictionary:new if (*error) { return nil; } +{{#_type}} +if (tmp{{capitalizeVarName}} == nil) { + return nil; +} +{{/_type}} {{#_type.maxLength}} if (tmp{{capitalizeVarName}}.length > {{_type.maxLength}}) { NSDictionary *userInfo = @{@"propertyName" : @"{{_type.name}}", diff --git a/test/readJSON_test.py b/test/readJSON_test.py index fd10e60..04c9794 100644 --- a/test/readJSON_test.py +++ b/test/readJSON_test.py @@ -15,12 +15,12 @@ def execute_script(self, json_file, output_dir): os.system("rm -rf ./src/Utilities") # return os.system("diff -r src/ " + output_dir) # common_file = "/AbstractInterfaceFiles/_ProductDetailJSONObject.h" - common_file = "/AbstractInterfaceFiles/_ProductDetailJSONObject.h" + # common_file = "/AbstractInterfaceFiles/_ProductDetailJSONObject.h" # common_file = "/AbstractInterfaceFiles/_SenderGroupJSONObject.h" # common_file = "/AbstractInterfaceFiles/_SenderList2JSONObject.h" # common_file = "/AbstractInterfaceFiles/_SenderListJSONObject.m" # common_file = "/AbstractInterfaceFiles/_SenderList2JSONObject.m" # common_file = "/AbstractInterfaceFiles/_SenderJSONObject.m" # common_file = "/AbstractInterfaceFiles/_SenderGroupJSONObject.m" - # return os.system("diff -r -w -b -B src " + output_dir) - return os.system("diff -r -w -b -B src" + common_file + " " + output_dir + common_file) + return os.system("diff -r -w -b -B src " + output_dir) + # return os.system("diff -r -w -b -B src" + common_file + " " + output_dir + common_file) From 54957a1fa2f64788fe9c30b8546b450ffec8012b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Franc=CC=A7ois=20Benaiteau?= <francois.benaiteau@sinnerschrader-mobile.com> Date: Tue, 13 May 2014 18:11:09 +0200 Subject: [PATCH 108/149] Update setup.py to install metajson --- setup.py | 33 +++++++++++++++++++++++++-------- 1 file changed, 25 insertions(+), 8 deletions(-) diff --git a/setup.py b/setup.py index 2f534af..ac295cc 100644 --- a/setup.py +++ b/setup.py @@ -1,11 +1,28 @@ #!/usr/bin/env python +import re +from setuptools import setup -from distutils.core import setup -setup(name='metaJSON', - version='1.0.0', - description='metaJSON provides a meta language to generate object models for several languages. The generated classes can easily be used for the client-server communication.', - url='https://github.com/sinnerschrader-mobile/metaJSON.git', - license='MIT', - scripts=['readJSON.py'] - ) +version = re.search( + '^__version__\s*=\s*"(.*)"', + open('metajson/readJSON.py').read(), + re.M + ).group(1) + + +with open("README.md", "rb") as f: + long_descr = f.read().decode("utf-8") + + +setup( + name = "metaJSON", + packages = ["metajson"], + entry_points = { + "console_scripts": ['metajson = metajson.readJSON:main'] + }, + version = version, + description='metaJSON provides a meta language to generate object models for several languages. The generated classes can easily be used for the client-server communication.', + url='https://github.com/sinnerschrader-mobile/metaJSON.git', + license='MIT', + long_description = long_descr, + ) From b847d1cd7cd035b95238b793c1a9f131d6240220 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Franc=CC=A7ois=20Benaiteau?= <francois.benaiteau@sinnerschrader-mobile.com> Date: Tue, 13 May 2014 18:11:36 +0200 Subject: [PATCH 109/149] ignore build folder --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index be385b8..5c62d77 100644 --- a/.gitignore +++ b/.gitignore @@ -3,3 +3,4 @@ # Default ouptut folder src/ +build/ \ No newline at end of file From 238fe2aa82bb79c488624f15ae5fc3a4fc6f1acf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Franc=CC=A7ois=20Benaiteau?= <francois.benaiteau@sinnerschrader-mobile.com> Date: Tue, 13 May 2014 18:25:11 +0200 Subject: [PATCH 110/149] move doc files to wiki --- doc/Development.md | 16 -- doc/MetaJSONProtocol.md | 617 ---------------------------------------- doc/known_issues.md | 22 -- 3 files changed, 655 deletions(-) delete mode 100644 doc/Development.md delete mode 100644 doc/MetaJSONProtocol.md delete mode 100644 doc/known_issues.md diff --git a/doc/Development.md b/doc/Development.md deleted file mode 100644 index 99bbc7f..0000000 --- a/doc/Development.md +++ /dev/null @@ -1,16 +0,0 @@ -# Tools to develop metaJSON - -MetaJSON has now some dependencies to be developed, in particular to be tested. There are listed in a `requirements.txt`. - -``` -sudo easy_install pip -sudo pip install -r requirements.txt -``` - - -## Run Tests - -`nosetests` will all the tests at the root of repo. -`nosetests <filename>` run only this test file. -`nosetests -s` run tests with output -`nosetests ObjectiveCCodeGenerator_test:TestSampleTestClassCase.test_human_source_content` run only one single test diff --git a/doc/MetaJSONProtocol.md b/doc/MetaJSONProtocol.md deleted file mode 100644 index 8e87c5f..0000000 --- a/doc/MetaJSONProtocol.md +++ /dev/null @@ -1,617 +0,0 @@ -# Writing Meta JSON and Using Meta JSON - -##1. define a type (common) - -``` -{ -"name" : string, -"base-type" : string or array, -"description" : string, -} -``` -* "name" and "base-type" are mandatory meta-data for all types. -* "description" is optional to understand what this property means. -* the value of "base-type" should be "boolean", "number", "string", "data", "date", "array", "object", "any" or a name of custom base-type. - -##2. define string type - -``` -{ -"name" : "myString", -"base-type" : "string", -"description" : string, -"regex" : regular expression string, -"maxLength" : positive integer or zero, -"minLength" : positive integer or zero -} -``` - -* "regex", "maxLength" and "minLength" are optional, to validate this type. -* "maxLength" should be always same or bigger than "minLength". - -You can also use just one of those ("minLength" or "maxLength"). - - -##3. define number type - -``` -{ - "name" : "myNumber", - "base-type" : "number", - "description" : string, - "maxValue" : real number, - "minValue" : real number -} -``` - -* "minValue" and "maxValue" are optional, to validate this type. -* "maxValue" should be always same or bigger than "minValue". - -You can also use just one of those ("minValue" or "maxValue"). - - -##4. define date type - -``` -{ - "name" : "myDate", - "base-type" : "date", - "description" : string - "minValue" : UTC time interval since 1970 - "maxValue" : UTC time interval since 1970 -} -``` - -* The value of myDate should be always UTC time interval since 1970. -* "minValue" and "maxValue" are optional, to validate this type. -* "maxValue" should be always same or later than "minValue". - -You can also use just one of those ("minValue" or "maxValue"). - - -##5. define boolean type - -``` -{ - "name" : "myBoolean", - "base-type" : "boolean", - "description" : string -} -``` - -##6. define data type - -``` -{ - "name" : "myData", - "base-type" : "data", - "description" : string, - "maxLength" : positive integer or zero, - "minLength" : positive integer or zero -} -``` - -* "maxLength" and "minLength" are optional, to validate this type. -* "maxLength" should be always same or bigger than "minLength". - - -##7. define array type - -``` -{ - "name" : "myArray", - "base-type" : "array", - "description" : string, - "subType" : string, - "maxCount" : positive integer or zero, - "minCount" : positive integer or zero -} -``` - -* "maxCount" and "minCount" are optional, to validate this type. -* "maxCount" should be always same or bigger than "minCount". -* "subType" should be boolean, number, string, data, date, array, object and any or a name of custom base-type. - - -##8. define custom type - -``` -{ - "name" : "myCustom", - "base-type" : "object", - "description" : "description-value", - "property" : [ - { - "name" : "property1" - "base-type" : "string", - "required" : "boolean", - }, - { - "name" : "property2" - "base-type" : "number", - "required" : "boolean", - }, - . - . - . - ] -} -``` - -To define custom type, you should write "property" (mandatory). -Property can have many different kind of types (boolean, number, string, data, date, array, object, any and/or custom object) -but "property" must have 1 or more types. - - -##9. define child type from custom type - -``` -{ - "name" : "myChild", - "base-type" : "myCustom", - "description" : string, - "property" : [ - { - "name" : "property3" - "base-type" : "myString", - "required" : boolean, - }, - . - . - . - ] -} -``` - -If you want to define child type from other custom type, you just need to write parent type's name in "base-type" field. -And you can also define other additional properties, or override existing properties. -In this case, "property" is not mandatory. - - -##10. define multi-type - -``` -{ - "name" : "myMultiType", - "base-type" : ["string", "number", "typeA", …], - "required" : boolean, - "description" : string -} -``` - -And when the base-type is json-array type, code generator has to implement method which is looked like - -``` - (JSONObject *)myMultiType; - (JSONString *)myMultiTypeAsString; - (JSONNumber *)myMultiTypeAsNumber; - (TypeA *)myMultiTypeAsTypeA; - . - . - . -``` - -And if subType is "any", the code generator will make just a method which will return the original JSON subtree (ex : Objective-c method can return any basic JSON type). - -``` - (JSONObject *) myMultiType; -``` - -##11. define multi-type array type - -``` -{ - "name" : "mtArray", - "base-type" : "array", - "description" : string, - "sub-type" : ["string", "number", "typeB", …], -} -``` - -Code generator has to implement method which is looked like - -``` - (JSONObject *)mtArrayObjectIndexAt:(NSUInteger)index; - (JSONString *)mtArrayObjectAsStringIndexAt:(NSUInteger)index; - (JSONNumber *)myArrayObjectAsNumberIndexAt:(NSUInteger)index; - (TypeB *)mtArrayObjectAsTypeBIndexAt:(NSUInteger)index; - . - . - . -``` - -And if subType is "any", the code generator will make just a method which will return the original JSON subtree (ex : Objective-c method can return any basic JSON type). - -``` - (JSONObject *)mtArrayObjectIndexAt:(NSUInteger)index; -``` - - -##12. several ways to define type and use - -Top-level Meta-JSON is an array where each element is one of "string", "array", "number", "boolean", ..., "object" and child type of custom type. - -###12.1. basic definition and usage - -``` -[ - { - "name" : "sessionString", - "base-type" : "string", - "description" : "session string after login", - "maxLength" : 50, - "minLength" : 20 - }, - { - "name" : "sessionExpirationDate", - "base-type" : "date", - "description" : "Expire date of session", - "maxValue" : 183759284 - }, - { - "name" : "mySession", - "base-type" : "object", - "description" : "session has session id and session expire date.", - "property" : - [ - { - "name" : "sessionID", - "base-type" : "sessionString", - "required" : 1 - }, - { - "name" : "expirationDate", - "base-type" : "sessionExpirationDate", - "required" : 1 - } - ] - }, - { - "name" : "user", - "base-type" : "object", - "description" : "test description of user type.", - "property" : - [ - { - "name" : "session", - "base-type" : "mySession", - "required" : 1 - }, - { - "name" : "userName", - "base-type" : "string", - "required" : 1 - } - ] - } -] -``` - -###12.2. define type in "base-type" -* the type named "person" is always accessible and reusable in other types. -* in this case, "user" type is a child type from "person" type. - -``` -[ - { - "name" : "sessionString", - "base-type" : "string", - "description" : "session string after login", - "maxLength" : 50, - "minLength" : 20 - }, - { - "name" : "sessionExpirationDate", - "base-type" : "date", - "description" : "Expire date of session", - "maxValue" : 183759284 - }, - { - "name" : "mySession", - "base-type" : "object", - "description" : "session has session id and session expire date.", - "property" : - [ - { - "name" : "sessionID", - "base-type" : "sessionString", - "required" : 1 - }, - { - "name" : "expirationDate", - "base-type" : "sessionExpirationDate", - "required" : 1 - } - ] - }, - { - "name" : "user", - "base-type" : - { - "name" : "person", - "base-type" : "object", - "description" : ".", - "property" : - [ - { - "name" : "email", - "base-type" : "string", - "required" : 1 - }, - { - "name" : "birthday", - "base-type" : "date", - "required" : 1 - } - ] - }, - "description" : "test description of user type.", - "property" : - [ - { - "name" : "userName", - "base-type" : "string", - "required" : 1 - }, - { - "name" : "userSession", - "base-type" : "mySession", - "required" : 1 - } - ] - } -] -``` - -###12.3. define type in "property" - -``` -[ - { - "name" : "sessionString", - "base-type" : "string", - "description" : "session string after login", - "maxLength" : 50, - "minLength" : 20, - }, - { - "name" : "sessionExpirationDate", - "base-type" : "date", - "description" : "Expire date of session" - "maxValue" : 183759284 - }, - { - "name" : "user", - "base-type" : "object", - "description" : "test description of user type.", - "property" : - [ - { - "name" : "session" - "base-type" : { - "name" : "mySession", - "base-type" : "object", - "description" : "session has session id and session expire date.", - "property" : - [ - { - "name" : "sessionID" - "base-type" : "sessionString", - "required" : 1, - }, - { - "name" : "expirationDate" - "base-type" : "sessionExpirationDate", - "required" : 1, - } - ] - }, - "required" : 1, - }, - { - "name" : "userName" - "base-type" : "string", - "required" : 1, - } - ] - } -] -``` - -###12.4. define type in "subType" of array -* "userSession" property can have "sessionID" type and "expirationDate". -* (it's not a good example……) - -``` -[ - { - "name" : "sessionString", - "base-type" : "string", - "description" : "session string after login", - "maxLength" : 50, - "minLength" : 20, - }, - { - "name" : "sessionExpirationDate", - "base-type" : "date", - "description" : "Expire date of session" - "maxValue" : 183759284 - }, - { - "name" : "mySession", - "base-type" : "array", - "description" : "session has session-ids and session expire dates.", - "subType" : - [ - { - "name" : "sessionID" - "base-type" : "string", - "description" : "session string after login", - "maxLength" : 50, - "minLength" : 20, - }, - { - "name" : "expirationDate", - "base-type" : "date", - "description" : "Expire date of session" - "maxValue" : 183759284 - } - ] - }, - { - "name" : "user", - "base-type" : "object", - "description" : "test description of user type.", - "property" : - [ - { - "name" : "userName" - "base-type" : "string", - "required" : 1, - }, - { - "name" : "userSession" - "base-type" : "mySession", - "required" : 1, - } - ] - } -] -``` - -###12.5. override the value of predefined keys in predefine type. -* I just overrides the maxLength value of "sessionString". - -``` -[ - { - "name" : "sessionString", - "base-type" : "string", - "description" : "session string after login", - "maxLength" : 50, - "minLength" : 20, - }, - { - "name" : "mySession", - "base-type" : "object", - "description" : "session has session id and session expire date.", - "property" : - [ - { - "name" : "sessionID", - "base-type" : "sessionString", - "description" : "session string after login", - "maxLength" : 30, - }, - { - "name" : "expirationDate" - "base-type" : "sessionExpirationDate", - "required" : 1, - } - ] - }, - { - "name" : "user", - "base-type" : "object", - "description" : "test description of user type.", - "property" : - [ - { - "name" : "session" - "base-type" : "mySession", - "required" : 1, - }, - { - "name" : "userName" - "base-type" : "string", - "required" : 1, - } - ] - } -] -``` - -###12.6. override the properties of predefined types. -- user type is a child type of person. -- redefine the property named "email" with new "regex" key. - -``` -[ - { - "name" : "sessionString", - "base-type" : "string", - "description" : "session string after login", - "maxLength" : 50, - "minLength" : 20, - }, - { - "name" : "sessionExpirationDate", - "base-type" : "date", - "description" : "Expire date of session" - "maxValue" : 183759284 - }, - { - "name" : "mySession", - "base-type" : "object", - "description" : "session has session id and session expire date.", - "property" : - [ - { - "name" : "sessionID" - "base-type" : "sessionString", - "required" : 1, - }, - { - "name" : "expirationDate" - "base-type" : "sessionExpirationDate", - "required" : 1, - } - ] - }, - { - "name" : "person", - "base-type" : "object", - "description" : ".", - "property" : - [ - { - "name" : "email" - "base-type" : "string", - "required" : 1, - }, - { - "name" : "birthday" - "base-type" : "date", - "required" : 1, - } - ] - }, - { - "name" : "user", - "base-type" : "person" - "description" : "test description of user type.", - "property" : - [ - { - "name" : "email" - "base-type" : "string", - "regex" : "[A-Z0-9._%+-]+@(?:[A-Z0-9-]+\.)+[A-Z]{2,4}" - "required" : 1, - }, - - { - "name" : "session" - "base-type" : "mySession", - "required" : 1, - }, - { - "name" : "userName" - "base-type" : "string", - "required" : 1, - } - ] - } -] -``` - - diff --git a/doc/known_issues.md b/doc/known_issues.md deleted file mode 100644 index 1d18265..0000000 --- a/doc/known_issues.md +++ /dev/null @@ -1,22 +0,0 @@ -#Currently known issues - -###Predefined primitive type - -A definition like below which might be referenced as sub or base type is not yet supported by the java code generator. Using that will result in valid Objective-C code but will lead to invalid code for Java. It can be used but manual "reparation" of the generated code is required. - -``` -{ - "name" : "titleString", - "base-type" : "string", - "description" : "the title of product", - "minLength" : 10, - "maxLength" : 20, - "regex" : "[a-z0-9]:10", - "required" : 1 -} -``` - -###Documentation Topic 12 -The complete topic 12 is not yet fully supported and/or tested. Some parts might already work but there is no intentionally support implemented yet. - -We highly appreciate any contribution to this work-in-progress project. \ No newline at end of file From 48032e8650deeb225ca46e7c5d1621343b0e3356 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois=20Benaiteau?= <netbe@users.noreply.github.com> Date: Wed, 14 May 2014 10:58:20 +0200 Subject: [PATCH 111/149] Create template_keys.csv --- template_keys.csv | 62 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 62 insertions(+) create mode 100644 template_keys.csv diff --git a/template_keys.csv b/template_keys.csv new file mode 100644 index 0000000..c4666f1 --- /dev/null +++ b/template_keys.csv @@ -0,0 +1,62 @@ +projectPrefix +date +humanClassName +machineClassName + +baseTypeIsObject +baseClassName +custom_classes + +numberProperties +stringProperties +booleanProperties +dataProperties +dateProperties +arrayProperties +objectProperties +undefinedProperties + +comment +varName +variableName +capitalizeVarName +name +required +maxValue +maxValue.value +minValue +minValue.value +regex +regex.value +maxLength +maxLength.value +minLength +minLength.value +maxCount +maxCount.value +minCount +minCount.value + +hasOneSubtype +hasMultipleSubtypes + +hasCustomType +hasAnyType +hasStringType +hasNumberType +hasDateType +hasDataType +hasBooleanType + +subtypes +subtypes.subtype +subtypes._subtype +subtypes.className + +types +types.type +types._type +types.className + + +_upper_camelcase From f8548a258d3b75d0f04d467d06b695f0e55355f0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois=20Benaiteau?= <netbe@users.noreply.github.com> Date: Wed, 14 May 2014 12:27:14 +0200 Subject: [PATCH 112/149] Update template_keys.csv --- template_keys.csv | 126 +++++++++++++++++++++++----------------------- 1 file changed, 64 insertions(+), 62 deletions(-) diff --git a/template_keys.csv b/template_keys.csv index c4666f1..3a2a63d 100644 --- a/template_keys.csv +++ b/template_keys.csv @@ -1,62 +1,64 @@ -projectPrefix -date -humanClassName -machineClassName - -baseTypeIsObject -baseClassName -custom_classes - -numberProperties -stringProperties -booleanProperties -dataProperties -dateProperties -arrayProperties -objectProperties -undefinedProperties - -comment -varName -variableName -capitalizeVarName -name -required -maxValue -maxValue.value -minValue -minValue.value -regex -regex.value -maxLength -maxLength.value -minLength -minLength.value -maxCount -maxCount.value -minCount -minCount.value - -hasOneSubtype -hasMultipleSubtypes - -hasCustomType -hasAnyType -hasStringType -hasNumberType -hasDateType -hasDataType -hasBooleanType - -subtypes -subtypes.subtype -subtypes._subtype -subtypes.className - -types -types.type -types._type -types.className - - -_upper_camelcase +KEYS, metaJSON, comments +projectPrefix, prefix, command arguments +date,, +humanClassName,name, +machineClassName,name, +,, +baseTypeIsObject,base-type, +baseClassName, base-type, +custom_classes, base-type, go through base-type of properties +,, +numberProperties, property, +stringProperties, property, +booleanProperties, property, +dataProperties, property, +dateProperties, property, +arrayProperties, property, +objectProperties, property, +undefinedProperties, property, +,, +comment, description, +varName, name, +variableName, name, +capitalizeVarName, name, +name, name, +required, required, +maxValue, maxValue, +maxValue.value, maxValue, +minValue, minValue, +minValue.value, minValue, +regex, regex, +regex.value, regex, +maxLength, maxLength, +maxLength.value, maxLength, +minLength, minLength, +minLength.value, minLength, +maxCount, maxCount, +maxCount.value, maxCount, +minCount, minCount, +minCount.value, minCount, +,, +hasOneSubtype, subType, +hasMultipleSubtypes, subType, +hasNoBasetypes, subType, +,, +hasCustomType, base-type, +hasAnyType, base-type, +hasStringType, base-type, +hasNumberType, base-type, +hasDateType, base-type, +hasDataType, base-type, +hasBooleanType, base-type, +,, +subtypes, subType, +subtypes.subtype, subType, +subtypes._subtype, subType, +subtypes.className, subType, +,, +types, base-type, +types.type, base-type, +types._type, base-type, reference full object definition +types.className, base-type, and also name +,, +,, +_upper_camelcase,,fonction to transform a string From 4293c3c2ac05c0bf2204b5a72452e9220f3211bc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Franc=CC=A7ois=20Benaiteau?= <francois.benaiteau@sinnerschrader-mobile.com> Date: Wed, 14 May 2014 15:40:36 +0200 Subject: [PATCH 113/149] move requirements to setup --- requirements.txt | 2 -- setup.py | 8 +++++--- 2 files changed, 5 insertions(+), 5 deletions(-) delete mode 100644 requirements.txt diff --git a/requirements.txt b/requirements.txt deleted file mode 100644 index 3cf4c2b..0000000 --- a/requirements.txt +++ /dev/null @@ -1,2 +0,0 @@ -nose -pystache diff --git a/setup.py b/setup.py index ac295cc..b6499ae 100644 --- a/setup.py +++ b/setup.py @@ -20,9 +20,11 @@ entry_points = { "console_scripts": ['metajson = metajson.readJSON:main'] }, + install_requires = ['pystache'], + tests_require = ['nose'], version = version, - description='metaJSON provides a meta language to generate object models for several languages. The generated classes can easily be used for the client-server communication.', - url='https://github.com/sinnerschrader-mobile/metaJSON.git', - license='MIT', + description = 'metaJSON provides a meta language to generate object models for several languages. The generated classes can easily be used for the client-server communication.', + url = 'https://github.com/sinnerschrader-mobile/metaJSON.git', + license = 'MIT', long_description = long_descr, ) From e29af8aca70101294d8d92d1185cdb06e74c59fa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Franc=CC=A7ois=20Benaiteau?= <francois.benaiteau@sinnerschrader-mobile.com> Date: Wed, 14 May 2014 16:58:12 +0200 Subject: [PATCH 114/149] Templates are now included in install process --- MANIFEST.in | 1 + setup.py | 3 +-- 2 files changed, 2 insertions(+), 2 deletions(-) create mode 100644 MANIFEST.in diff --git a/MANIFEST.in b/MANIFEST.in new file mode 100644 index 0000000..176eb63 --- /dev/null +++ b/MANIFEST.in @@ -0,0 +1 @@ +recursive-include metajson/templates * diff --git a/setup.py b/setup.py index b6499ae..98d1c4c 100644 --- a/setup.py +++ b/setup.py @@ -2,7 +2,6 @@ import re from setuptools import setup - version = re.search( '^__version__\s*=\s*"(.*)"', open('metajson/readJSON.py').read(), @@ -13,7 +12,6 @@ with open("README.md", "rb") as f: long_descr = f.read().decode("utf-8") - setup( name = "metaJSON", packages = ["metajson"], @@ -22,6 +20,7 @@ }, install_requires = ['pystache'], tests_require = ['nose'], + include_package_data = True, #will include files listed in MANIFEST.in version = version, description = 'metaJSON provides a meta language to generate object models for several languages. The generated classes can easily be used for the client-server communication.', url = 'https://github.com/sinnerschrader-mobile/metaJSON.git', From 7b1c5ff1d2c0c77d3fae963524d523206495ed58 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Franc=CC=A7ois=20Benaiteau?= <francois.benaiteau@sinnerschrader-mobile.com> Date: Wed, 14 May 2014 16:59:13 +0200 Subject: [PATCH 115/149] ignore generated files --- .gitignore | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 5c62d77..2a3d8bb 100644 --- a/.gitignore +++ b/.gitignore @@ -3,4 +3,6 @@ # Default ouptut folder src/ -build/ \ No newline at end of file +build/ +dist/ +*.egg-info From 6953994db694b4c6b9b35f26f67ca8778504dab2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Franc=CC=A7ois=20Benaiteau?= <francois.benaiteau@sinnerschrader-mobile.com> Date: Wed, 14 May 2014 17:06:49 +0200 Subject: [PATCH 116/149] restore requirements file for testing and development (pip) --- requirements.txt | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 requirements.txt diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..3cf4c2b --- /dev/null +++ b/requirements.txt @@ -0,0 +1,2 @@ +nose +pystache From d060af09f79902ef24b1c20a75cfd53a4611ca75 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Franc=CC=A7ois=20Benaiteau?= <francois.benaiteau@sinnerschrader-mobile.com> Date: Wed, 14 May 2014 17:23:53 +0200 Subject: [PATCH 117/149] update default params and add version option --- metajson/readJSON.py | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/metajson/readJSON.py b/metajson/readJSON.py index 1029579..6e57308 100755 --- a/metajson/readJSON.py +++ b/metajson/readJSON.py @@ -37,23 +37,24 @@ def main(argv=sys.argv): jsonfiles = [] inputfile = 'do you have files?' - projectPrefix = '' + projectPrefix = 'S2M' target = 'iOS' dirPathToSaveCodes = './src' objectSuffix = "JSONObject" usageString = '\nreadJSON.py [ -p | -t | -o | -s ] [-i]\n' usageString += 'Options:\n' + usageString += ' -v, --version shows version\n' usageString += ' -h, --help shows help\n' usageString += ' -p, --prefix= project prefix (default: S2M)\n' usageString += ' -s, --suffix= classname suffix (default: JSONObject). Use "-s false" for no suffix\n' usageString += ' -t, --target= target platform iOS or Android (default: iOS)\n' usageString += ' -i, --input= meta-JSON file to read\n' - usageString += ' -o, --output= ouput path of generated source codes\n' + usageString += ' -o, --output= ouput path of generated source codes (default: src)\n' argv = sys.argv[1:] try: - opts, args = getopt.getopt(argv,"ho:p:s:t:i:",["prefix=","suffix=","target=","input=","output="]) + opts, args = getopt.getopt(argv,"vhp:s:t:i:o",["version", "help", "prefix=", "suffix=", "target=", "input=", "output="]) except getopt.GetoptError: print(usageString) sys.exit(2) @@ -62,6 +63,8 @@ def main(argv=sys.argv): if opt in ("-h", "--help"): print(usageString) sys.exit() + elif opt in ("-v", "--version"): + version() elif opt in ("-p", "--prefix"): projectPrefix = arg elif opt in ("-t", "--target"): @@ -196,7 +199,8 @@ def openFileAndParseJSON(filePath): return obj def version(): - print("Running metajson version %s." % __version__) + print("metaJSON version %s." % __version__) + sys.exit(0) if __name__ == '__main__': sys.exit(main(sys.argv)) From 0fe2d42402ba92d85d381d93dc6d3b948581c2b0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Franc=CC=A7ois=20Benaiteau?= <francois.benaiteau@sinnerschrader-mobile.com> Date: Wed, 14 May 2014 17:28:17 +0200 Subject: [PATCH 118/149] reset version to next release 1.0.0 --- metajson/readJSON.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/metajson/readJSON.py b/metajson/readJSON.py index 6e57308..73f7bd1 100755 --- a/metajson/readJSON.py +++ b/metajson/readJSON.py @@ -22,7 +22,7 @@ THE SOFTWARE. ''' -__version__ = "2.7.2" +__version__ = "1.0.0" import json import os From f6b646ee3a7ac4b09f0381101aa19c0b6e6fc969 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Franc=CC=A7ois=20Benaiteau?= <francois.benaiteau@sinnerschrader-mobile.com> Date: Wed, 14 May 2014 18:01:41 +0200 Subject: [PATCH 119/149] refactor script to be more readable --- metajson/readJSON.py | 70 +++++++++++++++++++++++--------------------- 1 file changed, 37 insertions(+), 33 deletions(-) diff --git a/metajson/readJSON.py b/metajson/readJSON.py index 73f7bd1..4cc5f0c 100755 --- a/metajson/readJSON.py +++ b/metajson/readJSON.py @@ -35,6 +35,7 @@ from JavaCodeGenerator import * def main(argv=sys.argv): + # parse Options jsonfiles = [] inputfile = 'do you have files?' projectPrefix = 'S2M' @@ -42,26 +43,16 @@ def main(argv=sys.argv): dirPathToSaveCodes = './src' objectSuffix = "JSONObject" - usageString = '\nreadJSON.py [ -p | -t | -o | -s ] [-i]\n' - usageString += 'Options:\n' - usageString += ' -v, --version shows version\n' - usageString += ' -h, --help shows help\n' - usageString += ' -p, --prefix= project prefix (default: S2M)\n' - usageString += ' -s, --suffix= classname suffix (default: JSONObject). Use "-s false" for no suffix\n' - usageString += ' -t, --target= target platform iOS or Android (default: iOS)\n' - usageString += ' -i, --input= meta-JSON file to read\n' - usageString += ' -o, --output= ouput path of generated source codes (default: src)\n' - argv = sys.argv[1:] try: opts, args = getopt.getopt(argv,"vhp:s:t:i:o",["version", "help", "prefix=", "suffix=", "target=", "input=", "output="]) except getopt.GetoptError: - print(usageString) + usage() sys.exit(2) for opt, arg in opts: if opt in ("-h", "--help"): - print(usageString) + usage() sys.exit() elif opt in ("-v", "--version"): version() @@ -94,13 +85,11 @@ def main(argv=sys.argv): if target == 'none' : print 'error - target platform is not defined' - print(usageString) - sys.exit() + usage() if len(jsonfiles) == 0 : print 'error - meta JSON file is not defined' - print(usageString) - sys.exit() + usage() if not os.path.exists(dirPathToSaveCodes): os.makedirs(dirPathToSaveCodes) @@ -113,29 +102,20 @@ def main(argv=sys.argv): Android = True else : print 'error - unknown target platform : ' + target - print(usageString) - sys.exit() + usage() hasError = False + # write templates if iOS : - if dirPathToSaveCodes.endswith("/") : - dirPathToSaveCodes = dirPathToSaveCodes[:-1] - - if os.path.exists(dirPathToSaveCodes + "/AbstractInterfaceFiles"): - shutil.rmtree(dirPathToSaveCodes + "/AbstractInterfaceFiles") - - templateCodeGen = TemplateCodeGenerator() - templateCodeGen.projectPrefix = projectPrefix - templateCodeGen.dirPath = dirPathToSaveCodes - templateCodeGen.writeTemplates() - - JSONScheme.projectPrefix = projectPrefix - JSONScheme.objectSuffix = objectSuffix + generate_template_files(dirPathToSaveCodes, projectPrefix) + # read JSON file print "\nGenerate source codes for " + target + ", with Project Prefix \'" + projectPrefix + "\' and suffix \'" + objectSuffix + "\'" print "Output path : \'" + dirPathToSaveCodes + "\'\n" + JSONScheme.projectPrefix = projectPrefix + JSONScheme.objectSuffix = objectSuffix for filePath in jsonfiles : print "read " + filePath + " to parse ...." @@ -188,14 +168,38 @@ def main(argv=sys.argv): if obj.isNaturalType() == False : codeGen.make(obj) +def generate_template_files(dirPathToSaveCodes, projectPrefix): + if dirPathToSaveCodes.endswith("/") : + dirPathToSaveCodes = dirPathToSaveCodes[:-1] + + if os.path.exists(dirPathToSaveCodes + "/AbstractInterfaceFiles"): + shutil.rmtree(dirPathToSaveCodes + "/AbstractInterfaceFiles") + + templateCodeGen = TemplateCodeGenerator() + templateCodeGen.projectPrefix = projectPrefix + templateCodeGen.dirPath = dirPathToSaveCodes + templateCodeGen.writeTemplates() + +def usage(): + usageString = '\n'+__file__+' [ -p | -t | -o | -s ] [-i]\n' + usageString += 'Options:\n' + usageString += ' -v, --version shows version\n' + usageString += ' -h, --help shows help\n' + usageString += ' -p, --prefix= project prefix (default: S2M)\n' + usageString += ' -s, --suffix= classname suffix (default: JSONObject). Use "-s false" for no suffix\n' + usageString += ' -t, --target= target platform iOS or Android (default: iOS)\n' + usageString += ' -i, --input= meta-JSON file to read\n' + usageString += ' -o, --output= ouput path of generated source codes (default: src)\n' + print(usageString) + sys.exit() + +"Opens and read content of json file" def openFileAndParseJSON(filePath): f = open(filePath) - try: obj = json.load(f) finally: f.close() - return obj def version(): From ccfa3e1af53779088e2aa6c23d2a9416cf68afb4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Franc=CC=A7ois=20Benaiteau?= <francois.benaiteau@sinnerschrader-mobile.com> Date: Wed, 14 May 2014 18:02:00 +0200 Subject: [PATCH 120/149] support yaml as input file --- metajson/readJSON.py | 22 +++++++++++++++++++++- requirements.txt | 1 + samples/product.yaml | 33 +++++++++++++++++++++++++++++++++ setup.py | 2 +- 4 files changed, 56 insertions(+), 2 deletions(-) create mode 100644 samples/product.yaml diff --git a/metajson/readJSON.py b/metajson/readJSON.py index 4cc5f0c..9dc497f 100755 --- a/metajson/readJSON.py +++ b/metajson/readJSON.py @@ -24,6 +24,8 @@ __version__ = "1.0.0" +import yaml + import json import os import glob @@ -119,9 +121,10 @@ def main(argv=sys.argv): for filePath in jsonfiles : print "read " + filePath + " to parse ...." - jsonObj = openFileAndParseJSON(filePath) + jsonObj = read_file(filePath) if type(jsonObj) == list : + print "list" for dic in jsonObj : schemeObj = JSONScheme() schemeObj.projectPrefix = projectPrefix @@ -131,6 +134,7 @@ def main(argv=sys.argv): break elif type(jsonObj) == dict : + print "dict" schemeObj = JSONScheme() if schemeObj.parseDictionary(jsonObj) == False : hasError = True @@ -193,6 +197,22 @@ def usage(): print(usageString) sys.exit() +def read_file(file_path): + basename, extension = os.path.splitext(file_path) + if extension == '.yaml': + return open_yaml_file(file_path) + else: + return openFileAndParseJSON(file_path) + +"Opens and read content of yaml file" +def open_yaml_file(file_path): + f = open(file_path) + try: + obj = yaml.load(f) + finally: + f.close() + return obj + "Opens and read content of json file" def openFileAndParseJSON(filePath): f = open(filePath) diff --git a/requirements.txt b/requirements.txt index 3cf4c2b..2f7ba31 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,2 +1,3 @@ nose pystache +pyyaml diff --git a/samples/product.yaml b/samples/product.yaml new file mode 100644 index 0000000..0753ce7 --- /dev/null +++ b/samples/product.yaml @@ -0,0 +1,33 @@ +- + name: sender + base-type: object + description: 'sender info.' + property: [{ name: senderName, base-type: string, required: 1 }, { name: previewImageURL, base-type: string, required: 1 }] +- + name: senderList + base-type: object + description: 'the list of senders.' + property: [{ name: listTitle, base-type: string, description: 'the title of sender list', required: 1 }, { name: senders, base-type: array, description: 'the array of Sender', subType: sender, required: 1 }] +- + name: senderList2 + base-type: senderList + description: 'the list of senders2.' + property: [{ name: listSubTitle, base-type: string, description: 'the title of sender list', required: 1 }] +- + name: senderGroup + base-type: object + description: 'the list of senders.' + property: [{ name: digitalSenders, base-type: array, subType: [senderList, senderList2, number, string, boolean, date, data], description: 'the array of sender list' }, { name: HDOptions, base-type: array, description: 'the array of sender list', subType: [senderList, senderList2] }, { name: DTVHighlights, base-type: array, description: 'the array of sender list', subType: [string, titleString], maxCount: 6, minCount: 2 }, { name: IPTVSenders, base-type: array, description: 'the array of sender list', subType: any, maxCount: 6, minCount: 2 }] +- + name: titleString + base-type: string + description: 'the title of product' + minLength: 10 + maxLength: 20 + regex: '[a-z0-9]:10' + required: 1 +- + name: ProductDetail + base-type: object + description: 'Product details.' + property: [{ name: type, base-type: number, description: 'the type of product', required: 1 }, { name: advantage, base-type: number, required: 1 }, { name: teaserURL, base-type: string, description: 'teaser image url of product', required: 1 }, { name: telephoneFlatrate, base-type: string, description: 'telephone Flatrate option string' }, { name: includeHardware, base-type: boolean, required: 1 }, { name: senderInfo, base-type: senderGroup }, { name: anyProperty, base-type: any, required: 1 }, { name: title, base-type: [titleString, string], description: 'the title of product', required: 1 }, { name: download, base-type: [number, string], description: 'download speed (Mbit/s)', required: 1 }, { name: upload, base-type: [number, string], description: 'upload speed (Mbit/s)', required: 1 }] diff --git a/setup.py b/setup.py index 98d1c4c..7cec205 100644 --- a/setup.py +++ b/setup.py @@ -18,7 +18,7 @@ entry_points = { "console_scripts": ['metajson = metajson.readJSON:main'] }, - install_requires = ['pystache'], + install_requires = ['pystache', 'pyyaml'], tests_require = ['nose'], include_package_data = True, #will include files listed in MANIFEST.in version = version, From 3f3706bb49166f16ced8823a07eb8459e6a94dfd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Franc=CC=A7ois=20Benaiteau?= <francois.benaiteau@sinnerschrader-mobile.com> Date: Wed, 14 May 2014 18:25:18 +0200 Subject: [PATCH 121/149] make sure yaml support outputs the same as json --- metajson/readJSON.py | 2 +- samples.product.yaml | 33 +++++++++++++++++++++++++++++++++ test/readJSON_test.py | 10 +++++++++- 3 files changed, 43 insertions(+), 2 deletions(-) create mode 100644 samples.product.yaml diff --git a/metajson/readJSON.py b/metajson/readJSON.py index 9dc497f..bbac7ac 100755 --- a/metajson/readJSON.py +++ b/metajson/readJSON.py @@ -47,7 +47,7 @@ def main(argv=sys.argv): argv = sys.argv[1:] try: - opts, args = getopt.getopt(argv,"vhp:s:t:i:o",["version", "help", "prefix=", "suffix=", "target=", "input=", "output="]) + opts, args = getopt.getopt(argv,"vhp:s:t:i:o:",["version", "help", "prefix=", "suffix=", "target=", "input=", "output="]) except getopt.GetoptError: usage() sys.exit(2) diff --git a/samples.product.yaml b/samples.product.yaml new file mode 100644 index 0000000..0753ce7 --- /dev/null +++ b/samples.product.yaml @@ -0,0 +1,33 @@ +- + name: sender + base-type: object + description: 'sender info.' + property: [{ name: senderName, base-type: string, required: 1 }, { name: previewImageURL, base-type: string, required: 1 }] +- + name: senderList + base-type: object + description: 'the list of senders.' + property: [{ name: listTitle, base-type: string, description: 'the title of sender list', required: 1 }, { name: senders, base-type: array, description: 'the array of Sender', subType: sender, required: 1 }] +- + name: senderList2 + base-type: senderList + description: 'the list of senders2.' + property: [{ name: listSubTitle, base-type: string, description: 'the title of sender list', required: 1 }] +- + name: senderGroup + base-type: object + description: 'the list of senders.' + property: [{ name: digitalSenders, base-type: array, subType: [senderList, senderList2, number, string, boolean, date, data], description: 'the array of sender list' }, { name: HDOptions, base-type: array, description: 'the array of sender list', subType: [senderList, senderList2] }, { name: DTVHighlights, base-type: array, description: 'the array of sender list', subType: [string, titleString], maxCount: 6, minCount: 2 }, { name: IPTVSenders, base-type: array, description: 'the array of sender list', subType: any, maxCount: 6, minCount: 2 }] +- + name: titleString + base-type: string + description: 'the title of product' + minLength: 10 + maxLength: 20 + regex: '[a-z0-9]:10' + required: 1 +- + name: ProductDetail + base-type: object + description: 'Product details.' + property: [{ name: type, base-type: number, description: 'the type of product', required: 1 }, { name: advantage, base-type: number, required: 1 }, { name: teaserURL, base-type: string, description: 'teaser image url of product', required: 1 }, { name: telephoneFlatrate, base-type: string, description: 'telephone Flatrate option string' }, { name: includeHardware, base-type: boolean, required: 1 }, { name: senderInfo, base-type: senderGroup }, { name: anyProperty, base-type: any, required: 1 }, { name: title, base-type: [titleString, string], description: 'the title of product', required: 1 }, { name: download, base-type: [number, string], description: 'download speed (Mbit/s)', required: 1 }, { name: upload, base-type: [number, string], description: 'upload speed (Mbit/s)', required: 1 }] diff --git a/test/readJSON_test.py b/test/readJSON_test.py index 04c9794..ff644f2 100644 --- a/test/readJSON_test.py +++ b/test/readJSON_test.py @@ -10,7 +10,7 @@ def test_command(self): self.assertEqual(exit_status, 0) # no difference def execute_script(self, json_file, output_dir): - os.system("python -m metajson -i " + json_file) + os.system("python -m metajson -p '' -i " + json_file) # ignoring template files os.system("rm -rf ./src/Utilities") # return os.system("diff -r src/ " + output_dir) @@ -24,3 +24,11 @@ def execute_script(self, json_file, output_dir): # common_file = "/AbstractInterfaceFiles/_SenderGroupJSONObject.m" return os.system("diff -r -w -b -B src " + output_dir) # return os.system("diff -r -w -b -B src" + common_file + " " + output_dir + common_file) + + def test_yaml_input(self): + json_file = "samples/product.json" + yaml_file = "samples/product.yaml" + os.system("python -m metajson -i " + json_file + " -o src/json") + os.system("python -m metajson -i " + yaml_file + " -o src/yaml") + exit_status = os.system("diff -r -w -b -B src/json src/yaml") + self.assertEqual(exit_status, 0) # no difference From 4232371cb6213fe72faf1ad099a3e392e0dacdb2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Franc=CC=A7ois=20Benaiteau?= <francois.benaiteau@sinnerschrader-mobile.com> Date: Thu, 15 May 2014 10:40:25 +0200 Subject: [PATCH 122/149] read_template folder --- metajson/template_code_generator.py | 43 ++++++++++++++++++++-------- test/template_code_generator_test.py | 18 ++++++++++++ 2 files changed, 49 insertions(+), 12 deletions(-) create mode 100644 test/template_code_generator_test.py diff --git a/metajson/template_code_generator.py b/metajson/template_code_generator.py index 14d5281..655f429 100644 --- a/metajson/template_code_generator.py +++ b/metajson/template_code_generator.py @@ -4,14 +4,33 @@ class TemplateCodeGenerator : - projectPrefix = "" - dirPath = "" - templatePath = "./metajson/templates" - - def __init__(self): - projectPrefix = "S2M" - dirPath = "classes" - templatePath = "./metajson/templates" + projectPrefix = "S2M" + TEMPLATE_EXT = ".mustache" + DEFAULT_TEMPLATE_PATH = "./metajson/templates" + + def __init__(self, template_path = DEFAULT_TEMPLATE_PATH, output_path = "classes"): + self.template_path = template_path + self.output_path = output_path + self.read_template() + if len(self.json_template_files) == 0: + print "" + + def read_template(self): + self.json_template_files = [] + self.general_template_files = [] + for root, dirs, files in os.walk(self.template_path): + if root == self.template_path: + for name in files: + filepath = os.path.join(root, name) + basename, extension = os.path.splitext(filepath) + if extension == TemplateCodeGenerator.TEMPLATE_EXT: + template_basename, template_extension = os.path.splitext(basename) + if template_basename != basename: + self.json_template_files.append(filepath) + else: + for name in files: + filepath = os.path.join(root, name) + self.general_template_files.append(filepath) def writeNSStringCategory(self) : today = datetime.date.fromtimestamp(time.time()) @@ -20,7 +39,7 @@ def writeNSStringCategory(self) : os.makedirs(self.dirPath) headerDstFile = open(self.dirPath + "/NSString+RegExValidation.h", "w") - headerSrcFile = self.templatePath + "/NSString+RegExValidation.h" + headerSrcFile = self.template_path + "/NSString+RegExValidation.h" try: for line in open(headerSrcFile): @@ -31,7 +50,7 @@ def writeNSStringCategory(self) : headerDstFile.close() implDstFile = open(self.dirPath + "/NSString+RegExValidation.m", "w") - implSrcFile = self.templatePath + "/NSString+RegExValidation.m" + implSrcFile = self.template_path + "/NSString+RegExValidation.m" try: for line in open(implSrcFile): @@ -47,7 +66,7 @@ def writeAPIParser(self) : os.makedirs(self.dirPath) headerDstFile = open(self.dirPath + "/"+self.projectPrefix+"APIParser.h", "w") - headerSrcFile = self.templatePath + "/APIParser/APIParser.h" + headerSrcFile = self.template_path + "/APIParser/APIParser.h" try: @@ -60,7 +79,7 @@ def writeAPIParser(self) : headerDstFile.close() implDstFile = open(self.dirPath + "/"+self.projectPrefix+"APIParser.m", "w") - implSrcFile = self.templatePath + "/APIParser/APIParser.m" + implSrcFile = self.template_path + "/APIParser/APIParser.m" try: for line in open(implSrcFile): diff --git a/test/template_code_generator_test.py b/test/template_code_generator_test.py new file mode 100644 index 0000000..ef99a76 --- /dev/null +++ b/test/template_code_generator_test.py @@ -0,0 +1,18 @@ +import unittest +import os + +from metajson.template_code_generator import * + + +class TestTemplateCodeGenerator(unittest.TestCase): + def setUp(self): + self.object = TemplateCodeGenerator() + + def test_read_template(self): + expected_jsons = ['./metajson/templates/_header.h.mustache', './metajson/templates/_source.m.mustache', './metajson/templates/header.h.mustache', './metajson/templates/source.m.mustache'] + expected_api_templates = ['./metajson/templates/APIParser/APIParser.h', './metajson/templates/APIParser/APIParser.m', './metajson/templates/Utilities/NSString+RegExValidation.h', './metajson/templates/Utilities/NSString+RegExValidation.m'] + + self.object.read_template() + + self.assertEqual(self.object.json_template_files,expected_jsons) + self.assertEqual(self.object.general_template_files,expected_api_templates) From 514ff24c32588b5d93e8e59367c1235bf137a9a8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Franc=CC=A7ois=20Benaiteau?= <francois.benaiteau@sinnerschrader-mobile.com> Date: Thu, 15 May 2014 14:32:20 +0200 Subject: [PATCH 123/149] refactor generation of apiparser template code --- metajson/template_code_generator.py | 106 +++++++----------- .../{APIParser.h => _PREFIX_APIParser.h} | 0 .../{APIParser.m => _PREFIX_APIParser.m} | 0 .../NSString+RegExValidation.h | 0 .../NSString+RegExValidation.m | 0 test/template_code_generator_test.py | 20 +++- 6 files changed, 61 insertions(+), 65 deletions(-) rename metajson/templates/APIParser/{APIParser.h => _PREFIX_APIParser.h} (100%) rename metajson/templates/APIParser/{APIParser.m => _PREFIX_APIParser.m} (100%) rename metajson/templates/{ => Utilities}/NSString+RegExValidation.h (100%) rename metajson/templates/{ => Utilities}/NSString+RegExValidation.m (100%) diff --git a/metajson/template_code_generator.py b/metajson/template_code_generator.py index 655f429..ee5d0ad 100644 --- a/metajson/template_code_generator.py +++ b/metajson/template_code_generator.py @@ -4,16 +4,16 @@ class TemplateCodeGenerator : - projectPrefix = "S2M" TEMPLATE_EXT = ".mustache" DEFAULT_TEMPLATE_PATH = "./metajson/templates" - def __init__(self, template_path = DEFAULT_TEMPLATE_PATH, output_path = "classes"): + def __init__(self, template_path = DEFAULT_TEMPLATE_PATH, output_path = "classes", project_prefix = "S2M"): + self.project_prefix = project_prefix self.template_path = template_path + if output_path.endswith("/"): + output_path = output_path[:-1] self.output_path = output_path self.read_template() - if len(self.json_template_files) == 0: - print "" def read_template(self): self.json_template_files = [] @@ -32,70 +32,48 @@ def read_template(self): filepath = os.path.join(root, name) self.general_template_files.append(filepath) - def writeNSStringCategory(self) : - today = datetime.date.fromtimestamp(time.time()) - - if not os.path.exists(self.dirPath): - os.makedirs(self.dirPath) - - headerDstFile = open(self.dirPath + "/NSString+RegExValidation.h", "w") - headerSrcFile = self.template_path + "/NSString+RegExValidation.h" + def create_output_file(self, filename): + start = filename.find(self.template_path) - try: - for line in open(headerSrcFile): - newLine = line.replace('_DATE_', "") - newLine = newLine.replace('_YEAR_', str(today.year)) - headerDstFile.write(newLine) - finally : - headerDstFile.close() - - implDstFile = open(self.dirPath + "/NSString+RegExValidation.m", "w") - implSrcFile = self.template_path + "/NSString+RegExValidation.m" - - try: - for line in open(implSrcFile): - newLine = line.replace('_DATE_', "") - newLine = newLine.replace('_YEAR_', str(today.year)) - implDstFile.write(newLine) - finally : - implDstFile.close() + if start == -1: + new_filename = filename + else: + new_filename = filename[len(self.template_path):] + directories, new_filename = os.path.split(new_filename) - def writeAPIParser(self) : + # customize output filename today = datetime.date.fromtimestamp(time.time()) - if not os.path.exists(self.dirPath): - os.makedirs(self.dirPath) - - headerDstFile = open(self.dirPath + "/"+self.projectPrefix+"APIParser.h", "w") - headerSrcFile = self.template_path + "/APIParser/APIParser.h" - - - try: - for line in open(headerSrcFile): - newLine = line.replace('_DATE_', "") - newLine = newLine.replace('_YEAR_', str(today.year)) - newLine = newLine.replace('_PREFIX_', self.projectPrefix) - headerDstFile.write(newLine) - finally : - headerDstFile.close() + new_filename = self.replace_variables(new_filename, today) + + if directories.startswith("/"): + directories = directories[1:] + + end_dir = os.path.join(self.output_path, directories) + if not os.path.exists(end_dir): + os.makedirs(end_dir) + return open(os.path.join(end_dir, new_filename), 'w') + + def write_general_template_files(self): + for input_file in self.general_template_files: + print input_file + output_file = self.create_output_file(input_file) + if output_file: + self.write_template(input_file, output_file) + else: + print "skip " + input_file - implDstFile = open(self.dirPath + "/"+self.projectPrefix+"APIParser.m", "w") - implSrcFile = self.template_path + "/APIParser/APIParser.m" + def replace_variables(self, text, today): + newtext = text.replace('_DATE_', "") + newtext = newtext.replace('_YEAR_', str(today.year)) + newtext = newtext.replace('_PREFIX_', self.project_prefix) + return newtext + def write_template(self, template, output): + today = datetime.date.fromtimestamp(time.time()) + # write content to ouptut try: - for line in open(implSrcFile): - newLine = line.replace('_DATE_', "") - newLine = newLine.replace('_YEAR_', str(today.year)) - newLine = newLine.replace('_PREFIX_', self.projectPrefix) - implDstFile.write(newLine) + for line in open(template): + newLine = self.replace_variables(line, today) + output.write(newLine) finally : - implDstFile.close() - - def writeTemplates(self) : - - if self.dirPath.endswith("/") : - self.dirPath = self.dirPath[:-1] - baseDirPath = self.dirPath - self.dirPath = baseDirPath + "/Utilities/NSString" - self.writeNSStringCategory() - self.dirPath = baseDirPath + "/Utilities/APIParser" - self.writeAPIParser() + output.close() diff --git a/metajson/templates/APIParser/APIParser.h b/metajson/templates/APIParser/_PREFIX_APIParser.h similarity index 100% rename from metajson/templates/APIParser/APIParser.h rename to metajson/templates/APIParser/_PREFIX_APIParser.h diff --git a/metajson/templates/APIParser/APIParser.m b/metajson/templates/APIParser/_PREFIX_APIParser.m similarity index 100% rename from metajson/templates/APIParser/APIParser.m rename to metajson/templates/APIParser/_PREFIX_APIParser.m diff --git a/metajson/templates/NSString+RegExValidation.h b/metajson/templates/Utilities/NSString+RegExValidation.h similarity index 100% rename from metajson/templates/NSString+RegExValidation.h rename to metajson/templates/Utilities/NSString+RegExValidation.h diff --git a/metajson/templates/NSString+RegExValidation.m b/metajson/templates/Utilities/NSString+RegExValidation.m similarity index 100% rename from metajson/templates/NSString+RegExValidation.m rename to metajson/templates/Utilities/NSString+RegExValidation.m diff --git a/test/template_code_generator_test.py b/test/template_code_generator_test.py index ef99a76..0518e66 100644 --- a/test/template_code_generator_test.py +++ b/test/template_code_generator_test.py @@ -7,12 +7,30 @@ class TestTemplateCodeGenerator(unittest.TestCase): def setUp(self): self.object = TemplateCodeGenerator() + os.system("rm -rf ./classes") def test_read_template(self): expected_jsons = ['./metajson/templates/_header.h.mustache', './metajson/templates/_source.m.mustache', './metajson/templates/header.h.mustache', './metajson/templates/source.m.mustache'] - expected_api_templates = ['./metajson/templates/APIParser/APIParser.h', './metajson/templates/APIParser/APIParser.m', './metajson/templates/Utilities/NSString+RegExValidation.h', './metajson/templates/Utilities/NSString+RegExValidation.m'] + expected_api_templates = ['./metajson/templates/APIParser/_PREFIX_APIParser.h', './metajson/templates/APIParser/_PREFIX_APIParser.m', './metajson/templates/Utilities/NSString+RegExValidation.h', './metajson/templates/Utilities/NSString+RegExValidation.m'] self.object.read_template() self.assertEqual(self.object.json_template_files,expected_jsons) self.assertEqual(self.object.general_template_files,expected_api_templates) + + def test_create_output_file(self): + output = "classes/APIParser/S2MAPIParser.h" + self.object.create_output_file("./metajson/templates/APIParser/_PREFIX_APIParser.h") + file_exists = os.path.isfile(output) and os.access(output, os.R_OK) + self.assertEqual(file_exists, True) + + def test_create_output_file_without_project_prefix(self): + self.object.project_prefix = "" + output = "classes/APIParser/APIParser.h" + self.object.create_output_file("./metajson/templates/APIParser/_PREFIX_APIParser.h") + file_exists = os.path.isfile(output) and os.access(output, os.R_OK) + self.assertEqual(file_exists, True) + + # Uncomment for manual testing + # def test_write_general_template_files(self): + # self.object.write_general_template_files() From 194d42a7767dd954c42469907a28808be7403255 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Franc=CC=A7ois=20Benaiteau?= <francois.benaiteau@sinnerschrader-mobile.com> Date: Thu, 15 May 2014 14:32:51 +0200 Subject: [PATCH 124/149] ignore default generation folders --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 2a3d8bb..eaf591e 100644 --- a/.gitignore +++ b/.gitignore @@ -6,3 +6,4 @@ src/ build/ dist/ *.egg-info +classes/ \ No newline at end of file From 2f95bb73717b9f6d0e1469fc23c952fccd671224 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Franc=CC=A7ois=20Benaiteau?= <francois.benaiteau@sinnerschrader-mobile.com> Date: Thu, 15 May 2014 14:38:46 +0200 Subject: [PATCH 125/149] reorder fucntions --- metajson/template_code_generator.py | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/metajson/template_code_generator.py b/metajson/template_code_generator.py index ee5d0ad..27e7b0d 100644 --- a/metajson/template_code_generator.py +++ b/metajson/template_code_generator.py @@ -15,6 +15,17 @@ def __init__(self, template_path = DEFAULT_TEMPLATE_PATH, output_path = "classes self.output_path = output_path self.read_template() + ## main methods + def write_general_template_files(self): + for input_file in self.general_template_files: + print input_file + output_file = self.create_output_file(input_file) + if output_file: + self.write_template(input_file, output_file) + else: + print "skip " + input_file + + ## internal use def read_template(self): self.json_template_files = [] self.general_template_files = [] @@ -53,14 +64,6 @@ def create_output_file(self, filename): os.makedirs(end_dir) return open(os.path.join(end_dir, new_filename), 'w') - def write_general_template_files(self): - for input_file in self.general_template_files: - print input_file - output_file = self.create_output_file(input_file) - if output_file: - self.write_template(input_file, output_file) - else: - print "skip " + input_file def replace_variables(self, text, today): newtext = text.replace('_DATE_', "") From 16eac92d59c99634e0e896c08e60ea055090a307 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Franc=CC=A7ois=20Benaiteau?= <francois.benaiteau@sinnerschrader-mobile.com> Date: Thu, 15 May 2014 14:52:19 +0200 Subject: [PATCH 126/149] update template copy --- metajson/readJSON.py | 14 +++++++------- test/readJSON_test.py | 1 + 2 files changed, 8 insertions(+), 7 deletions(-) diff --git a/metajson/readJSON.py b/metajson/readJSON.py index bbac7ac..b9efcd6 100755 --- a/metajson/readJSON.py +++ b/metajson/readJSON.py @@ -172,17 +172,17 @@ def main(argv=sys.argv): if obj.isNaturalType() == False : codeGen.make(obj) -def generate_template_files(dirPathToSaveCodes, projectPrefix): +def generate_template_files(dirPathToSaveCodes, projectPrefix, template_dir = None): if dirPathToSaveCodes.endswith("/") : dirPathToSaveCodes = dirPathToSaveCodes[:-1] - if os.path.exists(dirPathToSaveCodes + "/AbstractInterfaceFiles"): - shutil.rmtree(dirPathToSaveCodes + "/AbstractInterfaceFiles") + # if os.path.exists(dirPathToSaveCodes + "/AbstractInterfaceFiles"): + # shutil.rmtree(dirPathToSaveCodes + "/AbstractInterfaceFiles") + if template_dir == None: + template_dir = TemplateCodeGenerator.DEFAULT_TEMPLATE_PATH - templateCodeGen = TemplateCodeGenerator() - templateCodeGen.projectPrefix = projectPrefix - templateCodeGen.dirPath = dirPathToSaveCodes - templateCodeGen.writeTemplates() + templateCodeGen = TemplateCodeGenerator(template_dir, dirPathToSaveCodes, projectPrefix) + templateCodeGen.write_general_template_files() def usage(): usageString = '\n'+__file__+' [ -p | -t | -o | -s ] [-i]\n' diff --git a/test/readJSON_test.py b/test/readJSON_test.py index ff644f2..c61ab9f 100644 --- a/test/readJSON_test.py +++ b/test/readJSON_test.py @@ -12,6 +12,7 @@ def test_command(self): def execute_script(self, json_file, output_dir): os.system("python -m metajson -p '' -i " + json_file) # ignoring template files + os.system("rm -rf ./src/APIParser") os.system("rm -rf ./src/Utilities") # return os.system("diff -r src/ " + output_dir) # common_file = "/AbstractInterfaceFiles/_ProductDetailJSONObject.h" From f50f5551c6ccb13f5f36d6f948c8e557ae11dac2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Franc=CC=A7ois=20Benaiteau?= <francois.benaiteau@sinnerschrader-mobile.com> Date: Thu, 15 May 2014 15:33:03 +0200 Subject: [PATCH 127/149] move template for iOS in iOS folder --- metajson/ObjectiveCCodeGenerator.py | 76 ++++++++++--------- metajson/readJSON.py | 24 ++---- .../{ => iOS}/APIParser/_PREFIX_APIParser.h | 0 .../{ => iOS}/APIParser/_PREFIX_APIParser.m | 0 .../Utilities/NSString+RegExValidation.h | 0 .../Utilities/NSString+RegExValidation.m | 0 .../templates/{ => iOS}/_header.h.mustache | 4 +- .../templates/{ => iOS}/_source.m.mustache | 2 +- .../{ => iOS}/array_property.mustache | 0 .../templates/{ => iOS}/header.h.mustache | 0 .../{ => iOS}/multiple_property.mustache | 0 .../multiple_property_implementation.mustache | 6 +- .../{ => iOS}/number_property.mustache | 0 .../templates/{ => iOS}/source.m.mustache | 0 .../{ => iOS}/string_property.mustache | 0 test/template_code_generator_test.py | 10 +-- 16 files changed, 57 insertions(+), 65 deletions(-) rename metajson/templates/{ => iOS}/APIParser/_PREFIX_APIParser.h (100%) rename metajson/templates/{ => iOS}/APIParser/_PREFIX_APIParser.m (100%) rename metajson/templates/{ => iOS}/Utilities/NSString+RegExValidation.h (100%) rename metajson/templates/{ => iOS}/Utilities/NSString+RegExValidation.m (100%) rename metajson/templates/{ => iOS}/_header.h.mustache (95%) rename metajson/templates/{ => iOS}/_source.m.mustache (99%) rename metajson/templates/{ => iOS}/array_property.mustache (100%) rename metajson/templates/{ => iOS}/header.h.mustache (100%) rename metajson/templates/{ => iOS}/multiple_property.mustache (100%) rename metajson/templates/{ => iOS}/multiple_property_implementation.mustache (77%) rename metajson/templates/{ => iOS}/number_property.mustache (100%) rename metajson/templates/{ => iOS}/source.m.mustache (100%) rename metajson/templates/{ => iOS}/string_property.mustache (100%) diff --git a/metajson/ObjectiveCCodeGenerator.py b/metajson/ObjectiveCCodeGenerator.py index 0b27a64..a931f27 100755 --- a/metajson/ObjectiveCCodeGenerator.py +++ b/metajson/ObjectiveCCodeGenerator.py @@ -65,10 +65,7 @@ def lambda_upper_snakecase(self, text): # END template available functions - def template_file_path(self, filename) : - templatePath = os.path.realpath( __file__ ) - templatePath = templatePath.replace(os.path.basename( __file__ ), 'templates') - return os.path.join(templatePath, filename) + def makeVarName(self,schemeObj) : returnName = schemeObj.type_name @@ -265,39 +262,6 @@ def process_properties(self, propObj, undefined = False) : classes = self.process_subtypes(propObj, propertyHash) return classes, propertyHash - def human_header_content(self, schemeObj) : - templateFile = open(self.template_file_path("header.h.mustache"), "r") - today = datetime.date.fromtimestamp(time.time()) - - hashParams = {"date": str(today.year), "machineClassName": schemeObj.getMachineClassName(), "humanClassName": schemeObj.getClassName()} - return self.mustache_renderer.render(templateFile.read(), hashParams) - - def human_source_content(self, schemeObj) : - templateFile = open(self.template_file_path("source.m.mustache"), "r") - today = datetime.date.fromtimestamp(time.time()) - - hashParams = {"date": str(today.year), "machineClassName": schemeObj.getMachineClassName(), "humanClassName": schemeObj.getClassName()} - return self.mustache_renderer.render(templateFile.read(), hashParams) - - def machine_header_content(self, schemeObj) : - template_file = open(self.template_file_path("_header.h.mustache"), "r") - return self.machine_file_content(schemeObj, template_file) - - def machine_source_content(self, schemeObj) : - template_file = open(self.template_file_path("_source.m.mustache"), "r") - return self.machine_file_content(schemeObj, template_file) - - def make(self, schemeObj) : - # machine files - self.write_abstract_file(schemeObj.getMachineClassName() + ".h", self.machine_header_content(schemeObj)) - self.write_abstract_file(schemeObj.getMachineClassName() + ".m", self.machine_source_content(schemeObj)) - - # human files - self.write_human_file(schemeObj.getClassName() + ".h", self.human_header_content(schemeObj)) - self.write_human_file(schemeObj.getClassName() + ".m", self.human_source_content(schemeObj)) - - return True - def machine_file_content(self, schemeObj, template_file) : today = datetime.date.fromtimestamp(time.time()) @@ -368,6 +332,44 @@ def machine_file_content(self, schemeObj, template_file) : sourceString = self.mustache_renderer.render(template_file.read(), hashParams) return sourceString + def template_file_path(self, filename) : + templatePath = os.path.realpath( __file__ ) + templatePath = templatePath.replace(os.path.basename( __file__ ), 'templates/iOS') + return os.path.join(templatePath, filename) + + def human_header_content(self, schemeObj) : + templateFile = open(self.template_file_path("header.h.mustache"), "r") + today = datetime.date.fromtimestamp(time.time()) + + hashParams = {"date": str(today.year), "machineClassName": schemeObj.getMachineClassName(), "humanClassName": schemeObj.getClassName()} + return self.mustache_renderer.render(templateFile.read(), hashParams) + + def human_source_content(self, schemeObj) : + templateFile = open(self.template_file_path("source.m.mustache"), "r") + today = datetime.date.fromtimestamp(time.time()) + + hashParams = {"date": str(today.year), "machineClassName": schemeObj.getMachineClassName(), "humanClassName": schemeObj.getClassName()} + return self.mustache_renderer.render(templateFile.read(), hashParams) + + def machine_header_content(self, schemeObj) : + template_file = open(self.template_file_path("_header.h.mustache"), "r") + print + return self.machine_file_content(schemeObj, template_file) + + def machine_source_content(self, schemeObj) : + template_file = open(self.template_file_path("_source.m.mustache"), "r") + return self.machine_file_content(schemeObj, template_file) + + def make(self, schemeObj) : + # machine files + self.write_abstract_file(schemeObj.getMachineClassName() + ".h", self.machine_header_content(schemeObj)) + self.write_abstract_file(schemeObj.getMachineClassName() + ".m", self.machine_source_content(schemeObj)) + + # human files + self.write_human_file(schemeObj.getClassName() + ".h", self.human_header_content(schemeObj)) + self.write_human_file(schemeObj.getClassName() + ".m", self.human_source_content(schemeObj)) + + return True def write_abstract_file(self, filename, content) : folder = "/AbstractInterfaceFiles/" diff --git a/metajson/readJSON.py b/metajson/readJSON.py index b9efcd6..34f656e 100755 --- a/metajson/readJSON.py +++ b/metajson/readJSON.py @@ -38,6 +38,7 @@ def main(argv=sys.argv): # parse Options + template_dir = None jsonfiles = [] inputfile = 'do you have files?' projectPrefix = 'S2M' @@ -108,14 +109,12 @@ def main(argv=sys.argv): hasError = False - # write templates - if iOS : - generate_template_files(dirPathToSaveCodes, projectPrefix) - - # read JSON file print "\nGenerate source codes for " + target + ", with Project Prefix \'" + projectPrefix + "\' and suffix \'" + objectSuffix + "\'" print "Output path : \'" + dirPathToSaveCodes + "\'\n" + # write templates + generate_template_files(dirPathToSaveCodes, projectPrefix, target, template_dir) + # read JSON file JSONScheme.projectPrefix = projectPrefix JSONScheme.objectSuffix = objectSuffix for filePath in jsonfiles : @@ -124,7 +123,6 @@ def main(argv=sys.argv): jsonObj = read_file(filePath) if type(jsonObj) == list : - print "list" for dic in jsonObj : schemeObj = JSONScheme() schemeObj.projectPrefix = projectPrefix @@ -134,11 +132,9 @@ def main(argv=sys.argv): break elif type(jsonObj) == dict : - print "dict" schemeObj = JSONScheme() if schemeObj.parseDictionary(jsonObj) == False : hasError = True - else : hasError = True print "error : no JSON Scheme" @@ -147,11 +143,7 @@ def main(argv=sys.argv): if hasError : print "error - Fail to make scheme object." break; - - if hasError : - break - - if not hasError: + else: codeGen = 0 if Android : @@ -172,14 +164,12 @@ def main(argv=sys.argv): if obj.isNaturalType() == False : codeGen.make(obj) -def generate_template_files(dirPathToSaveCodes, projectPrefix, template_dir = None): +def generate_template_files(dirPathToSaveCodes, projectPrefix, target, template_dir = None): if dirPathToSaveCodes.endswith("/") : dirPathToSaveCodes = dirPathToSaveCodes[:-1] - # if os.path.exists(dirPathToSaveCodes + "/AbstractInterfaceFiles"): - # shutil.rmtree(dirPathToSaveCodes + "/AbstractInterfaceFiles") if template_dir == None: - template_dir = TemplateCodeGenerator.DEFAULT_TEMPLATE_PATH + template_dir = os.path.join(TemplateCodeGenerator.DEFAULT_TEMPLATE_PATH, target) templateCodeGen = TemplateCodeGenerator(template_dir, dirPathToSaveCodes, projectPrefix) templateCodeGen.write_general_template_files() diff --git a/metajson/templates/APIParser/_PREFIX_APIParser.h b/metajson/templates/iOS/APIParser/_PREFIX_APIParser.h similarity index 100% rename from metajson/templates/APIParser/_PREFIX_APIParser.h rename to metajson/templates/iOS/APIParser/_PREFIX_APIParser.h diff --git a/metajson/templates/APIParser/_PREFIX_APIParser.m b/metajson/templates/iOS/APIParser/_PREFIX_APIParser.m similarity index 100% rename from metajson/templates/APIParser/_PREFIX_APIParser.m rename to metajson/templates/iOS/APIParser/_PREFIX_APIParser.m diff --git a/metajson/templates/Utilities/NSString+RegExValidation.h b/metajson/templates/iOS/Utilities/NSString+RegExValidation.h similarity index 100% rename from metajson/templates/Utilities/NSString+RegExValidation.h rename to metajson/templates/iOS/Utilities/NSString+RegExValidation.h diff --git a/metajson/templates/Utilities/NSString+RegExValidation.m b/metajson/templates/iOS/Utilities/NSString+RegExValidation.m similarity index 100% rename from metajson/templates/Utilities/NSString+RegExValidation.m rename to metajson/templates/iOS/Utilities/NSString+RegExValidation.m diff --git a/metajson/templates/_header.h.mustache b/metajson/templates/iOS/_header.h.mustache similarity index 95% rename from metajson/templates/_header.h.mustache rename to metajson/templates/iOS/_header.h.mustache index 41c3eb9..45260c2 100644 --- a/metajson/templates/_header.h.mustache +++ b/metajson/templates/iOS/_header.h.mustache @@ -76,10 +76,10 @@ - (NSDictionary *)propertyDictionary; {{/baseTypeIsObject}} {{#arrayProperties}} -{{> metajson/templates/array_property}} +{{> metajson/templates/iOS/array_property}} {{/arrayProperties}} {{#undefinedProperties}} -{{> metajson/templates/multiple_property}} +{{> metajson/templates/iOS/multiple_property}} {{/undefinedProperties}} {{^arrayProperties}} diff --git a/metajson/templates/_source.m.mustache b/metajson/templates/iOS/_source.m.mustache similarity index 99% rename from metajson/templates/_source.m.mustache rename to metajson/templates/iOS/_source.m.mustache index 51b4770..383c4c1 100644 --- a/metajson/templates/_source.m.mustache +++ b/metajson/templates/iOS/_source.m.mustache @@ -372,7 +372,7 @@ {{/hasAnyType}} {{/arrayProperties}} {{#undefinedProperties}} -{{> metajson/templates/multiple_property_implementation}} +{{> metajson/templates/iOS/multiple_property_implementation}} {{/undefinedProperties}} #pragma mark - NSCoding diff --git a/metajson/templates/array_property.mustache b/metajson/templates/iOS/array_property.mustache similarity index 100% rename from metajson/templates/array_property.mustache rename to metajson/templates/iOS/array_property.mustache diff --git a/metajson/templates/header.h.mustache b/metajson/templates/iOS/header.h.mustache similarity index 100% rename from metajson/templates/header.h.mustache rename to metajson/templates/iOS/header.h.mustache diff --git a/metajson/templates/multiple_property.mustache b/metajson/templates/iOS/multiple_property.mustache similarity index 100% rename from metajson/templates/multiple_property.mustache rename to metajson/templates/iOS/multiple_property.mustache diff --git a/metajson/templates/multiple_property_implementation.mustache b/metajson/templates/iOS/multiple_property_implementation.mustache similarity index 77% rename from metajson/templates/multiple_property_implementation.mustache rename to metajson/templates/iOS/multiple_property_implementation.mustache index 3b524f5..abdcaba 100644 --- a/metajson/templates/multiple_property_implementation.mustache +++ b/metajson/templates/iOS/multiple_property_implementation.mustache @@ -3,7 +3,7 @@ - ({{className}} *){{name}}As{{#_upper_camelcase}}{{type}}{{/_upper_camelcase}}:(NSError **)error { - {{> metajson/templates/number_property}} + {{> metajson/templates/iOS/number_property}} } {{/className}} {{/hasCustomType}} @@ -11,14 +11,14 @@ - (NSNumber *){{name}}AsNumber:(NSError **)error { - {{> metajson/templates/number_property}} + {{> metajson/templates/iOS/number_property}} } {{/hasNumberType}} {{#hasStringType}} {{#types}} - (NSString *){{name}}As{{#_upper_camelcase}}{{type}}{{/_upper_camelcase}}:(NSError **)error { - {{> metajson/templates/string_property}} + {{> metajson/templates/iOS/string_property}} } {{/types}} {{/hasStringType}} diff --git a/metajson/templates/number_property.mustache b/metajson/templates/iOS/number_property.mustache similarity index 100% rename from metajson/templates/number_property.mustache rename to metajson/templates/iOS/number_property.mustache diff --git a/metajson/templates/source.m.mustache b/metajson/templates/iOS/source.m.mustache similarity index 100% rename from metajson/templates/source.m.mustache rename to metajson/templates/iOS/source.m.mustache diff --git a/metajson/templates/string_property.mustache b/metajson/templates/iOS/string_property.mustache similarity index 100% rename from metajson/templates/string_property.mustache rename to metajson/templates/iOS/string_property.mustache diff --git a/test/template_code_generator_test.py b/test/template_code_generator_test.py index 0518e66..3901b0a 100644 --- a/test/template_code_generator_test.py +++ b/test/template_code_generator_test.py @@ -6,12 +6,12 @@ class TestTemplateCodeGenerator(unittest.TestCase): def setUp(self): - self.object = TemplateCodeGenerator() + self.object = TemplateCodeGenerator("./metajson/templates/iOS") os.system("rm -rf ./classes") def test_read_template(self): - expected_jsons = ['./metajson/templates/_header.h.mustache', './metajson/templates/_source.m.mustache', './metajson/templates/header.h.mustache', './metajson/templates/source.m.mustache'] - expected_api_templates = ['./metajson/templates/APIParser/_PREFIX_APIParser.h', './metajson/templates/APIParser/_PREFIX_APIParser.m', './metajson/templates/Utilities/NSString+RegExValidation.h', './metajson/templates/Utilities/NSString+RegExValidation.m'] + expected_jsons = ['./metajson/templates/iOS/_header.h.mustache', './metajson/templates/iOS/_source.m.mustache', './metajson/templates/iOS/header.h.mustache', './metajson/templates/iOS/source.m.mustache'] + expected_api_templates = ['./metajson/templates/iOS/APIParser/_PREFIX_APIParser.h', './metajson/templates/iOS/APIParser/_PREFIX_APIParser.m', './metajson/templates/iOS/Utilities/NSString+RegExValidation.h', './metajson/templates/iOS/Utilities/NSString+RegExValidation.m'] self.object.read_template() @@ -20,14 +20,14 @@ def test_read_template(self): def test_create_output_file(self): output = "classes/APIParser/S2MAPIParser.h" - self.object.create_output_file("./metajson/templates/APIParser/_PREFIX_APIParser.h") + self.object.create_output_file("./metajson/templates/iOS/APIParser/_PREFIX_APIParser.h") file_exists = os.path.isfile(output) and os.access(output, os.R_OK) self.assertEqual(file_exists, True) def test_create_output_file_without_project_prefix(self): self.object.project_prefix = "" output = "classes/APIParser/APIParser.h" - self.object.create_output_file("./metajson/templates/APIParser/_PREFIX_APIParser.h") + self.object.create_output_file("./metajson/templates/iOS/APIParser/_PREFIX_APIParser.h") file_exists = os.path.isfile(output) and os.access(output, os.R_OK) self.assertEqual(file_exists, True) From 2700d35936dec2d1a9787c2ec3f9d513586bf314 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Franc=CC=A7ois=20Benaiteau?= <francois.benaiteau@sinnerschrader-mobile.com> Date: Thu, 15 May 2014 16:18:12 +0200 Subject: [PATCH 128/149] template subdirectories are respected --- metajson/ObjectiveCCodeGenerator.py | 7 ++-- metajson/readJSON.py | 35 +++++++++++-------- metajson/template_code_generator.py | 21 ++++++----- .../_header.h.mustache | 4 +-- .../_source.m.mustache | 2 +- .../array_property.mustache | 0 .../multiple_property.mustache | 0 .../multiple_property_implementation.mustache | 6 ++-- .../number_property.mustache | 0 .../string_property.mustache | 0 test/template_code_generator_test.py | 2 +- 11 files changed, 39 insertions(+), 38 deletions(-) rename metajson/templates/iOS/{ => AbstractInterfaceFiles}/_header.h.mustache (93%) rename metajson/templates/iOS/{ => AbstractInterfaceFiles}/_source.m.mustache (99%) rename metajson/templates/iOS/{ => AbstractInterfaceFiles}/array_property.mustache (100%) rename metajson/templates/iOS/{ => AbstractInterfaceFiles}/multiple_property.mustache (100%) rename metajson/templates/iOS/{ => AbstractInterfaceFiles}/multiple_property_implementation.mustache (70%) rename metajson/templates/iOS/{ => AbstractInterfaceFiles}/number_property.mustache (100%) rename metajson/templates/iOS/{ => AbstractInterfaceFiles}/string_property.mustache (100%) diff --git a/metajson/ObjectiveCCodeGenerator.py b/metajson/ObjectiveCCodeGenerator.py index a931f27..2e29b89 100755 --- a/metajson/ObjectiveCCodeGenerator.py +++ b/metajson/ObjectiveCCodeGenerator.py @@ -306,9 +306,6 @@ def machine_file_content(self, schemeObj, template_file) : undefineProps.append(prop_hash) if(len(classes) > 0): custom_classes.extend(classes) - if prop_hash['varName'] == 'senderInfo': - print prop_hash - print prop.rootBaseType() hashParams = {"date": str(today.year), "projectPrefix": schemeObj.projectPrefix,"machineClassName": schemeObj.getMachineClassName(), "humanClassName": schemeObj.getClassName(), "variableName": self.makeVarName(schemeObj), "stringProperties": stringProps, "numberProperties": numberProps, "booleanProperties": booleanProps, "dataProperties": dataProps, "dateProperties": dateProps, "arrayProperties": arrayProps, "undefinedProperties": undefineProps, "objectProperties": objectProps} hashParams["custom_classes"] = [] @@ -352,12 +349,12 @@ def human_source_content(self, schemeObj) : return self.mustache_renderer.render(templateFile.read(), hashParams) def machine_header_content(self, schemeObj) : - template_file = open(self.template_file_path("_header.h.mustache"), "r") + template_file = open(self.template_file_path("AbstractInterfaceFiles/_header.h.mustache"), "r") print return self.machine_file_content(schemeObj, template_file) def machine_source_content(self, schemeObj) : - template_file = open(self.template_file_path("_source.m.mustache"), "r") + template_file = open(self.template_file_path("AbstractInterfaceFiles/_source.m.mustache"), "r") return self.machine_file_content(schemeObj, template_file) def make(self, schemeObj) : diff --git a/metajson/readJSON.py b/metajson/readJSON.py index 34f656e..e85c2c0 100755 --- a/metajson/readJSON.py +++ b/metajson/readJSON.py @@ -36,19 +36,22 @@ from ObjectiveCCodeGenerator import * from JavaCodeGenerator import * +TARGET_IOS = 'iOS' +TARGET_ANDROID = 'Android' + def main(argv=sys.argv): # parse Options template_dir = None jsonfiles = [] inputfile = 'do you have files?' projectPrefix = 'S2M' - target = 'iOS' + target = TARGET_IOS dirPathToSaveCodes = './src' objectSuffix = "JSONObject" argv = sys.argv[1:] try: - opts, args = getopt.getopt(argv,"vhp:s:t:i:o:",["version", "help", "prefix=", "suffix=", "target=", "input=", "output="]) + opts, args = getopt.getopt(argv,"vhp:s:t:i:o:",["version", "help", "prefix=", "suffix=", "target=", "input=", "output=", "template="]) except getopt.GetoptError: usage() sys.exit(2) @@ -71,6 +74,8 @@ def main(argv=sys.argv): objectSuffix = arg if objectSuffix == "false": objectSuffix = "" + elif opt in ("--template"): + template_dir = arg addFiles = False for arg in argv : @@ -99,9 +104,9 @@ def main(argv=sys.argv): iOS = False Android = False - if target == 'iOS' : + if target == TARGET_IOS: iOS = True - elif target == 'Android' : + elif target == TARGET_ANDROID: Android = True else : print 'error - unknown target platform : ' + target @@ -111,8 +116,17 @@ def main(argv=sys.argv): print "\nGenerate source codes for " + target + ", with Project Prefix \'" + projectPrefix + "\' and suffix \'" + objectSuffix + "\'" print "Output path : \'" + dirPathToSaveCodes + "\'\n" + # write templates - generate_template_files(dirPathToSaveCodes, projectPrefix, target, template_dir) + if dirPathToSaveCodes.endswith("/") : + dirPathToSaveCodes = dirPathToSaveCodes[:-1] + + if template_dir == None: + template_dir = os.path.join(TemplateCodeGenerator.DEFAULT_TEMPLATE_PATH, target) + + templateCodeGen = TemplateCodeGenerator(template_dir, dirPathToSaveCodes, projectPrefix) + templateCodeGen.write_general_template_files() + # read JSON file JSONScheme.projectPrefix = projectPrefix @@ -164,16 +178,6 @@ def main(argv=sys.argv): if obj.isNaturalType() == False : codeGen.make(obj) -def generate_template_files(dirPathToSaveCodes, projectPrefix, target, template_dir = None): - if dirPathToSaveCodes.endswith("/") : - dirPathToSaveCodes = dirPathToSaveCodes[:-1] - - if template_dir == None: - template_dir = os.path.join(TemplateCodeGenerator.DEFAULT_TEMPLATE_PATH, target) - - templateCodeGen = TemplateCodeGenerator(template_dir, dirPathToSaveCodes, projectPrefix) - templateCodeGen.write_general_template_files() - def usage(): usageString = '\n'+__file__+' [ -p | -t | -o | -s ] [-i]\n' usageString += 'Options:\n' @@ -184,6 +188,7 @@ def usage(): usageString += ' -t, --target= target platform iOS or Android (default: iOS)\n' usageString += ' -i, --input= meta-JSON file to read\n' usageString += ' -o, --output= ouput path of generated source codes (default: src)\n' + usageString += ' --template= template directory to use to generate code\n' print(usageString) sys.exit() diff --git a/metajson/template_code_generator.py b/metajson/template_code_generator.py index 27e7b0d..cf493e6 100644 --- a/metajson/template_code_generator.py +++ b/metajson/template_code_generator.py @@ -18,7 +18,6 @@ def __init__(self, template_path = DEFAULT_TEMPLATE_PATH, output_path = "classes ## main methods def write_general_template_files(self): for input_file in self.general_template_files: - print input_file output_file = self.create_output_file(input_file) if output_file: self.write_template(input_file, output_file) @@ -30,16 +29,16 @@ def read_template(self): self.json_template_files = [] self.general_template_files = [] for root, dirs, files in os.walk(self.template_path): - if root == self.template_path: - for name in files: - filepath = os.path.join(root, name) - basename, extension = os.path.splitext(filepath) - if extension == TemplateCodeGenerator.TEMPLATE_EXT: - template_basename, template_extension = os.path.splitext(basename) - if template_basename != basename: - self.json_template_files.append(filepath) - else: - for name in files: + for name in files: + if name.startswith('.'): + continue + filepath = os.path.join(root, name) + basename, extension = os.path.splitext(filepath) + if extension == TemplateCodeGenerator.TEMPLATE_EXT: + template_basename, template_extension = os.path.splitext(basename) + if template_basename != basename: + self.json_template_files.append(filepath) + else: filepath = os.path.join(root, name) self.general_template_files.append(filepath) diff --git a/metajson/templates/iOS/_header.h.mustache b/metajson/templates/iOS/AbstractInterfaceFiles/_header.h.mustache similarity index 93% rename from metajson/templates/iOS/_header.h.mustache rename to metajson/templates/iOS/AbstractInterfaceFiles/_header.h.mustache index 45260c2..c893f6b 100644 --- a/metajson/templates/iOS/_header.h.mustache +++ b/metajson/templates/iOS/AbstractInterfaceFiles/_header.h.mustache @@ -76,10 +76,10 @@ - (NSDictionary *)propertyDictionary; {{/baseTypeIsObject}} {{#arrayProperties}} -{{> metajson/templates/iOS/array_property}} +{{> metajson/templates/iOS/AbstractInterfaceFiles/array_property}} {{/arrayProperties}} {{#undefinedProperties}} -{{> metajson/templates/iOS/multiple_property}} +{{> metajson/templates/iOS/AbstractInterfaceFiles/multiple_property}} {{/undefinedProperties}} {{^arrayProperties}} diff --git a/metajson/templates/iOS/_source.m.mustache b/metajson/templates/iOS/AbstractInterfaceFiles/_source.m.mustache similarity index 99% rename from metajson/templates/iOS/_source.m.mustache rename to metajson/templates/iOS/AbstractInterfaceFiles/_source.m.mustache index 383c4c1..4213867 100644 --- a/metajson/templates/iOS/_source.m.mustache +++ b/metajson/templates/iOS/AbstractInterfaceFiles/_source.m.mustache @@ -372,7 +372,7 @@ {{/hasAnyType}} {{/arrayProperties}} {{#undefinedProperties}} -{{> metajson/templates/iOS/multiple_property_implementation}} +{{> metajson/templates/iOS/AbstractInterfaceFiles/multiple_property_implementation}} {{/undefinedProperties}} #pragma mark - NSCoding diff --git a/metajson/templates/iOS/array_property.mustache b/metajson/templates/iOS/AbstractInterfaceFiles/array_property.mustache similarity index 100% rename from metajson/templates/iOS/array_property.mustache rename to metajson/templates/iOS/AbstractInterfaceFiles/array_property.mustache diff --git a/metajson/templates/iOS/multiple_property.mustache b/metajson/templates/iOS/AbstractInterfaceFiles/multiple_property.mustache similarity index 100% rename from metajson/templates/iOS/multiple_property.mustache rename to metajson/templates/iOS/AbstractInterfaceFiles/multiple_property.mustache diff --git a/metajson/templates/iOS/multiple_property_implementation.mustache b/metajson/templates/iOS/AbstractInterfaceFiles/multiple_property_implementation.mustache similarity index 70% rename from metajson/templates/iOS/multiple_property_implementation.mustache rename to metajson/templates/iOS/AbstractInterfaceFiles/multiple_property_implementation.mustache index abdcaba..066a573 100644 --- a/metajson/templates/iOS/multiple_property_implementation.mustache +++ b/metajson/templates/iOS/AbstractInterfaceFiles/multiple_property_implementation.mustache @@ -3,7 +3,7 @@ - ({{className}} *){{name}}As{{#_upper_camelcase}}{{type}}{{/_upper_camelcase}}:(NSError **)error { - {{> metajson/templates/iOS/number_property}} + {{> metajson/templates/iOS/AbstractInterfaceFiles/number_property}} } {{/className}} {{/hasCustomType}} @@ -11,14 +11,14 @@ - (NSNumber *){{name}}AsNumber:(NSError **)error { - {{> metajson/templates/iOS/number_property}} + {{> metajson/templates/iOS/AbstractInterfaceFiles/number_property}} } {{/hasNumberType}} {{#hasStringType}} {{#types}} - (NSString *){{name}}As{{#_upper_camelcase}}{{type}}{{/_upper_camelcase}}:(NSError **)error { - {{> metajson/templates/iOS/string_property}} + {{> metajson/templates/iOS/AbstractInterfaceFiles/string_property}} } {{/types}} {{/hasStringType}} diff --git a/metajson/templates/iOS/number_property.mustache b/metajson/templates/iOS/AbstractInterfaceFiles/number_property.mustache similarity index 100% rename from metajson/templates/iOS/number_property.mustache rename to metajson/templates/iOS/AbstractInterfaceFiles/number_property.mustache diff --git a/metajson/templates/iOS/string_property.mustache b/metajson/templates/iOS/AbstractInterfaceFiles/string_property.mustache similarity index 100% rename from metajson/templates/iOS/string_property.mustache rename to metajson/templates/iOS/AbstractInterfaceFiles/string_property.mustache diff --git a/test/template_code_generator_test.py b/test/template_code_generator_test.py index 3901b0a..e1a7a9c 100644 --- a/test/template_code_generator_test.py +++ b/test/template_code_generator_test.py @@ -10,7 +10,7 @@ def setUp(self): os.system("rm -rf ./classes") def test_read_template(self): - expected_jsons = ['./metajson/templates/iOS/_header.h.mustache', './metajson/templates/iOS/_source.m.mustache', './metajson/templates/iOS/header.h.mustache', './metajson/templates/iOS/source.m.mustache'] + expected_jsons = ['./metajson/templates/iOS/header.h.mustache', './metajson/templates/iOS/source.m.mustache', './metajson/templates/iOS/AbstractInterfaceFiles/_header.h.mustache', './metajson/templates/iOS/AbstractInterfaceFiles/_source.m.mustache'] expected_api_templates = ['./metajson/templates/iOS/APIParser/_PREFIX_APIParser.h', './metajson/templates/iOS/APIParser/_PREFIX_APIParser.m', './metajson/templates/iOS/Utilities/NSString+RegExValidation.h', './metajson/templates/iOS/Utilities/NSString+RegExValidation.m'] self.object.read_template() From b8ed09573ab048a7075d9a70edf759bfe05f3a23 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Franc=CC=A7ois=20Benaiteau?= <francois.benaiteau@sinnerschrader-mobile.com> Date: Thu, 15 May 2014 18:18:58 +0200 Subject: [PATCH 129/149] remove writing from objectiveCCodeGenerator --- metajson/JSONScheme.py | 2 - metajson/ObjectiveCCodeGenerator.py | 86 ++----------------- metajson/readJSON.py | 76 +++++++++------- metajson/template_code_generator.py | 8 +- ...der.h.mustache => __CLASSNAME_.h.mustache} | 0 ...rce.m.mustache => __CLASSNAME_.m.mustache} | 0 ...ader.h.mustache => _CLASSNAME_.h.mustache} | 0 ...urce.m.mustache => _CLASSNAME_.m.mustache} | 0 test/ObjectiveCCodeGenerator_test.py | 57 ++++++++---- test/template_code_generator_test.py | 2 +- 10 files changed, 96 insertions(+), 135 deletions(-) rename metajson/templates/iOS/AbstractInterfaceFiles/{_header.h.mustache => __CLASSNAME_.h.mustache} (100%) rename metajson/templates/iOS/AbstractInterfaceFiles/{_source.m.mustache => __CLASSNAME_.m.mustache} (100%) rename metajson/templates/iOS/{header.h.mustache => _CLASSNAME_.h.mustache} (100%) rename metajson/templates/iOS/{source.m.mustache => _CLASSNAME_.m.mustache} (100%) diff --git a/metajson/JSONScheme.py b/metajson/JSONScheme.py index b0ed9a1..d15f3f1 100755 --- a/metajson/JSONScheme.py +++ b/metajson/JSONScheme.py @@ -53,8 +53,6 @@ class JSONScheme : domain = ["ROOT"] def __init__(self): - projectPrefix = "" - objectSuffix = "JSONObject" type_name = "" key_name = "" base_type = "" diff --git a/metajson/ObjectiveCCodeGenerator.py b/metajson/ObjectiveCCodeGenerator.py index 2e29b89..d48ab87 100755 --- a/metajson/ObjectiveCCodeGenerator.py +++ b/metajson/ObjectiveCCodeGenerator.py @@ -32,12 +32,7 @@ class ObjectiveCCodeGenerator : - projectPrefix = "" - dirPath = "" - def __init__(self): - projectPrefix = "" - dirPath = "classes" self.mustache_renderer = Renderer() # BEGIN template available functions @@ -72,7 +67,7 @@ def makeVarName(self,schemeObj) : if str(schemeObj.type_name) == "id" or str(schemeObj.type_name) == "description" : titleName = schemeObj.type_name.upper() titleName = titleName[:1] + schemeObj.type_name[1:] - prefix = self.projectPrefix.lower() if self.projectPrefix else 'meta' + prefix = schemeObj.projectPrefix.lower() if schemeObj.projectPrefix else 'meta' returnName = prefix + titleName else : prefixes = ["new", "alloc", "copy"] @@ -80,8 +75,8 @@ def makeVarName(self,schemeObj) : if schemeObj.type_name.startswith(prefix): titleName = schemeObj.type_name.upper() titleName = titleName[:1] + schemeObj.type_name[1:] - returnName = self.projectPrefix.lower() + titleName - #print returnName + returnName = schemeObj.projectPrefix.lower() + titleName + break return returnName @@ -263,7 +258,7 @@ def process_properties(self, propObj, undefined = False) : return classes, propertyHash - def machine_file_content(self, schemeObj, template_file) : + def render(self, schemeObj, template_content) : today = datetime.date.fromtimestamp(time.time()) numberProps = [] @@ -326,76 +321,5 @@ def machine_file_content(self, schemeObj, template_file) : hashParams['baseTypeIsObject'] = True # render - sourceString = self.mustache_renderer.render(template_file.read(), hashParams) + sourceString = self.mustache_renderer.render(template_content, hashParams) return sourceString - - def template_file_path(self, filename) : - templatePath = os.path.realpath( __file__ ) - templatePath = templatePath.replace(os.path.basename( __file__ ), 'templates/iOS') - return os.path.join(templatePath, filename) - - def human_header_content(self, schemeObj) : - templateFile = open(self.template_file_path("header.h.mustache"), "r") - today = datetime.date.fromtimestamp(time.time()) - - hashParams = {"date": str(today.year), "machineClassName": schemeObj.getMachineClassName(), "humanClassName": schemeObj.getClassName()} - return self.mustache_renderer.render(templateFile.read(), hashParams) - - def human_source_content(self, schemeObj) : - templateFile = open(self.template_file_path("source.m.mustache"), "r") - today = datetime.date.fromtimestamp(time.time()) - - hashParams = {"date": str(today.year), "machineClassName": schemeObj.getMachineClassName(), "humanClassName": schemeObj.getClassName()} - return self.mustache_renderer.render(templateFile.read(), hashParams) - - def machine_header_content(self, schemeObj) : - template_file = open(self.template_file_path("AbstractInterfaceFiles/_header.h.mustache"), "r") - print - return self.machine_file_content(schemeObj, template_file) - - def machine_source_content(self, schemeObj) : - template_file = open(self.template_file_path("AbstractInterfaceFiles/_source.m.mustache"), "r") - return self.machine_file_content(schemeObj, template_file) - - def make(self, schemeObj) : - # machine files - self.write_abstract_file(schemeObj.getMachineClassName() + ".h", self.machine_header_content(schemeObj)) - self.write_abstract_file(schemeObj.getMachineClassName() + ".m", self.machine_source_content(schemeObj)) - - # human files - self.write_human_file(schemeObj.getClassName() + ".h", self.human_header_content(schemeObj)) - self.write_human_file(schemeObj.getClassName() + ".m", self.human_source_content(schemeObj)) - - return True - - def write_abstract_file(self, filename, content) : - folder = "/AbstractInterfaceFiles/" - if not os.path.exists(self.dirPath + folder): - os.makedirs(self.dirPath + folder) - - filepath = self.dirPath + folder + filename - self.write_file(filepath, content) - - def write_human_file(self, filename, content) : - folder = "/" - if not os.path.exists(self.dirPath + folder): - os.makedirs(self.dirPath + folder) - - filepath = self.dirPath + folder + filename - self.write_file(filepath, content) - - def write_file(self, filename, content) : - if not os.path.exists(self.dirPath): - os.makedirs(self.dirPath) - - if self.dirPath.endswith("/") : - self.dirPath = self.dirPath[:-1] - - - if os.path.isfile(filename) is False : - print "create " + filename + " file..." - try: - writefile = open(filename, "w") - writefile.write(content) # Write a string to a file - finally : - writefile.close() diff --git a/metajson/readJSON.py b/metajson/readJSON.py index e85c2c0..21ab30f 100755 --- a/metajson/readJSON.py +++ b/metajson/readJSON.py @@ -133,38 +133,11 @@ def main(argv=sys.argv): JSONScheme.objectSuffix = objectSuffix for filePath in jsonfiles : print "read " + filePath + " to parse ...." - jsonObj = read_file(filePath) + schemeObj = create_json_scheme(jsonObj) - if type(jsonObj) == list : - for dic in jsonObj : - schemeObj = JSONScheme() - schemeObj.projectPrefix = projectPrefix - schemeObj.objectSuffix = objectSuffix - if schemeObj.parseDictionary(dic) == False: - hasError = True - break - - elif type(jsonObj) == dict : - schemeObj = JSONScheme() - if schemeObj.parseDictionary(jsonObj) == False : - hasError = True - else : - hasError = True - print "error : no JSON Scheme" - break; - - if hasError : - print "error - Fail to make scheme object." - break; - else: - codeGen = 0 - - if Android : - codeGen = JavaCodeGenerator() - else : - codeGen = ObjectiveCCodeGenerator() - + if Android : + codeGen = JavaCodeGenerator() codeGen.projectPrefix = projectPrefix codeGen.dirPath = dirPathToSaveCodes codeGen.objectSuffix = objectSuffix @@ -175,9 +148,50 @@ def main(argv=sys.argv): allRootKeys = rootDic.keys() for typeName in rootDic : obj = rootDic[typeName]; - if obj.isNaturalType() == False : + if obj.isNaturalType() == False: codeGen.make(obj) + else : + codeGen = ObjectiveCCodeGenerator() + + allSchemes = JSONScheme.JSONSchemeDic + rootDic = allSchemes["ROOT"] + + for typeName in rootDic : + obj = rootDic[typeName]; + if obj.isNaturalType() == False: + + for template_filename in templateCodeGen.json_template_files: + template = open(template_filename) + content = codeGen.render(obj, template.read()) + + file = templateCodeGen.create_template_output_file(template_filename, obj.getClassName()) + try: + file.write(content) + finally : + file.close() + + + +def create_json_scheme(jsonObj): + schemeObj = None + if type(jsonObj) == list : + for dic in jsonObj : + schemeObj = JSONScheme() + if schemeObj.parseDictionary(dic) == False: + schemeObj = None + print "error - Fail to make scheme object." + break + + elif type(jsonObj) == dict : + schemeObj = JSONScheme() + if schemeObj.parseDictionary(jsonObj) == False : + schemeObj = None + print "error - Fail to make scheme object." + else : + print "error : no JSON Scheme" + return schemeObj + def usage(): usageString = '\n'+__file__+' [ -p | -t | -o | -s ] [-i]\n' usageString += 'Options:\n' diff --git a/metajson/template_code_generator.py b/metajson/template_code_generator.py index cf493e6..1e02f28 100644 --- a/metajson/template_code_generator.py +++ b/metajson/template_code_generator.py @@ -43,6 +43,9 @@ def read_template(self): self.general_template_files.append(filepath) def create_output_file(self, filename): + return self.create_template_output_file(filename, None) + + def create_template_output_file(self, filename, classname): start = filename.find(self.template_path) if start == -1: @@ -54,7 +57,9 @@ def create_output_file(self, filename): # customize output filename today = datetime.date.fromtimestamp(time.time()) new_filename = self.replace_variables(new_filename, today) - + if classname: + new_filename = new_filename.replace('_CLASSNAME_', classname) + new_filename = new_filename.replace(TemplateCodeGenerator.TEMPLATE_EXT, '') if directories.startswith("/"): directories = directories[1:] @@ -63,7 +68,6 @@ def create_output_file(self, filename): os.makedirs(end_dir) return open(os.path.join(end_dir, new_filename), 'w') - def replace_variables(self, text, today): newtext = text.replace('_DATE_', "") newtext = newtext.replace('_YEAR_', str(today.year)) diff --git a/metajson/templates/iOS/AbstractInterfaceFiles/_header.h.mustache b/metajson/templates/iOS/AbstractInterfaceFiles/__CLASSNAME_.h.mustache similarity index 100% rename from metajson/templates/iOS/AbstractInterfaceFiles/_header.h.mustache rename to metajson/templates/iOS/AbstractInterfaceFiles/__CLASSNAME_.h.mustache diff --git a/metajson/templates/iOS/AbstractInterfaceFiles/_source.m.mustache b/metajson/templates/iOS/AbstractInterfaceFiles/__CLASSNAME_.m.mustache similarity index 100% rename from metajson/templates/iOS/AbstractInterfaceFiles/_source.m.mustache rename to metajson/templates/iOS/AbstractInterfaceFiles/__CLASSNAME_.m.mustache diff --git a/metajson/templates/iOS/header.h.mustache b/metajson/templates/iOS/_CLASSNAME_.h.mustache similarity index 100% rename from metajson/templates/iOS/header.h.mustache rename to metajson/templates/iOS/_CLASSNAME_.h.mustache diff --git a/metajson/templates/iOS/source.m.mustache b/metajson/templates/iOS/_CLASSNAME_.m.mustache similarity index 100% rename from metajson/templates/iOS/source.m.mustache rename to metajson/templates/iOS/_CLASSNAME_.m.mustache diff --git a/test/ObjectiveCCodeGenerator_test.py b/test/ObjectiveCCodeGenerator_test.py index c02a4c1..928607a 100644 --- a/test/ObjectiveCCodeGenerator_test.py +++ b/test/ObjectiveCCodeGenerator_test.py @@ -3,18 +3,39 @@ import pickle import unittest - +import sys +import os class TestObjectiveCCodeGenerator(unittest.TestCase): def setUp(self): self.gen = ObjectiveCCodeGenerator() - self.gen.dirPath = './src' self.maxDiff = None self.default_folder = 'test/data/' def tearDown(self): del self.gen + def template_file_path(self, filename) : + templatePath = os.path.realpath( __file__ ) + templatePath = templatePath.replace(os.path.basename( __file__ ), '../metajson/templates/iOS') + return os.path.join(templatePath, filename) + + def human_header_content(self, schemeObj) : + template_file = open(self.template_file_path("_CLASSNAME_.h.mustache"), "r") + return self.gen.render(schemeObj, template_file.read()) + + def human_source_content(self, schemeObj) : + template_file = open(self.template_file_path("_CLASSNAME_.m.mustache"), "r") + return self.gen.render(schemeObj, template_file.read()) + + def machine_header_content(self, schemeObj) : + template_file = open(self.template_file_path("AbstractInterfaceFiles/__CLASSNAME_.h.mustache"), "r") + return self.gen.render(schemeObj, template_file.read()) + + def machine_source_content(self, schemeObj) : + template_file = open(self.template_file_path("AbstractInterfaceFiles/__CLASSNAME_.m.mustache"), "r") + return self.gen.render(schemeObj, template_file.read()) + def assert_content_file(self, filename, content): with open(filename, 'r') as content_file: expected_result = content_file.read() @@ -28,19 +49,19 @@ def setUp(self): def test_human_header_content(self): - result = self.gen.human_header_content(self.scheme_object) + result = self.human_header_content(self.scheme_object) self.assert_content_file(self.test_file_path + "/S2MSenderJSONObject.h", result) def test_human_source_content(self): - result = self.gen.human_source_content(self.scheme_object) + result = self.human_source_content(self.scheme_object) self.assert_content_file(self.test_file_path + "/S2MSenderJSONObject.m", result) def test_machine_source_content(self): - result = self.gen.machine_source_content(self.scheme_object) + result = self.machine_source_content(self.scheme_object) self.assert_content_file(self.test_file_path + "/_S2MSenderJSONObject.m", result) def test_machine_header_content(self): - result = self.gen.machine_header_content(self.scheme_object) + result = self.machine_header_content(self.scheme_object) self.assert_content_file(self.test_file_path + "/_S2MSenderJSONObject.h", result) @@ -51,11 +72,11 @@ def setUp(self): self.scheme_object = pickle.load(open(self.test_file_path + '.p', 'rb')) def test_machine_source_content(self): - result = self.gen.machine_source_content(self.scheme_object) + result = self.machine_source_content(self.scheme_object) self.assert_content_file(self.test_file_path + "/_S2MLoginJSONObject.m", result) def test_machine_header_content(self): - result = self.gen.machine_header_content(self.scheme_object) + result = self.machine_header_content(self.scheme_object) self.assert_content_file(self.test_file_path + "/_S2MLoginJSONObject.h", result) class TestSampleTestSubclassCase(TestObjectiveCCodeGenerator): @@ -72,19 +93,19 @@ def setUp(self): self.scheme_object = pickle.load(open(self.default_folder + '/test_subclass_motherClass.p', 'rb')) def test_human_header_content(self): - result = self.gen.human_header_content(self.scheme_object) + result = self.human_header_content(self.scheme_object) self.assert_content_file(self.test_file_path + "/MotherClassJSONObject.h", result) def test_human_source_content(self): - result = self.gen.human_source_content(self.scheme_object) + result = self.human_source_content(self.scheme_object) self.assert_content_file(self.test_file_path + "/MotherClassJSONObject.m", result) def test_machine_source_content(self): - result = self.gen.machine_source_content(self.scheme_object) + result = self.machine_source_content(self.scheme_object) self.assert_content_file(self.test_file_path + "/_MotherClassJSONObject.m", result) def test_machine_header_content(self): - result = self.gen.machine_header_content(self.scheme_object) + result = self.machine_header_content(self.scheme_object) self.assert_content_file(self.test_file_path + "/_MotherClassJSONObject.h", result) class TestSampleTestSubclassSubclassCase(TestSampleTestSubclassCase): @@ -94,19 +115,19 @@ def setUp(self): self.scheme_object = pickle.load(open(self.default_folder + '/test_subclass_subClass.p', 'rb')) def test_human_header_content(self): - result = self.gen.human_header_content(self.scheme_object) + result = self.human_header_content(self.scheme_object) self.assert_content_file(self.test_file_path + "/SubClassJSONObject.h", result) def test_human_source_content(self): - result = self.gen.human_source_content(self.scheme_object) + result = self.human_source_content(self.scheme_object) self.assert_content_file(self.test_file_path + "/SubClassJSONObject.m", result) def test_machine_source_content(self): - result = self.gen.machine_source_content(self.scheme_object) + result = self.machine_source_content(self.scheme_object) self.assert_content_file(self.test_file_path + "/_SubClassJSONObject.m", result) def test_machine_header_content(self): - result = self.gen.machine_header_content(self.scheme_object) + result = self.machine_header_content(self.scheme_object) self.assert_content_file(self.test_file_path + "/_SubClassJSONObject.h", result) class TestSampleTestTypesCase(TestObjectiveCCodeGenerator): @@ -119,11 +140,11 @@ def setUp(self): self.scheme_object = pickle.load(open(self.default_folder + '/test_types_superObject.p', 'rb')) def test_machine_header_content(self): - result = self.gen.machine_header_content(self.scheme_object) + result = self.machine_header_content(self.scheme_object) self.assert_content_file(self.test_file_path + "/_S2MSuperObjectJSONObject.h", result) def test_machine_source_content(self): - result = self.gen.machine_source_content(self.scheme_object) + result = self.machine_source_content(self.scheme_object) self.assert_content_file(self.test_file_path + "/_S2MSuperObjectJSONObject.m", result) diff --git a/test/template_code_generator_test.py b/test/template_code_generator_test.py index e1a7a9c..6247495 100644 --- a/test/template_code_generator_test.py +++ b/test/template_code_generator_test.py @@ -10,7 +10,7 @@ def setUp(self): os.system("rm -rf ./classes") def test_read_template(self): - expected_jsons = ['./metajson/templates/iOS/header.h.mustache', './metajson/templates/iOS/source.m.mustache', './metajson/templates/iOS/AbstractInterfaceFiles/_header.h.mustache', './metajson/templates/iOS/AbstractInterfaceFiles/_source.m.mustache'] + expected_jsons = ['./metajson/templates/iOS/_CLASSNAME_.h.mustache', './metajson/templates/iOS/_CLASSNAME_.m.mustache', './metajson/templates/iOS/AbstractInterfaceFiles/__CLASSNAME_.h.mustache', './metajson/templates/iOS/AbstractInterfaceFiles/__CLASSNAME_.m.mustache'] expected_api_templates = ['./metajson/templates/iOS/APIParser/_PREFIX_APIParser.h', './metajson/templates/iOS/APIParser/_PREFIX_APIParser.m', './metajson/templates/iOS/Utilities/NSString+RegExValidation.h', './metajson/templates/iOS/Utilities/NSString+RegExValidation.m'] self.object.read_template() From d4e8493ef945c5a22802d3d78219ebd5213e4057 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Franc=CC=A7ois=20Benaiteau?= <francois.benaiteau@sinnerschrader-mobile.com> Date: Fri, 16 May 2014 11:27:12 +0200 Subject: [PATCH 130/149] avoid order of files in tests --- test/template_code_generator_test.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/template_code_generator_test.py b/test/template_code_generator_test.py index 6247495..631f468 100644 --- a/test/template_code_generator_test.py +++ b/test/template_code_generator_test.py @@ -15,8 +15,8 @@ def test_read_template(self): self.object.read_template() - self.assertEqual(self.object.json_template_files,expected_jsons) - self.assertEqual(self.object.general_template_files,expected_api_templates) + self.assertEqual(sorted(self.object.json_template_files),sorted(expected_jsons)) + self.assertEqual(sorted(self.object.general_template_files),sorted(expected_api_templates)) def test_create_output_file(self): output = "classes/APIParser/S2MAPIParser.h" From a06203ffe7d2e54f4d3952eca520ebd5d5b578b7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Franc=CC=A7ois=20Benaiteau?= <francois.benaiteau@sinnerschrader-mobile.com> Date: Fri, 16 May 2014 11:37:17 +0200 Subject: [PATCH 131/149] add extra info to version. devel version shows git revision --- metajson/readJSON.py | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/metajson/readJSON.py b/metajson/readJSON.py index 21ab30f..05328f9 100755 --- a/metajson/readJSON.py +++ b/metajson/readJSON.py @@ -231,8 +231,16 @@ def openFileAndParseJSON(filePath): f.close() return obj +def git_revision_short_hash(): + import subprocess + return subprocess.check_output(['git', 'rev-parse', '--short', 'HEAD']) + def version(): - print("metaJSON version %s." % __version__) + git_rev = git_revision_short_hash() + if git_rev: + print("metaJSON version {}. git revision {}").format(__version__, git_rev) + else: + print("metaJSON version %s." % __version__) sys.exit(0) if __name__ == '__main__': From cedad0f11437f329b8a9e520109d878956a6fb19 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Franc=CC=A7ois=20Benaiteau?= <francois.benaiteau@sinnerschrader-mobile.com> Date: Fri, 16 May 2014 11:46:57 +0200 Subject: [PATCH 132/149] clean options for command usage --- metajson/readJSON.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/metajson/readJSON.py b/metajson/readJSON.py index 05328f9..894c5c2 100755 --- a/metajson/readJSON.py +++ b/metajson/readJSON.py @@ -193,8 +193,7 @@ def create_json_scheme(jsonObj): return schemeObj def usage(): - usageString = '\n'+__file__+' [ -p | -t | -o | -s ] [-i]\n' - usageString += 'Options:\n' + usageString = 'Options:\n' usageString += ' -v, --version shows version\n' usageString += ' -h, --help shows help\n' usageString += ' -p, --prefix= project prefix (default: S2M)\n' From 2ad6f266567191ac0987c1ed8a5e86841fd72d2a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Franc=CC=A7ois=20Benaiteau?= <francois.benaiteau@sinnerschrader-mobile.com> Date: Fri, 16 May 2014 11:47:13 +0200 Subject: [PATCH 133/149] update README --- README.md | 53 ++++++++++++----------------------------------------- 1 file changed, 12 insertions(+), 41 deletions(-) diff --git a/README.md b/README.md index b53f43d..941245c 100644 --- a/README.md +++ b/README.md @@ -4,60 +4,31 @@ metaJSON provides a meta language to generate object models for several language ## Usage -1. Write your JSON scheme according to the JSON spec of your backend (for yaml, please see details below) +1. Write your [JSON scheme](https://github.com/sinnerschrader-mobile/metaJSON/wiki/Protocol) according to the JSON spec of your backend 2. Run the script ``` -# python readJSON.py -h - -readJSON.py [ -p | -t | -o | -s ] [-i] +# metajson -h Options: + -v, --version shows version -h, --help shows help - -p, --prefix= project prefix (default: S2M) - -s, --suffix= classname suffix (default: JSONObject). Use "-s false" for no suffix - -t, --target= target platform iOS or Android (default: iOS) - -i, --input= meta-JSON file to read - -o, --output= ouput path of generated source codes + -p, --prefix= project prefix (default: S2M) + -s, --suffix= classname suffix (default: JSONObject). Use "-s false" for no suffix + -t, --target= target platform iOS or Android (default: iOS) + -i, --input= meta-JSON file to read + -o, --output= ouput path of generated source codes (default: src) + --template= template directory to use to generate code ``` A working sample call could look like that: ``` -# python readJSON.py --p GitHub -t Android -i github-scheme.json -o com/example/project/android/json +# metajson --p GitHub -t Android -i github-scheme.json -o com/example/project/android/json ``` The result of that call will be generated Java code in the folder "com". The java package structure and definition will be there, so you just need to copy the folder in your project structure. It is ready to be used. -<!-- -## Yaml - -if you prefer to use yaml as a description language, you will need to install the converter via npm: - -``` -npm install -g yamljs -``` - -#### Converting YAML to JSON - -Example: - -``` -yaml2json --pretty --indentation 6 test.yaml > test.json -``` - -#### Converting JSON to YAML - -Example: - -``` -json2yaml -d 5 test.json > test.yaml -``` ---> - ## Documentation -See MetaJSONProtocol.md file in the doc folder. - -## Known issues -Please check the issue tracker and/or refer to the known_issues.md file in the doc folder. +See [Wiki](https://github.com/sinnerschrader-mobile/metaJSON/wiki) ## License -The project is published with the MIT License. Please read the LICENSE.txt for more details. \ No newline at end of file +The project is published with the MIT License. Please read the LICENSE.txt for more details. From c0cee1770c3fd80b7b5c6306b2c7d9ff6e5d643a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Franc=CC=A7ois=20Benaiteau?= <francois.benaiteau@sinnerschrader-mobile.com> Date: Tue, 20 May 2014 11:15:45 +0200 Subject: [PATCH 134/149] change 'comment' template key to 'description' --- metajson/ObjectiveCCodeGenerator.py | 2 +- .../__CLASSNAME_.h.mustache | 48 +++++++++---------- 2 files changed, 25 insertions(+), 25 deletions(-) diff --git a/metajson/ObjectiveCCodeGenerator.py b/metajson/ObjectiveCCodeGenerator.py index d48ab87..da7fffa 100755 --- a/metajson/ObjectiveCCodeGenerator.py +++ b/metajson/ObjectiveCCodeGenerator.py @@ -211,7 +211,7 @@ def process_properties(self, propObj, undefined = False) : capitalizeVarName = capitalizeVarName[:1].upper() + capitalizeVarName[1:] propertyHash = {'name' : propObj.type_name, 'varName' : self.makeVarName(propObj), 'capitalizeVarName': capitalizeVarName} if propObj.type_description and len(propObj.type_description) : - propertyHash["comment"] = propObj.type_description + propertyHash["description"] = propObj.type_description if propObj.required == 1: propertyHash['required'] = True diff --git a/metajson/templates/iOS/AbstractInterfaceFiles/__CLASSNAME_.h.mustache b/metajson/templates/iOS/AbstractInterfaceFiles/__CLASSNAME_.h.mustache index c893f6b..130d327 100644 --- a/metajson/templates/iOS/AbstractInterfaceFiles/__CLASSNAME_.h.mustache +++ b/metajson/templates/iOS/AbstractInterfaceFiles/__CLASSNAME_.h.mustache @@ -22,51 +22,51 @@ {{/baseTypeIsObject}} {{#numberProperties}} -{{#comment}} -// {{comment}} -{{/comment}} +{{#description}} +// {{description}} +{{/description}} @property (nonatomic, strong) NSNumber *{{varName}}; {{/numberProperties}} {{#stringProperties}} -{{#comment}} -// {{comment}} -{{/comment}} +{{#description}} +// {{description}} +{{/description}} @property (nonatomic, strong) NSString *{{varName}}; {{/stringProperties}} {{#booleanProperties}} -{{#comment}} -// {{comment}} -{{/comment}} +{{#description}} +// {{description}} +{{/description}} @property (nonatomic, assign) BOOL {{varName}}; {{/booleanProperties}} {{#dataProperties}} -{{#comment}} -// {{comment}} -{{/comment}} +{{#description}} +// {{description}} +{{/description}} @property (nonatomic, strong) NSData *{{varName}}; {{/dataProperties}} {{#dateProperties}} -{{#comment}} -// {{comment}} -{{/comment}} +{{#description}} +// {{description}} +{{/description}} @property (nonatomic, strong) NSDate *{{varName}}; {{/dateProperties}} {{#arrayProperties}} -{{#comment}} -// {{comment}} -{{/comment}} +{{#description}} +// {{description}} +{{/description}} @property (nonatomic, strong) NSArray *{{varName}}; {{/arrayProperties}} {{#objectProperties}} -{{#comment}} -// {{comment}} -{{/comment}} +{{#description}} +// {{description}} +{{/description}} @property (nonatomic, strong) {{className}} *{{varName}}; {{/objectProperties}} {{#undefinedProperties}} -{{#comment}} -// {{comment}} -{{/comment}} +{{#description}} +// {{description}} +{{/description}} @property (nonatomic, strong) id {{varName}}; {{/undefinedProperties}} From afaad9120e22a01b7f5a3eb183f9153c86aafb66 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Franc=CC=A7ois=20Benaiteau?= <francois.benaiteau@sinnerschrader-mobile.com> Date: Tue, 20 May 2014 11:15:54 +0200 Subject: [PATCH 135/149] Typo fixes --- metajson/readJSON.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/metajson/readJSON.py b/metajson/readJSON.py index 894c5c2..8e7041c 100755 --- a/metajson/readJSON.py +++ b/metajson/readJSON.py @@ -199,8 +199,8 @@ def usage(): usageString += ' -p, --prefix= project prefix (default: S2M)\n' usageString += ' -s, --suffix= classname suffix (default: JSONObject). Use "-s false" for no suffix\n' usageString += ' -t, --target= target platform iOS or Android (default: iOS)\n' - usageString += ' -i, --input= meta-JSON file to read\n' - usageString += ' -o, --output= ouput path of generated source codes (default: src)\n' + usageString += ' -i, --input= metaJSON file to read\n' + usageString += ' -o, --output= output path of generated source codes (default: src)\n' usageString += ' --template= template directory to use to generate code\n' print(usageString) sys.exit() From edba73c9111bcb8910c7dc645fb734e4ff347330 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Franc=CC=A7ois=20Benaiteau?= <francois.benaiteau@sinnerschrader-mobile.com> Date: Tue, 20 May 2014 11:19:06 +0200 Subject: [PATCH 136/149] uniform variableName and varName --- metajson/ObjectiveCCodeGenerator.py | 2 +- .../iOS/AbstractInterfaceFiles/__CLASSNAME_.h.mustache | 2 +- .../iOS/AbstractInterfaceFiles/__CLASSNAME_.m.mustache | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/metajson/ObjectiveCCodeGenerator.py b/metajson/ObjectiveCCodeGenerator.py index da7fffa..663983c 100755 --- a/metajson/ObjectiveCCodeGenerator.py +++ b/metajson/ObjectiveCCodeGenerator.py @@ -302,7 +302,7 @@ def render(self, schemeObj, template_content) : if(len(classes) > 0): custom_classes.extend(classes) - hashParams = {"date": str(today.year), "projectPrefix": schemeObj.projectPrefix,"machineClassName": schemeObj.getMachineClassName(), "humanClassName": schemeObj.getClassName(), "variableName": self.makeVarName(schemeObj), "stringProperties": stringProps, "numberProperties": numberProps, "booleanProperties": booleanProps, "dataProperties": dataProps, "dateProperties": dateProps, "arrayProperties": arrayProps, "undefinedProperties": undefineProps, "objectProperties": objectProps} + hashParams = {"date": str(today.year), "projectPrefix": schemeObj.projectPrefix,"machineClassName": schemeObj.getMachineClassName(), "humanClassName": schemeObj.getClassName(), "varName": self.makeVarName(schemeObj), "stringProperties": stringProps, "numberProperties": numberProps, "booleanProperties": booleanProps, "dataProperties": dataProps, "dateProperties": dateProps, "arrayProperties": arrayProps, "undefinedProperties": undefineProps, "objectProperties": objectProps} hashParams["custom_classes"] = [] for classname in custom_classes: if classname not in hashParams["custom_classes"]: diff --git a/metajson/templates/iOS/AbstractInterfaceFiles/__CLASSNAME_.h.mustache b/metajson/templates/iOS/AbstractInterfaceFiles/__CLASSNAME_.h.mustache index 130d327..b873df8 100644 --- a/metajson/templates/iOS/AbstractInterfaceFiles/__CLASSNAME_.h.mustache +++ b/metajson/templates/iOS/AbstractInterfaceFiles/__CLASSNAME_.h.mustache @@ -70,7 +70,7 @@ @property (nonatomic, strong) id {{varName}}; {{/undefinedProperties}} -+ ({{humanClassName}} *){{variableName}}WithDictionary:(NSDictionary *)dic withError:(NSError **)error; ++ ({{humanClassName}} *){{varName}}WithDictionary:(NSDictionary *)dic withError:(NSError **)error; - (id)initWithDictionary:(NSDictionary *)dic withError:(NSError **)error; {{#baseTypeIsObject}} - (NSDictionary *)propertyDictionary; diff --git a/metajson/templates/iOS/AbstractInterfaceFiles/__CLASSNAME_.m.mustache b/metajson/templates/iOS/AbstractInterfaceFiles/__CLASSNAME_.m.mustache index 4213867..1ea1e5b 100644 --- a/metajson/templates/iOS/AbstractInterfaceFiles/__CLASSNAME_.m.mustache +++ b/metajson/templates/iOS/AbstractInterfaceFiles/__CLASSNAME_.m.mustache @@ -16,7 +16,7 @@ #pragma mark - factory -+ ({{humanClassName}} *){{variableName}}WithDictionary:(NSDictionary *)dic withError:(NSError **)error ++ ({{humanClassName}} *){{varName}}WithDictionary:(NSDictionary *)dic withError:(NSError **)error { return [[{{humanClassName}} alloc] initWithDictionary:dic withError:error]; } From 2748fb4c252e9e78736e866676b0cf33385ff7aa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Franc=CC=A7ois=20Benaiteau?= <francois.benaiteau@sinnerschrader-mobile.com> Date: Tue, 20 May 2014 12:03:16 +0200 Subject: [PATCH 137/149] replace {{capitalizeVarName}} by {{#_upper_camelcase}}{{varName}}{{/_upper_camelcase}} --- metajson/ObjectiveCCodeGenerator.py | 20 ++--- .../__CLASSNAME_.m.mustache | 82 +++++++++---------- .../array_property.mustache | 14 ++-- .../number_property.mustache | 4 +- .../string_property.mustache | 12 +-- 5 files changed, 65 insertions(+), 67 deletions(-) diff --git a/metajson/ObjectiveCCodeGenerator.py b/metajson/ObjectiveCCodeGenerator.py index 663983c..4ea836b 100755 --- a/metajson/ObjectiveCCodeGenerator.py +++ b/metajson/ObjectiveCCodeGenerator.py @@ -35,14 +35,17 @@ class ObjectiveCCodeGenerator : def __init__(self): self.mustache_renderer = Renderer() - # BEGIN template available functions def lambda_uppercase(self, text): - return text.upper() + process_text = Renderer().render(text, self.mustache_renderer.context) + return process_text.upper() + def lambda_lowercase(self, text): - return text.lower() + process_text = Renderer().render(text, self.mustache_renderer.context) + return process_text.lower() def lambda_capitalize(self, text): - return text.capitalize() + process_text = Renderer().render(text, self.mustache_renderer.context) + return process_text.capitalize() def lambda_camelcase(self, text): process_text = Renderer().render(text, self.mustache_renderer.context) @@ -55,13 +58,10 @@ def lambda_upper_camelcase(self, text): def lambda_snakecase(self, text): return re.sub('([a-z0-9])([A-Z])', r'\1_\2', string).lower() + def lambda_upper_snakecase(self, text): return re.sub('([a-z0-9])([A-Z])', r'\1_\2', string).upper() - # END template available functions - - - def makeVarName(self,schemeObj) : returnName = schemeObj.type_name if str(schemeObj.type_name) == "id" or str(schemeObj.type_name) == "description" : @@ -207,9 +207,7 @@ def process_subtypes(self, propObj, propertyHash) : return classes def process_properties(self, propObj, undefined = False) : - capitalizeVarName = self.makeVarName(propObj) - capitalizeVarName = capitalizeVarName[:1].upper() + capitalizeVarName[1:] - propertyHash = {'name' : propObj.type_name, 'varName' : self.makeVarName(propObj), 'capitalizeVarName': capitalizeVarName} + propertyHash = {'name' : propObj.type_name, 'varName' : self.makeVarName(propObj)} if propObj.type_description and len(propObj.type_description) : propertyHash["description"] = propObj.type_description if propObj.required == 1: diff --git a/metajson/templates/iOS/AbstractInterfaceFiles/__CLASSNAME_.m.mustache b/metajson/templates/iOS/AbstractInterfaceFiles/__CLASSNAME_.m.mustache index 1ea1e5b..2258cd0 100644 --- a/metajson/templates/iOS/AbstractInterfaceFiles/__CLASSNAME_.m.mustache +++ b/metajson/templates/iOS/AbstractInterfaceFiles/__CLASSNAME_.m.mustache @@ -136,31 +136,31 @@ } {{/hasAnyType}} {{^hasAnyType}} - NSArray *tmp{{capitalizeVarName}}Array = [{{projectPrefix}}APIParser arrayFromResponseDictionary:dic forKey:@"{{name}}" acceptNil:{{#required}}NO{{/required}}{{^required}}YES{{/required}} error:error]; + NSArray *tmp{{#_upper_camelcase}}{{varName}}{{/_upper_camelcase}}Array = [{{projectPrefix}}APIParser arrayFromResponseDictionary:dic forKey:@"{{name}}" acceptNil:{{#required}}NO{{/required}}{{^required}}YES{{/required}} error:error]; if (*error) { return self; } - NSMutableArray *tmp{{capitalizeVarName}} = [[NSMutableArray alloc] initWithCapacity:tmp{{capitalizeVarName}}Array.count]; - for (NSUInteger loop = 0; loop < tmp{{capitalizeVarName}}Array.count; loop++) { + NSMutableArray *tmp{{#_upper_camelcase}}{{varName}}{{/_upper_camelcase}} = [[NSMutableArray alloc] initWithCapacity:tmp{{#_upper_camelcase}}{{varName}}{{/_upper_camelcase}}Array.count]; + for (NSUInteger loop = 0; loop < tmp{{#_upper_camelcase}}{{varName}}{{/_upper_camelcase}}Array.count; loop++) { {{#hasStringType}} - NSString *tmpValue = [{{projectPrefix}}APIParser stringFromResponseArray:tmp{{capitalizeVarName}}Array atIndex:loop acceptNil:{{#required}}NO{{/required}}{{^required}}YES{{/required}} error:error]; + NSString *tmpValue = [{{projectPrefix}}APIParser stringFromResponseArray:tmp{{#_upper_camelcase}}{{varName}}{{/_upper_camelcase}}Array atIndex:loop acceptNil:{{#required}}NO{{/required}}{{^required}}YES{{/required}} error:error]; {{/hasStringType}} {{#hasNumberType}} - NSNumber *tmpValue = [{{projectPrefix}}APIParser numberFromResponseArray:tmp{{capitalizeVarName}}Array atIndex:loop acceptNil:{{#required}}NO{{/required}}{{^required}}YES{{/required}} error:error]; + NSNumber *tmpValue = [{{projectPrefix}}APIParser numberFromResponseArray:tmp{{#_upper_camelcase}}{{varName}}{{/_upper_camelcase}}Array atIndex:loop acceptNil:{{#required}}NO{{/required}}{{^required}}YES{{/required}} error:error]; {{/hasNumberType}} {{#hasDateType}} - NSDate *tmpValue = [{{projectPrefix}}APIParser dateFromResponseArray:tmp{{capitalizeVarName}}Array atIndex:loop acceptNil:{{#required}}NO{{/required}}{{^required}}YES{{/required}} error:error]; + NSDate *tmpValue = [{{projectPrefix}}APIParser dateFromResponseArray:tmp{{#_upper_camelcase}}{{varName}}{{/_upper_camelcase}}Array atIndex:loop acceptNil:{{#required}}NO{{/required}}{{^required}}YES{{/required}} error:error]; {{/hasDateType}} {{^hasCustomType}} if (*error) { return self; } if (tmpValue) { - [tmp{{capitalizeVarName}} addObject:tmpValue]; + [tmp{{#_upper_camelcase}}{{varName}}{{/_upper_camelcase}} addObject:tmpValue]; } {{/hasCustomType}} {{#hasCustomType}} - NSDictionary *tmpDic = [APIParser dictionaryFromResponseArray:tmp{{capitalizeVarName}}Array atIndex:loop acceptNil:NO error:error]; + NSDictionary *tmpDic = [APIParser dictionaryFromResponseArray:tmp{{#_upper_camelcase}}{{varName}}{{/_upper_camelcase}}Array atIndex:loop acceptNil:NO error:error]; if (*error) { return self; } @@ -173,12 +173,12 @@ } } if (tmpObject) { - [tmp{{capitalizeVarName}} addObject:tmpObject]; + [tmp{{#_upper_camelcase}}{{varName}}{{/_upper_camelcase}} addObject:tmpObject]; } {{/subtypes}} {{/hasCustomType}} } - self.{{varName}} = [NSArray arrayWithArray:tmp{{capitalizeVarName}}]; + self.{{varName}} = [NSArray arrayWithArray:tmp{{#_upper_camelcase}}{{varName}}{{/_upper_camelcase}}]; {{/hasAnyType}} {{/hasOneSubtype}} {{#maxCount}} @@ -207,12 +207,12 @@ {{/minCount}} {{/arrayProperties}} {{#objectProperties}} - NSDictionary *tmp{{capitalizeVarName}} = [APIParser dictionaryFromResponseDictionary:dic forKey:@"{{name}}" acceptNil:{{#required}}NO{{/required}}{{^required}}YES{{/required}} error:error]; + NSDictionary *tmp{{#_upper_camelcase}}{{varName}}{{/_upper_camelcase}} = [APIParser dictionaryFromResponseDictionary:dic forKey:@"{{name}}" acceptNil:{{#required}}NO{{/required}}{{^required}}YES{{/required}} error:error]; if (*error) { return self; } - if (tmp{{capitalizeVarName}}) { - self.{{varName}}= [[{{className}} alloc] initWithDictionary:tmp{{capitalizeVarName}} withError:error]; + if (tmp{{#_upper_camelcase}}{{varName}}{{/_upper_camelcase}}) { + self.{{varName}}= [[{{className}} alloc] initWithDictionary:tmp{{#_upper_camelcase}}{{varName}}{{/_upper_camelcase}} withError:error]; if (*error) { return self; } @@ -235,23 +235,23 @@ {{#subtypes}} {{#className}} -- ({{className}} *){{subtype}}In{{capitalizeVarName}}AtIndex:(NSUInteger)index withError:(NSError **)error +- ({{className}} *){{subtype}}In{{#_upper_camelcase}}{{varName}}{{/_upper_camelcase}}AtIndex:(NSUInteger)index withError:(NSError **)error { - NSDictionary *tmp{{capitalizeVarName}}Dic = [APIParser dictionaryFromResponseArray:self.{{varName}} atIndex:index acceptNil:YES error:error]; + NSDictionary *tmp{{#_upper_camelcase}}{{varName}}{{/_upper_camelcase}}Dic = [APIParser dictionaryFromResponseArray:self.{{varName}} atIndex:index acceptNil:YES error:error]; if (*error) { return nil; } - {{className}} *tmp{{capitalizeVarName}} = nil; - if (tmp{{capitalizeVarName}}Dic== nil) { + {{className}} *tmp{{#_upper_camelcase}}{{varName}}{{/_upper_camelcase}} = nil; + if (tmp{{#_upper_camelcase}}{{varName}}{{/_upper_camelcase}}Dic== nil) { return nil; } - if (tmp{{capitalizeVarName}}Dic) { - tmp{{capitalizeVarName}}= [[{{className}} alloc] initWithDictionary:tmp{{capitalizeVarName}}Dic withError:error]; + if (tmp{{#_upper_camelcase}}{{varName}}{{/_upper_camelcase}}Dic) { + tmp{{#_upper_camelcase}}{{varName}}{{/_upper_camelcase}}= [[{{className}} alloc] initWithDictionary:tmp{{#_upper_camelcase}}{{varName}}{{/_upper_camelcase}}Dic withError:error]; if (*error) { return nil; } } - return tmp{{capitalizeVarName}}; + return tmp{{#_upper_camelcase}}{{varName}}{{/_upper_camelcase}}; } {{/className}} {{/subtypes}} @@ -259,27 +259,27 @@ {{#hasNumberType}} {{#subtypes}} -- (NSNumber *){{subtype}}In{{capitalizeVarName}}AtIndex:(NSUInteger)index withError:(NSError **)error +- (NSNumber *){{subtype}}In{{#_upper_camelcase}}{{varName}}{{/_upper_camelcase}}AtIndex:(NSUInteger)index withError:(NSError **)error { - NSNumber *tmp{{capitalizeVarName}} = [{{projectPrefix}}APIParser numberFromResponseArray:self.{{varName}} atIndex:index acceptNil:{{#required}}NO{{/required}}{{^required}}YES{{/required}} error:error]; + NSNumber *tmp{{#_upper_camelcase}}{{varName}}{{/_upper_camelcase}} = [{{projectPrefix}}APIParser numberFromResponseArray:self.{{varName}} atIndex:index acceptNil:{{#required}}NO{{/required}}{{^required}}YES{{/required}} error:error]; if (*error) { return nil; } - return tmp{{capitalizeVarName}}; + return tmp{{#_upper_camelcase}}{{varName}}{{/_upper_camelcase}}; } {{/subtypes}} {{/hasNumberType}} {{#hasStringType}} {{#subtypes}} -- (NSString *){{subtype}}In{{capitalizeVarName}}AtIndex:(NSUInteger)index withError:(NSError **)error +- (NSString *){{subtype}}In{{#_upper_camelcase}}{{varName}}{{/_upper_camelcase}}AtIndex:(NSUInteger)index withError:(NSError **)error { - NSString *tmp{{capitalizeVarName}} = [{{projectPrefix}}APIParser stringFromResponseArray:self.{{varName}} atIndex:index acceptNil:{{#required}}NO{{/required}}{{^required}}YES{{/required}} error:error]; + NSString *tmp{{#_upper_camelcase}}{{varName}}{{/_upper_camelcase}} = [{{projectPrefix}}APIParser stringFromResponseArray:self.{{varName}} atIndex:index acceptNil:{{#required}}NO{{/required}}{{^required}}YES{{/required}} error:error]; if (*error) { return nil; } {{#_subtype.maxLength}} - if (tmp{{capitalizeVarName}}.length > {{_subtype.maxLength}}) { + if (tmp{{#_upper_camelcase}}{{varName}}{{/_upper_camelcase}}.length > {{_subtype.maxLength}}) { NSDictionary *userInfo = @{@"propertyName" : @"{{_subtype.name}}", @"key" : @"{{_subtype.name}}", @"reason" : @"max length validation error", @@ -291,7 +291,7 @@ } {{/_subtype.maxLength}} {{#_subtype.minLength}} - if (tmp{{capitalizeVarName}}.length < {{_subtype.minLength}}) { + if (tmp{{#_upper_camelcase}}{{varName}}{{/_upper_camelcase}}.length < {{_subtype.minLength}}) { NSDictionary *userInfo = @{@"propertyName" : @"{{_subtype.name}}", @"key" : @"{{_subtype.name}}", @"reason" : @"min length validation error", @@ -304,7 +304,7 @@ {{/_subtype.minLength}} {{! to finish need to pass customClass regex...}} {{#_subtype.regex}} - if (tmp{{capitalizeVarName}} && [tmp{{capitalizeVarName}} matchesRegExString:@"{{& _subtype.regex}}"] == NO) { + if (tmp{{#_upper_camelcase}}{{varName}}{{/_upper_camelcase}} && [tmp{{#_upper_camelcase}}{{varName}}{{/_upper_camelcase}} matchesRegExString:@"{{& _subtype.regex}}"] == NO) { NSDictionary *userInfo = @{@"propertyName" : @"{{_subtype.name}}", @"key" : @"{{_subtype.name}}", @"reason" : @"validation error", @@ -315,58 +315,58 @@ return nil; } {{/_subtype.regex}} - return tmp{{capitalizeVarName}}; + return tmp{{#_upper_camelcase}}{{varName}}{{/_upper_camelcase}}; } {{/subtypes}} {{/hasStringType}} {{#hasBooleanType}} {{#subtypes}} -- (BOOL){{subtype}}In{{capitalizeVarName}}AtIndex:(NSUInteger)index withError:(NSError **)error +- (BOOL){{subtype}}In{{#_upper_camelcase}}{{varName}}{{/_upper_camelcase}}AtIndex:(NSUInteger)index withError:(NSError **)error { - BOOL tmp{{capitalizeVarName}} = [{{projectPrefix}}APIParser boolFromResponseArray:self.{{varName}} atIndex:index acceptNil:{{#required}}NO{{/required}}{{^required}}YES{{/required}} error:error]; + BOOL tmp{{#_upper_camelcase}}{{varName}}{{/_upper_camelcase}} = [{{projectPrefix}}APIParser boolFromResponseArray:self.{{varName}} atIndex:index acceptNil:{{#required}}NO{{/required}}{{^required}}YES{{/required}} error:error]; if (*error) { return nil; } - return tmp{{capitalizeVarName}}; + return tmp{{#_upper_camelcase}}{{varName}}{{/_upper_camelcase}}; } {{/subtypes}} {{/hasBooleanType}} {{#hasDateType}} {{#subtypes}} -- (NSDate *){{subtype}}In{{capitalizeVarName}}AtIndex:(NSUInteger)index withError:(NSError **)error +- (NSDate *){{subtype}}In{{#_upper_camelcase}}{{varName}}{{/_upper_camelcase}}AtIndex:(NSUInteger)index withError:(NSError **)error { - NSDate *tmp{{capitalizeVarName}} = [{{projectPrefix}}APIParser dateWithTimeIntervalFromResponseArray:self.{{varName}} atIndex:index acceptNil:{{#required}}NO{{/required}}{{^required}}YES{{/required}} error:error]; + NSDate *tmp{{#_upper_camelcase}}{{varName}}{{/_upper_camelcase}} = [{{projectPrefix}}APIParser dateWithTimeIntervalFromResponseArray:self.{{varName}} atIndex:index acceptNil:{{#required}}NO{{/required}}{{^required}}YES{{/required}} error:error]; if (*error) { return nil; } - return tmp{{capitalizeVarName}}; + return tmp{{#_upper_camelcase}}{{varName}}{{/_upper_camelcase}}; } {{/subtypes}} {{/hasDateType}} {{#hasDataType}} {{#subtypes}} -- (NSData*){{subtype}}In{{capitalizeVarName}}AtIndex:(NSUInteger)index withError:(NSError **)error +- (NSData*){{subtype}}In{{#_upper_camelcase}}{{varName}}{{/_upper_camelcase}}AtIndex:(NSUInteger)index withError:(NSError **)error { - NSData* tmp{{capitalizeVarName}} = [{{projectPrefix}}APIParser dataFromResponseArray:self.{{varName}} atIndex:index acceptNil:{{#required}}NO{{/required}}{{^required}}YES{{/required}} error:error]; + NSData* tmp{{#_upper_camelcase}}{{varName}}{{/_upper_camelcase}} = [{{projectPrefix}}APIParser dataFromResponseArray:self.{{varName}} atIndex:index acceptNil:{{#required}}NO{{/required}}{{^required}}YES{{/required}} error:error]; if (*error) { return nil; } - return tmp{{capitalizeVarName}}; + return tmp{{#_upper_camelcase}}{{varName}}{{/_upper_camelcase}}; } {{/subtypes}} {{/hasDataType}} {{/hasMultipleSubtypes}} {{#hasAnyType}} -- (id)objectIn{{capitalizeVarName}}AtIndex:(NSUInteger)index withError:(NSError **)error +- (id)objectIn{{#_upper_camelcase}}{{varName}}{{/_upper_camelcase}}AtIndex:(NSUInteger)index withError:(NSError **)error { - id tmp{{capitalizeVarName}} = [APIParser objectFromResponseArray:self.{{varName}} atIndex:index acceptNil:YES error:error]; + id tmp{{#_upper_camelcase}}{{varName}}{{/_upper_camelcase}} = [APIParser objectFromResponseArray:self.{{varName}} atIndex:index acceptNil:YES error:error]; if (*error) { return nil; } - return tmp{{capitalizeVarName}}; + return tmp{{#_upper_camelcase}}{{varName}}{{/_upper_camelcase}}; } {{/hasAnyType}} diff --git a/metajson/templates/iOS/AbstractInterfaceFiles/array_property.mustache b/metajson/templates/iOS/AbstractInterfaceFiles/array_property.mustache index eea7456..13a6273 100644 --- a/metajson/templates/iOS/AbstractInterfaceFiles/array_property.mustache +++ b/metajson/templates/iOS/AbstractInterfaceFiles/array_property.mustache @@ -2,36 +2,36 @@ {{#hasCustomType}} {{#subtypes}} {{#className}} -- ({{className}} *){{subtype}}In{{capitalizeVarName}}AtIndex:(NSUInteger)index withError:(NSError **)error; +- ({{className}} *){{subtype}}In{{#_upper_camelcase}}{{varName}}{{/_upper_camelcase}}AtIndex:(NSUInteger)index withError:(NSError **)error; {{/className}} {{/subtypes}} {{/hasCustomType}} {{#hasNumberType}} {{#subtypes}} -- (NSNumber *){{subtype}}In{{capitalizeVarName}}AtIndex:(NSUInteger)index withError:(NSError **)error; +- (NSNumber *){{subtype}}In{{#_upper_camelcase}}{{varName}}{{/_upper_camelcase}}AtIndex:(NSUInteger)index withError:(NSError **)error; {{/subtypes}} {{/hasNumberType}} {{#hasStringType}} {{#subtypes}} -- (NSString *){{subtype}}In{{capitalizeVarName}}AtIndex:(NSUInteger)index withError:(NSError **)error; +- (NSString *){{subtype}}In{{#_upper_camelcase}}{{varName}}{{/_upper_camelcase}}AtIndex:(NSUInteger)index withError:(NSError **)error; {{/subtypes}} {{/hasStringType}} {{#hasBooleanType}} {{#subtypes}} -- (BOOL ){{subtype}}In{{capitalizeVarName}}AtIndex:(NSUInteger)index withError:(NSError **)error; +- (BOOL ){{subtype}}In{{#_upper_camelcase}}{{varName}}{{/_upper_camelcase}}AtIndex:(NSUInteger)index withError:(NSError **)error; {{/subtypes}} {{/hasBooleanType}} {{#hasDateType}} {{#subtypes}} -- (NSDate *){{subtype}}In{{capitalizeVarName}}AtIndex:(NSUInteger)index withError:(NSError **)error; +- (NSDate *){{subtype}}In{{#_upper_camelcase}}{{varName}}{{/_upper_camelcase}}AtIndex:(NSUInteger)index withError:(NSError **)error; {{/subtypes}} {{/hasDateType}} {{#hasDataType}} {{#subtypes}} -- (NSData *){{subtype}}In{{capitalizeVarName}}AtIndex:(NSUInteger)index withError:(NSError **)error; +- (NSData *){{subtype}}In{{#_upper_camelcase}}{{varName}}{{/_upper_camelcase}}AtIndex:(NSUInteger)index withError:(NSError **)error; {{/subtypes}} {{/hasDataType}} {{/hasMultipleSubtypes}} {{#hasAnyType}} -- (id){{subtype}}In{{capitalizeVarName}}AtIndex:(NSUInteger)index withError:(NSError **)error; +- (id){{subtype}}In{{#_upper_camelcase}}{{varName}}{{/_upper_camelcase}}AtIndex:(NSUInteger)index withError:(NSError **)error; {{/hasAnyType}} diff --git a/metajson/templates/iOS/AbstractInterfaceFiles/number_property.mustache b/metajson/templates/iOS/AbstractInterfaceFiles/number_property.mustache index 48b5ce6..fabec55 100644 --- a/metajson/templates/iOS/AbstractInterfaceFiles/number_property.mustache +++ b/metajson/templates/iOS/AbstractInterfaceFiles/number_property.mustache @@ -1,7 +1,7 @@ if (!self.{{varName}}) return nil; NSDictionary *new{{varName}}Dic = @{@"{{name}}" : self.{{varName}}}; -NSNumber *tmp{{capitalizeVarName}} = [APIParser numberFromResponseDictionary:new{{varName}}Dic forKey:@"{{name}}" acceptNil:NO error:error]; +NSNumber *tmp{{#_upper_camelcase}}{{varName}}{{/_upper_camelcase}} = [APIParser numberFromResponseDictionary:new{{varName}}Dic forKey:@"{{name}}" acceptNil:NO error:error]; if (*error) { return nil; } -return tmp{{capitalizeVarName}}; +return tmp{{#_upper_camelcase}}{{varName}}{{/_upper_camelcase}}; diff --git a/metajson/templates/iOS/AbstractInterfaceFiles/string_property.mustache b/metajson/templates/iOS/AbstractInterfaceFiles/string_property.mustache index a31186f..dbf24d2 100644 --- a/metajson/templates/iOS/AbstractInterfaceFiles/string_property.mustache +++ b/metajson/templates/iOS/AbstractInterfaceFiles/string_property.mustache @@ -1,16 +1,16 @@ if (!self.{{varName}}) return nil; NSDictionary *new{{varName}}Dic = @{@"{{varName}}" : self.{{varName}}}; -NSString *tmp{{capitalizeVarName}} = [APIParser stringFromResponseDictionary:new{{varName}}Dic forKey:@"{{name}}" acceptNumber:NO acceptNil:{{#required}}NO{{/required}}{{^required}}YES{{/required}} error:error]; +NSString *tmp{{#_upper_camelcase}}{{varName}}{{/_upper_camelcase}} = [APIParser stringFromResponseDictionary:new{{varName}}Dic forKey:@"{{name}}" acceptNumber:NO acceptNil:{{#required}}NO{{/required}}{{^required}}YES{{/required}} error:error]; if (*error) { return nil; } {{#_type}} -if (tmp{{capitalizeVarName}} == nil) { +if (tmp{{#_upper_camelcase}}{{varName}}{{/_upper_camelcase}} == nil) { return nil; } {{/_type}} {{#_type.maxLength}} -if (tmp{{capitalizeVarName}}.length > {{_type.maxLength}}) { +if (tmp{{#_upper_camelcase}}{{varName}}{{/_upper_camelcase}}.length > {{_type.maxLength}}) { NSDictionary *userInfo = @{@"propertyName" : @"{{_type.name}}", @"key" : @"{{_type.name}}", @"reason" : @"max length validation error", @@ -22,7 +22,7 @@ if (tmp{{capitalizeVarName}}.length > {{_type.maxLength}}) { } {{/_type.maxLength}} {{#_type.minLength}} -if (tmp{{capitalizeVarName}}.length < {{_type.minLength}}) { +if (tmp{{#_upper_camelcase}}{{varName}}{{/_upper_camelcase}}.length < {{_type.minLength}}) { NSDictionary *userInfo = @{@"propertyName" : @"{{_type.name}}", @"key" : @"{{_type.name}}", @"reason" : @"min length validation error", @@ -35,7 +35,7 @@ if (tmp{{capitalizeVarName}}.length < {{_type.minLength}}) { {{/_type.minLength}} {{! to finish need to pass customClass regex...}} {{#_type.regex}} -if (tmp{{capitalizeVarName}} && [tmp{{capitalizeVarName}} matchesRegExString:@"{{& _type.regex}}"] == NO) { +if (tmp{{#_upper_camelcase}}{{varName}}{{/_upper_camelcase}} && [tmp{{#_upper_camelcase}}{{varName}}{{/_upper_camelcase}} matchesRegExString:@"{{& _type.regex}}"] == NO) { NSDictionary *userInfo = @{@"propertyName" : @"{{_type.name}}", @"key" : @"{{_type.name}}", @"reason" : @"validation error", @@ -46,4 +46,4 @@ if (tmp{{capitalizeVarName}} && [tmp{{capitalizeVarName}} matchesRegExString:@"{ return nil; } {{/_type.regex}} -return tmp{{capitalizeVarName}}; +return tmp{{#_upper_camelcase}}{{varName}}{{/_upper_camelcase}}; From 5549b4be45b3f127483325410aff055881c6fdde Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Franc=CC=A7ois=20Benaiteau?= <francois.benaiteau@sinnerschrader-mobile.com> Date: Tue, 20 May 2014 12:09:19 +0200 Subject: [PATCH 138/149] remove sub key value for min/maxLength,min/maxValue, min/maxCount, regex --- metajson/ObjectiveCCodeGenerator.py | 14 +++++++------- .../AbstractInterfaceFiles/__CLASSNAME_.m.mustache | 14 +++++++------- 2 files changed, 14 insertions(+), 14 deletions(-) diff --git a/metajson/ObjectiveCCodeGenerator.py b/metajson/ObjectiveCCodeGenerator.py index 4ea836b..c9f8e2e 100755 --- a/metajson/ObjectiveCCodeGenerator.py +++ b/metajson/ObjectiveCCodeGenerator.py @@ -220,33 +220,33 @@ def process_properties(self, propObj, undefined = False) : if propObj.rootBaseType() == "string": hasRegex, regex = propObj.getRegex() if hasRegex: - propertyHash['regex'] = {"value": regex} + propertyHash['regex'] = regex hasMax, maxLength = propObj.getMaxLength() if hasMax: - propertyHash['maxLength'] = {"value": maxLength} + propertyHash['maxLength'] = maxLength hasMin, minLength = propObj.getMinLength() if hasMin: - propertyHash['minLength'] = {"value": minLength} + propertyHash['minLength'] = minLength if propObj.rootBaseType() == "number": hasMax, maxLength = propObj.getMaxValue() if hasMax: - propertyHash['maxValue'] = {"value": maxLength} + propertyHash['maxValue'] = maxLength hasMin, minLength = propObj.getMinValue() if hasMin: - propertyHash['minValue'] = {"value": minLength} + propertyHash['minValue'] = minLength if propObj.rootBaseType() == "array": hasMax, maxLength = propObj.getMaxCount() if hasMax: - propertyHash['maxCount'] = {"value": maxLength} + propertyHash['maxCount'] = maxLength hasMin, minLength = propObj.getMinCount() if hasMin: - propertyHash['minCount'] = {"value": minLength} + propertyHash['minCount'] = minLength # dealing with array property if propObj.rootBaseType() == "multi": diff --git a/metajson/templates/iOS/AbstractInterfaceFiles/__CLASSNAME_.m.mustache b/metajson/templates/iOS/AbstractInterfaceFiles/__CLASSNAME_.m.mustache index 2258cd0..f2e2f8a 100644 --- a/metajson/templates/iOS/AbstractInterfaceFiles/__CLASSNAME_.m.mustache +++ b/metajson/templates/iOS/AbstractInterfaceFiles/__CLASSNAME_.m.mustache @@ -37,7 +37,7 @@ return self; } {{#maxValue}} - if (self.{{varName}}.length > {{value}}) { + if (self.{{varName}}.length > {{maxValue}}) { NSDictionary *userInfo = @{@"propertyName" : @"{{varName}}", @"key" : @"{{name}}", @"reason" : @"max value validation error", @@ -49,7 +49,7 @@ } {{/maxValue}} {{#minValue}} - if (self.{{varName}}.length < {{value}}) { + if (self.{{varName}}.length < {{minValue}}) { NSDictionary *userInfo = @{@"propertyName" : @"{{varName}}", @"key" : @"{{name}}", @"reason" : @"min value validation error", @@ -67,7 +67,7 @@ return self; } {{#regex}} - if (self.{{varName}} && [self.{{varName}} matchesRegExString:@"{{& value}}"] == NO) { + if (self.{{varName}} && [self.{{varName}} matchesRegExString:@"{{& regex}}"] == NO) { NSDictionary *userInfo = @{@"propertyName" : @"{{varName}}", @"key" : @"{{name}}", @"reason" : @"validation error", @@ -79,7 +79,7 @@ } {{/regex}} {{#maxLength}} - if (self.{{varName}}.length > {{value}}) { + if (self.{{varName}}.length > {{maxLength}}) { NSDictionary *userInfo = @{@"propertyName" : @"{{varName}}", @"key" : @"{{name}}", @"reason" : @"max length validation error", @@ -91,7 +91,7 @@ } {{/maxLength}} {{#minLength}} - if (self.{{varName}}.length < {{value}}) { + if (self.{{varName}}.length < {{minLength}}) { NSDictionary *userInfo = @{@"propertyName" : @"{{varName}}", @"key" : @"{{name}}", @"reason" : @"min length validation error", @@ -182,7 +182,7 @@ {{/hasAnyType}} {{/hasOneSubtype}} {{#maxCount}} - if (self.{{varName}}.count > {{value}}) { + if (self.{{varName}}.count > {{maxCount}}) { NSDictionary *userInfo = @{@"propertyName" : @"{{varName}}", @"key" : @"{{name}}", @"reason" : @"max count validation error", @@ -194,7 +194,7 @@ } {{/maxCount}} {{#minCount}} - if (self.{{varName}}.count < {{value}}) { + if (self.{{varName}}.count < {{minCount}}) { NSDictionary *userInfo = @{@"propertyName" : @"{{varName}}", @"key" : @"{{name}}", @"reason" : @"min count validation error", From 3af890a472b9c9c616b3854867a19d69db91f5a3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Franc=CC=A7ois=20Benaiteau?= <francois.benaiteau@sinnerschrader-mobile.com> Date: Tue, 20 May 2014 12:12:04 +0200 Subject: [PATCH 139/149] projectPrefix becomes prefix --- metajson/ObjectiveCCodeGenerator.py | 2 +- .../__CLASSNAME_.m.mustache | 54 +++++++++---------- .../string_property.mustache | 6 +-- 3 files changed, 31 insertions(+), 31 deletions(-) diff --git a/metajson/ObjectiveCCodeGenerator.py b/metajson/ObjectiveCCodeGenerator.py index c9f8e2e..39013ca 100755 --- a/metajson/ObjectiveCCodeGenerator.py +++ b/metajson/ObjectiveCCodeGenerator.py @@ -300,7 +300,7 @@ def render(self, schemeObj, template_content) : if(len(classes) > 0): custom_classes.extend(classes) - hashParams = {"date": str(today.year), "projectPrefix": schemeObj.projectPrefix,"machineClassName": schemeObj.getMachineClassName(), "humanClassName": schemeObj.getClassName(), "varName": self.makeVarName(schemeObj), "stringProperties": stringProps, "numberProperties": numberProps, "booleanProperties": booleanProps, "dataProperties": dataProps, "dateProperties": dateProps, "arrayProperties": arrayProps, "undefinedProperties": undefineProps, "objectProperties": objectProps} + hashParams = {"date": str(today.year), "prefix": schemeObj.projectPrefix,"machineClassName": schemeObj.getMachineClassName(), "humanClassName": schemeObj.getClassName(), "varName": self.makeVarName(schemeObj), "stringProperties": stringProps, "numberProperties": numberProps, "booleanProperties": booleanProps, "dataProperties": dataProps, "dateProperties": dateProps, "arrayProperties": arrayProps, "undefinedProperties": undefineProps, "objectProperties": objectProps} hashParams["custom_classes"] = [] for classname in custom_classes: if classname not in hashParams["custom_classes"]: diff --git a/metajson/templates/iOS/AbstractInterfaceFiles/__CLASSNAME_.m.mustache b/metajson/templates/iOS/AbstractInterfaceFiles/__CLASSNAME_.m.mustache index f2e2f8a..81ce8c8 100644 --- a/metajson/templates/iOS/AbstractInterfaceFiles/__CLASSNAME_.m.mustache +++ b/metajson/templates/iOS/AbstractInterfaceFiles/__CLASSNAME_.m.mustache @@ -4,7 +4,7 @@ // Created by MetaJSONParser. // Copyright (c) {{date}} SinnerSchrader Mobile. All rights reserved. -#import "{{projectPrefix}}APIParser.h" +#import "{{prefix}}APIParser.h" #import "NSString+RegExValidation.h" #import "{{humanClassName}}.h" {{#custom_classes}} @@ -32,7 +32,7 @@ {{/baseTypeIsObject}} if (self) { {{#numberProperties}} - self.{{varName}} = [{{projectPrefix}}APIParser numberFromResponseDictionary:dic forKey:@"{{name}}" acceptNil:{{#required}}NO{{/required}}{{^required}}YES{{/required}} error:error]; + self.{{varName}} = [{{prefix}}APIParser numberFromResponseDictionary:dic forKey:@"{{name}}" acceptNil:{{#required}}NO{{/required}}{{^required}}YES{{/required}} error:error]; if (*error) { return self; } @@ -43,7 +43,7 @@ @"reason" : @"max value validation error", @"objectClass" : NSStringFromClass([self class]) }; - *error = [NSError errorWithDomain:k{{projectPrefix}}ErrorDomain_parser code:k{{projectPrefix}}ErrorDomain_parser_valueIsNotValid userInfo:userInfo]; + *error = [NSError errorWithDomain:k{{prefix}}ErrorDomain_parser code:k{{prefix}}ErrorDomain_parser_valueIsNotValid userInfo:userInfo]; NSLog(@"%@", *error); return self; } @@ -55,14 +55,14 @@ @"reason" : @"min value validation error", @"objectClass" : NSStringFromClass([self class]) }; - *error = [NSError errorWithDomain:k{{projectPrefix}}ErrorDomain_parser code:k{{projectPrefix}}ErrorDomain_parser_valueIsNotValid userInfo:userInfo]; + *error = [NSError errorWithDomain:k{{prefix}}ErrorDomain_parser code:k{{prefix}}ErrorDomain_parser_valueIsNotValid userInfo:userInfo]; NSLog(@"%@", *error); return self; } {{/minValue}} {{/numberProperties}} {{#stringProperties}} - self.{{varName}} = [{{projectPrefix}}APIParser stringFromResponseDictionary:dic forKey:@"{{name}}" acceptNumber:NO acceptNil:{{#required}}NO{{/required}}{{^required}}YES{{/required}} error:error]; + self.{{varName}} = [{{prefix}}APIParser stringFromResponseDictionary:dic forKey:@"{{name}}" acceptNumber:NO acceptNil:{{#required}}NO{{/required}}{{^required}}YES{{/required}} error:error]; if (*error) { return self; } @@ -73,7 +73,7 @@ @"reason" : @"validation error", @"objectClass" : NSStringFromClass([self class]) }; - *error = [NSError errorWithDomain:k{{projectPrefix}}ErrorDomain_parser code:k{{projectPrefix}}ErrorDomain_parser_valueIsNotValid userInfo:userInfo]; + *error = [NSError errorWithDomain:k{{prefix}}ErrorDomain_parser code:k{{prefix}}ErrorDomain_parser_valueIsNotValid userInfo:userInfo]; NSLog(@"%@", *error); return self; } @@ -85,7 +85,7 @@ @"reason" : @"max length validation error", @"objectClass" : NSStringFromClass([self class]) }; - *error = [NSError errorWithDomain:k{{projectPrefix}}ErrorDomain_parser code:k{{projectPrefix}}ErrorDomain_parser_valueIsNotValid userInfo:userInfo]; + *error = [NSError errorWithDomain:k{{prefix}}ErrorDomain_parser code:k{{prefix}}ErrorDomain_parser_valueIsNotValid userInfo:userInfo]; NSLog(@"%@", *error); return self; } @@ -97,59 +97,59 @@ @"reason" : @"min length validation error", @"objectClass" : NSStringFromClass([self class]) }; - *error = [NSError errorWithDomain:k{{projectPrefix}}ErrorDomain_parser code:k{{projectPrefix}}ErrorDomain_parser_valueIsNotValid userInfo:userInfo]; + *error = [NSError errorWithDomain:k{{prefix}}ErrorDomain_parser code:k{{prefix}}ErrorDomain_parser_valueIsNotValid userInfo:userInfo]; NSLog(@"%@", *error); return self; } {{/minLength}} {{/stringProperties}} {{#booleanProperties}} - self.{{varName}} = [{{projectPrefix}}APIParser boolFromResponseDictionary:dic forKey:@"{{name}}" acceptNil:{{#required}}NO{{/required}}{{^required}}YES{{/required}} error:error]; + self.{{varName}} = [{{prefix}}APIParser boolFromResponseDictionary:dic forKey:@"{{name}}" acceptNil:{{#required}}NO{{/required}}{{^required}}YES{{/required}} error:error]; if (*error) { return self; } {{/booleanProperties}} {{#dataProperties}} - self.{{varName}} = [{{projectPrefix}}APIParser dataFromResponseDictionary:dic forKey:@"{{name}}" acceptNil:{{#required}}NO{{/required}}{{^required}}YES{{/required}} error:error]; + self.{{varName}} = [{{prefix}}APIParser dataFromResponseDictionary:dic forKey:@"{{name}}" acceptNil:{{#required}}NO{{/required}}{{^required}}YES{{/required}} error:error]; if (*error) { return self; } {{/dataProperties}} {{#dateProperties}} - self.{{varName}} = [{{projectPrefix}}APIParser dateWithTimeIntervalFromResponseDictionary:dic forKey:@"{{name}}" acceptNil:{{#required}}NO{{/required}}{{^required}}YES{{/required}} error:error]; + self.{{varName}} = [{{prefix}}APIParser dateWithTimeIntervalFromResponseDictionary:dic forKey:@"{{name}}" acceptNil:{{#required}}NO{{/required}}{{^required}}YES{{/required}} error:error]; if (*error) { return self; } {{/dateProperties}} {{#arrayProperties}} {{^hasOneSubtype}} - self.{{varName}} = [{{projectPrefix}}APIParser arrayFromResponseDictionary:dic forKey:@"{{name}}" acceptNil:{{#required}}NO{{/required}}{{^required}}YES{{/required}} error:error]; + self.{{varName}} = [{{prefix}}APIParser arrayFromResponseDictionary:dic forKey:@"{{name}}" acceptNil:{{#required}}NO{{/required}}{{^required}}YES{{/required}} error:error]; if (*error) { return self; } {{/hasOneSubtype}} {{#hasOneSubtype}} {{#hasAnyType}} - self.{{varName}} = [{{projectPrefix}}APIParser arrayFromResponseDictionary:dic forKey:@"{{name}}" acceptNil:{{#required}}NO{{/required}}{{^required}}YES{{/required}} error:error]; + self.{{varName}} = [{{prefix}}APIParser arrayFromResponseDictionary:dic forKey:@"{{name}}" acceptNil:{{#required}}NO{{/required}}{{^required}}YES{{/required}} error:error]; if (*error) { return self; } {{/hasAnyType}} {{^hasAnyType}} - NSArray *tmp{{#_upper_camelcase}}{{varName}}{{/_upper_camelcase}}Array = [{{projectPrefix}}APIParser arrayFromResponseDictionary:dic forKey:@"{{name}}" acceptNil:{{#required}}NO{{/required}}{{^required}}YES{{/required}} error:error]; + NSArray *tmp{{#_upper_camelcase}}{{varName}}{{/_upper_camelcase}}Array = [{{prefix}}APIParser arrayFromResponseDictionary:dic forKey:@"{{name}}" acceptNil:{{#required}}NO{{/required}}{{^required}}YES{{/required}} error:error]; if (*error) { return self; } NSMutableArray *tmp{{#_upper_camelcase}}{{varName}}{{/_upper_camelcase}} = [[NSMutableArray alloc] initWithCapacity:tmp{{#_upper_camelcase}}{{varName}}{{/_upper_camelcase}}Array.count]; for (NSUInteger loop = 0; loop < tmp{{#_upper_camelcase}}{{varName}}{{/_upper_camelcase}}Array.count; loop++) { {{#hasStringType}} - NSString *tmpValue = [{{projectPrefix}}APIParser stringFromResponseArray:tmp{{#_upper_camelcase}}{{varName}}{{/_upper_camelcase}}Array atIndex:loop acceptNil:{{#required}}NO{{/required}}{{^required}}YES{{/required}} error:error]; + NSString *tmpValue = [{{prefix}}APIParser stringFromResponseArray:tmp{{#_upper_camelcase}}{{varName}}{{/_upper_camelcase}}Array atIndex:loop acceptNil:{{#required}}NO{{/required}}{{^required}}YES{{/required}} error:error]; {{/hasStringType}} {{#hasNumberType}} - NSNumber *tmpValue = [{{projectPrefix}}APIParser numberFromResponseArray:tmp{{#_upper_camelcase}}{{varName}}{{/_upper_camelcase}}Array atIndex:loop acceptNil:{{#required}}NO{{/required}}{{^required}}YES{{/required}} error:error]; + NSNumber *tmpValue = [{{prefix}}APIParser numberFromResponseArray:tmp{{#_upper_camelcase}}{{varName}}{{/_upper_camelcase}}Array atIndex:loop acceptNil:{{#required}}NO{{/required}}{{^required}}YES{{/required}} error:error]; {{/hasNumberType}} {{#hasDateType}} - NSDate *tmpValue = [{{projectPrefix}}APIParser dateFromResponseArray:tmp{{#_upper_camelcase}}{{varName}}{{/_upper_camelcase}}Array atIndex:loop acceptNil:{{#required}}NO{{/required}}{{^required}}YES{{/required}} error:error]; + NSDate *tmpValue = [{{prefix}}APIParser dateFromResponseArray:tmp{{#_upper_camelcase}}{{varName}}{{/_upper_camelcase}}Array atIndex:loop acceptNil:{{#required}}NO{{/required}}{{^required}}YES{{/required}} error:error]; {{/hasDateType}} {{^hasCustomType}} if (*error) { @@ -188,7 +188,7 @@ @"reason" : @"max count validation error", @"objectClass" : NSStringFromClass([self class]) }; - *error = [NSError errorWithDomain:k{{projectPrefix}}ErrorDomain_parser code:k{{projectPrefix}}ErrorDomain_parser_valueIsNotValid userInfo:userInfo]; + *error = [NSError errorWithDomain:k{{prefix}}ErrorDomain_parser code:k{{prefix}}ErrorDomain_parser_valueIsNotValid userInfo:userInfo]; NSLog(@"%@", *error); return self; } @@ -200,7 +200,7 @@ @"reason" : @"min count validation error", @"objectClass" : NSStringFromClass([self class]) }; - *error = [NSError errorWithDomain:k{{projectPrefix}}ErrorDomain_parser code:k{{projectPrefix}}ErrorDomain_parser_valueIsNotValid userInfo:userInfo]; + *error = [NSError errorWithDomain:k{{prefix}}ErrorDomain_parser code:k{{prefix}}ErrorDomain_parser_valueIsNotValid userInfo:userInfo]; NSLog(@"%@", *error); return self; } @@ -261,7 +261,7 @@ - (NSNumber *){{subtype}}In{{#_upper_camelcase}}{{varName}}{{/_upper_camelcase}}AtIndex:(NSUInteger)index withError:(NSError **)error { - NSNumber *tmp{{#_upper_camelcase}}{{varName}}{{/_upper_camelcase}} = [{{projectPrefix}}APIParser numberFromResponseArray:self.{{varName}} atIndex:index acceptNil:{{#required}}NO{{/required}}{{^required}}YES{{/required}} error:error]; + NSNumber *tmp{{#_upper_camelcase}}{{varName}}{{/_upper_camelcase}} = [{{prefix}}APIParser numberFromResponseArray:self.{{varName}} atIndex:index acceptNil:{{#required}}NO{{/required}}{{^required}}YES{{/required}} error:error]; if (*error) { return nil; } @@ -274,7 +274,7 @@ - (NSString *){{subtype}}In{{#_upper_camelcase}}{{varName}}{{/_upper_camelcase}}AtIndex:(NSUInteger)index withError:(NSError **)error { - NSString *tmp{{#_upper_camelcase}}{{varName}}{{/_upper_camelcase}} = [{{projectPrefix}}APIParser stringFromResponseArray:self.{{varName}} atIndex:index acceptNil:{{#required}}NO{{/required}}{{^required}}YES{{/required}} error:error]; + NSString *tmp{{#_upper_camelcase}}{{varName}}{{/_upper_camelcase}} = [{{prefix}}APIParser stringFromResponseArray:self.{{varName}} atIndex:index acceptNil:{{#required}}NO{{/required}}{{^required}}YES{{/required}} error:error]; if (*error) { return nil; } @@ -285,7 +285,7 @@ @"reason" : @"max length validation error", @"objectClass" : NSStringFromClass([self class]) }; - *error = [NSError errorWithDomain:k{{projectPrefix}}ErrorDomain_parser code:k{{projectPrefix}}ErrorDomain_parser_valueIsNotValid userInfo:userInfo]; + *error = [NSError errorWithDomain:k{{prefix}}ErrorDomain_parser code:k{{prefix}}ErrorDomain_parser_valueIsNotValid userInfo:userInfo]; NSLog(@"%@", *error); return nil; } @@ -297,7 +297,7 @@ @"reason" : @"min length validation error", @"objectClass" : NSStringFromClass([self class]) }; - *error = [NSError errorWithDomain:k{{projectPrefix}}ErrorDomain_parser code:k{{projectPrefix}}ErrorDomain_parser_valueIsNotValid userInfo:userInfo]; + *error = [NSError errorWithDomain:k{{prefix}}ErrorDomain_parser code:k{{prefix}}ErrorDomain_parser_valueIsNotValid userInfo:userInfo]; NSLog(@"%@", *error); return nil; } @@ -310,7 +310,7 @@ @"reason" : @"validation error", @"objectClass" : NSStringFromClass([self class]) }; - *error = [NSError errorWithDomain:k{{projectPrefix}}ErrorDomain_parser code:k{{projectPrefix}}ErrorDomain_parser_valueIsNotValid userInfo:userInfo]; + *error = [NSError errorWithDomain:k{{prefix}}ErrorDomain_parser code:k{{prefix}}ErrorDomain_parser_valueIsNotValid userInfo:userInfo]; NSLog(@"%@", *error); return nil; } @@ -324,7 +324,7 @@ - (BOOL){{subtype}}In{{#_upper_camelcase}}{{varName}}{{/_upper_camelcase}}AtIndex:(NSUInteger)index withError:(NSError **)error { - BOOL tmp{{#_upper_camelcase}}{{varName}}{{/_upper_camelcase}} = [{{projectPrefix}}APIParser boolFromResponseArray:self.{{varName}} atIndex:index acceptNil:{{#required}}NO{{/required}}{{^required}}YES{{/required}} error:error]; + BOOL tmp{{#_upper_camelcase}}{{varName}}{{/_upper_camelcase}} = [{{prefix}}APIParser boolFromResponseArray:self.{{varName}} atIndex:index acceptNil:{{#required}}NO{{/required}}{{^required}}YES{{/required}} error:error]; if (*error) { return nil; } @@ -337,7 +337,7 @@ - (NSDate *){{subtype}}In{{#_upper_camelcase}}{{varName}}{{/_upper_camelcase}}AtIndex:(NSUInteger)index withError:(NSError **)error { - NSDate *tmp{{#_upper_camelcase}}{{varName}}{{/_upper_camelcase}} = [{{projectPrefix}}APIParser dateWithTimeIntervalFromResponseArray:self.{{varName}} atIndex:index acceptNil:{{#required}}NO{{/required}}{{^required}}YES{{/required}} error:error]; + NSDate *tmp{{#_upper_camelcase}}{{varName}}{{/_upper_camelcase}} = [{{prefix}}APIParser dateWithTimeIntervalFromResponseArray:self.{{varName}} atIndex:index acceptNil:{{#required}}NO{{/required}}{{^required}}YES{{/required}} error:error]; if (*error) { return nil; } @@ -350,7 +350,7 @@ - (NSData*){{subtype}}In{{#_upper_camelcase}}{{varName}}{{/_upper_camelcase}}AtIndex:(NSUInteger)index withError:(NSError **)error { - NSData* tmp{{#_upper_camelcase}}{{varName}}{{/_upper_camelcase}} = [{{projectPrefix}}APIParser dataFromResponseArray:self.{{varName}} atIndex:index acceptNil:{{#required}}NO{{/required}}{{^required}}YES{{/required}} error:error]; + NSData* tmp{{#_upper_camelcase}}{{varName}}{{/_upper_camelcase}} = [{{prefix}}APIParser dataFromResponseArray:self.{{varName}} atIndex:index acceptNil:{{#required}}NO{{/required}}{{^required}}YES{{/required}} error:error]; if (*error) { return nil; } diff --git a/metajson/templates/iOS/AbstractInterfaceFiles/string_property.mustache b/metajson/templates/iOS/AbstractInterfaceFiles/string_property.mustache index dbf24d2..1e7eea1 100644 --- a/metajson/templates/iOS/AbstractInterfaceFiles/string_property.mustache +++ b/metajson/templates/iOS/AbstractInterfaceFiles/string_property.mustache @@ -16,7 +16,7 @@ if (tmp{{#_upper_camelcase}}{{varName}}{{/_upper_camelcase}}.length > {{_type.ma @"reason" : @"max length validation error", @"objectClass" : NSStringFromClass([self class]) }; - *error = [NSError errorWithDomain:k{{projectPrefix}}ErrorDomain_parser code:k{{projectPrefix}}ErrorDomain_parser_valueIsNotValid userInfo:userInfo]; + *error = [NSError errorWithDomain:k{{prefix}}ErrorDomain_parser code:k{{prefix}}ErrorDomain_parser_valueIsNotValid userInfo:userInfo]; NSLog(@"%@", *error); return nil; } @@ -28,7 +28,7 @@ if (tmp{{#_upper_camelcase}}{{varName}}{{/_upper_camelcase}}.length < {{_type.mi @"reason" : @"min length validation error", @"objectClass" : NSStringFromClass([self class]) }; - *error = [NSError errorWithDomain:k{{projectPrefix}}ErrorDomain_parser code:k{{projectPrefix}}ErrorDomain_parser_valueIsNotValid userInfo:userInfo]; + *error = [NSError errorWithDomain:k{{prefix}}ErrorDomain_parser code:k{{prefix}}ErrorDomain_parser_valueIsNotValid userInfo:userInfo]; NSLog(@"%@", *error); return nil; } @@ -41,7 +41,7 @@ if (tmp{{#_upper_camelcase}}{{varName}}{{/_upper_camelcase}} && [tmp{{#_upper_ca @"reason" : @"validation error", @"objectClass" : NSStringFromClass([self class]) }; - *error = [NSError errorWithDomain:k{{projectPrefix}}ErrorDomain_parser code:k{{projectPrefix}}ErrorDomain_parser_valueIsNotValid userInfo:userInfo]; + *error = [NSError errorWithDomain:k{{prefix}}ErrorDomain_parser code:k{{prefix}}ErrorDomain_parser_valueIsNotValid userInfo:userInfo]; NSLog(@"%@", *error); return nil; } From 587648ca5b97609a5120486d5742512584b16e3b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Franc=CC=A7ois=20Benaiteau?= <francois.benaiteau@sinnerschrader-mobile.com> Date: Tue, 20 May 2014 12:14:00 +0200 Subject: [PATCH 140/149] remove template keys csv, see wiki --- template_keys.csv | 64 ----------------------------------------------- 1 file changed, 64 deletions(-) delete mode 100644 template_keys.csv diff --git a/template_keys.csv b/template_keys.csv deleted file mode 100644 index 3a2a63d..0000000 --- a/template_keys.csv +++ /dev/null @@ -1,64 +0,0 @@ -KEYS, metaJSON, comments -projectPrefix, prefix, command arguments -date,, -humanClassName,name, -machineClassName,name, -,, -baseTypeIsObject,base-type, -baseClassName, base-type, -custom_classes, base-type, go through base-type of properties -,, -numberProperties, property, -stringProperties, property, -booleanProperties, property, -dataProperties, property, -dateProperties, property, -arrayProperties, property, -objectProperties, property, -undefinedProperties, property, -,, -comment, description, -varName, name, -variableName, name, -capitalizeVarName, name, -name, name, -required, required, -maxValue, maxValue, -maxValue.value, maxValue, -minValue, minValue, -minValue.value, minValue, -regex, regex, -regex.value, regex, -maxLength, maxLength, -maxLength.value, maxLength, -minLength, minLength, -minLength.value, minLength, -maxCount, maxCount, -maxCount.value, maxCount, -minCount, minCount, -minCount.value, minCount, -,, -hasOneSubtype, subType, -hasMultipleSubtypes, subType, -hasNoBasetypes, subType, -,, -hasCustomType, base-type, -hasAnyType, base-type, -hasStringType, base-type, -hasNumberType, base-type, -hasDateType, base-type, -hasDataType, base-type, -hasBooleanType, base-type, -,, -subtypes, subType, -subtypes.subtype, subType, -subtypes._subtype, subType, -subtypes.className, subType, -,, -types, base-type, -types.type, base-type, -types._type, base-type, reference full object definition -types.className, base-type, and also name -,, -,, -_upper_camelcase,,fonction to transform a string From d102ecda8d7572181ee5bc05cb25c1a3cd62c187 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Franc=CC=A7ois=20Benaiteau?= <francois.benaiteau@sinnerschrader-mobile.com> Date: Tue, 20 May 2014 13:18:20 +0200 Subject: [PATCH 141/149] replace {{humanClassName}} and {{machineClassName}} --- metajson/ObjectiveCCodeGenerator.py | 2 +- .../iOS/AbstractInterfaceFiles/__CLASSNAME_.h.mustache | 10 +++++----- .../iOS/AbstractInterfaceFiles/__CLASSNAME_.m.mustache | 10 +++++----- metajson/templates/iOS/_CLASSNAME_.h.mustache | 6 +++--- metajson/templates/iOS/_CLASSNAME_.m.mustache | 8 ++++---- 5 files changed, 18 insertions(+), 18 deletions(-) diff --git a/metajson/ObjectiveCCodeGenerator.py b/metajson/ObjectiveCCodeGenerator.py index 39013ca..8fe4e44 100755 --- a/metajson/ObjectiveCCodeGenerator.py +++ b/metajson/ObjectiveCCodeGenerator.py @@ -300,7 +300,7 @@ def render(self, schemeObj, template_content) : if(len(classes) > 0): custom_classes.extend(classes) - hashParams = {"date": str(today.year), "prefix": schemeObj.projectPrefix,"machineClassName": schemeObj.getMachineClassName(), "humanClassName": schemeObj.getClassName(), "varName": self.makeVarName(schemeObj), "stringProperties": stringProps, "numberProperties": numberProps, "booleanProperties": booleanProps, "dataProperties": dataProps, "dateProperties": dateProps, "arrayProperties": arrayProps, "undefinedProperties": undefineProps, "objectProperties": objectProps} + hashParams = {"date": str(today.year), "suffix": schemeObj.objectSuffix, "prefix": schemeObj.projectPrefix, "name": schemeObj.type_name, "varName": self.makeVarName(schemeObj), "stringProperties": stringProps, "numberProperties": numberProps, "booleanProperties": booleanProps, "dataProperties": dataProps, "dateProperties": dateProps, "arrayProperties": arrayProps, "undefinedProperties": undefineProps, "objectProperties": objectProps} hashParams["custom_classes"] = [] for classname in custom_classes: if classname not in hashParams["custom_classes"]: diff --git a/metajson/templates/iOS/AbstractInterfaceFiles/__CLASSNAME_.h.mustache b/metajson/templates/iOS/AbstractInterfaceFiles/__CLASSNAME_.h.mustache index b873df8..85ec9ee 100644 --- a/metajson/templates/iOS/AbstractInterfaceFiles/__CLASSNAME_.h.mustache +++ b/metajson/templates/iOS/AbstractInterfaceFiles/__CLASSNAME_.h.mustache @@ -1,5 +1,5 @@ // -// {{machineClassName}}.h +// _{{prefix}}{{#_upper_camelcase}}{{name}}{{/_upper_camelcase}}{{suffix}}.h // // Created by MetaJSONParser. // Copyright (c) {{date}} SinnerSchrader Mobile. All rights reserved. @@ -12,13 +12,13 @@ {{#custom_classes}} @class {{.}}; {{/custom_classes}} -@class {{humanClassName}}; +@class {{prefix}}{{#_upper_camelcase}}{{varName}}{{/_upper_camelcase}}{{suffix}}; {{#baseTypeIsObject}} -@interface {{machineClassName}} : NSObject <NSCoding> +@interface _{{prefix}}{{#_upper_camelcase}}{{name}}{{/_upper_camelcase}}{{suffix}} : NSObject <NSCoding> {{/baseTypeIsObject}} {{^baseTypeIsObject}} -@interface {{machineClassName}} : {{baseClassName}} +@interface _{{prefix}}{{#_upper_camelcase}}{{name}}{{/_upper_camelcase}}{{suffix}} : {{baseClassName}} {{/baseTypeIsObject}} {{#numberProperties}} @@ -70,7 +70,7 @@ @property (nonatomic, strong) id {{varName}}; {{/undefinedProperties}} -+ ({{humanClassName}} *){{varName}}WithDictionary:(NSDictionary *)dic withError:(NSError **)error; ++ ({{prefix}}{{#_upper_camelcase}}{{varName}}{{/_upper_camelcase}}{{suffix}} *){{varName}}WithDictionary:(NSDictionary *)dic withError:(NSError **)error; - (id)initWithDictionary:(NSDictionary *)dic withError:(NSError **)error; {{#baseTypeIsObject}} - (NSDictionary *)propertyDictionary; diff --git a/metajson/templates/iOS/AbstractInterfaceFiles/__CLASSNAME_.m.mustache b/metajson/templates/iOS/AbstractInterfaceFiles/__CLASSNAME_.m.mustache index 81ce8c8..17ec4dd 100644 --- a/metajson/templates/iOS/AbstractInterfaceFiles/__CLASSNAME_.m.mustache +++ b/metajson/templates/iOS/AbstractInterfaceFiles/__CLASSNAME_.m.mustache @@ -1,24 +1,24 @@ // -// {{machineClassName}}.m +// _{{prefix}}{{#_upper_camelcase}}{{name}}{{/_upper_camelcase}}{{suffix}}.m // // Created by MetaJSONParser. // Copyright (c) {{date}} SinnerSchrader Mobile. All rights reserved. #import "{{prefix}}APIParser.h" #import "NSString+RegExValidation.h" -#import "{{humanClassName}}.h" +#import "{{prefix}}{{#_upper_camelcase}}{{name}}{{/_upper_camelcase}}{{suffix}}.h" {{#custom_classes}} #import "{{.}}.h" {{/custom_classes}} -@implementation {{machineClassName}} +@implementation _{{prefix}}{{#_upper_camelcase}}{{name}}{{/_upper_camelcase}}{{suffix}} #pragma mark - factory -+ ({{humanClassName}} *){{varName}}WithDictionary:(NSDictionary *)dic withError:(NSError **)error ++ ({{prefix}}{{#_upper_camelcase}}{{name}}{{/_upper_camelcase}}{{suffix}} *){{varName}}WithDictionary:(NSDictionary *)dic withError:(NSError **)error { - return [[{{humanClassName}} alloc] initWithDictionary:dic withError:error]; + return [[{{prefix}}{{#_upper_camelcase}}{{varName}}{{/_upper_camelcase}}{{suffix}} alloc] initWithDictionary:dic withError:error]; } #pragma mark - initialize diff --git a/metajson/templates/iOS/_CLASSNAME_.h.mustache b/metajson/templates/iOS/_CLASSNAME_.h.mustache index 5ed18b6..1a1bb94 100644 --- a/metajson/templates/iOS/_CLASSNAME_.h.mustache +++ b/metajson/templates/iOS/_CLASSNAME_.h.mustache @@ -1,10 +1,10 @@ // -// {{humanClassName}}.h +// {{prefix}}{{#_upper_camelcase}}{{varName}}{{/_upper_camelcase}}{{suffix}}.h // // Created by MetaJSONParser. // Copyright (c) {{date}} SinnerSchrader Mobile. All rights reserved. -#import "{{machineClassName}}.h" -@interface {{humanClassName}} : {{machineClassName}} +#import "_{{prefix}}{{#_upper_camelcase}}{{varName}}{{/_upper_camelcase}}{{suffix}}.h" +@interface {{prefix}}{{#_upper_camelcase}}{{varName}}{{/_upper_camelcase}}{{suffix}} : _{{prefix}}{{#_upper_camelcase}}{{varName}}{{/_upper_camelcase}}{{suffix}} @end diff --git a/metajson/templates/iOS/_CLASSNAME_.m.mustache b/metajson/templates/iOS/_CLASSNAME_.m.mustache index 94bad0f..7601b88 100644 --- a/metajson/templates/iOS/_CLASSNAME_.m.mustache +++ b/metajson/templates/iOS/_CLASSNAME_.m.mustache @@ -1,15 +1,15 @@ // -// {{humanClassName}}.m +// {{prefix}}{{#_upper_camelcase}}{{varName}}{{/_upper_camelcase}}{{suffix}}.m // // Created by MetaJSONParser. // Copyright (c) {{date}} SinnerSchrader Mobile. All rights reserved. -#import "{{humanClassName}}.h" +#import "{{prefix}}{{#_upper_camelcase}}{{varName}}{{/_upper_camelcase}}{{suffix}}.h" -@interface {{humanClassName}} () +@interface {{prefix}}{{#_upper_camelcase}}{{varName}}{{/_upper_camelcase}}{{suffix}} () @end -@implementation {{humanClassName}} +@implementation {{prefix}}{{#_upper_camelcase}}{{varName}}{{/_upper_camelcase}}{{suffix}} @end From 1ecb5552e076d68c2903e3e9f79c0d750ba08f70 Mon Sep 17 00:00:00 2001 From: Martin Bober <mbo@sinnerschrader-mobile.com> Date: Mon, 9 Mar 2015 15:22:41 +0100 Subject: [PATCH 142/149] Fixing tests broken due to copyright timestamp All tests have failed since 2015-01-01 because the timestamp at the copyright notice of the generated files differs from the timestamp of reference file's copyright notice which is of 2014. This is fixed by replacing all occurences of the current year in the generated files with "2014". Keep in mind that even new reference files need a timestamp of 2014 for the tests to work. --- test/ObjectiveCCodeGenerator_test.py | 4 +++- test/readJSON_test.py | 4 ++++ 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/test/ObjectiveCCodeGenerator_test.py b/test/ObjectiveCCodeGenerator_test.py index 928607a..b2699c4 100644 --- a/test/ObjectiveCCodeGenerator_test.py +++ b/test/ObjectiveCCodeGenerator_test.py @@ -5,6 +5,7 @@ import unittest import sys import os +import datetime class TestObjectiveCCodeGenerator(unittest.TestCase): def setUp(self): @@ -39,7 +40,8 @@ def machine_source_content(self, schemeObj) : def assert_content_file(self, filename, content): with open(filename, 'r') as content_file: expected_result = content_file.read() - self.assertMultiLineEqual(content, expected_result) + # All reference files have a timestamp of 2014 so we tweak our generated code to match them. + self.assertMultiLineEqual(content.replace(str(datetime.datetime.now().year), "2014"), expected_result) class TestSampleTestClassCase(TestObjectiveCCodeGenerator): def setUp(self): diff --git a/test/readJSON_test.py b/test/readJSON_test.py index c61ab9f..9735b44 100644 --- a/test/readJSON_test.py +++ b/test/readJSON_test.py @@ -1,5 +1,6 @@ import unittest import os +import datetime class TestReadJSON(unittest.TestCase): def setUp(self): @@ -23,6 +24,9 @@ def execute_script(self, json_file, output_dir): # common_file = "/AbstractInterfaceFiles/_SenderList2JSONObject.m" # common_file = "/AbstractInterfaceFiles/_SenderJSONObject.m" # common_file = "/AbstractInterfaceFiles/_SenderGroupJSONObject.m" + + # All timestamps in reference files should be 2014, so we need to tweak our generated files to match them. + os.system("find src -type f -exec sed -r --in-place \"s/%d/2014/g\" {} +" % (datetime.datetime.now().year, ) ) return os.system("diff -r -w -b -B src " + output_dir) # return os.system("diff -r -w -b -B src" + common_file + " " + output_dir + common_file) From 26b628857dce076682d32cb4cc2717b41c1e9f2b Mon Sep 17 00:00:00 2001 From: Martin Bober <mbo@sinnerschrader-mobile.com> Date: Thu, 12 Mar 2015 13:36:45 +0100 Subject: [PATCH 143/149] Added package parameter for Java code generation --- README.md | 1 + metajson/JSONScheme.py | 2 ++ metajson/ObjectiveCCodeGenerator.py | 2 +- metajson/readJSON.py | 12 ++++++++---- metajson/template_code_generator.py | 4 +++- 5 files changed, 15 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index 941245c..36981df 100644 --- a/README.md +++ b/README.md @@ -18,6 +18,7 @@ Options: -i, --input= meta-JSON file to read -o, --output= ouput path of generated source codes (default: src) --template= template directory to use to generate code + --package= name of the generated package (default: none) ``` A working sample call could look like that: diff --git a/metajson/JSONScheme.py b/metajson/JSONScheme.py index d15f3f1..6a0104f 100755 --- a/metajson/JSONScheme.py +++ b/metajson/JSONScheme.py @@ -26,6 +26,7 @@ class JSONScheme : JSONSchemeDic = {} naturalTypeList = ['string', 'array', 'date', 'data', 'boolean', 'number'] projectPrefix = "" + packageName = "" objectSuffix = "JSONObject" type_name = "" key_name = "" @@ -318,6 +319,7 @@ def getBaseTypes(self) : def makeNewScheme(self, jsonDic): newScheme = JSONScheme() newScheme.projectPrefix = self.projectPrefix + newScheme.packageName = self.packageName newScheme.objectSuffix = self.objectSuffix newScheme.domain = self.domain[:] newScheme.domain.append(self.type_name) diff --git a/metajson/ObjectiveCCodeGenerator.py b/metajson/ObjectiveCCodeGenerator.py index 8fe4e44..bbdf9cd 100755 --- a/metajson/ObjectiveCCodeGenerator.py +++ b/metajson/ObjectiveCCodeGenerator.py @@ -300,7 +300,7 @@ def render(self, schemeObj, template_content) : if(len(classes) > 0): custom_classes.extend(classes) - hashParams = {"date": str(today.year), "suffix": schemeObj.objectSuffix, "prefix": schemeObj.projectPrefix, "name": schemeObj.type_name, "varName": self.makeVarName(schemeObj), "stringProperties": stringProps, "numberProperties": numberProps, "booleanProperties": booleanProps, "dataProperties": dataProps, "dateProperties": dateProps, "arrayProperties": arrayProps, "undefinedProperties": undefineProps, "objectProperties": objectProps} + hashParams = {"date": str(today.year), "suffix": schemeObj.objectSuffix, "prefix": schemeObj.projectPrefix, "package": schemeObj.packageName, "name": schemeObj.type_name, "varName": self.makeVarName(schemeObj), "stringProperties": stringProps, "numberProperties": numberProps, "booleanProperties": booleanProps, "dataProperties": dataProps, "dateProperties": dateProps, "arrayProperties": arrayProps, "undefinedProperties": undefineProps, "objectProperties": objectProps} hashParams["custom_classes"] = [] for classname in custom_classes: if classname not in hashParams["custom_classes"]: diff --git a/metajson/readJSON.py b/metajson/readJSON.py index 8e7041c..a4e13b9 100755 --- a/metajson/readJSON.py +++ b/metajson/readJSON.py @@ -42,6 +42,7 @@ def main(argv=sys.argv): # parse Options template_dir = None + packageName = "" jsonfiles = [] inputfile = 'do you have files?' projectPrefix = 'S2M' @@ -51,7 +52,7 @@ def main(argv=sys.argv): argv = sys.argv[1:] try: - opts, args = getopt.getopt(argv,"vhp:s:t:i:o:",["version", "help", "prefix=", "suffix=", "target=", "input=", "output=", "template="]) + opts, args = getopt.getopt(argv,"vhp:s:t:i:o:",["version", "help", "prefix=", "suffix=", "target=", "input=", "output=", "template=", "package="]) except getopt.GetoptError: usage() sys.exit(2) @@ -76,7 +77,8 @@ def main(argv=sys.argv): objectSuffix = "" elif opt in ("--template"): template_dir = arg - + elif opt in ("--package"): + packageName = arg addFiles = False for arg in argv : if arg.endswith(inputfile) : @@ -122,14 +124,15 @@ def main(argv=sys.argv): dirPathToSaveCodes = dirPathToSaveCodes[:-1] if template_dir == None: - template_dir = os.path.join(TemplateCodeGenerator.DEFAULT_TEMPLATE_PATH, target) + template_dir = os.path.join(TemplateCodeGenerator.DEFAULT_TEMPLATE_PATH, "iOS") - templateCodeGen = TemplateCodeGenerator(template_dir, dirPathToSaveCodes, projectPrefix) + templateCodeGen = TemplateCodeGenerator(template_dir, dirPathToSaveCodes, projectPrefix, packageName) templateCodeGen.write_general_template_files() # read JSON file JSONScheme.projectPrefix = projectPrefix + JSONScheme.packageName = packageName JSONScheme.objectSuffix = objectSuffix for filePath in jsonfiles : print "read " + filePath + " to parse ...." @@ -202,6 +205,7 @@ def usage(): usageString += ' -i, --input= metaJSON file to read\n' usageString += ' -o, --output= output path of generated source codes (default: src)\n' usageString += ' --template= template directory to use to generate code\n' + usageString += ' --package= name of the generated package (default: none)\n' print(usageString) sys.exit() diff --git a/metajson/template_code_generator.py b/metajson/template_code_generator.py index 1e02f28..6d03d17 100644 --- a/metajson/template_code_generator.py +++ b/metajson/template_code_generator.py @@ -7,8 +7,9 @@ class TemplateCodeGenerator : TEMPLATE_EXT = ".mustache" DEFAULT_TEMPLATE_PATH = "./metajson/templates" - def __init__(self, template_path = DEFAULT_TEMPLATE_PATH, output_path = "classes", project_prefix = "S2M"): + def __init__(self, template_path = DEFAULT_TEMPLATE_PATH, output_path = "classes", project_prefix = "S2M", package_name = ""): self.project_prefix = project_prefix + self.package_name = package_name self.template_path = template_path if output_path.endswith("/"): output_path = output_path[:-1] @@ -72,6 +73,7 @@ def replace_variables(self, text, today): newtext = text.replace('_DATE_', "") newtext = newtext.replace('_YEAR_', str(today.year)) newtext = newtext.replace('_PREFIX_', self.project_prefix) + newtext = newtext.replace('_PACKAGE_', self.package_name) return newtext def write_template(self, template, output): From 40cbdabbda50cd28781c316d01ba35e8dd81e2bc Mon Sep 17 00:00:00 2001 From: Martin Bober <mbo@sinnerschrader-mobile.com> Date: Wed, 11 Mar 2015 09:43:10 +0100 Subject: [PATCH 144/149] Templates for Android code generation --- .../Android/_CLASSNAME_.java.mustache | 236 ++++++++++++++++++ metajson/templates/Android/array.mustache | 53 ++++ 2 files changed, 289 insertions(+) create mode 100644 metajson/templates/Android/_CLASSNAME_.java.mustache create mode 100644 metajson/templates/Android/array.mustache diff --git a/metajson/templates/Android/_CLASSNAME_.java.mustache b/metajson/templates/Android/_CLASSNAME_.java.mustache new file mode 100644 index 0000000..2407e8e --- /dev/null +++ b/metajson/templates/Android/_CLASSNAME_.java.mustache @@ -0,0 +1,236 @@ +/** +* {{prefix}}{{#_upper_camelcase}}{{varName}}{{/_upper_camelcase}}{{suffix}}.h +* +* Created by MetaJSONParser. +* Copyright (c) {{date}} SinnerSchrader Mobile. All rights reserved. +**/ + +package {{package}}; + +import android.util.Base64; + +import java.lang.IllegalArgumentException; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; + +import org.json.JSONArray; +import org.json.JSONException; +import org.json.JSONObject; + +import {{package}}.*; + +{{#baseTypeIsObject}} +public class {{prefix}}{{#_upper_camelcase}}{{name}}{{/_upper_camelcase}} { +{{/baseTypeIsObject}} +{{^baseTypeIsObject}} +public class {{prefix}}{{#_upper_camelcase}}{{name}}{{/_upper_camelcase}} extends {{baseClassName}} { +{{/baseTypeIsObject}} + + public {{prefix}}{{#_upper_camelcase}}{{name}}{{/_upper_camelcase}}(JSONObject source) throws JSONException { + {{^baseTypeIsObject}} + super(source); + {{/baseTypeIsObject}} + {{#numberProperties}} + {{#required}} + set{{#_upper_camelcase}}{{name}}{{/_upper_camelcase}}(source.getDouble("{{name}}")); + {{/required}} + {{^required}} + set{{#_upper_camelcase}}{{name}}{{/_upper_camelcase}}(source.optDouble("{{name}}")); + {{/required}} + {{/numberProperties}} + {{#stringProperties}} + {{#required}} + set{{#_upper_camelcase}}{{name}}{{/_upper_camelcase}}(source.getString("{{name}}")); + {{/required}} + {{^required}} + set{{#_upper_camelcase}}{{name}}{{/_upper_camelcase}}(source.optString("{{name}}")); + {{/required}} + {{/stringProperties}} + {{#booleanProperties}} + {{#required}} + m{{#_upper_camelcase}}{{name}}{{/_upper_camelcase}} = source.getBoolean("{{name}}"); + {{/required}} + {{^required}} + m{{#_upper_camelcase}}{{name}}{{/_upper_camelcase}} = source.optBoolean("{{name}}"); + {{/required}} + {{/booleanProperties}} + {{#dateProperties}} + {{#required}} + set{{#_upper_camelcase}}{{name}}{{/_upper_camelcase}}(new Date(source.getLong("{{name}}"))); + {{/required}} + {{^required}} + set{{#_upper_camelcase}}{{name}}{{/_upper_camelcase}}(new Date(source.optLong("{{name}}"))); + {{/required}} + {{/dateProperties}} + {{#dataProperties}} + {{#required}} + set{{#_upper_camelcase}}{{name}}{{/_upper_camelcase}}(Base64.decode(source.getString("{{name}}"), Base64.DEFAULT)); + {{/required}} + {{^required}} + set{{#_upper_camelcase}}{{name}}{{/_upper_camelcase}}(Base64.decode(source.opString("{{name}}"), Base64.DEFAULT)); + {{/required}} + {{/dataProperties}} + {{#arrayProperties}} + {{#required}} + set{{#_upper_camelcase}}{{name}}{{/_upper_camelcase}}(source.getJSONArray("{{name}}")); + {{/required}} + {{^required}} + set{{#_upper_camelcase}}{{name}}{{/_upper_camelcase}}(source.optJSONArray("{{name}}")); + {{/required}} + {{/arrayProperties}} + {{#objectProperties}} + m{{#_upper_camelcase}}{{name}}{{/_upper_camelcase}} = new {{className}}(source.optJSONObject("{{name}}")); + {{/objectProperties}} + {{#undefinedProperties}} + {{#required}} + set{{#_upper_camelcase}}{{name}}{{/_upper_camelcase}}(source.getJSONArray("{{name}}")); + {{/required}} + {{^required}} + set{{#_upper_camelcase}}{{name}}{{/_upper_camelcase}}(source.optJSONArray("{{name}}")); + {{/required}} + {{/undefinedProperties}} + } + +{{#numberProperties}} + {{#description}} + /** + * {{description}} + */ + {{/description}} + private double m{{#_upper_camelcase}}{{name}}{{/_upper_camelcase}}; + public void set{{#_upper_camelcase}}{{name}}{{/_upper_camelcase}}(double newVal) { + {{#minValue}} + if (newVal < {{minValue}}) { + throw new IllegalArgumentException("Number " + newVal + " is smaller than {{minValue}}."); + } + {{/minValue}} + {{#maxValue}} + if (newVal > {{maxValue}}) { + throw new IllegalArgumentException("Number " + newVal + " is bigger than {{maxValue}}"); + } + {{/maxValue}} + m{{#_upper_camelcase}}{{name}}{{/_upper_camelcase}} = newVal; + } + public double get{{#_upper_camelcase}}{{name}}{{/_upper_camelcase}}() { + return m{{#_upper_camelcase}}{{name}}{{/_upper_camelcase}}; + } + +{{/numberProperties}} +{{#stringProperties}} + {{#description}} + /** + * {{description}} + */ + {{/description}} + private String m{{#_upper_camelcase}}{{name}}{{/_upper_camelcase}}; + public void set{{#_upper_camelcase}}{{name}}{{/_upper_camelcase}}(String newVal) { + {{#maxLength}} + if ((newVal != null) && (newVal.length() > {{maxLength}})) { + throw new IllegalArgumentException("String is longer than " + {{maxLength}} + " characters."); + } + {{/maxLength}} + {{#minLength}} + if ((newVal != null) && (newVal.length() < {{minLength}})) { + throw new IllegalArgumentException("String is shorter than " + {{minLength}} + " characters."); + } + {{/minLength}} + {{#regex}} + if ((newVal != null) && (!newVal.matches("{{regex}}"))) { + throw new IllegalArgumentException("String \"" + newVal + "\" does not match regexp \"{{regex}}\"."); + } + {{/regex}} + m{{#_upper_camelcase}}{{name}}{{/_upper_camelcase}} = newVal; + } + public String get{{#_upper_camelcase}}{{name}}{{/_upper_camelcase}}() { + return m{{#_upper_camelcase}}{{name}}{{/_upper_camelcase}}; + } + +{{/stringProperties}} +{{#booleanProperties}} + {{#description}} + /** + * {{description}} + */ + {{/description}} + private boolean m{{#_upper_camelcase}}{{name}}{{/_upper_camelcase}}; + public void set{{#_upper_camelcase}}{{name}}{{/_upper_camelcase}}(boolean newVal) { + m{{#_upper_camelcase}}{{name}}{{/_upper_camelcase}} = newVal; + } + public boolean get{{#_upper_camelcase}}{{name}}{{/_upper_camelcase}}() { + return m{{#_upper_camelcase}}{{name}}{{/_upper_camelcase}}; + } + +{{/booleanProperties}} +{{#dataProperties}} + {{#description}} + /** + * {{description}} + */ + {{/description}} + private byte[] m{{#_upper_camelcase}}{{name}}{{/_upper_camelcase}}; + public void set{{#_upper_camelcase}}{{name}}{{/_upper_camelcase}}(byte[] newVal) { + {{#minLength}} + if ((newVal != null) && (newVal.length < {{minLength}})) { + throw new IllegalArgumentException("Data is only " + newVal.length + " bytes long (min: {{minLength}})"); + } + {{/minLength}} + {{#maxLength}} + if ((newVal != null) && (newVal.length > {{maxLength}})) { + throw new IllegalArgumentException("Data is " + newVal.length + " bytes long (max: {{maxLength}})"); + } + {{/maxLength}} + m{{#_upper_camelcase}}{{name}}{{/_upper_camelcase}} = newVal; + } + public byte[] get{{#_upper_camelcase}}{{name}}{{/_upper_camelcase}}() { + return m{{#_upper_camelcase}}{{name}}{{/_upper_camelcase}}; + } + +{{/dataProperties}} +{{#dateProperties}} + {{#description}} + /** + * {{description}} + */ + {{/description}} + private Date m{{#_upper_camelcase}}{{name}}{{/_upper_camelcase}}; + public void set{{#_upper_camelcase}}{{name}}{{/_upper_camelcase}}(Date newVal) { + {{#minValue}} + if ((newVal != null) && (newVal.getTime() < {{minValue}}) { + throw new IllegalArgumentException("Date " + newVal.getTime() + " is before {{minValue}}."); + } + {{/minValue}} + {{#maxValue}} + if ((newVal != null) && (newVal.getTime() > {{maxValue}}) { + throw new IllegalArgumentException("Date " + newVal.getTime() + " is after {{maxValue}}."); + } + {{/maxValue}} + m{{#_upper_camelcase}}{{name}}{{/_upper_camelcase}} = newVal; + } + public Date get{{#_upper_camelcase}}{{name}}{{/_upper_camelcase}}() { + return m{{#_upper_camelcase}}{{name}}{{/_upper_camelcase}}; + } +{{/dateProperties}} +{{#arrayProperties}} +{{> metajson/templates/Android/array}} +{{/arrayProperties}} +{{#objectProperties}} + {{#description}} + /** + * {{description}} + */ + {{/description}} + private {{className}} m{{#_upper_camelcase}}{{name}}{{/_upper_camelcase}}; + public void set{{#_upper_camelcase}}{{name}}{{/_upper_camelcase}}({{className}} newVal) { + m{{#_upper_camelcase}}{{name}}{{/_upper_camelcase}} = newVal; + } + public {{className}} get{{#_upper_camelcase}}{{name}}{{/_upper_camelcase}}() { + return m{{#_upper_camelcase}}{{name}}{{/_upper_camelcase}}; + } + +{{/objectProperties}} +{{#undefinedProperties}} +{{> metajson/templates/Android/array}} +{{/undefinedProperties}} + +} diff --git a/metajson/templates/Android/array.mustache b/metajson/templates/Android/array.mustache new file mode 100644 index 0000000..5eecb74 --- /dev/null +++ b/metajson/templates/Android/array.mustache @@ -0,0 +1,53 @@ + {{#description}} + /** + * {{description}} + */ + {{/description}} + private JSONArray m{{#_upper_camelcase}}{{name}}{{/_upper_camelcase}}; + public void set{{#_upper_camelcase}}{{name}}{{/_upper_camelcase}}(JSONArray newVal) { + {{#minCount}} + if ((newVal != null) && (newVal.length() < {{minCount}})) { + throw new IllegalArgumentException("Array only has " + newVal.length() + " elements ({{minCount}} needed)."); + } + {{/minCount}} + {{#maxCount}} + if ((newVal != null) && (newVal.length() > {{maxCount}})) { + throw new IllegalArgumentException("Array has " + newVal.length() + " elements ({{maxCount}} allowed)."); + } + {{/maxCount}} + m{{#_upper_camelcase}}{{name}}{{/_upper_camelcase}} = newVal; + } + public void set{{#_upper_camelcase}}{{name}}{{/_upper_camelcase}}AsDouble(double newVal, int index) throws JSONException { + m{{#_upper_camelcase}}{{name}}{{/_upper_camelcase}}.put(index, newVal); + } + public void set{{#_upper_camelcase}}{{name}}{{/_upper_camelcase}}AsString(String newVal, int index) throws JSONException { + m{{#_upper_camelcase}}{{name}}{{/_upper_camelcase}}.put(index, newVal); + } + public void set{{#_upper_camelcase}}{{name}}{{/_upper_camelcase}}AsBoolean(boolean newVal, int index) throws JSONException { + m{{#_upper_camelcase}}{{name}}{{/_upper_camelcase}}.put(index, newVal); + } + public void set{{#_upper_camelcase}}{{name}}{{/_upper_camelcase}}AsDate(Date newVal, int index) throws JSONException { + m{{#_upper_camelcase}}{{name}}{{/_upper_camelcase}}.put(index, newVal); + } + public void set{{#_upper_camelcase}}{{name}}{{/_upper_camelcase}}AsArray(JSONArray newVal, int index) throws JSONException { + m{{#_upper_camelcase}}{{name}}{{/_upper_camelcase}}.put(index, newVal); + } + public JSONArray get{{#_upper_camelcase}}{{name}}{{/_upper_camelcase}}() { + return m{{#_upper_camelcase}}{{name}}{{/_upper_camelcase}}; + } + public double get{{#_upper_camelcase}}{{name}}{{/_upper_camelcase}}AsDouble(int index) { + return m{{#_upper_camelcase}}{{name}}{{/_upper_camelcase}}.optDouble(index); + } + public String get{{#_upper_camelcase}}{{name}}{{/_upper_camelcase}}AsString(int index) { + return m{{#_upper_camelcase}}{{name}}{{/_upper_camelcase}}.optString(index); + } + public boolean get{{#_upper_camelcase}}{{name}}{{/_upper_camelcase}}AsBoolean(int index) { + return m{{#_upper_camelcase}}{{name}}{{/_upper_camelcase}}.optBoolean(index); + } + public Date get{{#_upper_camelcase}}{{name}}{{/_upper_camelcase}}AsDate(int index) { + return new Date(m{{#_upper_camelcase}}{{name}}{{/_upper_camelcase}}.optLong(index)); + } + public JSONArray get{{#_upper_camelcase}}{{name}}{{/_upper_camelcase}}AsArray(int index) { + return m{{#_upper_camelcase}}{{name}}{{/_upper_camelcase}}.optJSONArray(index); + } + From 16e5bb52e8d3b8db8f9184d09e45b0424b815f9f Mon Sep 17 00:00:00 2001 From: Martin Bober <mbo@sinnerschrader-mobile.com> Date: Thu, 12 Mar 2015 13:43:50 +0100 Subject: [PATCH 145/149] Unified Android and iOS code generation * Removed "target" option from command line. * Deleted JavaCodeGenerator because it is not needed anymore. --- README.md | 3 +- metajson/JavaCodeGenerator.py | 443 ---------------------------------- metajson/readJSON.py | 74 ++---- 3 files changed, 17 insertions(+), 503 deletions(-) delete mode 100644 metajson/JavaCodeGenerator.py diff --git a/README.md b/README.md index 36981df..2cb5f10 100644 --- a/README.md +++ b/README.md @@ -14,7 +14,6 @@ Options: -h, --help shows help -p, --prefix= project prefix (default: S2M) -s, --suffix= classname suffix (default: JSONObject). Use "-s false" for no suffix - -t, --target= target platform iOS or Android (default: iOS) -i, --input= meta-JSON file to read -o, --output= ouput path of generated source codes (default: src) --template= template directory to use to generate code @@ -23,7 +22,7 @@ Options: A working sample call could look like that: ``` -# metajson --p GitHub -t Android -i github-scheme.json -o com/example/project/android/json +# metajson --p GitHub -i github-scheme.json -o com/example/project/android/json --template=metajson/templates/Android --package=com.example.project.android.json ``` The result of that call will be generated Java code in the folder "com". The java package structure and definition will be there, so you just need to copy the folder in your project structure. It is ready to be used. diff --git a/metajson/JavaCodeGenerator.py b/metajson/JavaCodeGenerator.py deleted file mode 100644 index cc133e5..0000000 --- a/metajson/JavaCodeGenerator.py +++ /dev/null @@ -1,443 +0,0 @@ -''' -The MIT License (MIT) - -Copyright (c) 2013 SinnerSchrader Mobile GmbH - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. -''' - -import time -import datetime -import os - -class JavaCodeGenerator: - naturalList = ["Object", "String", "double", "boolean", "Double", "Boolean"] - projectPrefix = "" - dirPath = "" - memberVariables = "" - isChild = False - isAbstract = False - - def getCommonDescriptionString(self): - today = datetime.date.fromtimestamp(time.time()) - commonDescription = "/*\n * Created by MetaJSONParser on " + today.strftime("%d.%m.%Y") + "." - commonDescription += "\n * Copyright (c) " + str(today.year) + " SinnerSchrader Mobile. All rights reserved.\n*/\n" - return commonDescription - - def make(self, schemeObj): - self.makeInternal(schemeObj) - self.makeExtension(schemeObj) - return True - - def makeInternal(self, schemeObj): - self.isAbstract = True - sourceString = "" - self.isChild = False; - print "starting: " + self.getClassName(schemeObj) - - if len(self.dirPath) > 0: - sourceString += "package " + self.dirPath.replace("/", ".") + ".internal;\n\n" - sourceString += self.getCommonDescriptionString() - sourceString += self.getImports(schemeObj) - sourceString += self.getClassDefinition(schemeObj) - - methodString = ""; - self.memberVariables = "" - for prop in schemeObj.props: - methodString += self.getMethod(schemeObj, prop) - - for variable in self.memberVariables.split("\n"): - if len(variable) > 0: - sourceString += self.indent(1) + variable + ";" - - sourceString += "\n" - - setterString = ""; - getterString = ""; - for variable in self.memberVariables.split("\n"): - setterString += self.createSetter(variable) - getterString += self.createGetter(variable) - - sourceString += self.getConstructor(schemeObj) - sourceString += setterString - sourceString += getterString - - # end class body - sourceString += "}\n" - - if not os.path.exists(self.dirPath + "/internal"): - os.makedirs(self.dirPath + "/internal") - try: - sourceFile = open(self.dirPath + "/internal/" + self.getClassName(schemeObj) + ".java", "w") - sourceFile.write(sourceString) # Write a string to a file - finally: - sourceFile.close() - - def makeExtension(self, schemeObj): - sourceString = "" - self.isChild = False; - self.isAbstract = False - print "extending: " + self.getClassName(schemeObj) - - if len(self.dirPath) > 0: - sourceString += "package " + self.dirPath.replace("/", ".") + ";\n\n" - sourceString += self.getCommonDescriptionString() - sourceString += self.getImports(schemeObj) - sourceString += "import " + self.dirPath.replace("/", ".") + ".internal.Abstract" + self.getClassName(schemeObj) + ";\n" - - sourceString += "\npublic class " + self.getClassName(schemeObj) - sourceString += " extends Abstract" + self.getClassName(schemeObj) - sourceString += " {\n" - - sourceString += self.indent(1) + "public " + self.getClassName(schemeObj) + "(JSONObject json) throws JSONException {" - sourceString += self.indent(2) + "super(json);" - sourceString += self.indent(1) + "}\n" - # end class body - sourceString += "}\n" - try: - sourceFile = open(self.dirPath + "/" + self.getClassName(schemeObj) + ".java", "w") - sourceFile.write(sourceString) # Write a string to a file - finally: - sourceFile.close() - - def getClassDefinition(self, schemeObj): - abstract = "" - classDef = "\npublic class " + self.getClassName(schemeObj) - if self.isAbstract is True: - abstract = "Abstract" - classDef = "\npublic abstract class " + self.getClassName(schemeObj) - if schemeObj.base_type != "object": - self.isChild = True - classDef += " extends " + abstract + self.projectPrefix + self.cap(schemeObj.base_type) - classDef += " {\n" - return classDef - - def getMethod(self, schemeObj, prop=None): - source = "" - if len(prop.getBaseTypes()) == 0: - # only one base type - source += self.getMethodForBaseType(schemeObj, prop, prop.base_type) - else: - # multiple base types - for baseType in prop.getBaseTypes(): - if schemeObj.hasScheme(baseType): - baseTypeScheme = schemeObj.getScheme(baseType) - objectName = self.convertToJavaType(baseTypeScheme.type_name) - className = self.projectPrefix + self.cap(self.convertToJavaType(baseTypeScheme.type_name)) - if len(baseTypeScheme.getBaseTypes()) == 0: - if self.convertToJavaType(baseTypeScheme.base_type) == "array": - for subType in baseTypeScheme.sub_type: - className = self.cap(subType) - projectPrefix = "" - if schemeObj.hasScheme(subType) and len(schemeObj.getScheme(subType).props) > 0: - projectPrefix = self.projectPrefix - - self.addOrIgnoreMemberVariable("private", "ArrayList<" + projectPrefix + className + ">", self.getVariableName(prop.type_name) + "As" + className) - if prop.required is True: - source += self.indent(2) + "final JSONArray " + self.getVariableName(prop.type_name) + "As" + className + "Array = json.getJSONArray(\"" + self.getVariableName(prop.type_name) + "\");" - else: - extraIndent = " " - source += self.indent(2) + "final JSONArray " + self.getVariableName(prop.type_name) + "As" + className + "Array = json.optJSONArray(\"" + self.getVariableName(prop.type_name) + "\");" - source += self.indent(2) + "if (" + self.getVariableName(prop.type_name) + "As" + className + "Array == null) {" - source += self.indent(3) + self.getVariableName(prop.type_name) + "As" + className + " = null;" - source += self.indent(2) + "} else {" - - source += self.indent(2) + extraIndent + self.getVariableName(prop.type_name) + "As" + className + " = new ArrayList<" + projectPrefix + className + ">(" + self.getVariableName(prop.type_name) + "As" + className + "Array.length());" - source += self.indent(2) + extraIndent + "for (int i = 0; i < " + self.getVariableName(prop.type_name) + "As" + className + "Array.length(); i++) {" - if self.isNatural(className): - source += self.indent(3) + extraIndent + self.getVariableName(prop.type_name) + "As" + className + ".add(" + self.getVariableName(prop.type_name) + "As" + className + "Array.get" + className + "(i));" - else: - source += self.indent(3) + extraIndent + self.getVariableName(prop.type_name) + "As" + className + ".add(new " + projectPrefix + className + "(" + self.getVariableName(prop.type_name) + "As" + className + "Array.getJSONObject(i)));" - source += self.indent(2) + extraIndent + "}" - source += self.indent(2) + "}" - return source - variableName = self.getVariableName(prop.type_name) + "As" + self.cap(objectName) - self.addOrIgnoreMemberVariable("private", self.cap(className), variableName) - getType = "opt" - if prop.required is True: - getType = "get" - - if self.isNatural(className): - source += self.getSchemeLimitationBody(schemeObj, baseTypeScheme) - else: - source += self.indent(2) + variableName + " = new " + self.projectPrefix + self.cap(self.convertToJavaType(baseTypeScheme.type_name)) + "(json.getJSONObject(\"" + self.getVariableName(prop.type_name) + "\"));" - else: - asString = "" - if self.convertToJavaType(baseTypeScheme.base_type) == "multi": - asString = "As" + className - projectPrefix = "" - if baseTypeScheme.isNaturalType() is False: - projectPrefix = self.projectPrefix - - self.addOrIgnoreMemberVariable("private", projectPrefix + className, self.getVariableName(prop.type_name) + asString) - if prop.required is True: - source += self.indent(2) + self.getVariableName(prop.type_name) + " = new " + projectPrefix + className + "(json.getJSONObject(\"" + self.getVariableName(prop.type_name) + "\"));" - else: - source += self.indent(2) + "final JSONObject " + self.getVariableName(prop.type_name) + "JsonObject = json.optJSONObject(\"" + self.getVariableName(prop.type_name) + "\");" - source += self.indent(2) + "if (" + self.getVariableName(prop.type_name) + "JsonObject == null) {" - source += self.indent(3) + "return null;" - source += self.indent(2) + "} else {" - source += self.indent(3) + self.getVariableName(prop.type_name) + " = new " + projectPrefix + className + "(" + self.getVariableName(prop.type_name) + "JsonObject);" - source += self.indent(2) + "}" - else: - className = self.convertToJavaType(baseType) - variableName = self.getVariableName(prop.type_name) + "As" + self.cap(className) - if self.low(className) == "byte": - self.addOrIgnoreMemberVariable("private", "byte[]", variableName) - else: - self.addOrIgnoreMemberVariable("private", self.cap(className), variableName) - - getType = "opt" - if prop.required is True: - getType = "get" - - if self.isNatural(baseType): - source += self.indent(2) + variableName + " = json." + getType + self.cap(className) + "(\"" + self.getVariableName(prop.type_name) + "\");" - else: - if self.low(className) == "date": - source += self.indent(2) + variableName + " = new Date(json." + getType + "Long(\"" + self.getVariableName(prop.type_name) + "\"));" - elif self.low(className) == "byte": - source += self.indent(2) + variableName + " = json." + getType + "String(\"" + self.getVariableName(prop.type_name) + "\").getBytes();" - else: - source += self.indent(2) + variableName + " = json." + getType + self.cap(className) + "(\"" + self.getVariableName(prop.type_name) + "\");" - return source - - def getSchemeLimitationBody(self, schemeObj, prop): - className = self.convertToJavaType(prop.base_type) - varName = self.getVariableName(prop.type_name) - source = self.indent(2) + varName + " = json.get" + className + "(\"" + varName + "\");" - if prop.base_type == "array": - if prop.hasMaxCount: - source += self.indent(2) + "if (" + varName + ".length < " + str(prop.minCount) + ") {" - source += self.indent(3) + "throw new IllegalArgumentException(\"" + varName + " can't be less than " + str(prop.minCount) + "\");" - source += self.indent(2) + "}" - if prop.hasMaxCount: - source += self.indent(2) + "if (" + varName + ".length > " + str(prop.maxCount) + ") {" - source += self.indent(3) + "throw new IllegalArgumentException(\"" + varName + " can't be bigger than " + str(prop.maxCount) + "\");" - source += self.indent(2) + "}" - if prop.hasMinLength: - source += self.indent(2) + "if (" + varName + ".length() < " + str(prop.minLength) + ") {" - source += self.indent(3) + "throw new IllegalArgumentException(\"" + varName + " can't be shorter than " + str(prop.minLength) + "\");" - source += self.indent(2) + "}" - if prop.hasMaxLength: - source += self.indent(2) + "if (" + varName + ".length() > " + str(prop.maxLength) + ") {" - source += self.indent(3) + "throw new IllegalArgumentException(\"" + varName + " can't be longer than " + str(prop.maxLength) + "\");" - source += self.indent(2) + "}" - if prop.regex: - source += self.indent(2) + "if (!Pattern.compile(\"" + prop.regex + "\").matcher(" + varName + ").matches()) {" - source += self.indent(3) + "throw new IllegalArgumentException(\"" + varName + " doesn't fit regex " + prop.regex + "\");" - source += self.indent(2) + "}" - - source += self.indent(2) + "return " + varName + ";" - return source - - def getMethodForBaseType(self, schemeObj, prop, typeName): - source = "" - baseType = typeName - typeClassName = self.cap(self.convertToJavaType(typeName)) - if baseType == "array": - for subType in prop.sub_type: - objectName = self.convertToJavaType(subType) - className = self.cap(objectName) - projectPrefix = "" - if schemeObj.hasScheme(subType) and len(schemeObj.getScheme(subType).props) > 0: - projectPrefix = self.projectPrefix - - variableName = self.getVariableName(prop.type_name) + "As" + self.cap(subType) - - self.addOrIgnoreMemberVariable("private", "ArrayList<" + projectPrefix + className + ">", variableName) - extraIndent = "" - if prop.required is True: - source += self.indent(2) + "final JSONArray " + variableName + "Array = json.getJSONArray(\"" + self.getVariableName(prop.type_name) + "\");" - else: - extraIndent = " " - source += self.indent(2) + "final JSONArray " + variableName + "Array = json.optJSONArray(\"" + self.getVariableName(prop.type_name) + "\");" - source += self.indent(2) + "if (" + variableName + "Array == null) {" - source += self.indent(3) + variableName + " = null;" - source += self.indent(2) + "} else {" - - source += self.indent(2) + extraIndent + variableName + " = new ArrayList<" + projectPrefix + className + ">(" + variableName + "Array.length());" - source += self.indent(2) + extraIndent + "for (int i = 0; i < " + variableName + "Array.length(); i++) {" - if self.isNatural(className): - if className == "Object": - className = "" - source += self.indent(3) + extraIndent + variableName + ".add(" + variableName + "Array.get" + className + "(i));" - else: - source += self.indent(3) + extraIndent + variableName + ".add(new " + projectPrefix + className + "(" + variableName + "Array.getJSONObject(i)));" - source += self.indent(2) + extraIndent + "}" - source += self.indent(2) + "}" - elif baseType == "date": - self.addOrIgnoreMemberVariable("private", self.cap(self.convertToJavaType(prop.rootBaseType())), self.getVariableName(prop.type_name)) - if prop.required is True: - source += self.indent(2) + self.getVariableName(prop.type_name) + " = new Date(json.getInt(\"" + self.getVariableName(prop.type_name) + "\") / 1000);" - else: - source += self.indent(2) + "final int " + self.getVariableName(prop.type_name) + "Timestamp = json.optInt(\"" + self.getVariableName(prop.type_name) + "\", -1);" - source += self.indent(2) + "if (" + self.getVariableName(prop.type_name) + "Timestamp == -1) {" - source += self.indent(3) + self.getVariableName(prop.type_name) + " = null;" - source += self.indent(2) + "} else {" - source += self.indent(3) + self.getVariableName(prop.type_name) + " = new Date(" + self.getVariableName(prop.type_name) + "Timestamp / 1000);" - source += self.indent(2) + "}" - else: - if self.isNatural(prop.rootBaseType()) is True: - self.addOrIgnoreMemberVariable("private", self.cap(self.convertToJavaType(prop.rootBaseType())), self.getVariableName(prop.type_name)) - getMethod = typeClassName - if getMethod == "Object": - getMethod = "" # reset as the getter for Object is just json.get() - if prop.required is True: - source += self.indent(2) + self.getVariableName(prop.type_name) + " = json.get" + getMethod + "(\"" + self.getVariableName(prop.type_name) + "\");" - else: - if len(getMethod) == 0: - source += self.indent(2) + self.getVariableName(prop.type_name) + " = json.opt" + getMethod + "(\"" + self.getVariableName(prop.type_name) + "\");" - else: - source += self.indent(2) + self.getVariableName(prop.type_name) + " = json.opt" + getMethod + "(\"" + self.getVariableName(prop.type_name) + "\", " + str(self.getDefaultValue(typeClassName)) + ");" - else: - self.addOrIgnoreMemberVariable("private", self.projectPrefix + self.cap(typeName), self.getVariableName(prop.type_name)) - typeName = self.convertToJavaType(prop.base_type); - if prop.required is True: - source += self.indent(2) + self.getVariableName(prop.type_name) + " = new " + self.projectPrefix + self.cap(typeName) + "(json.getJSONObject(\"" + self.getVariableName(prop.type_name) + "\"));" - else: - source += self.indent(2) + "final JSONObject " + self.getVariableName(prop.type_name) + "Json = json.optJSONObject(\"" + self.getVariableName(prop.type_name) + "\");" - source += self.indent(2) + "if (" + self.getVariableName(prop.type_name) + "Json == null) {" - source += self.indent(3) + self.getVariableName(prop.type_name) + " = null;" - source += self.indent(2) + "} else {" - source += self.indent(3) + self.getVariableName(prop.type_name) + " = new " + self.projectPrefix + self.cap(typeName) + "(" + self.getVariableName(prop.type_name) + "Json);" - source += self.indent(2) + "}" - - return source - - def getImports(self, schemeObj): - source = "\nimport org.json.JSONObject;" - source += "\nimport org.json.JSONArray;" - source += "\nimport org.json.JSONException;" - source += "\nimport java.util.ArrayList;" - source += "\nimport java.util.Date;" # somehow date will not be added later - temporary static import - source += "\nimport " + self.dirPath.replace("/", ".") + ".*;" - source += "\n\nimport java.lang.IllegalArgumentException;\n" - stringImported = False - dateImported = False - regexImported = False - for prop in schemeObj.props: - baseTypes = schemeObj.getScheme(schemeObj.getScheme(prop.type_name).type_name).getBaseTypes() - if prop.base_type == "string" and stringImported is False: - source += "import java.lang.String;\n" - stringImported = True - if prop.base_type == "date" and dateImported is False: - source += "import java.util.Date;\n" - dateImported = True - for baseType in baseTypes: - if not schemeObj.hasScheme(baseType): - continue - else: - base = schemeObj.getScheme(baseType) - if len(base.regex) > 0 and regexImported is False: - source += "import java.util.regex.Pattern;\n" - regexImported = True - return source - - def getConstructor(self, schemeObj): - source = self.indent(1) + "public " + self.cap(self.getClassName(schemeObj)) + "(JSONObject json) throws JSONException {" - if self.isChild: - source += self.indent(2) + "super(json);" - else: - source += self.indent(2) + "if (json == null) {" - source += self.indent(3) + "throw new IllegalArgumentException(\"JSONObject can't be null\");" - source += self.indent(2) + "}" - for prop in schemeObj.props: - source += self.getMethod(schemeObj, prop) - source += self.indent(1) + "}\n" - return source - - ### helper methods - def cap(self, name): - return name[0].capitalize() + name[1:] - - def low(self, name): - return name[0].lower() + name[1:] - - def indent(self, size): - i = 0 - indent = "\n" - while i < size: - indent += " " - i += 1 - return indent - - def convertToJavaType(self, objCType): - if objCType == "number": - return "double" - elif objCType == "any": - return "Object" - elif objCType == "data": - return "byte" - elif objCType == "string": - return "String" - elif objCType == "date": - return "Date" - else: - return objCType - - def isNatural(self, objectType): - objectType = self.convertToJavaType(objectType) - return objectType in self.naturalList - - def getDefaultValue(self, type): - typeName = self.low(self.convertToJavaType(type)) - if typeName == "double": - return 0 - elif typeName == "boolean": - return "false" - return "null" - - def addOrIgnoreMemberVariable(self, visibility, type, name): - newVariable = visibility + " " + type + " " + name + "" - - if not newVariable in self.memberVariables.split("\n"): - self.memberVariables += newVariable + "\n" - - def createMethodHead(self, visibility, returnType, name, parameter = ""): - return self.indent(1) + visibility + " " + returnType + " " + name + "(" + parameter + ") {" - - def createSetter(self, variableString): - elements = variableString.split(" ") - if len(elements) == 3: - source = self.createMethodHead("public", "void", "set" + self.cap(elements[2]), elements[1] + " " + self.low(elements[2])) - source += self.indent(2) + "this." + elements[2] + " = " + self.low(elements[2]) + ";" - source += self.indent(1) + "}\n" - return source - return "" - - def createGetter(self, variableString): - elements = variableString.split(" ") - if len(elements) == 3: - source = self.createMethodHead("public", elements[1], "get" + self.cap(elements[2])) - source += self.indent(2) + "return " + elements[2] + ";" - source += self.indent(1) + "}\n" - return source - return "" - - def getClassName(self, schemeObj): - if self.isAbstract is True: - return "Abstract" + schemeObj.getClassName() - else: - return schemeObj.getClassName() - - def getVariableName(self, name): - if name in ["private", "protected", "public", "class", "abstract", "final", "static"]: - return self.projectPrefix + self.cap(name) - return name \ No newline at end of file diff --git a/metajson/readJSON.py b/metajson/readJSON.py index a4e13b9..eb1c359 100755 --- a/metajson/readJSON.py +++ b/metajson/readJSON.py @@ -34,10 +34,6 @@ from JSONScheme import * from ObjectiveCCodeGenerator import * -from JavaCodeGenerator import * - -TARGET_IOS = 'iOS' -TARGET_ANDROID = 'Android' def main(argv=sys.argv): # parse Options @@ -46,13 +42,12 @@ def main(argv=sys.argv): jsonfiles = [] inputfile = 'do you have files?' projectPrefix = 'S2M' - target = TARGET_IOS dirPathToSaveCodes = './src' objectSuffix = "JSONObject" argv = sys.argv[1:] try: - opts, args = getopt.getopt(argv,"vhp:s:t:i:o:",["version", "help", "prefix=", "suffix=", "target=", "input=", "output=", "template=", "package="]) + opts, args = getopt.getopt(argv,"vhp:s:i:o:",["version", "help", "prefix=", "suffix=", "input=", "output=", "template=", "package="]) except getopt.GetoptError: usage() sys.exit(2) @@ -65,8 +60,6 @@ def main(argv=sys.argv): version() elif opt in ("-p", "--prefix"): projectPrefix = arg - elif opt in ("-t", "--target"): - target = arg elif opt in ("-i", "--input"): inputfile = arg elif opt in ("-o", "--output"): @@ -93,10 +86,6 @@ def main(argv=sys.argv): if addFiles : jsonfiles.append(arg) - if target == 'none' : - print 'error - target platform is not defined' - usage() - if len(jsonfiles) == 0 : print 'error - meta JSON file is not defined' usage() @@ -104,19 +93,9 @@ def main(argv=sys.argv): if not os.path.exists(dirPathToSaveCodes): os.makedirs(dirPathToSaveCodes) - iOS = False - Android = False - if target == TARGET_IOS: - iOS = True - elif target == TARGET_ANDROID: - Android = True - else : - print 'error - unknown target platform : ' + target - usage() - hasError = False - print "\nGenerate source codes for " + target + ", with Project Prefix \'" + projectPrefix + "\' and suffix \'" + objectSuffix + "\'" + print "\nGenerate source codes with Project Prefix \'" + projectPrefix + "\' and suffix \'" + objectSuffix + "\'" print "Output path : \'" + dirPathToSaveCodes + "\'\n" # write templates @@ -139,40 +118,20 @@ def main(argv=sys.argv): jsonObj = read_file(filePath) schemeObj = create_json_scheme(jsonObj) - if Android : - codeGen = JavaCodeGenerator() - codeGen.projectPrefix = projectPrefix - codeGen.dirPath = dirPathToSaveCodes - codeGen.objectSuffix = objectSuffix - allSchemes = JSONScheme.JSONSchemeDic - codeGen.JSONSchemeDic = allSchemes - - rootDic = allSchemes["ROOT"] - allRootKeys = rootDic.keys() - for typeName in rootDic : - obj = rootDic[typeName]; - if obj.isNaturalType() == False: - codeGen.make(obj) - - else : - codeGen = ObjectiveCCodeGenerator() - - allSchemes = JSONScheme.JSONSchemeDic - rootDic = allSchemes["ROOT"] - - for typeName in rootDic : - obj = rootDic[typeName]; - if obj.isNaturalType() == False: - - for template_filename in templateCodeGen.json_template_files: - template = open(template_filename) - content = codeGen.render(obj, template.read()) - - file = templateCodeGen.create_template_output_file(template_filename, obj.getClassName()) - try: - file.write(content) - finally : - file.close() + codeGen = ObjectiveCCodeGenerator() + allSchemes = JSONScheme.JSONSchemeDic + rootDic = allSchemes["ROOT"] + for typeName in rootDic : + obj = rootDic[typeName]; + if obj.isNaturalType() == False: + for template_filename in templateCodeGen.json_template_files: + template = open(template_filename) + content = codeGen.render(obj, template.read()) + file = templateCodeGen.create_template_output_file(template_filename, obj.getClassName()) + try: + file.write(content) + finally : + file.close() @@ -201,7 +160,6 @@ def usage(): usageString += ' -h, --help shows help\n' usageString += ' -p, --prefix= project prefix (default: S2M)\n' usageString += ' -s, --suffix= classname suffix (default: JSONObject). Use "-s false" for no suffix\n' - usageString += ' -t, --target= target platform iOS or Android (default: iOS)\n' usageString += ' -i, --input= metaJSON file to read\n' usageString += ' -o, --output= output path of generated source codes (default: src)\n' usageString += ' --template= template directory to use to generate code\n' From b5871915e39f7d3853c3826a98cb40b227298712 Mon Sep 17 00:00:00 2001 From: Martin Bober <mbo@sinnerschrader-mobile.com> Date: Thu, 12 Mar 2015 13:50:44 +0100 Subject: [PATCH 146/149] Renamed ObjectiveCCodeGenerator.py to SourceCodeGenerator --- ...iveCCodeGenerator.py => SourceCodeGenerator.py} | 2 +- metajson/readJSON.py | 4 ++-- ...nerator_test.py => SourceCodeGenerator_test.py} | 14 +++++++------- 3 files changed, 10 insertions(+), 10 deletions(-) rename metajson/{ObjectiveCCodeGenerator.py => SourceCodeGenerator.py} (99%) rename test/{ObjectiveCCodeGenerator_test.py => SourceCodeGenerator_test.py} (94%) diff --git a/metajson/ObjectiveCCodeGenerator.py b/metajson/SourceCodeGenerator.py similarity index 99% rename from metajson/ObjectiveCCodeGenerator.py rename to metajson/SourceCodeGenerator.py index bbdf9cd..9c68296 100755 --- a/metajson/ObjectiveCCodeGenerator.py +++ b/metajson/SourceCodeGenerator.py @@ -30,7 +30,7 @@ from template_code_generator import * -class ObjectiveCCodeGenerator : +class SourceCodeGenerator : def __init__(self): self.mustache_renderer = Renderer() diff --git a/metajson/readJSON.py b/metajson/readJSON.py index eb1c359..1539ec4 100755 --- a/metajson/readJSON.py +++ b/metajson/readJSON.py @@ -33,7 +33,7 @@ import sys, getopt from JSONScheme import * -from ObjectiveCCodeGenerator import * +from SourceCodeGenerator import * def main(argv=sys.argv): # parse Options @@ -118,7 +118,7 @@ def main(argv=sys.argv): jsonObj = read_file(filePath) schemeObj = create_json_scheme(jsonObj) - codeGen = ObjectiveCCodeGenerator() + codeGen = SourceCodeGenerator() allSchemes = JSONScheme.JSONSchemeDic rootDic = allSchemes["ROOT"] for typeName in rootDic : diff --git a/test/ObjectiveCCodeGenerator_test.py b/test/SourceCodeGenerator_test.py similarity index 94% rename from test/ObjectiveCCodeGenerator_test.py rename to test/SourceCodeGenerator_test.py index b2699c4..e291e99 100644 --- a/test/ObjectiveCCodeGenerator_test.py +++ b/test/SourceCodeGenerator_test.py @@ -1,4 +1,4 @@ -from metajson.ObjectiveCCodeGenerator import ObjectiveCCodeGenerator +from metajson.SourceCodeGenerator import SourceCodeGenerator from metajson.JSONScheme import * import pickle @@ -7,9 +7,9 @@ import os import datetime -class TestObjectiveCCodeGenerator(unittest.TestCase): +class TestSourceCodeGenerator(unittest.TestCase): def setUp(self): - self.gen = ObjectiveCCodeGenerator() + self.gen = SourceCodeGenerator() self.maxDiff = None self.default_folder = 'test/data/' @@ -43,7 +43,7 @@ def assert_content_file(self, filename, content): # All reference files have a timestamp of 2014 so we tweak our generated code to match them. self.assertMultiLineEqual(content.replace(str(datetime.datetime.now().year), "2014"), expected_result) -class TestSampleTestClassCase(TestObjectiveCCodeGenerator): +class TestSampleTestClassCase(TestSourceCodeGenerator): def setUp(self): super(TestSampleTestClassCase, self).setUp() self.test_file_path = self.default_folder + 'test_class' @@ -67,7 +67,7 @@ def test_machine_header_content(self): self.assert_content_file(self.test_file_path + "/_S2MSenderJSONObject.h", result) -class TestSampleTestStringOptionsCase(TestObjectiveCCodeGenerator): +class TestSampleTestStringOptionsCase(TestSourceCodeGenerator): def setUp(self): super(TestSampleTestStringOptionsCase, self).setUp() self.test_file_path = self.default_folder + 'test_string_options' @@ -81,7 +81,7 @@ def test_machine_header_content(self): result = self.machine_header_content(self.scheme_object) self.assert_content_file(self.test_file_path + "/_S2MLoginJSONObject.h", result) -class TestSampleTestSubclassCase(TestObjectiveCCodeGenerator): +class TestSampleTestSubclassCase(TestSourceCodeGenerator): def setUp(self): super(TestSampleTestSubclassCase, self).setUp() scheme = pickle.load(open(self.default_folder + '/test_subclass_scheme.p', 'rb')) @@ -132,7 +132,7 @@ def test_machine_header_content(self): result = self.machine_header_content(self.scheme_object) self.assert_content_file(self.test_file_path + "/_SubClassJSONObject.h", result) -class TestSampleTestTypesCase(TestObjectiveCCodeGenerator): +class TestSampleTestTypesCase(TestSourceCodeGenerator): def setUp(self): super(TestSampleTestTypesCase, self).setUp() scheme = pickle.load(open(self.default_folder + '/test_types_scheme.p', 'rb')) From c35c5d89885d3b153962a76821e5cb72a9906e5b Mon Sep 17 00:00:00 2001 From: Martin Bober <mbo@sinnerschrader-mobile.com> Date: Mon, 16 Mar 2015 11:48:49 +0100 Subject: [PATCH 147/149] Respecting suffix in class names. --- metajson/templates/Android/_CLASSNAME_.java.mustache | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/metajson/templates/Android/_CLASSNAME_.java.mustache b/metajson/templates/Android/_CLASSNAME_.java.mustache index 2407e8e..5637c3e 100644 --- a/metajson/templates/Android/_CLASSNAME_.java.mustache +++ b/metajson/templates/Android/_CLASSNAME_.java.mustache @@ -21,13 +21,13 @@ import org.json.JSONObject; import {{package}}.*; {{#baseTypeIsObject}} -public class {{prefix}}{{#_upper_camelcase}}{{name}}{{/_upper_camelcase}} { +public class {{prefix}}{{#_upper_camelcase}}{{name}}{{/_upper_camelcase}}{{suffix}} { {{/baseTypeIsObject}} {{^baseTypeIsObject}} -public class {{prefix}}{{#_upper_camelcase}}{{name}}{{/_upper_camelcase}} extends {{baseClassName}} { +public class {{prefix}}{{#_upper_camelcase}}{{name}}{{/_upper_camelcase}}{{suffix}} extends {{baseClassName}} { {{/baseTypeIsObject}} - public {{prefix}}{{#_upper_camelcase}}{{name}}{{/_upper_camelcase}}(JSONObject source) throws JSONException { + public {{prefix}}{{#_upper_camelcase}}{{name}}{{/_upper_camelcase}}{{suffix}}(JSONObject source) throws JSONException { {{^baseTypeIsObject}} super(source); {{/baseTypeIsObject}} From d9c1bf9b3ce123d713e43bf9bc1d0acde6f0012b Mon Sep 17 00:00:00 2001 From: Martin Bober <mbo@sinnerschrader-mobile.com> Date: Mon, 16 Mar 2015 11:59:25 +0100 Subject: [PATCH 148/149] Moved member variable's definitions up and added some whitespace. --- .../Android/_CLASSNAME_.java.mustache | 102 ++++++++++++------ metajson/templates/Android/array.mustache | 17 +-- 2 files changed, 83 insertions(+), 36 deletions(-) diff --git a/metajson/templates/Android/_CLASSNAME_.java.mustache b/metajson/templates/Android/_CLASSNAME_.java.mustache index 5637c3e..d38502a 100644 --- a/metajson/templates/Android/_CLASSNAME_.java.mustache +++ b/metajson/templates/Android/_CLASSNAME_.java.mustache @@ -99,6 +99,72 @@ public class {{prefix}}{{#_upper_camelcase}}{{name}}{{/_upper_camelcase}}{{suffi */ {{/description}} private double m{{#_upper_camelcase}}{{name}}{{/_upper_camelcase}}; + +{{/numberProperties}} +{{#stringProperties}} + {{#description}} + /** + * {{description}} + */ + {{/description}} + private String m{{#_upper_camelcase}}{{name}}{{/_upper_camelcase}}; + +{{/stringProperties}} +{{#booleanProperties}} + {{#description}} + /** + * {{description}} + */ + {{/description}} + private boolean m{{#_upper_camelcase}}{{name}}{{/_upper_camelcase}}; + +{{/booleanProperties}} +{{#dataProperties}} + {{#description}} + /** + * {{description}} + */ + {{/description}} + private byte[] m{{#_upper_camelcase}}{{name}}{{/_upper_camelcase}}; + +{{/dataProperties}} +{{#dateProperties}} + {{#description}} + /** + * {{description}} + */ + {{/description}} + private Date m{{#_upper_camelcase}}{{name}}{{/_upper_camelcase}}; + +{{/dateProperties}} +{{#arrayProperties}} + {{#description}} + /** + * {{description}} + */ + {{/description}} + private JSONArray m{{#_upper_camelcase}}{{name}}{{/_upper_camelcase}}; + +{{/arrayProperties}} +{{#objectProperties}} + {{#description}} + /** + * {{description}} + */ + {{/description}} + private {{className}} m{{#_upper_camelcase}}{{name}}{{/_upper_camelcase}}; + +{{/objectProperties}} +{{#undefinedProperties}} + {{#description}} + /** + * {{description}} + */ + {{/description}} + private JSONArray m{{#_upper_camelcase}}{{name}}{{/_upper_camelcase}}; + +{{/undefinedProperties}} +{{#numberProperties}} public void set{{#_upper_camelcase}}{{name}}{{/_upper_camelcase}}(double newVal) { {{#minValue}} if (newVal < {{minValue}}) { @@ -112,18 +178,13 @@ public class {{prefix}}{{#_upper_camelcase}}{{name}}{{/_upper_camelcase}}{{suffi {{/maxValue}} m{{#_upper_camelcase}}{{name}}{{/_upper_camelcase}} = newVal; } + public double get{{#_upper_camelcase}}{{name}}{{/_upper_camelcase}}() { return m{{#_upper_camelcase}}{{name}}{{/_upper_camelcase}}; } {{/numberProperties}} {{#stringProperties}} - {{#description}} - /** - * {{description}} - */ - {{/description}} - private String m{{#_upper_camelcase}}{{name}}{{/_upper_camelcase}}; public void set{{#_upper_camelcase}}{{name}}{{/_upper_camelcase}}(String newVal) { {{#maxLength}} if ((newVal != null) && (newVal.length() > {{maxLength}})) { @@ -142,33 +203,23 @@ public class {{prefix}}{{#_upper_camelcase}}{{name}}{{/_upper_camelcase}}{{suffi {{/regex}} m{{#_upper_camelcase}}{{name}}{{/_upper_camelcase}} = newVal; } + public String get{{#_upper_camelcase}}{{name}}{{/_upper_camelcase}}() { return m{{#_upper_camelcase}}{{name}}{{/_upper_camelcase}}; } {{/stringProperties}} {{#booleanProperties}} - {{#description}} - /** - * {{description}} - */ - {{/description}} - private boolean m{{#_upper_camelcase}}{{name}}{{/_upper_camelcase}}; public void set{{#_upper_camelcase}}{{name}}{{/_upper_camelcase}}(boolean newVal) { m{{#_upper_camelcase}}{{name}}{{/_upper_camelcase}} = newVal; } + public boolean get{{#_upper_camelcase}}{{name}}{{/_upper_camelcase}}() { return m{{#_upper_camelcase}}{{name}}{{/_upper_camelcase}}; } {{/booleanProperties}} {{#dataProperties}} - {{#description}} - /** - * {{description}} - */ - {{/description}} - private byte[] m{{#_upper_camelcase}}{{name}}{{/_upper_camelcase}}; public void set{{#_upper_camelcase}}{{name}}{{/_upper_camelcase}}(byte[] newVal) { {{#minLength}} if ((newVal != null) && (newVal.length < {{minLength}})) { @@ -182,18 +233,13 @@ public class {{prefix}}{{#_upper_camelcase}}{{name}}{{/_upper_camelcase}}{{suffi {{/maxLength}} m{{#_upper_camelcase}}{{name}}{{/_upper_camelcase}} = newVal; } + public byte[] get{{#_upper_camelcase}}{{name}}{{/_upper_camelcase}}() { return m{{#_upper_camelcase}}{{name}}{{/_upper_camelcase}}; } {{/dataProperties}} {{#dateProperties}} - {{#description}} - /** - * {{description}} - */ - {{/description}} - private Date m{{#_upper_camelcase}}{{name}}{{/_upper_camelcase}}; public void set{{#_upper_camelcase}}{{name}}{{/_upper_camelcase}}(Date newVal) { {{#minValue}} if ((newVal != null) && (newVal.getTime() < {{minValue}}) { @@ -207,6 +253,7 @@ public class {{prefix}}{{#_upper_camelcase}}{{name}}{{/_upper_camelcase}}{{suffi {{/maxValue}} m{{#_upper_camelcase}}{{name}}{{/_upper_camelcase}} = newVal; } + public Date get{{#_upper_camelcase}}{{name}}{{/_upper_camelcase}}() { return m{{#_upper_camelcase}}{{name}}{{/_upper_camelcase}}; } @@ -215,15 +262,10 @@ public class {{prefix}}{{#_upper_camelcase}}{{name}}{{/_upper_camelcase}}{{suffi {{> metajson/templates/Android/array}} {{/arrayProperties}} {{#objectProperties}} - {{#description}} - /** - * {{description}} - */ - {{/description}} - private {{className}} m{{#_upper_camelcase}}{{name}}{{/_upper_camelcase}}; public void set{{#_upper_camelcase}}{{name}}{{/_upper_camelcase}}({{className}} newVal) { m{{#_upper_camelcase}}{{name}}{{/_upper_camelcase}} = newVal; } + public {{className}} get{{#_upper_camelcase}}{{name}}{{/_upper_camelcase}}() { return m{{#_upper_camelcase}}{{name}}{{/_upper_camelcase}}; } diff --git a/metajson/templates/Android/array.mustache b/metajson/templates/Android/array.mustache index 5eecb74..ad74b79 100644 --- a/metajson/templates/Android/array.mustache +++ b/metajson/templates/Android/array.mustache @@ -1,9 +1,3 @@ - {{#description}} - /** - * {{description}} - */ - {{/description}} - private JSONArray m{{#_upper_camelcase}}{{name}}{{/_upper_camelcase}}; public void set{{#_upper_camelcase}}{{name}}{{/_upper_camelcase}}(JSONArray newVal) { {{#minCount}} if ((newVal != null) && (newVal.length() < {{minCount}})) { @@ -17,36 +11,47 @@ {{/maxCount}} m{{#_upper_camelcase}}{{name}}{{/_upper_camelcase}} = newVal; } + public void set{{#_upper_camelcase}}{{name}}{{/_upper_camelcase}}AsDouble(double newVal, int index) throws JSONException { m{{#_upper_camelcase}}{{name}}{{/_upper_camelcase}}.put(index, newVal); } + public void set{{#_upper_camelcase}}{{name}}{{/_upper_camelcase}}AsString(String newVal, int index) throws JSONException { m{{#_upper_camelcase}}{{name}}{{/_upper_camelcase}}.put(index, newVal); } + public void set{{#_upper_camelcase}}{{name}}{{/_upper_camelcase}}AsBoolean(boolean newVal, int index) throws JSONException { m{{#_upper_camelcase}}{{name}}{{/_upper_camelcase}}.put(index, newVal); } + public void set{{#_upper_camelcase}}{{name}}{{/_upper_camelcase}}AsDate(Date newVal, int index) throws JSONException { m{{#_upper_camelcase}}{{name}}{{/_upper_camelcase}}.put(index, newVal); } + public void set{{#_upper_camelcase}}{{name}}{{/_upper_camelcase}}AsArray(JSONArray newVal, int index) throws JSONException { m{{#_upper_camelcase}}{{name}}{{/_upper_camelcase}}.put(index, newVal); } + public JSONArray get{{#_upper_camelcase}}{{name}}{{/_upper_camelcase}}() { return m{{#_upper_camelcase}}{{name}}{{/_upper_camelcase}}; } + public double get{{#_upper_camelcase}}{{name}}{{/_upper_camelcase}}AsDouble(int index) { return m{{#_upper_camelcase}}{{name}}{{/_upper_camelcase}}.optDouble(index); } + public String get{{#_upper_camelcase}}{{name}}{{/_upper_camelcase}}AsString(int index) { return m{{#_upper_camelcase}}{{name}}{{/_upper_camelcase}}.optString(index); } + public boolean get{{#_upper_camelcase}}{{name}}{{/_upper_camelcase}}AsBoolean(int index) { return m{{#_upper_camelcase}}{{name}}{{/_upper_camelcase}}.optBoolean(index); } + public Date get{{#_upper_camelcase}}{{name}}{{/_upper_camelcase}}AsDate(int index) { return new Date(m{{#_upper_camelcase}}{{name}}{{/_upper_camelcase}}.optLong(index)); } + public JSONArray get{{#_upper_camelcase}}{{name}}{{/_upper_camelcase}}AsArray(int index) { return m{{#_upper_camelcase}}{{name}}{{/_upper_camelcase}}.optJSONArray(index); } From 836833c37ef987ddda8b5db393d3fa720b3cd026 Mon Sep 17 00:00:00 2001 From: Martin Bober <mbo@sinnerschrader-mobile.com> Date: Fri, 20 Mar 2015 16:22:55 +0100 Subject: [PATCH 149/149] Improved test portability to fix sinnerschrader-mobile/metaJSON#28 --- test/readJSON_test.py | 81 ++++++++++++++++++++++++++++++------------- 1 file changed, 56 insertions(+), 25 deletions(-) diff --git a/test/readJSON_test.py b/test/readJSON_test.py index 9735b44..93d5748 100644 --- a/test/readJSON_test.py +++ b/test/readJSON_test.py @@ -1,6 +1,10 @@ -import unittest -import os import datetime +import difflib +import os +import re +import shutil +import sys +import unittest class TestReadJSON(unittest.TestCase): def setUp(self): @@ -8,32 +12,59 @@ def setUp(self): def test_command(self): exit_status = self.execute_script("samples/product.json", "test/data/product") - self.assertEqual(exit_status, 0) # no difference + self.assertTrue(exit_status) def execute_script(self, json_file, output_dir): os.system("python -m metajson -p '' -i " + json_file) # ignoring template files - os.system("rm -rf ./src/APIParser") - os.system("rm -rf ./src/Utilities") - # return os.system("diff -r src/ " + output_dir) - # common_file = "/AbstractInterfaceFiles/_ProductDetailJSONObject.h" - # common_file = "/AbstractInterfaceFiles/_ProductDetailJSONObject.h" - # common_file = "/AbstractInterfaceFiles/_SenderGroupJSONObject.h" - # common_file = "/AbstractInterfaceFiles/_SenderList2JSONObject.h" - # common_file = "/AbstractInterfaceFiles/_SenderListJSONObject.m" - # common_file = "/AbstractInterfaceFiles/_SenderList2JSONObject.m" - # common_file = "/AbstractInterfaceFiles/_SenderJSONObject.m" - # common_file = "/AbstractInterfaceFiles/_SenderGroupJSONObject.m" - - # All timestamps in reference files should be 2014, so we need to tweak our generated files to match them. - os.system("find src -type f -exec sed -r --in-place \"s/%d/2014/g\" {} +" % (datetime.datetime.now().year, ) ) - return os.system("diff -r -w -b -B src " + output_dir) - # return os.system("diff -r -w -b -B src" + common_file + " " + output_dir + common_file) + shutil.rmtree(os.path.join("src", "APIParser")) + shutil.rmtree(os.path.join("src", "Utilities")) + return self.compare_dirs("src", output_dir, fix_date = True) def test_yaml_input(self): - json_file = "samples/product.json" - yaml_file = "samples/product.yaml" - os.system("python -m metajson -i " + json_file + " -o src/json") - os.system("python -m metajson -i " + yaml_file + " -o src/yaml") - exit_status = os.system("diff -r -w -b -B src/json src/yaml") - self.assertEqual(exit_status, 0) # no difference + json_file = os.path.join("samples", "product.json") + yaml_file = os.path.join("samples", "product.yaml") + json_out_dir = os.path.join("src", "json") + yaml_out_dir = os.path.join("src", "yaml") + os.system("python -m metajson -i " + json_file + " -o " + json_out_dir) + os.system("python -m metajson -i " + yaml_file + " -o " + yaml_out_dir) + exit_status = self.compare_dirs(json_out_dir, yaml_out_dir) + self.assertTrue(exit_status) + + def compare_dirs(self, dir_a, dir_b, fix_date = False): + files_in_a = [] + for (dirpath, subdirs, filenames) in os.walk(dir_a): + current_dir = dirpath + for filename in filenames: + cur_file_path_a = os.path.join(dirpath,filename) + cur_file_path_b = cur_file_path_a.replace(dir_a, dir_b, 1) + if not os.path.isfile(cur_file_path_b): + print "%s not found in %s." % (current_file_path_a, dir_b) + return False + files_in_a += [cur_file_path_a] + content_a = "foo" + content_b = "bar" + cur_file_a = open(cur_file_path_a, 'r') + cur_file_b = open(cur_file_path_b, 'r') + try: + content_a = cur_file_a.read() + if fix_date: + # All timestamps in reference files should be 2014, so we need to tweak our generated files to match them. + content_a = content_a.replace(str(datetime.datetime.now().year), "2014") + content_a = re.sub("\s", "", content_a) + content_b = re.sub("\s", "", cur_file_b.read()) + finally: + cur_file_a.close() + cur_file_b.close() + if content_a != content_b: + for line in difflib.unified_diff(content_a, content_b, fromfile=cur_file_path_a, tofile=cur_file_path_b): + sys.stdout.write(line) + return False + for (dirpath, subdirs, filenames) in os.walk(dir_b): + for filename in filenames: + current_file_name = os.path.join(dirpath, filename) + if not (current_file_name.replace(dir_b, dir_a, 1) in files_in_a): + print "%s not found in %s" % (current_file_name, dir_a) + return False + return True +