mwgencode 1.4.1__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- gencode/__init__.py +140 -0
- gencode/dd_models.py +256 -0
- gencode/ext.py +19 -0
- gencode/gen_code.py +343 -0
- gencode/gencode/__init__.py +0 -0
- gencode/gencode/export_class2swgclass.py +206 -0
- gencode/gencode/gen_bo_models_code.py +719 -0
- gencode/gencode/gen_state_code.py +171 -0
- gencode/gencode/gen_swagger_code.py +94 -0
- gencode/gencode/gen_tests_code.py +113 -0
- gencode/gencode/sample/__init__.py +2 -0
- gencode/gencode/sample/babel.cfg +3 -0
- gencode/gencode/sample/config-sample.ini +9 -0
- gencode/gencode/sample/config.ini +14 -0
- gencode/gencode/sample/create_new_table_run.pys +19 -0
- gencode/gencode/sample/dockerignore.dock +57 -0
- gencode/gencode/sample/file_utils.pys +396 -0
- gencode/gencode/sample/gencode.xmi +33 -0
- gencode/gencode/sample/gitignore.git +14 -0
- gencode/gencode/sample/migrate_run.bat +5 -0
- gencode/gencode/sample/migrate_run.pys +9 -0
- gencode/gencode/sample/requirements.txt +17 -0
- gencode/gencode/sample/run.sh +27 -0
- gencode/gencode/sample/seeds/__init__.py +0 -0
- gencode/gencode/sample/seeds/models_rm.pys +187 -0
- gencode/gencode/sample/seeds/seed_dev_data.pys +21 -0
- gencode/gencode/sample/seeds/seed_init.pys +17 -0
- gencode/gencode/sample/seeds/seed_rm.pys +39 -0
- gencode/gencode/sample/seeds/seed_run.pys +13 -0
- gencode/gencode/sample/seeds/seed_utils.pys +23 -0
- gencode/gencode/sample/test__init__.pys +6 -0
- gencode/gencode/sample/test_run.pys +4 -0
- gencode/gencode/sample/utils.pys +92 -0
- gencode/gencode/template/Dockerfile.tmp +55 -0
- gencode/gencode/template/README.md +91 -0
- gencode/gencode/template/__init__.py +0 -0
- gencode/gencode/template/__init__.pys +99 -0
- gencode/gencode/template/config.pys +134 -0
- gencode/gencode/template/default.conf +21 -0
- gencode/gencode/template/docker-compose-dev.yaml +52 -0
- gencode/gencode/template/docker-compose.yaml +55 -0
- gencode/gencode/template/drone.tmp +45 -0
- gencode/gencode/template/flask_models.pys +107 -0
- gencode/gencode/template/flask_models_base.pys +159 -0
- gencode/gencode/template/gen_code_flask.yaml +21 -0
- gencode/gencode/template/gen_code_run.pys +28 -0
- gencode/gencode/template/k8s-tmp.yml +141 -0
- gencode/gencode/template/run.pys +52 -0
- gencode/gencode/template/sample.mdj +1193 -0
- gencode/gencode/template/setup.tmp +48 -0
- gencode/gencode/template/supervisord.conf +21 -0
- gencode/gencode/template/swagger_file.yaml +195 -0
- gencode/gencode/template/swg_class.tmp +41 -0
- gencode/gencode/template/swg_ctrl_code.pys +130 -0
- gencode/gencode/template/swg_package_mng.tmp +4423 -0
- gencode/gencode/template/test_test_base.tmp +34 -0
- gencode/gencode/template/tests/__init__.py +0 -0
- gencode/gencode/template/tests/__init__.pys +5 -0
- gencode/gencode/template/tests/init_test_data.pys +80 -0
- gencode/gencode/template/tests/run.pys +4 -0
- gencode/gencode/template/tests/test_base.pys +87 -0
- gencode/gencode/template/tests/test_classmng.pys +58 -0
- gencode/gencode/template/uwsgi.ini +20 -0
- gencode/gencode/template/uwsgi_run.pys +44 -0
- gencode/importmdj/__init__.py +0 -0
- gencode/importmdj/import_dd_classes.py +369 -0
- gencode/importmdj/import_swagger2_class.py +371 -0
- gencode/importmdj/import_uml_models.py +466 -0
- gencode/importxmi/__init__.py +1 -0
- gencode/importxmi/import_classes.py +342 -0
- gencode/importxmi/import_sequences.py +291 -0
- gencode/importxmi/import_states.py +150 -0
- gencode/importxmi/import_swagger.py +151 -0
- gencode/swg2_class_models.py +179 -0
- gencode/uml_class_models.py +295 -0
- gencode/upgrade.py +113 -0
- gencode/utils.py +225 -0
- manage.py +194 -0
- mwgencode-1.4.1.dist-info/METADATA +325 -0
- mwgencode-1.4.1.dist-info/RECORD +84 -0
- mwgencode-1.4.1.dist-info/WHEEL +5 -0
- mwgencode-1.4.1.dist-info/entry_points.txt +2 -0
- mwgencode-1.4.1.dist-info/licenses/LICENSE.txt +19 -0
- mwgencode-1.4.1.dist-info/top_level.txt +2 -0
gencode/gen_code.py
ADDED
|
@@ -0,0 +1,343 @@
|
|
|
1
|
+
from . import upgrade
|
|
2
|
+
from .gencode.gen_bo_models_code import Gen_bo_models
|
|
3
|
+
from .gencode.gen_swagger_code import GenSwaggerCodeFromUml
|
|
4
|
+
from .gencode.gen_tests_code import GenTestsCodeFromUml
|
|
5
|
+
import os
|
|
6
|
+
import logging
|
|
7
|
+
from gencode.utils import saveUTF8File
|
|
8
|
+
import codecs
|
|
9
|
+
from gencode.gencode.export_class2swgclass import ExportClass2SWGClass
|
|
10
|
+
|
|
11
|
+
class GenCode():
|
|
12
|
+
def __init__(self,modelfile,rootpath):
|
|
13
|
+
'''
|
|
14
|
+
:param modelfile: mdj 文件
|
|
15
|
+
:param rootpath: 专案根目录
|
|
16
|
+
:param appdir: model文件放入的目录
|
|
17
|
+
'''
|
|
18
|
+
assert modelfile.endswith('.mdj') or modelfile.endswith('.json'), \
|
|
19
|
+
'modelfile 必须为 modelfile,扩展名为.mdj'
|
|
20
|
+
self.modelfile = os.path.abspath(modelfile)
|
|
21
|
+
self.rootpath = os.path.abspath(rootpath)
|
|
22
|
+
|
|
23
|
+
def model(self, outfile='models_base.py', type='flask',appdir='app',exists2cover=True):
|
|
24
|
+
'''
|
|
25
|
+
产生基本资料的base类别的代码
|
|
26
|
+
:param outfile: bomodel的文件名
|
|
27
|
+
:param type: flask:flask_sqlalchemy 的 model
|
|
28
|
+
sql :' sqlalchemy 的 model
|
|
29
|
+
:return:
|
|
30
|
+
'''
|
|
31
|
+
if appdir:
|
|
32
|
+
outfile_name = os.path.join(self.rootpath,appdir, outfile)
|
|
33
|
+
else:
|
|
34
|
+
outfile_name = os.path.join(self.rootpath, outfile)
|
|
35
|
+
gen_code = Gen_bo_models(self.modelfile,
|
|
36
|
+
outfile_name,
|
|
37
|
+
type=type)
|
|
38
|
+
gen_code.gen_code(exists2cover)
|
|
39
|
+
|
|
40
|
+
def swagger(self,outfile='swagger.yaml',type='flask'):
|
|
41
|
+
'''
|
|
42
|
+
产生swagger.yaml文件
|
|
43
|
+
:param outfile:
|
|
44
|
+
:param type:
|
|
45
|
+
:return:
|
|
46
|
+
'''
|
|
47
|
+
imp = GenSwaggerCodeFromUml(self.rootpath,self.modelfile,type)
|
|
48
|
+
imp.gen_swagger_code(os.path.join(self.rootpath,outfile))
|
|
49
|
+
|
|
50
|
+
def export(self,source_umlfile,dest_umlfile,exclude_classes=None):
|
|
51
|
+
export = ExportClass2SWGClass(source_umlfile,dest_umlfile)
|
|
52
|
+
export.export(exclude_classes)
|
|
53
|
+
|
|
54
|
+
# def add_swgmodel_file(self,swgmodel_name):
|
|
55
|
+
# '''
|
|
56
|
+
# 增加swagger model文件
|
|
57
|
+
# :param swgmodel_name: 如:主model名为estopserver,swgmodel为 basedata时,api为estopserver-basedata
|
|
58
|
+
# :return:
|
|
59
|
+
# '''
|
|
60
|
+
# pass
|
|
61
|
+
|
|
62
|
+
class GenSwagger():
|
|
63
|
+
def __init__(self,swg_modelfile):
|
|
64
|
+
'''
|
|
65
|
+
:param modelfile: mdj 文件
|
|
66
|
+
:param rootpath: 专案根目录
|
|
67
|
+
:param appdir: model文件放入的目录
|
|
68
|
+
'''
|
|
69
|
+
assert swg_modelfile.endswith('.mdj') or swg_modelfile.endswith('.json'), \
|
|
70
|
+
'modelfile 必须为 modelfile,扩展名为.mdj'
|
|
71
|
+
self.swg_modelfile = os.path.abspath(swg_modelfile)
|
|
72
|
+
# self.rootpath = os.path.abspath(rootpath)
|
|
73
|
+
self.export_swg = None
|
|
74
|
+
|
|
75
|
+
def export(self,source_umlfile:str='',exclude_classes:list=None,include_classes:list=None):
|
|
76
|
+
'''
|
|
77
|
+
汇入类别到swagger,当exclude_classes,include_classes同时为None时,汇入所有的类到到swagger
|
|
78
|
+
:param source_umlfile:原
|
|
79
|
+
:param exclude_classes:不用汇出成swagger class的类名
|
|
80
|
+
:param include_classes:只需要汇入的swagger class的类名
|
|
81
|
+
'''
|
|
82
|
+
export = ExportClass2SWGClass(source_umlfile,self.swg_modelfile)
|
|
83
|
+
export.export(exclude_classes,include_classes)
|
|
84
|
+
|
|
85
|
+
def export_one_swgclass(self,bocls:str,source_modelfile:str=''):
|
|
86
|
+
'''
|
|
87
|
+
把bocls汇入到swagger,bocls不存在时会创建
|
|
88
|
+
:param bocls:
|
|
89
|
+
:param source_modelfile: bocls 所在的umlfile,为空时,为本身swagger file
|
|
90
|
+
:return:
|
|
91
|
+
'''
|
|
92
|
+
export = ExportClass2SWGClass(source_modelfile if source_modelfile else self.swg_modelfile, self.swg_modelfile)
|
|
93
|
+
export.export_one_swgclass(bocls)
|
|
94
|
+
|
|
95
|
+
def add_operation(self, swgpackage_name: str, opname: str, method: str = 'get'):
|
|
96
|
+
'''
|
|
97
|
+
在swagger类上增加一个方法
|
|
98
|
+
:param swgpackage_name: swagger package 名称,如:companymng
|
|
99
|
+
:param opname: companys
|
|
100
|
+
:param method: http method,如:get,put,post,delete等
|
|
101
|
+
:return:
|
|
102
|
+
'''
|
|
103
|
+
if self.export_swg is None:
|
|
104
|
+
self.export_swg = ExportClass2SWGClass(self.swg_modelfile, self.swg_modelfile)
|
|
105
|
+
self.export_swg.add_operation(swgpackage_name,opname,method)
|
|
106
|
+
|
|
107
|
+
class GenProject_base():
|
|
108
|
+
def __init__(self,modelfile,rootpath):
|
|
109
|
+
# project 类型,flask,aiohttp
|
|
110
|
+
self.modelfile = os.path.abspath(modelfile)
|
|
111
|
+
self.rootpath = os.path.abspath(rootpath)
|
|
112
|
+
self.tmp_path = os.path.join(os.path.dirname(os.path.realpath(__file__)), 'gencode', 'template')
|
|
113
|
+
self.sample_path = os.path.join(os.path.dirname(os.path.realpath(__file__)), 'gencode', 'sample')
|
|
114
|
+
# 创建其他专案文件
|
|
115
|
+
from jinja2 import FileSystemLoader, Environment
|
|
116
|
+
load = FileSystemLoader(self.tmp_path)
|
|
117
|
+
self.env = Environment(loader=load)
|
|
118
|
+
|
|
119
|
+
def save_as(self,sfile,dfile):
|
|
120
|
+
if os.path.exists(dfile):
|
|
121
|
+
logging.info('the file(%s) is exist'%dfile)
|
|
122
|
+
return
|
|
123
|
+
with codecs.open(sfile,encoding='utf8') as f:
|
|
124
|
+
codes = f.readlines()
|
|
125
|
+
saveUTF8File(dfile,[code.rstrip() for code in codes])
|
|
126
|
+
|
|
127
|
+
class GenProject_Sample(GenProject_base):
|
|
128
|
+
def __init__(self,modelfile,rootpath):
|
|
129
|
+
super().__init__(modelfile,rootpath)
|
|
130
|
+
|
|
131
|
+
def gen_code(self,include_gencoderun):
|
|
132
|
+
p_name = os.path.split(self.rootpath)[-1]
|
|
133
|
+
if not os.path.exists(self.modelfile):
|
|
134
|
+
if not os.path.exists('docs'):
|
|
135
|
+
os.makedirs('docs')
|
|
136
|
+
|
|
137
|
+
template = self.env.get_template(r'sample.mdj')
|
|
138
|
+
# 不要覆盖原有的文件
|
|
139
|
+
saveUTF8File(os.path.join(os.path.realpath(self.rootpath),'docs', '%s.mdj'%p_name),
|
|
140
|
+
[template.render(service_name=p_name)],
|
|
141
|
+
writegeninfo=False,exist_ok=False)
|
|
142
|
+
gen_code_file = os.path.join(os.path.realpath(self.rootpath), 'gen_code_run.py')
|
|
143
|
+
if include_gencoderun and not os.path.exists(gen_code_file):
|
|
144
|
+
template = self.env.get_template(r'gen_code_run.pys')
|
|
145
|
+
saveUTF8File(gen_code_file,
|
|
146
|
+
[template.render(pro_name=p_name)])
|
|
147
|
+
gen_code_yaml = os.path.join(os.path.realpath(self.rootpath), 'gen_code.yaml')
|
|
148
|
+
if not os.path.exists(gen_code_yaml):
|
|
149
|
+
template = self.env.get_template(r'gen_code_flask.yaml')
|
|
150
|
+
saveUTF8File(gen_code_yaml,
|
|
151
|
+
[template.render(pro_name=p_name,pro_type='flask')])
|
|
152
|
+
|
|
153
|
+
class GenProject_Aiohttp(GenProject_base):
|
|
154
|
+
def __init__(self,modelfile,rootpath):
|
|
155
|
+
super().__init__(modelfile,rootpath)
|
|
156
|
+
|
|
157
|
+
def gen_code(self):
|
|
158
|
+
gen = GenSwaggerCodeFromUml(self.rootpath, self.modelfile, type='aiohttp')
|
|
159
|
+
# outfile为’‘时,采用默认的路径
|
|
160
|
+
gen.gen_swagger_code(outfile='')
|
|
161
|
+
saveUTF8File(os.path.join(os.path.realpath(self.rootpath), f'{gen.swager.name}-k8s.yml'),
|
|
162
|
+
[self.env.get_template('k8s-tmp.yml').render(root_path=os.path.split(self.rootpath)[-1],
|
|
163
|
+
swagger=gen.swager, plugins=[])],
|
|
164
|
+
exist_ok=False)
|
|
165
|
+
|
|
166
|
+
class GenProject_Flask(GenProject_base):
|
|
167
|
+
def __init__(self,modelfile,rootpath):
|
|
168
|
+
super().__init__(modelfile,rootpath)
|
|
169
|
+
|
|
170
|
+
def gen_code(self,
|
|
171
|
+
include_swagger:bool=True,
|
|
172
|
+
include_model:bool=True,
|
|
173
|
+
include_test:bool = False,
|
|
174
|
+
include_seeds:bool = False,
|
|
175
|
+
use_uwsgi:bool = True,
|
|
176
|
+
plugins:list = None):
|
|
177
|
+
'''
|
|
178
|
+
创建专案文件
|
|
179
|
+
:param include_swagger: False 不产生swagger file 和 swagger相关代码
|
|
180
|
+
:param include_model: False 不产生model,model_base等相关代码
|
|
181
|
+
:param include_test: False 不产生test相关代码
|
|
182
|
+
:param include_seeds: False 不产生seeds相关代码
|
|
183
|
+
:param use_uwsgi: False 不产生uwsgi相关代码
|
|
184
|
+
:param plugins: 支持redis,kafka,cassandra等,默认支持redis
|
|
185
|
+
:return:
|
|
186
|
+
'''
|
|
187
|
+
if plugins is None:
|
|
188
|
+
plugins= ['redis']
|
|
189
|
+
elif isinstance(plugins,list):
|
|
190
|
+
plugins.append('redis')
|
|
191
|
+
else:
|
|
192
|
+
plugins = ['redis',plugins]
|
|
193
|
+
# outfile为’‘时,采用默认的路径
|
|
194
|
+
gen = GenSwaggerCodeFromUml(self.rootpath, self.modelfile, type='flask')
|
|
195
|
+
if include_swagger:
|
|
196
|
+
gen.gen_swagger_code(outfile='')
|
|
197
|
+
gen.gen_swagger_ctr_code()
|
|
198
|
+
else:
|
|
199
|
+
logging.info('提示:不产生swagger file')
|
|
200
|
+
saveUTF8File(os.path.join(os.path.realpath(self.rootpath),'app','__init__.py'),
|
|
201
|
+
[self.env.get_template('__init__.pys').render(swagger = gen.swager,
|
|
202
|
+
include_model=include_model,plugins=plugins)],
|
|
203
|
+
exist_ok=False
|
|
204
|
+
)
|
|
205
|
+
saveUTF8File(os.path.join(os.path.realpath(self.rootpath), 'README.md'),
|
|
206
|
+
[self.env.get_template('README.md').render(swagger = gen.swager)],
|
|
207
|
+
exist_ok=False
|
|
208
|
+
)
|
|
209
|
+
saveUTF8File(os.path.join(os.path.realpath(self.rootpath), 'Dockerfile'),
|
|
210
|
+
[self.env.get_template('Dockerfile.tmp').render(swagger=gen.swager)],
|
|
211
|
+
exist_ok=False)
|
|
212
|
+
saveUTF8File(os.path.join(os.path.realpath(self.rootpath), '.drone.yml'),
|
|
213
|
+
[self.env.get_template('drone.tmp').render(swagger=gen.swager)],
|
|
214
|
+
exist_ok=False)
|
|
215
|
+
saveUTF8File(os.path.join(os.path.realpath(self.rootpath), 'setup.py'),
|
|
216
|
+
[self.env.get_template('setup.tmp').render(swagger=gen.swager)],
|
|
217
|
+
exist_ok=False)
|
|
218
|
+
|
|
219
|
+
saveUTF8File(os.path.join(os.path.realpath(self.rootpath), 'docker-compose.yaml'),
|
|
220
|
+
[self.env.get_template('docker-compose.yaml').render(root_path=os.path.split(self.rootpath)[-1],
|
|
221
|
+
swagger=gen.swager,plugins=plugins)],
|
|
222
|
+
exist_ok=False)
|
|
223
|
+
saveUTF8File(os.path.join(os.path.realpath(self.rootpath), 'docker-compose-dev.yaml'),
|
|
224
|
+
[self.env.get_template('docker-compose-dev.yaml').render(root_path=os.path.split(self.rootpath)[-1],
|
|
225
|
+
swagger=gen.swager,plugins=plugins)],
|
|
226
|
+
exist_ok=False)
|
|
227
|
+
saveUTF8File(os.path.join(os.path.realpath(self.rootpath), 'run.py'),
|
|
228
|
+
[self.env.get_template('run.pys').render(root_path=os.path.split(self.rootpath)[-1],
|
|
229
|
+
swagger=gen.swager)],
|
|
230
|
+
exist_ok=False)
|
|
231
|
+
|
|
232
|
+
saveUTF8File(os.path.join(os.path.realpath(self.rootpath), 'uwsgi_run.py'),
|
|
233
|
+
[self.env.get_template('uwsgi_run.pys').render(root_path=os.path.split(self.rootpath)[-1],
|
|
234
|
+
swagger=gen.swager)],
|
|
235
|
+
exist_ok=False
|
|
236
|
+
)
|
|
237
|
+
|
|
238
|
+
# saveUTF8File(os.path.join(os.path.realpath(self.rootpath), 'gen_code_run.py'),
|
|
239
|
+
# [self.env.get_template('gen_code_run.pys').render(root_path=os.path.split(self.rootpath)[-1],
|
|
240
|
+
# swagger=gen.swager)],
|
|
241
|
+
# exist_ok=False
|
|
242
|
+
# )
|
|
243
|
+
|
|
244
|
+
|
|
245
|
+
saveUTF8File(os.path.join(os.path.realpath(self.rootpath), f'{gen.swager.name}-k8s.yml'),
|
|
246
|
+
[self.env.get_template('k8s-tmp.yml').render(root_path=os.path.split(self.rootpath)[-1],
|
|
247
|
+
swagger=gen.swager, plugins=plugins)],
|
|
248
|
+
exist_ok=False)
|
|
249
|
+
self.save_as(os.path.join(self.sample_path, '__init__.py'),
|
|
250
|
+
os.path.join(os.path.realpath(self.rootpath), 'app', 'api', '__init__.py'))
|
|
251
|
+
self.save_as(os.path.join(self.sample_path, '__init__.py'),
|
|
252
|
+
os.path.join(os.path.realpath(self.rootpath), 'app', 'api','v1_0', '__init__.py'))
|
|
253
|
+
self.save_as(os.path.join(self.sample_path,'config.ini'),
|
|
254
|
+
os.path.join(os.path.realpath(self.rootpath), 'config.ini'))
|
|
255
|
+
|
|
256
|
+
self.save_as(os.path.join(self.sample_path,'create_new_table_run.pys'),
|
|
257
|
+
os.path.join(os.path.realpath(self.rootpath),'create_new_table_run.py'))
|
|
258
|
+
|
|
259
|
+
saveUTF8File(os.path.join(os.path.realpath(self.rootpath),'app', 'config.py'),
|
|
260
|
+
[self.env.get_template('config.pys').render(include_model=include_model)],
|
|
261
|
+
exist_ok=False
|
|
262
|
+
)
|
|
263
|
+
# self.save_as(os.path.join(self.sample_path,'config-sample.ini'),
|
|
264
|
+
# os.path.join(os.path.realpath(self.rootpath),'config-sample.ini'))
|
|
265
|
+
self.save_as(os.path.join(self.sample_path,'babel.cfg'),
|
|
266
|
+
os.path.join(os.path.realpath(self.rootpath), 'babel.cfg'))
|
|
267
|
+
# self.save_as(os.path.join(self.sample_path,'gen_code_run.pys'),
|
|
268
|
+
# os.path.join(os.path.realpath(self.rootpath),'gen_code_run.py'))
|
|
269
|
+
self.save_as(os.path.join(self.sample_path, 'requirements.txt'),
|
|
270
|
+
os.path.join(os.path.realpath(self.rootpath), 'requirements.txt'))
|
|
271
|
+
self.save_as(os.path.join(self.sample_path, 'gitignore.git'),
|
|
272
|
+
os.path.join(os.path.realpath(self.rootpath), '.gitignore'))
|
|
273
|
+
self.save_as(os.path.join(self.sample_path, 'dockerignore.dock'),
|
|
274
|
+
os.path.join(os.path.realpath(self.rootpath), '.dockerignore'))
|
|
275
|
+
self.save_as(os.path.join(self.sample_path, 'run.sh'),
|
|
276
|
+
os.path.join(os.path.realpath(self.rootpath), 'run.sh'))
|
|
277
|
+
self.save_as(os.path.join(self.sample_path, 'run.sh'),
|
|
278
|
+
os.path.join(os.path.realpath(self.rootpath), 'run-dev.sh'))
|
|
279
|
+
self.save_as(os.path.join(self.sample_path, 'utils.pys'),
|
|
280
|
+
os.path.join(os.path.realpath(self.rootpath),'app', 'utils.py'))
|
|
281
|
+
self.save_as(os.path.join(self.sample_path, 'file_utils.pys'),
|
|
282
|
+
os.path.join(os.path.realpath(self.rootpath),'app', 'file_utils.py'))
|
|
283
|
+
|
|
284
|
+
if include_model:
|
|
285
|
+
self.save_as(os.path.join(self.sample_path, 'utils.pys'),
|
|
286
|
+
os.path.join(os.path.realpath(self.rootpath), 'app', 'utils.py'))
|
|
287
|
+
# self.save_as(os.path.join(self.sample_path, 'migrate_run.pys'),
|
|
288
|
+
# os.path.join(os.path.realpath(self.rootpath), 'migrate_run.py'))
|
|
289
|
+
# self.save_as(os.path.join(self.sample_path, 'migrate_run.bat'),
|
|
290
|
+
# os.path.join(os.path.realpath(self.rootpath), 'migrate_run.bat'))
|
|
291
|
+
# self.save_as(os.path.join(self.sample_path, 'migrate_run.bat'),
|
|
292
|
+
# os.path.join(os.path.realpath(self.rootpath), 'migrate_run.sh'))
|
|
293
|
+
if include_seeds:
|
|
294
|
+
# self.save_as(os.path.join(self.sample_path, 'config.ini'),
|
|
295
|
+
# os.path.join(os.path.realpath(self.rootpath), 'seeds', 'config.ini'))
|
|
296
|
+
self.save_as(os.path.join(self.sample_path,'seeds', 'models_rm.pys'),
|
|
297
|
+
os.path.join(os.path.realpath(self.rootpath),'seeds', 'models_rm.py'))
|
|
298
|
+
self.save_as(os.path.join(self.sample_path,'seeds', 'seed_dev_data.pys'),
|
|
299
|
+
os.path.join(os.path.realpath(self.rootpath),'seeds', 'seed_dev_data.py'))
|
|
300
|
+
self.save_as(os.path.join(self.sample_path,'seeds', 'seed_init.pys'),
|
|
301
|
+
os.path.join(os.path.realpath(self.rootpath),'seeds', 'seed_init.py'))
|
|
302
|
+
self.save_as(os.path.join(self.sample_path,'seeds', 'seed_rm.pys'),
|
|
303
|
+
os.path.join(os.path.realpath(self.rootpath),'seeds', 'seed_rm.py'))
|
|
304
|
+
# 在seeds中不能执行
|
|
305
|
+
self.save_as(os.path.join(self.sample_path,'seeds','seed_run.pys'),
|
|
306
|
+
os.path.join(os.path.realpath(self.rootpath), 'seed_run.py'))
|
|
307
|
+
self.save_as(os.path.join(self.sample_path,'seeds', 'seed_utils.pys'),
|
|
308
|
+
os.path.join(os.path.realpath(self.rootpath),'seeds', 'seed_utils.py'))
|
|
309
|
+
|
|
310
|
+
if include_test:
|
|
311
|
+
gen_test_code = GenTestsCodeFromUml(self.rootpath, self.modelfile, type='flask')
|
|
312
|
+
gen_test_code.gen_tests_codes()
|
|
313
|
+
# self.save_as(os.path.join(self.sample_path, 'test__init__.pys'),
|
|
314
|
+
# os.path.join(os.path.realpath(self.rootpath),'tests', '__init__.py'))
|
|
315
|
+
# self.save_as(os.path.join(self.sample_path, 'test_run.pys'),
|
|
316
|
+
# os.path.join(os.path.realpath(self.rootpath), 'tests', 'run.py'))
|
|
317
|
+
# saveUTF8File(os.path.join(os.path.realpath(self.rootpath),'tests', 'test_base.py'),
|
|
318
|
+
# [self.env.get_template('test_test_base.tmp').render(service_name=gen.swager.name)],
|
|
319
|
+
# exist_ok=False
|
|
320
|
+
# )
|
|
321
|
+
|
|
322
|
+
if use_uwsgi:
|
|
323
|
+
saveUTF8File(os.path.join(os.path.realpath(self.rootpath), 'default.conf'),
|
|
324
|
+
[self.env.get_template('default.conf').render(port=80)],
|
|
325
|
+
exist_ok=False
|
|
326
|
+
)
|
|
327
|
+
saveUTF8File(os.path.join(os.path.realpath(self.rootpath), 'supervisord.conf'),
|
|
328
|
+
[self.env.get_template('supervisord.conf').render(swagger=gen.swager)],
|
|
329
|
+
exist_ok=False
|
|
330
|
+
)
|
|
331
|
+
saveUTF8File(os.path.join(os.path.realpath(self.rootpath), 'uwsgi.ini'),
|
|
332
|
+
[self.env.get_template('uwsgi.ini').render(swagger=gen.swager,plugins=plugins)],
|
|
333
|
+
exist_ok=False
|
|
334
|
+
)
|
|
335
|
+
saveUTF8File(os.path.join(os.path.realpath(self.rootpath), 'uwsgi-dev.ini'),
|
|
336
|
+
[self.env.get_template('uwsgi.ini').render(swagger=gen.swager,plugins=plugins)],
|
|
337
|
+
exist_ok=False
|
|
338
|
+
)
|
|
339
|
+
try:
|
|
340
|
+
k8s = upgrade.Upgrade_k8s('.',gen.swager)
|
|
341
|
+
k8s.merge_code()
|
|
342
|
+
except Exception as e:
|
|
343
|
+
print('升级 k8s 失败,error:',str(e))
|
|
File without changes
|
|
@@ -0,0 +1,206 @@
|
|
|
1
|
+
from gencode.importmdj.import_uml_models import Import_uml_models
|
|
2
|
+
from gencode.uml_class_models import Class,Property
|
|
3
|
+
from gencode.ext import Session
|
|
4
|
+
import os
|
|
5
|
+
from jinja2 import FileSystemLoader, Environment
|
|
6
|
+
import codecs
|
|
7
|
+
import json
|
|
8
|
+
import logging
|
|
9
|
+
class ExportClass2SWGClass():
|
|
10
|
+
def __init__(self,source_umlfile,dest_umlfile):
|
|
11
|
+
'''
|
|
12
|
+
|
|
13
|
+
:param source_umlfile: 源umlmodel文件
|
|
14
|
+
:param dest_umlfile: 汇入swg的umlmodel文件
|
|
15
|
+
'''
|
|
16
|
+
self.source_umlfile = source_umlfile
|
|
17
|
+
self.dest_umlfile = dest_umlfile
|
|
18
|
+
self.session = Session()
|
|
19
|
+
tmp_path = os.path.join(os.path.dirname(os.path.realpath(__file__)), 'template')
|
|
20
|
+
load = FileSystemLoader(tmp_path)
|
|
21
|
+
self.env = Environment(loader=load)
|
|
22
|
+
self.project = Import_uml_models(self.source_umlfile).import_model()
|
|
23
|
+
self.dest_model = self._load_models(self.dest_umlfile)
|
|
24
|
+
self.swg_package = self.__get_swg_package(self.dest_model)
|
|
25
|
+
self.temp = self.env.get_template('swg_package_mng.tmp')
|
|
26
|
+
|
|
27
|
+
def _load_models(self,file):
|
|
28
|
+
with codecs.open(file, encoding='utf8') as f:
|
|
29
|
+
js = f.read()
|
|
30
|
+
return json.loads(js)
|
|
31
|
+
|
|
32
|
+
def __get_swg_package(self,dmodel):
|
|
33
|
+
for tag in dmodel.get('tags',[]):
|
|
34
|
+
if tag['name']=='swagger':
|
|
35
|
+
swg_ref_id = tag['reference']['$ref']
|
|
36
|
+
for elem in dmodel.get('ownedElements', []):
|
|
37
|
+
if elem['_id'] == swg_ref_id:
|
|
38
|
+
return elem
|
|
39
|
+
for elem in dmodel.get('ownedElements',[]):
|
|
40
|
+
if elem['name']=='swagger':
|
|
41
|
+
return elem
|
|
42
|
+
return {}
|
|
43
|
+
|
|
44
|
+
def __get_package_mng_code_from_temp(self, bocls):
|
|
45
|
+
'''
|
|
46
|
+
从模板中载入swagger 中的package
|
|
47
|
+
:param bocls:
|
|
48
|
+
:return:
|
|
49
|
+
'''
|
|
50
|
+
cls = bocls
|
|
51
|
+
if getattr(bocls, "assign_propertys", None):
|
|
52
|
+
cls.assign_propertys(self.session)
|
|
53
|
+
codes = self.temp.render(cls_id=cls.id,
|
|
54
|
+
swg_pkg_id=self.swg_package['_id'],
|
|
55
|
+
cls_name=cls.name.replace(' ','').lower(),
|
|
56
|
+
cls=cls
|
|
57
|
+
)
|
|
58
|
+
self.session.rollback()
|
|
59
|
+
return codes
|
|
60
|
+
|
|
61
|
+
def export(self,exclude_classes:list=None,include_classes:list=None):
|
|
62
|
+
'''
|
|
63
|
+
汇入类别到swagger,当exclude_classes,include_classes同时为None时,汇入所有的类到到swagger
|
|
64
|
+
:param exclude_classes:不用汇出成swagger class的类名
|
|
65
|
+
:param include_classes:只需要汇入的swagger class的类名
|
|
66
|
+
:return:
|
|
67
|
+
'''
|
|
68
|
+
if exclude_classes is None :
|
|
69
|
+
exclude_classes = []
|
|
70
|
+
exclude_classes = [ecls.lower() for ecls in exclude_classes or []]
|
|
71
|
+
include_classes = [ecls.lower() for ecls in include_classes or []]
|
|
72
|
+
classes = self.session.query(Class). \
|
|
73
|
+
filter(Class.isswagger == False). \
|
|
74
|
+
filter(Class.type == 'UMLClass'). \
|
|
75
|
+
filter(Class.projectid == self.project.id).all()
|
|
76
|
+
classes_swg = [elm['name'] for elm in self.swg_package.get('ownedElements', []) if elm['_type'] == 'UMLClass']
|
|
77
|
+
packages_swg = [elm['name'] for elm in self.swg_package.get('ownedElements', []) if elm['_type'] == 'UMLPackage']
|
|
78
|
+
for cls in classes :
|
|
79
|
+
class_name = cls.name.replace(' ','').lower()
|
|
80
|
+
# 已产生swagger class
|
|
81
|
+
if class_name in classes_swg or '%smng'%class_name in packages_swg :
|
|
82
|
+
continue
|
|
83
|
+
# 有排除表时,不能产生
|
|
84
|
+
if exclude_classes and class_name in exclude_classes:
|
|
85
|
+
continue
|
|
86
|
+
# 有包含表时,只产生包含表的类别
|
|
87
|
+
if include_classes and class_name not in include_classes:
|
|
88
|
+
continue
|
|
89
|
+
codes = self.__get_package_mng_code_from_temp(cls)
|
|
90
|
+
self.swg_package.setdefault('ownedElements',[]).append(json.loads(codes,strict=False))
|
|
91
|
+
with codecs.open(self.dest_umlfile,mode='w',encoding='utf-8') as file:
|
|
92
|
+
file.write(json.dumps(self.dest_model,ensure_ascii=False))
|
|
93
|
+
# 需要删除吗???
|
|
94
|
+
# self.session.query(Project).filter(Project.id==self.project.id).delete()
|
|
95
|
+
logging.info('export swagger classes success.')
|
|
96
|
+
|
|
97
|
+
def __find_element(self,elemnts:list,key:str,value):
|
|
98
|
+
'''
|
|
99
|
+
查找某个元素
|
|
100
|
+
:param elemnts:
|
|
101
|
+
:param key:
|
|
102
|
+
:param value:
|
|
103
|
+
:return: obj
|
|
104
|
+
'''
|
|
105
|
+
for elem in elemnts:
|
|
106
|
+
if elem[key]==value:
|
|
107
|
+
return elem
|
|
108
|
+
return None
|
|
109
|
+
|
|
110
|
+
def export_one_swgclass(self,bocls:str):
|
|
111
|
+
'''
|
|
112
|
+
把bocls汇入到swagger,bocls不存在时会创建
|
|
113
|
+
:param bocls:
|
|
114
|
+
:return:
|
|
115
|
+
'''
|
|
116
|
+
cls = self.session.query(Class). \
|
|
117
|
+
filter(Class.isswagger == False). \
|
|
118
|
+
filter(Class.type == 'UMLClass'). \
|
|
119
|
+
filter(Class.projectid == self.project.id,Class.name==bocls).first()
|
|
120
|
+
if not cls :
|
|
121
|
+
import uuid
|
|
122
|
+
cls = Class(id=str(uuid.uuid4()),name=bocls)
|
|
123
|
+
cls.propertys = [Property(id=str(uuid.uuid4()),name='id',type='integer')]
|
|
124
|
+
# 获取swg中该类的package
|
|
125
|
+
package_cls_swg = self.__find_element(self.swg_package['ownedElements'], 'name', '%smng' % bocls)
|
|
126
|
+
# 如果swagger中没有,则把模板中的package加入swagger中
|
|
127
|
+
if not package_cls_swg:
|
|
128
|
+
package_cls_tmp = self.__get_package_mng_code_from_temp(cls)
|
|
129
|
+
self.swg_package.setdefault('ownedElements', []).append(json.loads(package_cls_tmp, strict=False))
|
|
130
|
+
with codecs.open(self.dest_umlfile, mode='w', encoding='utf-8') as file:
|
|
131
|
+
file.write(json.dumps(self.dest_model, ensure_ascii=False))
|
|
132
|
+
logging.debug('The class (%smng) has insert' % bocls)
|
|
133
|
+
else:
|
|
134
|
+
logging.debug('The class (%smng) has exist'%bocls)
|
|
135
|
+
|
|
136
|
+
def add_operation(self,swgpackage_name:str,opname:str,method:str='get'):
|
|
137
|
+
'''
|
|
138
|
+
在swagger类上增加一个方法
|
|
139
|
+
:param swgpackage_name: swagger package 名称,如:companymng
|
|
140
|
+
:param opname: companys
|
|
141
|
+
:param method: http method,如:get,put,post,delete等
|
|
142
|
+
:return:
|
|
143
|
+
'''
|
|
144
|
+
if method not in ['get','put','post','delete']:
|
|
145
|
+
logging.debug("add_operation() error, the method %s not in ['get','put','post','delete']"%method)
|
|
146
|
+
# 获取swg中该类的package
|
|
147
|
+
package_cls_swg = self.__find_element(self.swg_package['ownedElements'], 'name',swgpackage_name)
|
|
148
|
+
if not package_cls_swg:
|
|
149
|
+
logging.warning('the swagger package(%s) is not exist'%swgpackage_name)
|
|
150
|
+
return
|
|
151
|
+
obj_signal = self.__find_element(package_cls_swg['ownedElements'],'_type','UMLSignal')
|
|
152
|
+
assert obj_signal,'the swagger package(%s) has no UMLSignal class'%swgpackage_name
|
|
153
|
+
obj_cls = self.__find_element(package_cls_swg['ownedElements'],'_type','UMLClass')
|
|
154
|
+
if not obj_cls:
|
|
155
|
+
obj_cls = self.__find_element(package_cls_swg['ownedElements'], '_type', 'UMLDataType')
|
|
156
|
+
assert obj_cls, 'the swagger package(%s) has no UMLClass class' % swgpackage_name
|
|
157
|
+
# 如果方法名存在则不能产生,
|
|
158
|
+
op= self.__find_element(obj_signal['operations'],'name',opname)
|
|
159
|
+
if op:
|
|
160
|
+
logging.error('the swagger package(%s) has a opname(%s) UMLSignal class,请修改opname再试'%(swgpackage_name,opname))
|
|
161
|
+
return
|
|
162
|
+
# 从模板中拷贝 物件
|
|
163
|
+
import uuid
|
|
164
|
+
# 使用临时的类别,保证临时物件中的id是唯一的,可以直接加入的swagger中
|
|
165
|
+
cls = Class(id=str(uuid.uuid4()), name=opname)
|
|
166
|
+
package_cls_tmp = json.loads(self.__get_package_mng_code_from_temp(cls), strict=False)
|
|
167
|
+
obj_signal_tmp = self.__find_element(package_cls_tmp['ownedElements'], '_type', 'UMLSignal')
|
|
168
|
+
op_tmp = self.__find_element(obj_signal_tmp['operations'], 'stereotype', method)
|
|
169
|
+
# 与swagger建立关系
|
|
170
|
+
op_tmp['_parent']['$ref']=obj_signal['_id']
|
|
171
|
+
op_tmp['name'] = opname
|
|
172
|
+
obj_signal['operations'].append(op_tmp)
|
|
173
|
+
# 找到 in,return类
|
|
174
|
+
op_parm_in = self.__find_element(op_tmp['parameters'],'name','in')
|
|
175
|
+
obj_in = self.__find_element(package_cls_tmp['ownedElements'], '_id', op_parm_in['type']['$ref'])
|
|
176
|
+
obj_in['_parent']['$ref']=package_cls_swg['_id']
|
|
177
|
+
package_cls_swg['ownedElements'].append(obj_in)
|
|
178
|
+
op_parm_return = self.__find_element(op_tmp['parameters'],'direction','return')
|
|
179
|
+
obj_return = self.__find_element(package_cls_tmp['ownedElements'], '_id', op_parm_return['type']['$ref'])
|
|
180
|
+
obj_return['_parent']['$ref']=package_cls_swg['_id']
|
|
181
|
+
# 返回类型 用 obj_cls
|
|
182
|
+
default_value = self.__find_element(obj_return['attributes'],'name','default')
|
|
183
|
+
default_value['type']['$ref'] = obj_cls['_id']
|
|
184
|
+
package_cls_swg['ownedElements'].append(obj_return)
|
|
185
|
+
# 把in return param obj 加入到图上
|
|
186
|
+
diagram_tmp= self.__find_element(package_cls_tmp['ownedElements'], '_type', 'UMLClassDiagram')
|
|
187
|
+
diagram_main = self.__find_element(package_cls_swg['ownedElements'], '_type', 'UMLClassDiagram')
|
|
188
|
+
op_parm_in_view = self.__find_element(diagram_tmp['ownedViews'], 'model', {"$ref": obj_in['_id']})
|
|
189
|
+
op_parm_in_view['_parent']['$ref']=diagram_main['_id']
|
|
190
|
+
op_parm_in_view['left'] += 380
|
|
191
|
+
diagram_main['ownedViews'].append(op_parm_in_view)
|
|
192
|
+
op_parm_return_view = self.__find_element(diagram_tmp['ownedViews'], 'model', {"$ref": obj_return['_id']})
|
|
193
|
+
op_parm_return_view['_parent']['$ref']=diagram_main['_id']
|
|
194
|
+
op_parm_return_view['left'] += 380
|
|
195
|
+
diagram_main['ownedViews'].append(op_parm_return_view)
|
|
196
|
+
with codecs.open(self.dest_umlfile, mode='w', encoding='utf-8') as file:
|
|
197
|
+
file.write(json.dumps(self.dest_model, ensure_ascii=False))
|
|
198
|
+
logging.info("add_operation(%s,%s,%s) success" % (swgpackage_name,opname,method))
|
|
199
|
+
|
|
200
|
+
|
|
201
|
+
if __name__ == '__main__':
|
|
202
|
+
exp = ExportClass2SWGClass(r'D:\mwwork\projects\mwgencode\order_system\docs\temp.json',
|
|
203
|
+
r'D:\mwwork\projects\mwgencode\order_system\docs\temp.json')
|
|
204
|
+
# exp.export()
|
|
205
|
+
exp.export_one_swgclass('company')
|
|
206
|
+
exp.add_operation('companymng','company2','put')
|