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
|
@@ -0,0 +1,466 @@
|
|
|
1
|
+
from gencode.uml_class_models import *
|
|
2
|
+
import json
|
|
3
|
+
import codecs
|
|
4
|
+
from gencode.ext import engine,Session,Base
|
|
5
|
+
import logging
|
|
6
|
+
from mwutils.cache import Cached
|
|
7
|
+
from enum import Enum
|
|
8
|
+
from collections import namedtuple
|
|
9
|
+
|
|
10
|
+
logger = logging.getLogger('gencode.import_model')
|
|
11
|
+
|
|
12
|
+
uml_contain = ['UMLModel','UMLSubsystem','UMLPackage']
|
|
13
|
+
classs_uml = ['UMLClass','UMLSignal','UMLPrimitiveType','UMLDataType']
|
|
14
|
+
|
|
15
|
+
support_uml_type =('Project','UMLModel','UMLSubsystem','UMLPackage',
|
|
16
|
+
'UMLClassDiagram','UMLAttribute','UMLClass',
|
|
17
|
+
'UMLAssociation','UMLAssociationEnd','UMLSignal',
|
|
18
|
+
'UMLPrimitiveType','UMLDataType','UMLAssociationClassLink')
|
|
19
|
+
|
|
20
|
+
class Tag_type(Enum):
|
|
21
|
+
boclass = 'boclass'
|
|
22
|
+
swagger = 'swagger'
|
|
23
|
+
|
|
24
|
+
Tag = namedtuple('Tag',['type','value','ref_id'])
|
|
25
|
+
|
|
26
|
+
class Import_base():
|
|
27
|
+
def _create_obj(self, cls, js):
|
|
28
|
+
# 把所有UML class的 id 栏位增加flag
|
|
29
|
+
js['id'] = self._get_id(js['id'])
|
|
30
|
+
obj = cls(**js)
|
|
31
|
+
self.session.add(obj)
|
|
32
|
+
self.session.commit()
|
|
33
|
+
return obj
|
|
34
|
+
|
|
35
|
+
def __init__(self,session,project):
|
|
36
|
+
if session is None:
|
|
37
|
+
session = Session()
|
|
38
|
+
self.session = session
|
|
39
|
+
self.project = project
|
|
40
|
+
|
|
41
|
+
def _get_id(self, _id):
|
|
42
|
+
return '%s_%s'%(self.project.flag,_id)
|
|
43
|
+
|
|
44
|
+
def import_elm(self,parent,elements):
|
|
45
|
+
pass
|
|
46
|
+
|
|
47
|
+
@property
|
|
48
|
+
def importer(self):
|
|
49
|
+
return Importer(self.project)
|
|
50
|
+
|
|
51
|
+
class Import_package(Import_base):
|
|
52
|
+
def import_elm(self, parent, elements):
|
|
53
|
+
assert elements['_type'] in uml_contain
|
|
54
|
+
packege_js = {"id": elements['_id'],
|
|
55
|
+
"name": elements['name'],
|
|
56
|
+
"stereotype": elements.get('stereotype',''),
|
|
57
|
+
"doc": elements.get("documentation",''),
|
|
58
|
+
"type": elements['_type'],
|
|
59
|
+
"parentid":parent.id,
|
|
60
|
+
"projectid": self.project.id,
|
|
61
|
+
"isswagger": parent.isswagger or elements['name'].lower()=='swagger'
|
|
62
|
+
}
|
|
63
|
+
return self._create_obj(Package, packege_js)
|
|
64
|
+
|
|
65
|
+
class Import_diagram(Import_base):
|
|
66
|
+
def import_elm(self, parent, elements):
|
|
67
|
+
assert elements['_type'] == 'UMLClassDiagram'
|
|
68
|
+
obj_js = {"id": elements['_id'],
|
|
69
|
+
"name": elements['name'],
|
|
70
|
+
"isdefault": elements.get('defaultDiagram'),
|
|
71
|
+
"type": elements['_type'],
|
|
72
|
+
"parentid": parent.id,
|
|
73
|
+
"isswagger": parent.isswagger
|
|
74
|
+
}
|
|
75
|
+
return self._create_obj(Diagram, obj_js)
|
|
76
|
+
|
|
77
|
+
class Import_property(Import_base):
|
|
78
|
+
def import_elm(self, parent, elements):
|
|
79
|
+
assert elements['_type'] == 'UMLAttribute'
|
|
80
|
+
try:
|
|
81
|
+
obj_js = {"id": elements['_id'],
|
|
82
|
+
"name": elements['name'],
|
|
83
|
+
"stereotype": elements.get('stereotype', ''),
|
|
84
|
+
"doc": elements.get("documentation", ''),
|
|
85
|
+
"type": elements.get('type','string') if not isinstance(elements.get('type','string'), dict) else 'object',
|
|
86
|
+
"multiplicity": elements.get('multiplicity', ''),
|
|
87
|
+
"isreadonly": elements.get('isReadOnly', False),
|
|
88
|
+
"isordered": elements.get('isOrdered', False),
|
|
89
|
+
"isunique": elements.get('isUnique', False),
|
|
90
|
+
"defaultvalue": elements.get('defaultValue', ''),
|
|
91
|
+
"isid": elements.get('isID', False),
|
|
92
|
+
"parentid": parent.id,
|
|
93
|
+
"isswagger": parent.isswagger,
|
|
94
|
+
"objectid": self._get_id(elements['type']['$ref']) if isinstance(elements.get('type','string'), dict) else '',
|
|
95
|
+
}
|
|
96
|
+
except Exception as e:
|
|
97
|
+
raise Exception('%s.elements have a error:%s,elements:%s'%(parent.name,e,elements))
|
|
98
|
+
|
|
99
|
+
return self._create_obj(Property, obj_js)
|
|
100
|
+
|
|
101
|
+
class Import_association(Import_base):
|
|
102
|
+
def __init__(self, session,project):
|
|
103
|
+
super().__init__(session,project)
|
|
104
|
+
# self.import_assoc_end = Import_assoc_end(session,project)
|
|
105
|
+
|
|
106
|
+
def import_elm(self, parent, elements):
|
|
107
|
+
assert elements['_type'] == 'UMLAssociation'
|
|
108
|
+
obj_js = {"id":elements['_id'],
|
|
109
|
+
"name":elements.get('name',''),
|
|
110
|
+
"stereotype":elements.get('stereotype',''),
|
|
111
|
+
"doc":elements.get('documentation',''),
|
|
112
|
+
"parentid":parent.id,
|
|
113
|
+
"end1id":self._get_id(elements.get('end1',{}).get('_id')),
|
|
114
|
+
"end2id":self._get_id(elements.get('end2',{}).get('_id')),
|
|
115
|
+
"projectid":self.project.id,
|
|
116
|
+
"isswagger": parent.isswagger
|
|
117
|
+
}
|
|
118
|
+
assoc = self._create_obj(Association, obj_js)
|
|
119
|
+
end1 = self.importer.import_elm(assoc,elements['end1'])
|
|
120
|
+
end2 = self.importer.import_elm(assoc,elements['end2'])
|
|
121
|
+
return assoc
|
|
122
|
+
|
|
123
|
+
class Import_assoc_end(Import_base):
|
|
124
|
+
def import_elm(self, parent, elements):
|
|
125
|
+
assert elements['_type'] == 'UMLAssociationEnd'
|
|
126
|
+
obj_js = {"id":elements['_id'],
|
|
127
|
+
"name":elements.get('name',''),
|
|
128
|
+
"stereotype":elements.get('stereotype',''),
|
|
129
|
+
# todo 3.22
|
|
130
|
+
"navigable":elements.get('navigable',True),
|
|
131
|
+
"aggregation":elements.get('aggregation',''),
|
|
132
|
+
"multiplicity":elements.get('multiplicity',''),
|
|
133
|
+
"referenceid":self._get_id(elements['reference']["$ref"]),
|
|
134
|
+
"isswagger": parent.isswagger,
|
|
135
|
+
"isderived":elements.get('isDerived',False)
|
|
136
|
+
}
|
|
137
|
+
return self._create_obj(Assoc_end, obj_js)
|
|
138
|
+
|
|
139
|
+
class Import_operation(Import_base):
|
|
140
|
+
def __init__(self, session,project):
|
|
141
|
+
super().__init__(session,project)
|
|
142
|
+
|
|
143
|
+
def _import_paramer(self,cls,elements):
|
|
144
|
+
for elem in elements:
|
|
145
|
+
self.importer.import_elm(cls, elem)
|
|
146
|
+
|
|
147
|
+
def import_elm(self, parent, elements):
|
|
148
|
+
# starUML 2.8 有 derection,3.2.2有name
|
|
149
|
+
param_is_type = lambda elm,type:('direction' in elm.keys() and elm['direction']==type) \
|
|
150
|
+
or ('direction' not in elm.keys() and type=='in')
|
|
151
|
+
def get_paramer_id(elms,type='in'):
|
|
152
|
+
for elm in elms:
|
|
153
|
+
if param_is_type(elm,type):
|
|
154
|
+
return self._get_id(elm['_id'])
|
|
155
|
+
return ''
|
|
156
|
+
|
|
157
|
+
def get_py_paramers(elms):
|
|
158
|
+
result = []
|
|
159
|
+
for elm in elms or []:
|
|
160
|
+
if param_is_type(elm,'in'):
|
|
161
|
+
def_value = elm.get('defaultValue','')
|
|
162
|
+
result.append(elm['name']+ ' = %s'%def_value if def_value else elm['name'])
|
|
163
|
+
return ','.join(result)
|
|
164
|
+
|
|
165
|
+
assert elements['_type'] == 'UMLOperation'
|
|
166
|
+
obj_js = {"id":elements['_id'],
|
|
167
|
+
"name":elements.get('name',''),
|
|
168
|
+
"stereotype":elements.get('stereotype',''),
|
|
169
|
+
"doc":elements.get('documentation',''),
|
|
170
|
+
"parentid":parent.id,
|
|
171
|
+
"in_param_id":get_paramer_id(elements.get('parameters',[]),'in'),
|
|
172
|
+
"return_param_id":get_paramer_id(elements.get('parameters',[]),'return'),
|
|
173
|
+
"isswagger": parent.isswagger,
|
|
174
|
+
"py_params":get_py_paramers(elements.get('parameters')),
|
|
175
|
+
"isstatic":elements.get('isStatic',False),
|
|
176
|
+
"isquery":elements.get('isQuery',False),
|
|
177
|
+
"isabstract":elements.get('isAbstract',False),
|
|
178
|
+
"specification":elements.get('specification','')
|
|
179
|
+
}
|
|
180
|
+
operation = self._create_obj(Operation, obj_js)
|
|
181
|
+
self._import_paramer(operation,elements.get('parameters',[]))
|
|
182
|
+
return operation
|
|
183
|
+
|
|
184
|
+
class Import_paramer(Import_base):
|
|
185
|
+
def import_elm(self, parent, elements):
|
|
186
|
+
assert elements['_type'] == 'UMLParameter'
|
|
187
|
+
obj_js = {"id":elements['_id'],
|
|
188
|
+
"name":elements.get('name',''),
|
|
189
|
+
"stereotype":elements.get('stereotype',''),
|
|
190
|
+
"multiplicity":elements.get('multiplicity',''),
|
|
191
|
+
"type":elements['type'] if not isinstance(elements['type'],dict) else 'object',
|
|
192
|
+
"object_type_id":self._get_id(elements['type']['$ref']) if isinstance(elements['type'],dict) else '',
|
|
193
|
+
"isswagger": parent.isswagger,
|
|
194
|
+
}
|
|
195
|
+
return self._create_obj(Parameter, obj_js)
|
|
196
|
+
|
|
197
|
+
class Import_enumeration(Import_base):
|
|
198
|
+
def import_eitem(self,parent,literals):
|
|
199
|
+
for li in literals:
|
|
200
|
+
self.importer.import_elm(parent,li)
|
|
201
|
+
|
|
202
|
+
def import_elm(self, parent, elements):
|
|
203
|
+
assert elements['_type'] == 'UMLEnumeration'
|
|
204
|
+
obj_js = {"id":elements['_id'],
|
|
205
|
+
"name":elements.get('name',''),
|
|
206
|
+
"stereotype":elements.get('stereotype',''),
|
|
207
|
+
"doc":elements.get('documentation',''),
|
|
208
|
+
"packageid":parent.id,
|
|
209
|
+
"isswagger": parent.isswagger,
|
|
210
|
+
"projectid":self.project.id
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
enumera = self._create_obj(Enumeration, obj_js)
|
|
214
|
+
self.import_eitem(enumera,elements['literals'])
|
|
215
|
+
|
|
216
|
+
class Import_enumeitem(Import_base):
|
|
217
|
+
def import_elm(self, parent, elements):
|
|
218
|
+
assert elements['_type'] == 'UMLEnumerationLiteral'
|
|
219
|
+
obj_js = {"id":elements['_id'],
|
|
220
|
+
"name":elements.get('name',''),
|
|
221
|
+
"stereotype":elements.get('stereotype',''),
|
|
222
|
+
"doc":elements.get('documentation',''),
|
|
223
|
+
"enumerationid":parent.id,
|
|
224
|
+
"isswagger": parent.isswagger,
|
|
225
|
+
}
|
|
226
|
+
return self._create_obj(Enumeitem, obj_js)
|
|
227
|
+
|
|
228
|
+
class Import_umlgeneralization(Import_base):
|
|
229
|
+
def import_elm(self, parent, elements):
|
|
230
|
+
assert elements['_type'] == 'UMLGeneralization'
|
|
231
|
+
obj_js = {"id":elements['_id'],
|
|
232
|
+
"stereotype":elements.get('stereotype',''),
|
|
233
|
+
# "doc":elements.get('documentation',''),
|
|
234
|
+
"parentid":self._get_id(elements['source']['$ref']),
|
|
235
|
+
"sourceid":self._get_id(elements['source']['$ref']),
|
|
236
|
+
"targetid":self._get_id(elements['target']['$ref']),
|
|
237
|
+
"isswagger": parent.isswagger,
|
|
238
|
+
"discriminator":elements.get('discriminator','')
|
|
239
|
+
}
|
|
240
|
+
return self._create_obj(Umlgeneralization, obj_js)
|
|
241
|
+
|
|
242
|
+
class Import_class(Import_base):
|
|
243
|
+
def __init__(self, session,project):
|
|
244
|
+
super().__init__(session,project)
|
|
245
|
+
|
|
246
|
+
|
|
247
|
+
def _import_attrs(self,cls,attributes):
|
|
248
|
+
for attr in attributes:
|
|
249
|
+
self.importer.import_elm(cls,attr)
|
|
250
|
+
|
|
251
|
+
def _import_assocs(self,cls,assoc):
|
|
252
|
+
self.importer.import_elm(cls, assoc)
|
|
253
|
+
|
|
254
|
+
def _import_operation(self,cls,ops):
|
|
255
|
+
for op in ops:
|
|
256
|
+
self.importer.import_elm(cls,op)
|
|
257
|
+
|
|
258
|
+
def _import_assoc_link(self,elem):
|
|
259
|
+
ass = self.session.query(Association).filter(Association.id == self._get_id(elem['associationSide']['$ref'])).first()
|
|
260
|
+
ass.is_assoc_class = True
|
|
261
|
+
cls = self.session.query(Class).filter(Class.id==self._get_id(elem['classSide']['$ref'])).first()
|
|
262
|
+
cls.is_assoc_class = True
|
|
263
|
+
cls.assoc_id= ass.id
|
|
264
|
+
ass.assoc_class_id=cls.id
|
|
265
|
+
self.session.add(ass)
|
|
266
|
+
self.session.add(cls)
|
|
267
|
+
self.session.commit()
|
|
268
|
+
|
|
269
|
+
def _import_elements(self,cls,elements):
|
|
270
|
+
try:
|
|
271
|
+
for elem in elements:
|
|
272
|
+
if elem['_type'] == 'UMLAssociation':
|
|
273
|
+
self._import_assocs(cls, elem)
|
|
274
|
+
elif elem['_type'] == 'UMLAssociationClassLink':
|
|
275
|
+
self._import_assoc_link(elem)
|
|
276
|
+
elif elem['_type'] in ('UMLClass','UMLGeneralization'): #汇入关联类
|
|
277
|
+
self.importer.import_elm(cls,elem)
|
|
278
|
+
else:
|
|
279
|
+
logger.warning('the uml type(%s) is not support in class(%s)' % (
|
|
280
|
+
elem['_type'], elem.get('name')))
|
|
281
|
+
except Exception as e:
|
|
282
|
+
logger.error('import %s class " elements raise exception,error:%s'%(cls.name,str(e)))
|
|
283
|
+
raise
|
|
284
|
+
|
|
285
|
+
def import_elm(self, parent, elements):
|
|
286
|
+
assert elements['_type'] in classs_uml,'not support the class(%s)'%elements['_type']
|
|
287
|
+
obj_js = {"id": elements['_id'],
|
|
288
|
+
"name": elements['name'],
|
|
289
|
+
"stereotype": elements.get('stereotype',''),
|
|
290
|
+
"type": elements['_type'],
|
|
291
|
+
"parentid": parent.id,
|
|
292
|
+
"doc":elements.get("documentation",''),
|
|
293
|
+
"isabstract":elements.get('isAbstract',False),
|
|
294
|
+
"isswagger": parent.isswagger,
|
|
295
|
+
"projectid":self.project.id
|
|
296
|
+
}
|
|
297
|
+
cls = self._create_obj(Class, obj_js)
|
|
298
|
+
self._import_attrs(cls,elements.get('attributes',[]))
|
|
299
|
+
self._import_elements(cls,elements.get('ownedElements',[]))
|
|
300
|
+
self._import_operation(cls,elements.get('operations',[]))
|
|
301
|
+
return cls
|
|
302
|
+
|
|
303
|
+
class Importer(metaclass=Cached):
|
|
304
|
+
def _reg_importor(self,types,importor):
|
|
305
|
+
if isinstance(types,list):
|
|
306
|
+
for tp in types:
|
|
307
|
+
self._importor[tp] = importor
|
|
308
|
+
else:
|
|
309
|
+
self._importor[types] =importor
|
|
310
|
+
|
|
311
|
+
def _init_importor(self):
|
|
312
|
+
# self._reg_importor("Project", Import_project(self.session,self.project))
|
|
313
|
+
self._reg_importor(uml_contain, Import_package(self.session,self.project))
|
|
314
|
+
self._reg_importor('UMLClassDiagram', Import_diagram(self.session,self.project))
|
|
315
|
+
self._reg_importor(classs_uml, Import_class(self.session,self.project))
|
|
316
|
+
self._reg_importor("UMLAttribute",Import_property(self.session,self.project))
|
|
317
|
+
self._reg_importor("UMLAssociation",Import_association(self.session,self.project))
|
|
318
|
+
self._reg_importor("UMLAssociationEnd",Import_assoc_end(self.session,self.project))
|
|
319
|
+
self._reg_importor("UMLOperation",Import_operation(self.session,self.project))
|
|
320
|
+
self._reg_importor("UMLParameter",Import_paramer(self.session,self.project))
|
|
321
|
+
self._reg_importor("UMLEnumeration",Import_enumeration(self.session,self.project))
|
|
322
|
+
self._reg_importor("UMLEnumerationLiteral",Import_enumeitem(self.session,self.project))
|
|
323
|
+
self._reg_importor("UMLGeneralization", Import_umlgeneralization(self.session, self.project))
|
|
324
|
+
|
|
325
|
+
def __init__(self,project):
|
|
326
|
+
self.session = Session()
|
|
327
|
+
self.project = project
|
|
328
|
+
self._importor = {}
|
|
329
|
+
self._init_importor()
|
|
330
|
+
|
|
331
|
+
def import_elm(self, parent, elements):
|
|
332
|
+
importor = self._importor.get(elements['_type'])
|
|
333
|
+
if importor is None:
|
|
334
|
+
logger.warning('the type(%s) is not support,will be ignore' % (
|
|
335
|
+
elements['_type']))
|
|
336
|
+
return None
|
|
337
|
+
return importor.import_elm(parent,elements)
|
|
338
|
+
|
|
339
|
+
class Import_uml_models():
|
|
340
|
+
def _load_models(self,file):
|
|
341
|
+
with codecs.open(file, encoding='utf8') as f:
|
|
342
|
+
js = f.read()
|
|
343
|
+
return json.loads(js)
|
|
344
|
+
|
|
345
|
+
def _init_database(self):
|
|
346
|
+
try:
|
|
347
|
+
Base.metadata.drop_all(engine,checkfirst=False)
|
|
348
|
+
except Exception as e:
|
|
349
|
+
pass
|
|
350
|
+
Base.metadata.create_all(engine) # 创建资料库结构
|
|
351
|
+
|
|
352
|
+
def __init__(self,file):
|
|
353
|
+
self.file_name = file
|
|
354
|
+
self._model_js = self._load_models(file)
|
|
355
|
+
self._init_database()
|
|
356
|
+
self._session = Session()
|
|
357
|
+
self._importer = None
|
|
358
|
+
|
|
359
|
+
def _import_package_elements(self, package, elements):
|
|
360
|
+
for elm in elements:
|
|
361
|
+
if elm["_type"] in uml_contain:
|
|
362
|
+
pkg_elm = self._importer.import_elm(package, elm)
|
|
363
|
+
self._import_package_elements(pkg_elm, elm.get('ownedElements',[]))
|
|
364
|
+
continue
|
|
365
|
+
self._importer.import_elm(package, elm)
|
|
366
|
+
|
|
367
|
+
def _import_project_elements(self,project,elements,tag=None):
|
|
368
|
+
def set_tag(package):
|
|
369
|
+
if not tag:
|
|
370
|
+
return
|
|
371
|
+
pkg_js ={}
|
|
372
|
+
if tag.type==Tag_type.swagger.value:
|
|
373
|
+
pkg['isswagger'] = True
|
|
374
|
+
# 指定为swagger的package需要把名称改为'swagger',后面加载swagger时要用到
|
|
375
|
+
if package.id=='%s_%s'%(project.flag,tag.ref_id):
|
|
376
|
+
if package.name !='swagger':
|
|
377
|
+
pkg_js['name']='swagger'
|
|
378
|
+
try:
|
|
379
|
+
pkg_js['stereotype'] ='%s/%s/%s/%s'%(tag.value['name'],tag.value['ver'],tag.value.get('auth','jwt'),tag.value.get('format','json'))
|
|
380
|
+
except Exception as e:
|
|
381
|
+
raise Exception('tag.value 不符合要求,正确格式: {"name":"service_name","ver":"v1.0","auth":"jwt","ext":"xml/html/json"}')
|
|
382
|
+
self._session.query(Package).filter(Package.id==package.id).update(pkg_js)
|
|
383
|
+
for pkg in elements:
|
|
384
|
+
# 只有容器类才需要汇入
|
|
385
|
+
if pkg['_type'] not in uml_contain:
|
|
386
|
+
logger.warning('the pkg(%s) is not support type(%s),will be ignore'%(
|
|
387
|
+
pkg['name'],pkg['_type']
|
|
388
|
+
))
|
|
389
|
+
continue
|
|
390
|
+
package = self._importer.import_elm(project, pkg)
|
|
391
|
+
set_tag(package)
|
|
392
|
+
# if tag.type==Tag_type.swagger.value:
|
|
393
|
+
# package.isswagger = True
|
|
394
|
+
# # 指定为swagger的package需要把名称改为'swagger',后面加载swagger时要用到
|
|
395
|
+
# if package.id=='%s_%s'%(project.flag,tag.ref_id):
|
|
396
|
+
# if package.name !='swagger':
|
|
397
|
+
# package.name='swagger'
|
|
398
|
+
# try:
|
|
399
|
+
# package.stereotype ='%s/%s'%(tag.value['name'],tag.value['ver'])
|
|
400
|
+
# except Exception as e:
|
|
401
|
+
# raise Exception('tag.value 不符合要求,正确格式: {"name":"service_name","ver":"v1.0"}')
|
|
402
|
+
# self._session.add(package)
|
|
403
|
+
# self._session.commit()
|
|
404
|
+
# 汇入package的元素
|
|
405
|
+
self._import_package_elements(package, pkg.get('ownedElements',[]))
|
|
406
|
+
|
|
407
|
+
def __import_project(self,project_js):
|
|
408
|
+
import random
|
|
409
|
+
flag = str(random.randint(1,10000))+project_js['name']
|
|
410
|
+
project = Project(**{'id': '%s_%s'%(flag,project_js['_id']),
|
|
411
|
+
'name': project_js['name'],
|
|
412
|
+
'author': project_js.get('author','cxh'),
|
|
413
|
+
'version': project_js.get('version','v1.0'),
|
|
414
|
+
'doc': project_js.get('documentation',''),
|
|
415
|
+
'flag': flag,
|
|
416
|
+
'file_name':self.file_name
|
|
417
|
+
}
|
|
418
|
+
)
|
|
419
|
+
self._session.add(project)
|
|
420
|
+
self._session.commit()
|
|
421
|
+
return project
|
|
422
|
+
|
|
423
|
+
def __handle_tags(self,project,tags,elments):
|
|
424
|
+
def get_package(id,elments):
|
|
425
|
+
for el in elments:
|
|
426
|
+
if el['_id']==id:
|
|
427
|
+
return el
|
|
428
|
+
return None
|
|
429
|
+
if not tags:
|
|
430
|
+
return False
|
|
431
|
+
for tag in tags:
|
|
432
|
+
ref_id = tag.get('reference',{}).get('$ref','')
|
|
433
|
+
if not ref_id:
|
|
434
|
+
raise Exception('名为(%s)的tag没有指定 referenc,请指定!'%tag['name'])
|
|
435
|
+
pkg_ref = get_package(ref_id,elments)
|
|
436
|
+
if tag['name'].lower()=='boclass':
|
|
437
|
+
tag = Tag(type=Tag_type.boclass.value,value={},ref_id=ref_id)
|
|
438
|
+
self._import_project_elements(project, [pkg_ref],tag)
|
|
439
|
+
elif tag['name'].lower()=='swagger':
|
|
440
|
+
try:
|
|
441
|
+
tag = Tag(type=Tag_type.swagger.value,
|
|
442
|
+
value=json.loads(tag.get('value','{}').replace('\'','"')),
|
|
443
|
+
ref_id = ref_id)
|
|
444
|
+
except Exception as e:
|
|
445
|
+
raise Exception('tag.value格式错误:%s,\n正确格式如:{"name":"service_name","ver":"v1.0"},\n error:%s'%(tag.get('value','{}'),e))
|
|
446
|
+
self._import_project_elements(project, [pkg_ref],tag)
|
|
447
|
+
else:
|
|
448
|
+
logger.warning('不支持名为(%s)的tag,只支持[%s,%s]'%(tag['name'],
|
|
449
|
+
'boclass','swagger'))
|
|
450
|
+
return True
|
|
451
|
+
|
|
452
|
+
def import_model(self):
|
|
453
|
+
session = self._session
|
|
454
|
+
project = session.query(Project).filter(Project.file_name==self.file_name).first()
|
|
455
|
+
# 不允许同一project导入两次
|
|
456
|
+
if project:
|
|
457
|
+
return project
|
|
458
|
+
project = self.__import_project(self._model_js)
|
|
459
|
+
self._importer = Importer(project)
|
|
460
|
+
if not self.__handle_tags(project,self._model_js.get('tags',[]),self._model_js['ownedElements']):
|
|
461
|
+
self._import_project_elements(project, self._model_js['ownedElements'])
|
|
462
|
+
return project
|
|
463
|
+
|
|
464
|
+
|
|
465
|
+
|
|
466
|
+
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
from .import_classes import ImportModels
|