Skip to content

Commit fd67ea1

Browse files
authored
Merge pull request #2 from majora2007/feature/refactor
Refactor
2 parents af37c79 + ce41fe8 commit fd67ea1

File tree

12 files changed

+387
-167
lines changed

12 files changed

+387
-167
lines changed

.gitignore

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -136,3 +136,6 @@ dmypy.json
136136

137137
# Cython debug symbols
138138
cython_debug/
139+
140+
# Generated .java files
141+
*.java

README.md

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,6 @@ example: python easyjava.py --entity ApplicationGroup --data "C:/Users/majora200
1212
Word list came from:
1313
https://raw.githubusercontent.com/first20hours/google-10000-english/master/google-10000-english-no-swears.txt
1414

15-
N.B. This code is pretty messy, I wrote this in 2 hours. Don't judge.
16-
1715
Build:
1816
//pyinstaller --onefile --add-data "templates/*.*;./templates" --add-data "words.txt;." easyjava.py
1917
Use:

easyjava.py

Lines changed: 5 additions & 98 deletions
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,8 @@
88

99
from gooey import Gooey, GooeyParser
1010

11-
import parse as parse
12-
from typeinfo import TypeInfo
13-
from util import camel_case, first_upper, first_chars, spinal_case, pyinstaller_get_full_path
11+
from parse import DataParser
12+
from generator import Generator
1413

1514
def get_argument(argument, default="None"):
1615
if argument:
@@ -31,107 +30,15 @@ def init_args():
3130
return parser.parse_args()
3231

3332

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

128-
types = parse_data(data_file)
129-
130-
generate_entity_file(entity, types)
131-
generate_entity_row_mapper(entity, types)
132-
133-
if bool(args.typescript):
134-
generate_entity_typescript(entity, types)
39+
gen = Generator()
40+
gen.load_file(data_file)
41+
gen.generate_entity_files(entity, os.getcwd(), bool(args.typescript))
13542

13643

13744
if __name__ == '__main__':

easyjava.spec

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,11 @@ gooey_root = os.path.dirname(gooey.__file__)
77
gooey_languages = Tree(os.path.join(gooey_root, 'languages'), prefix = 'gooey/languages')
88
gooey_images = Tree(os.path.join(gooey_root, 'images'), prefix = 'gooey/images')
99

10+
import os
11+
path = os.getcwd()
1012

1113
a = Analysis(['easyjava.py'],
12-
pathex=['C:\\Users\\Joe\\Documents\\Projects\\Python\\easy-java'],
14+
pathex=[path],
1315
binaries=[],
1416
datas=[('templates/*.*', './templates'), ('words.txt', '.')],
1517
hiddenimports=['pkg_resources.py2_warn'],

generator.py

Lines changed: 165 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,165 @@
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 = '\tprivate {0} {1};'
9+
GETTER_TEMPLATE = '\tpublic {0} get{1}() {{\n\t\treturn this.{2};\n\t}}'
10+
SETTER_TEMPLATE = '\tpublic void set{0}({1} {2}) {{\n\t\tthis.{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]))

languagetype.py

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
from enum import Enum
2+
3+
class Language(Enum):
4+
Java = 'java'
5+
Typescript = 'typescript'
6+
7+
class LanguageType(Enum):
8+
string = 'string'
9+
integer = 'integer'
10+
float = 'float'
11+
boolean = 'boolean'

0 commit comments

Comments
 (0)