1+ """ Resposible for generating code related to a language """
2+ import os
3+
4+ from parse import DataParser
5+ from util import camel_case , first_upper , first_chars , spinal_case , pyinstaller_get_full_path
6+ from languagetype import Language
7+
8+ DEFINITION_TEMPLATE = '\t private {0} {1};'
9+ GETTER_TEMPLATE = '\t public {0} get{1}() {{\n \t \t return this.{2};\n \t }}'
10+ SETTER_TEMPLATE = '\t public void set{0}({1} {2}) {{\n \t \t this.{2} = {2};\n \t }}'
11+ TOSTRING_TEMPLATE = '"[{0}] [{1}]"'
12+ TOSTRING_INNER_TEMPLATE = '{}=" + {} + "'
13+ ROWMAP_SETTER_TEMPLATE = '\t \t {0}.set{1}(rs.get{1}("{2}"));'
14+ TYPESCRIPT_DEFINITION_TEMPLATE = ' {0}: {1};'
15+
16+
17+ class Generator (object ):
18+ data = []
19+ types = {}
20+
21+ def __init__ (self ):
22+ self .parser = DataParser ()
23+
24+
25+ def load_file (self , data_file ):
26+ # Reset information about a file
27+ self .data = []
28+ self .types = {}
29+
30+ with open (data_file , 'r' ) as in_file :
31+ lines = in_file .read ().splitlines ()
32+
33+
34+ header = lines [0 ].split ('|' )
35+ print (header )
36+
37+ for item in header :
38+ self .types [item ] = None
39+
40+ line_data = []
41+ for line in lines [1 :]:
42+ line_data = [c for c in line .split ('|' ) if c != '' and c != ' ' ]
43+ if len (line_data ) is len (lines [0 ]):
44+ break # TODO: Is there a better way to handle this?
45+
46+ for idx , cell in enumerate (line_data ):
47+ self .types [header [idx ]] = self .parser .parse_type (cell ), camel_case (header [idx ])
48+
49+ self ._pretty_print_types ()
50+
51+ def generate_entity_files (self , entity_name , folder_path , create_typescript = False ):
52+ if not os .path .isdir (folder_path ):
53+ os .mkdir (folder_path )
54+
55+ self ._make_bean (entity_name , folder_path )
56+ self ._make_bean_rowmapper (entity_name , folder_path )
57+ if create_typescript :
58+ self ._make_typescript (entity_name , folder_path )
59+
60+ def _make_bean (self , entity_name , folder_path ):
61+ if not entity_name [0 ].isupper ():
62+ entity_name = first_upper (entity_name )
63+
64+ print ('Generating {0}.java' .format (entity_name ))
65+
66+ declarations = '\n ' .join (self ._generate_definitions ())
67+ getter_setter = '\n ' .join (self ._generate_getters_setters ())
68+ to_string = self ._generate_tostring (entity_name )
69+
70+ template = ''
71+ path = pyinstaller_get_full_path ('templates/Entity.java' )
72+
73+ with open (path , 'r' ) as in_file :
74+ template = in_file .read ()
75+
76+ template = template .replace ('[%ENTITY%]' , entity_name ).replace ('[%DECLARATION%]' , declarations ).replace ('[%GETTER_SETTER%]' , getter_setter ).replace ('[%TOSTRING%]' , to_string )
77+
78+ output_path = os .path .join (folder_path , entity_name + '.java' )
79+
80+ with open (output_path , 'w+' ) as out_file :
81+ out_file .write (template )
82+
83+ def _make_bean_rowmapper (self , entity_name , folder_path ):
84+ if not entity_name [0 ].isupper ():
85+ entity_name = first_upper (entity_name )
86+
87+ print ('Generating {0}RowMapper.java' .format (entity_name ))
88+
89+ template = ''
90+ path = pyinstaller_get_full_path ('templates/EntityRowMapper.java' )
91+
92+ with open (path , 'r' ) as in_file :
93+ template = in_file .read ()
94+
95+ row_maps = '\n ' .join (self ._generate_rowmap (entity_name ))
96+
97+ template = template .replace ('[%ENTITY%]' , first_upper (entity_name )).replace ('[%ENTITYVAR%]' , first_chars (entity_name )).replace ('[%ROWMAPPER%]' , row_maps )
98+ output_path = os .path .join (folder_path , entity_name + 'RowMapper.java' )
99+
100+ with open (output_path , 'w+' ) as out_file :
101+ out_file .write (template )
102+
103+ def _make_typescript (self , entity_name , folder_path ):
104+ print ('Generating {0}.ts' .format (spinal_case (entity_name ).lower ()))
105+
106+ template = ''
107+ path = pyinstaller_get_full_path ('templates/entity.ts' )
108+ with open (path , 'r' ) as in_file :
109+ template = in_file .read ()
110+
111+ definitions = '\n ' .join (self ._generate_typescript_definitions ())
112+
113+ template = template .replace ('[%ENTITY%]' , first_upper (entity_name )).replace ('[%DEFINITIONS%]' , definitions )
114+ output_path = os .path .join (folder_path , spinal_case (entity_name ).lower () + '.ts' )
115+
116+ with open (output_path , 'w+' ) as out_file :
117+ out_file .write (template )
118+
119+ def _generate_typescript_definitions (self ):
120+ code_lines = []
121+ for key in self .types :
122+ var = self .types [key ]
123+ code_lines .append (TYPESCRIPT_DEFINITION_TEMPLATE .format (var [1 ], self .parser .translate_type (var [0 ], Language .Typescript )))
124+ return code_lines
125+
126+ def _generate_rowmap (self , entity_name ):
127+ entity_var_name = first_chars (entity_name )
128+
129+ code_lines = []
130+ for key in self .types :
131+ var = self .types [key ]
132+ code_lines .append (ROWMAP_SETTER_TEMPLATE .format (entity_var_name , first_upper (var [1 ]), key ))
133+ return code_lines
134+
135+ def _generate_getters_setters (self ):
136+ code_lines = []
137+ for key in self .types :
138+ var = self .types [key ]
139+ java_type = self .parser .translate_type (var [0 ], Language .Java )
140+ code_lines .append (GETTER_TEMPLATE .format (java_type , first_upper (var [1 ]), var [1 ]))
141+ code_lines .append (SETTER_TEMPLATE .format (first_upper (java_type ), java_type , var [1 ]))
142+ return code_lines
143+
144+ def _generate_definitions (self ):
145+ code_lines = []
146+ for key in self .types :
147+ var = self .types [key ]
148+ code_lines .append (DEFINITION_TEMPLATE .format (self .parser .translate_type (var [0 ], Language .Java ), var [1 ]))
149+ return code_lines
150+
151+ def _generate_tostring (self , entity_name ):
152+ variables = []
153+ for key in self .types :
154+ var = self .types [key ]
155+ variables .append (first_upper (var [1 ]))
156+ variables .append (var [1 ])
157+ inner_format_templates = ', ' .join ([TOSTRING_INNER_TEMPLATE ] * len (self .types .keys ()))
158+ return TOSTRING_TEMPLATE .format (entity_name , inner_format_templates .format (* variables ))
159+
160+ def _pretty_print_types (self ):
161+ print ('Parsed type info:' )
162+ # \tSQL -> camelCase: type
163+ for key in self .types :
164+ var = self .types [key ]
165+ print ('\t {} -> {}: {}' .format (key , var [1 ], var [0 ]))
0 commit comments