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.
Files changed (84) hide show
  1. gencode/__init__.py +140 -0
  2. gencode/dd_models.py +256 -0
  3. gencode/ext.py +19 -0
  4. gencode/gen_code.py +343 -0
  5. gencode/gencode/__init__.py +0 -0
  6. gencode/gencode/export_class2swgclass.py +206 -0
  7. gencode/gencode/gen_bo_models_code.py +719 -0
  8. gencode/gencode/gen_state_code.py +171 -0
  9. gencode/gencode/gen_swagger_code.py +94 -0
  10. gencode/gencode/gen_tests_code.py +113 -0
  11. gencode/gencode/sample/__init__.py +2 -0
  12. gencode/gencode/sample/babel.cfg +3 -0
  13. gencode/gencode/sample/config-sample.ini +9 -0
  14. gencode/gencode/sample/config.ini +14 -0
  15. gencode/gencode/sample/create_new_table_run.pys +19 -0
  16. gencode/gencode/sample/dockerignore.dock +57 -0
  17. gencode/gencode/sample/file_utils.pys +396 -0
  18. gencode/gencode/sample/gencode.xmi +33 -0
  19. gencode/gencode/sample/gitignore.git +14 -0
  20. gencode/gencode/sample/migrate_run.bat +5 -0
  21. gencode/gencode/sample/migrate_run.pys +9 -0
  22. gencode/gencode/sample/requirements.txt +17 -0
  23. gencode/gencode/sample/run.sh +27 -0
  24. gencode/gencode/sample/seeds/__init__.py +0 -0
  25. gencode/gencode/sample/seeds/models_rm.pys +187 -0
  26. gencode/gencode/sample/seeds/seed_dev_data.pys +21 -0
  27. gencode/gencode/sample/seeds/seed_init.pys +17 -0
  28. gencode/gencode/sample/seeds/seed_rm.pys +39 -0
  29. gencode/gencode/sample/seeds/seed_run.pys +13 -0
  30. gencode/gencode/sample/seeds/seed_utils.pys +23 -0
  31. gencode/gencode/sample/test__init__.pys +6 -0
  32. gencode/gencode/sample/test_run.pys +4 -0
  33. gencode/gencode/sample/utils.pys +92 -0
  34. gencode/gencode/template/Dockerfile.tmp +55 -0
  35. gencode/gencode/template/README.md +91 -0
  36. gencode/gencode/template/__init__.py +0 -0
  37. gencode/gencode/template/__init__.pys +99 -0
  38. gencode/gencode/template/config.pys +134 -0
  39. gencode/gencode/template/default.conf +21 -0
  40. gencode/gencode/template/docker-compose-dev.yaml +52 -0
  41. gencode/gencode/template/docker-compose.yaml +55 -0
  42. gencode/gencode/template/drone.tmp +45 -0
  43. gencode/gencode/template/flask_models.pys +107 -0
  44. gencode/gencode/template/flask_models_base.pys +159 -0
  45. gencode/gencode/template/gen_code_flask.yaml +21 -0
  46. gencode/gencode/template/gen_code_run.pys +28 -0
  47. gencode/gencode/template/k8s-tmp.yml +141 -0
  48. gencode/gencode/template/run.pys +52 -0
  49. gencode/gencode/template/sample.mdj +1193 -0
  50. gencode/gencode/template/setup.tmp +48 -0
  51. gencode/gencode/template/supervisord.conf +21 -0
  52. gencode/gencode/template/swagger_file.yaml +195 -0
  53. gencode/gencode/template/swg_class.tmp +41 -0
  54. gencode/gencode/template/swg_ctrl_code.pys +130 -0
  55. gencode/gencode/template/swg_package_mng.tmp +4423 -0
  56. gencode/gencode/template/test_test_base.tmp +34 -0
  57. gencode/gencode/template/tests/__init__.py +0 -0
  58. gencode/gencode/template/tests/__init__.pys +5 -0
  59. gencode/gencode/template/tests/init_test_data.pys +80 -0
  60. gencode/gencode/template/tests/run.pys +4 -0
  61. gencode/gencode/template/tests/test_base.pys +87 -0
  62. gencode/gencode/template/tests/test_classmng.pys +58 -0
  63. gencode/gencode/template/uwsgi.ini +20 -0
  64. gencode/gencode/template/uwsgi_run.pys +44 -0
  65. gencode/importmdj/__init__.py +0 -0
  66. gencode/importmdj/import_dd_classes.py +369 -0
  67. gencode/importmdj/import_swagger2_class.py +371 -0
  68. gencode/importmdj/import_uml_models.py +466 -0
  69. gencode/importxmi/__init__.py +1 -0
  70. gencode/importxmi/import_classes.py +342 -0
  71. gencode/importxmi/import_sequences.py +291 -0
  72. gencode/importxmi/import_states.py +150 -0
  73. gencode/importxmi/import_swagger.py +151 -0
  74. gencode/swg2_class_models.py +179 -0
  75. gencode/uml_class_models.py +295 -0
  76. gencode/upgrade.py +113 -0
  77. gencode/utils.py +225 -0
  78. manage.py +194 -0
  79. mwgencode-1.4.1.dist-info/METADATA +325 -0
  80. mwgencode-1.4.1.dist-info/RECORD +84 -0
  81. mwgencode-1.4.1.dist-info/WHEEL +5 -0
  82. mwgencode-1.4.1.dist-info/entry_points.txt +2 -0
  83. mwgencode-1.4.1.dist-info/licenses/LICENSE.txt +19 -0
  84. 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')