-
Notifications
You must be signed in to change notification settings - Fork 2
Expand file tree
/
Copy pathinstantiator.py
More file actions
128 lines (90 loc) · 4.68 KB
/
Copy pathinstantiator.py
File metadata and controls
128 lines (90 loc) · 4.68 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
#!/usr/bin/python
import plistlib
import os
import sys
import getopt
import dircache
import glob
import commands
import json
sys.dont_write_bytecode = True
from constants import Type
from constants import MappingKey
class InstantiatorGenerator:
def __init__(self, plistPaths, output_directory, version, testEnabled, jsonFormatEnabled):
self.plistPaths = plistPaths
self.output_directory = output_directory
self.version = version
self.testEnabled = testEnabled
self.jsonFormatEnabled = jsonFormatEnabled
def internalGeneratedClass(self):
templatePath = self.getPathForFile("instantiator_template.txt")
internalTemplate = open(templatePath, 'r').read()
internalTemplate = str.replace(internalTemplate, '\n', '\r\n')
if self.testEnabled == 0:
internalTemplate = str.replace(internalTemplate, "{ PROD_IMPORT }", "import JSONModelKit")
else:
internalTemplate = str.replace(internalTemplate, "{ PROD_IMPORT }", "")
classnames = []
for mapping in self.plistPaths:
filename = mapping[mapping.rindex('/',0,-1)+1:-1] if mapping.endswith('/') else mapping[mapping.rindex('/')+1:]
classname = filename.split('.', 1 )[0]
classnames.append(classname)
fileString = str.replace(internalTemplate, "{ CASE_ENUM_DEFINITION }", self.class_case_statements(classnames))
fileString = str.replace(fileString, "{ SWITCH_CASE_ENUM_INSTANTIATE }", self.class_switch_statements(classnames))
fileString = str.replace(fileString, "{ CASE_TRANSAFORMER_ENUM_DEFINITION }", self.transformer_case_statements())
fileString = str.replace(fileString, "{ CASE_TRANSAFORMER_ENUM_RETURN }", self.transformer_switch_statements())
return fileString
'''
Replaces { CASE_ENUM_DEFINITION } in the template
'''
def class_case_statements(self, classnames):
caseString = ""
for classname in classnames:
caseString = caseString + 'case _' + classname + ' \t= "'+ classname + '"\n\t'
caseString = caseString + 'case _None \t\t\t= \"None\"'
return caseString
def class_switch_statements(self, classnames):
caseString = ""
for classname in classnames:
caseString = caseString + 'case ._' + classname + ':\n\t\t\treturn '+ classname + '(data)'
if classnames.index(classname) <= len(classnames) - 2:
caseString = caseString + '\n\t\t'
return caseString
def transformer_case_statements(self):
distinctMapperClassDefinitions = []
caseString = ""
for mappingPath in self.plistPaths:
propertyMapping = self.propertyMappingDictionary(mappingPath)
for propertyKey in propertyMapping.keys():
if MappingKey.Transformer in propertyMapping[propertyKey].keys():
mapperClass = propertyMapping[propertyKey][MappingKey.Transformer]
if mapperClass not in distinctMapperClassDefinitions:
distinctMapperClassDefinitions.append(mapperClass)
for mapperClass in distinctMapperClassDefinitions:
caseString = caseString + 'case _' + mapperClass + ' \t= "'+ mapperClass + '"'
if distinctMapperClassDefinitions.index(mapperClass) <= len(distinctMapperClassDefinitions) - 2:
caseString = caseString + '\n\t'
return str(caseString)
def transformer_switch_statements(self):
distinctMapperClassDefinitions = []
caseString = ""
for mappingPath in self.plistPaths:
propertyMapping = self.propertyMappingDictionary(mappingPath)
for propertyKey in propertyMapping.keys():
if MappingKey.Transformer in propertyMapping[propertyKey].keys():
mapperClass = propertyMapping[propertyKey][MappingKey.Transformer]
if mapperClass not in distinctMapperClassDefinitions:
distinctMapperClassDefinitions.append(mapperClass)
for mapperClass in distinctMapperClassDefinitions:
caseString = caseString + 'case ._' + mapperClass + ':\n\t\t\treturn '+ mapperClass + '()'
if distinctMapperClassDefinitions.index(mapperClass) <= len(distinctMapperClassDefinitions) - 2:
caseString = caseString + '\n\t\t'
return str(caseString)
def propertyMappingDictionary(self, mappingPath):
if self.jsonFormatEnabled == True:
print mappingPath
return json.load(open(mappingPath))
return plistlib.readPlist(mappingPath)
def getPathForFile(self, fileName):
return str.replace(os.path.abspath(__file__), "instantiator.py", fileName)