Skip to content

Commit 9854805

Browse files
committed
Completed the refactor to a more robust system.
1 parent 09bcc28 commit 9854805

File tree

8 files changed

+133
-199
lines changed

8 files changed

+133
-199
lines changed

easyjava.py

Lines changed: 1 addition & 102 deletions
Original file line numberDiff line numberDiff line change
@@ -8,10 +8,7 @@
88

99
from gooey import Gooey, GooeyParser
1010

11-
#import parse as parse
1211
from parse import DataParser
13-
from typeinfo import TypeInfo
14-
from util import camel_case, first_upper, first_chars, spinal_case, pyinstaller_get_full_path
1512
from generator import Generator
1613

1714
def get_argument(argument, default="None"):
@@ -33,95 +30,6 @@ def init_args():
3330
return parser.parse_args()
3431

3532

36-
37-
def parse_data(data_file):
38-
types = []
39-
lines = []
40-
parser = DataParser()
41-
with open(data_file, 'r') as in_file:
42-
lines = in_file.read().splitlines()
43-
44-
45-
header = lines[0].split('|')
46-
print(header)
47-
48-
line_data = []
49-
for line in lines[1:]:
50-
line_data = [c for c in line.split('|') if c != '' and c != ' ']
51-
if len(line_data) is len(lines[0]):
52-
break
53-
54-
for idx, cell in enumerate(line_data):
55-
types.append(TypeInfo(parser.parse_type(cell), camel_case(header[idx]), header[idx]))
56-
57-
return types
58-
59-
def generate_entity_file(entity_name, types):
60-
print('Generating {0}.java'.format(entity_name))
61-
62-
declarations = ''
63-
for t in types:
64-
declarations = declarations + t.generate_definitition() + '\n'
65-
66-
getter_setter = ''
67-
for t in types:
68-
getter_setter = getter_setter + t.generate_getter() + '\n' + t.generate_setter() + '\n'
69-
70-
to_string = '" ' + entity_name + ' ['
71-
72-
for t in types:
73-
# "[%ENTITY%] [[%VARIABLE%]=" + [%VARIABLE%] + ", Name=" + name + ", Designation=" + designation + ", Salary=" + salary + "]";
74-
to_string = to_string + t.var_name + '= " + ' + t.var_name + ' + ", '
75-
to_string = ''.join(to_string[:len(to_string)-3]) + '"]";'
76-
77-
template = ''
78-
path = pyinstaller_get_full_path('templates/Entity.java') #os.path.abspath(os.path.join(os.getcwd(), 'templates/Entity.java')) # Local only
79-
80-
with open(path, 'r') as in_file:
81-
template = in_file.read()
82-
83-
template = template.replace('[%ENTITY%]', first_upper(entity_name)).replace('[%DECLARATION%]', declarations).replace('[%GETTER_SETTER%]', getter_setter).replace('[%TOSTRING%]', to_string)
84-
with open(first_upper(entity_name) + '.java', 'w+') as out_file:
85-
out_file.write(template)
86-
87-
def generate_entity_row_mapper(entity_name, types):
88-
print('Generating {0}RowMapper.java'.format(entity_name))
89-
90-
template = ''
91-
path = pyinstaller_get_full_path('templates/EntityRowMapper.java') # os.path.abspath(os.path.join(os.getcwd(), 'templates/EntityRowMapper.java')) # Local only
92-
93-
with open(path, 'r') as in_file:
94-
template = in_file.read()
95-
96-
entity_var_name = first_chars(entity_name)
97-
98-
row_maps = ''
99-
for t in types:
100-
row_maps = row_maps + '\t\t' + entity_var_name + t.generate_rowmap_method() + '\n'
101-
102-
template = template.replace('[%ENTITY%]', first_upper(entity_name)).replace('[%ENTITYVAR%]', entity_var_name).replace('[%ROWMAPPER%]', row_maps)
103-
104-
with open(first_upper(entity_name) + 'RowMapper.java', 'w+') as out_file:
105-
out_file.write(template)
106-
107-
def generate_entity_typescript(entity_name, types):
108-
print('Generating {0}.ts'.format(spinal_case(entity_name).lower()))
109-
110-
template = ''
111-
path = pyinstaller_get_full_path('templates/entity.ts') # os.path.abspath(os.path.join(os.getcwd(), 'templates/entity.ts')) # Local only
112-
with open(path, 'r') as in_file:
113-
template = in_file.read()
114-
115-
definitions = ''
116-
for t in types:
117-
definitions = definitions + ' ' + t.generate_ts_definition() + '\n'
118-
119-
template = template.replace('[%ENTITY%]', first_upper(entity_name)).replace('[%DEFINITIONS%]', definitions)
120-
121-
with open(spinal_case(entity_name).lower() + '.ts', 'w+') as out_file:
122-
out_file.write(template)
123-
124-
12533
@Gooey
12634
def main(program_name='Easy Java', program_description='Generate POJOs and Row Mappers from data output'):
12735
args = init_args()
@@ -130,16 +38,7 @@ def main(program_name='Easy Java', program_description='Generate POJOs and Row M
13038

13139
gen = Generator()
13240
gen.load_file(data_file)
133-
gen.generate_entity_files(entity, os.getcwd())
134-
exit()
135-
136-
types = parse_data(data_file)
137-
138-
generate_entity_file(entity, types)
139-
generate_entity_row_mapper(entity, types)
140-
141-
if bool(args.typescript):
142-
generate_entity_typescript(entity, types)
41+
gen.generate_entity_files(entity, os.getcwd(), bool(args.typescript))
14342

14443

14544
if __name__ == '__main__':

generator.py

Lines changed: 66 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,16 @@
33

44
from parse import DataParser
55
from util import camel_case, first_upper, first_chars, spinal_case, pyinstaller_get_full_path
6+
from languagetype import Language
67

78
DEFINITION_TEMPLATE = '\tprivate {0} {1};'
89
GETTER_TEMPLATE = '\tpublic {0} get{1}() {{\n\t\treturn this.{2};\n\t}}'
910
SETTER_TEMPLATE = '\tpublic void set{0}({1} {2}) {{\n\t\tthis.{2} = {2};\n\t}}'
1011
TOSTRING_TEMPLATE = '"[{0}] [{1}]"'
1112
TOSTRING_INNER_TEMPLATE = '{}=" + {} + "'
13+
ROWMAP_SETTER_TEMPLATE = '\t\t{0}.set{1}(rs.get{1}("{2}"));'
14+
TYPESCRIPT_DEFINITION_TEMPLATE = ' {0}: {1};'
15+
1216

1317
class Generator(object):
1418
data = []
@@ -42,16 +46,16 @@ def load_file(self, data_file):
4246
for idx, cell in enumerate(line_data):
4347
self.types[header[idx]] = self.parser.parse_type(cell), camel_case(header[idx])
4448

45-
# {'ACTIONITEMIMPACTID': ('int', 'actionItemImpactId'), 'ACTIONITEMID': ('int', 'actionItemId'), 'APPID': ('int', 'appId'), 'APPNAME': (None, 'appName'), 'UPDATEDBY': ('String', 'updatedBy'), 'LASTUPDATED': ('String', 'lastUpdated'), 'DISTANCE': ('float', 'distance')}
46-
print(self.types)
49+
print(self.types) # TODO: Pretty print the mappings to the console
4750

48-
def generate_entity_files(self, entity_name, folder_path):
51+
def generate_entity_files(self, entity_name, folder_path, create_typescript=False):
4952
if not os.path.isdir(folder_path):
50-
# Create folder
5153
os.mkdir(folder_path)
5254

53-
# Make Bean
5455
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)
5559

5660
def _make_bean(self, entity_name, folder_path):
5761
if not entity_name[0].isupper():
@@ -60,20 +64,9 @@ def _make_bean(self, entity_name, folder_path):
6064
print('Generating {0}.java'.format(entity_name))
6165

6266
declarations = '\n'.join(self._generate_definitions())
63-
6467
getter_setter = '\n'.join(self._generate_getters_setters())
65-
6668
to_string = self._generate_tostring(entity_name)
6769

68-
69-
#to_string = '" ' + entity_name + ' ['
70-
71-
72-
#for t in types:
73-
# "[%ENTITY%] [[%VARIABLE%]=" + [%VARIABLE%] + ", Name=" + name + ", Designation=" + designation + ", Salary=" + salary + "]";
74-
# to_string = to_string + t.var_name + '= " + ' + t.var_name + ' + ", '
75-
#to_string = ''.join(to_string[:len(to_string)-3]) + '"]";'
76-
7770
template = ''
7871
path = pyinstaller_get_full_path('templates/Entity.java')
7972

@@ -87,20 +80,73 @@ def _make_bean(self, entity_name, folder_path):
8780
with open(output_path, 'w+') as out_file:
8881
out_file.write(template)
8982

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+
90135
def _generate_getters_setters(self):
91136
code_lines = []
92137
for key in self.types:
93138
var = self.types[key]
94-
code_lines.append(GETTER_TEMPLATE.format(var[0], first_upper(var[1]), var[1]))
95-
code_lines.append(SETTER_TEMPLATE.format(var[0], first_upper(var[1]), var[1]))
96-
print(code_lines)
139+
java_type = self.parser.translate_type(var[0], Language.Java)
140+
print('GETTER: Type for {0}: {1}'.format(var[1], java_type))
141+
code_lines.append(GETTER_TEMPLATE.format(java_type, first_upper(var[1]), var[1]))
142+
code_lines.append(SETTER_TEMPLATE.format(first_upper(java_type), java_type, var[1]))
97143
return code_lines
98144

99145
def _generate_definitions(self):
100146
code_lines = []
101147
for key in self.types:
102148
var = self.types[key]
103-
code_lines.append(DEFINITION_TEMPLATE.format(var[0], var[1]))
149+
code_lines.append(DEFINITION_TEMPLATE.format(self.parser.translate_type(var[0], Language.Java), var[1]))
104150
print(code_lines)
105151
return code_lines
106152

languagetype.py

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,11 @@
11
from enum import Enum
22

3+
class Language(Enum):
4+
Java = 'java'
5+
Typescript = 'typescript'
6+
37
class LanguageType(Enum):
4-
string = 1
5-
integer = 2
6-
float = 3
7-
boolean = 4
8+
string = 'string'
9+
integer = 'integer'
10+
float = 'float'
11+
boolean = 'boolean'

parse.py

Lines changed: 36 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,52 +1,68 @@
11
from rule import ParseRule, RenameRule
2-
from languagetype import LanguageType
2+
from languagetype import LanguageType, Language
33

44
default_rules = [
55
# (E)thernet to the cell site - (P)lanning and (D)esign (D)atabase
6-
ParseRule('matches', r'[^\|\d\.]*', 'String'),
6+
ParseRule('matches', r'[^\|\d\.]*', LanguageType.string),
77
# ma0585
8-
ParseRule('matches', r'[a-z]+[0-9]+', 'String'),
8+
ParseRule('matches', r'[a-z]+[0-9]+', LanguageType.string),
99
# 05/01/2020
10-
ParseRule('matches', r'\d{2}\/\d{2}\/\d{4}', 'String'),
10+
ParseRule('matches', r'\d{2}\/\d{2}\/\d{4}', LanguageType.string),
1111
# 0123
12-
ParseRule('matches', r'0\d+', 'String'),
12+
ParseRule('matches', r'0\d+', LanguageType.string),
1313
# 0.234
14-
ParseRule('matches', r'\d?\.\d*', 'float'),
14+
ParseRule('matches', r'\d?\.\d*', LanguageType.float),
1515
# 123
16-
ParseRule('matches', r'\d*', 'int'),
16+
ParseRule('matches', r'\d*', LanguageType.integer),
1717
]
1818

1919
java_rename_rules = [
20-
RenameRule('Java', 'string', 'String'),
21-
RenameRule('Java', 'integer', 'int'),
22-
RenameRule('Java', 'float', 'float'),
20+
RenameRule(LanguageType.string, 'String'),
21+
RenameRule(LanguageType.integer, 'int'),
22+
RenameRule(LanguageType.float, 'float'),
2323
]
2424

25-
"""
25+
typescript_rename_rules = [
26+
RenameRule(LanguageType.string, 'string'),
27+
RenameRule(LanguageType.integer, 'number'),
28+
RenameRule(LanguageType.float, 'number'),
29+
]
30+
31+
2632
language_type_rules = {
27-
'Java': java_rename_rules,
28-
} """
33+
Language.Java: java_rename_rules,
34+
Language.Typescript: typescript_rename_rules
35+
}
36+
2937

3038
class DataParser(object):
3139
""" Responsible for infering text values into language types based on a set of rules """
3240

3341
rules = []
3442

35-
def __init__(self, rules=default_rules, ):
43+
def __init__(self, rules=default_rules):
3644
self.rules = rules
3745

46+
# Add a catchall for NoneTypes, but prioritize order of rulelist
47+
self.rules.append(ParseRule('matches', r'.*', LanguageType.string))
48+
3849
def parse_type(self, value):
3950
for rule in self.rules:
4051
parsed_type = rule.run(value)
4152

4253
if parsed_type is not None:
4354
return parsed_type
4455
return None
45-
46-
def translate_type_java(self, parse_type):
47-
for rename in java_rename_rules:
48-
java_type = rename.run(parse_type)
49-
if java_type is None:
56+
57+
def translate_type(self, parse_type, language):
58+
if not language in language_type_rules:
59+
return parse_type
60+
61+
rules = language_type_rules[language]
62+
63+
for rename in rules:
64+
translated_type = rename.run(parse_type)
65+
if translated_type is None:
5066
continue
51-
return java_type
67+
return translated_type
5268
return parse_type

parsetest.py

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,24 @@
11
import unittest
22
from parse import DataParser
33
from rule import ParseRule
4+
from languagetype import Language, LanguageType
45

56

67
class Test_TestParse(unittest.TestCase):
78
def test_parse_type(self):
89
parser = DataParser()
9-
self.assertEqual(parser.parse_type('Hippos eat grass'), 'String')
10-
self.assertEqual(parser.parse_type('0123'), 'String')
11-
self.assertEqual(parser.parse_type('0.43'), 'float')
12-
self.assertEqual(parser.parse_type('.32'), 'float')
13-
self.assertEqual(parser.parse_type('100'), 'int')
10+
self.assertEqual(parser.parse_type('Hippos eat grass'), LanguageType.string)
11+
self.assertEqual(parser.parse_type('0123'), LanguageType.string)
12+
self.assertEqual(parser.parse_type('0.43'), LanguageType.float)
13+
self.assertEqual(parser.parse_type('.32'), LanguageType.float)
14+
self.assertEqual(parser.parse_type('100'), LanguageType.integer)
15+
self.assertEqual(parser.parse_type('$650 Switcher registration'), LanguageType.string)
16+
17+
def test_parse_type_translate(self):
18+
parser = DataParser()
19+
self.assertEqual(parser.translate_type(LanguageType.string, Language.Java), 'String')
20+
self.assertEqual(parser.translate_type(LanguageType.string, Language.Typescript), 'string')
21+
self.assertEqual(parser.translate_type(LanguageType.integer, Language.Typescript), 'number')
1422

1523
def test_parse_type_order(self):
1624
""" Test parsing a type where I order a BigInt mapping in front of int """

0 commit comments

Comments
 (0)