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
@@ -0,0 +1,369 @@
1
+ try: # 导入模块
2
+ import xml.etree.cElementTree as ET
3
+ except ImportError:
4
+ import xml.etree.ElementTree as ET
5
+ from gencode.dd_models import *
6
+ from gencode.ext import Session,engine
7
+ from gencode.importmdj.import_uml_models import Import_uml_models
8
+ from gencode.uml_class_models import *
9
+
10
+ from gencode.utils import Keytype,FieldFrom,DBDataType,DBDataType_len,convert2dbType
11
+
12
+ class ImportDDModels():
13
+ def __init__(self):
14
+ self.project = None
15
+ self.database = None
16
+ self.tables = {}
17
+ self.roles = []
18
+
19
+ def _create_db(self,project):
20
+ database = Databasedictionary()
21
+ database.name = project.name
22
+ database.description = project.doc
23
+ database.id = project.id
24
+ self.session = Session()
25
+ return database
26
+ # self.session.add(db)
27
+
28
+ def _create_tb(self, cls):
29
+ if cls.isabstract:
30
+ return
31
+ table = Tabledictionary()
32
+ table.databasedictionaryid = self.database.id
33
+ table.tablename = cls.name.lower()
34
+ table.is_assoc_table = cls.is_assoc_class
35
+ table.isabstract = cls.isabstract
36
+ table.id = cls.id
37
+ table.description = cls.doc
38
+ if cls.stereotype:
39
+ stereotype = cls.stereotype.split('/')
40
+ for stype in stereotype:
41
+ if stype.lower().startswith('map'):
42
+ # 如:customerid = map{c_id}
43
+ table.maptablename = stype[4:-1].lower()
44
+ elif stype.lower().startswith('bind'):
45
+ table.bind_db=stype[5:-1].lower()
46
+ if not table.maptablename:
47
+ table.maptablename = table.tablename
48
+ return table
49
+
50
+ def _create_idfld(self,clsidvalue):
51
+ field = Fielddictionary()
52
+ field.id = clsidvalue
53
+ field.tabledictionaryid = clsidvalue
54
+ field.fieldname = 'id'
55
+ # if self.isIntID:
56
+ field.fieldtype = DBDataType.int.value
57
+ field.fieldsize = DBDataType_len.int.value
58
+ # else:
59
+ # field.fieldtype = DBDataType.varchar.value
60
+ # field.fieldsize = DBDataType_len.varchar.value
61
+ field.englishname = field.fieldname.lower()
62
+ field.othername = field.fieldname.lower()
63
+ field.keytype = Keytype.key.value
64
+ field.fieldfrom = FieldFrom.database.value
65
+ field.gb32name = field.fieldname.lower()
66
+ field.isallownull = False
67
+ return field
68
+
69
+ def _assign_fld_value(self,source,target):
70
+ '''
71
+ source赋值给target
72
+ :param source:
73
+ :param target:
74
+ :return:
75
+ '''
76
+ field = target
77
+ # field.id = source.id
78
+ # field.tabledictionaryid = source.tabledictionaryid
79
+ field.fieldname = source.fieldname
80
+ field.fieldtype = source.fieldtype
81
+ field.fieldsize = source.fieldsize
82
+ field.englishname = source.englishname
83
+ field.othername = source.othername
84
+ field.keytype = source.keytype
85
+ field.fieldfrom = source.fieldfrom
86
+ field.gb32name = source.gb32name
87
+ field.isallownull = source.isallownull
88
+
89
+ def _create_fld(self,attr,table):
90
+ field = Fielddictionary()
91
+ field.id = attr.id
92
+ field.tabledictionaryid = table.id
93
+ field.fieldname = attr.name.lower()
94
+ field.fieldtype = convert2dbType(attr.type)
95
+ type_s = attr.type.lower().strip()
96
+ if type_s.startswith('string') and len(type_s)>6:
97
+ type_len = int(type_s[6:])
98
+ else:
99
+ type_len = DBDataType_len[field.fieldtype].value
100
+ field.fieldsize = type_len
101
+ field.englishname = field.fieldname.lower()
102
+ field.othername = field.fieldname.lower()
103
+ field.gb32name = field.fieldname.lower()
104
+ field.big5name = field.fieldname.lower()
105
+ if attr.isid:
106
+ field.keytype = Keytype.key.value
107
+ else:
108
+ field.keytype = Keytype.notkey.value
109
+ if attr.isunique:
110
+ field.repfields = field.fieldname.lower()
111
+ field.fieldfrom = FieldFrom.database.value
112
+ if attr.multiplicity:
113
+ field.fieldsize = int(attr.multiplicity)
114
+ field.defaultvalue = attr.defaultvalue
115
+ field.gb32name = attr.doc
116
+ field.doc = attr.doc
117
+ if attr.stereotype:
118
+ # print(' stype:', attr_stype.attrib)
119
+ stypes = attr.stereotype.split('/')
120
+ for stype in stypes:
121
+ if stype.lower() == 'req':
122
+ field.isallownull = False
123
+ elif stype.lower() == 'rep':
124
+ field.repfields = field.fieldname.lower()
125
+ elif stype.lower().startswith('map'):
126
+ # 如:customerid = map{c_id}
127
+ field.mapname = stype[4:-1].lower()
128
+ elif stype.lower().startswith('rep'):
129
+ # 如:rep{id;name}
130
+ # stype[4:-1].split(';')=>['id','name']
131
+ stype_l = stype[4:-1].lower().split(';')
132
+ stype_l.append(field.fieldname)
133
+ field.repfields = ';'.join(stype_l)
134
+ elif stype.lower().startswith('plk'):
135
+ field.plkfieldcode = field.gb32name
136
+ field.plkfieldpath = stype[4:-1].lower()
137
+ field.fieldfrom = FieldFrom.lookup.value
138
+ # if not field.mapname :
139
+ # field.mapname = field.fieldname
140
+ return field
141
+
142
+ def _create_role(self,memb,table):
143
+ def getMultiplicitye(multi):
144
+ upperv = multi.split('..')[-1]
145
+ if upperv == '*':
146
+ return 65535
147
+ elif upperv == '1':
148
+ return 1
149
+ else:
150
+ return 65535
151
+
152
+ def getReqire(multi):
153
+ lowerv = multi.split('..')[0]
154
+ return lowerv != '0'
155
+
156
+ def get_map_name(end):
157
+ stereotype = end.stereotype.split('/')
158
+ for stype in stereotype:
159
+ if stype.lower().startswith('map'):
160
+ return stype[4:-1].lower()
161
+
162
+ def get_st_code(st_name,stereotype):
163
+ if isinstance(stereotype,str):
164
+ stereotype = stereotype.split('/')
165
+ for stype in stereotype:
166
+ if stype.lower().startswith(st_name):
167
+ return stype[len(st_name)+1:-1]
168
+ return ''
169
+
170
+ def getRole(assoc, end1, end2, table, stereotype):
171
+ '''
172
+ 1,1 -> 1 只有单向关系
173
+ 2,* -> 1 lookup的关系 (非组合或聚合的关系视为单向)
174
+ 3,1 <-> * 组合或聚合关系 (为双向)
175
+ '''
176
+ def exchange_end(end1,end2):
177
+ # 交换end1和end2,让o2m和m2o的role关系处理起来更自然
178
+ end1_multi = getMultiplicitye(end1.multiplicity)
179
+ end2_multi = getMultiplicitye(end2.multiplicity)
180
+ relationship_value = get_relationship_type(end1_multi, end2_multi,
181
+ end1.navigable, end2.navigable)
182
+ # 1对一,如果方向反则交换
183
+ if relationship_value == Relationship_type.o2o.value and not end2.navigable:
184
+ return end2,end1
185
+ if relationship_value == Relationship_type.o2m.value and end1_multi>1:
186
+ return end2,end1
187
+ elif relationship_value ==Relationship_type.m2o.value and end1_multi==1:
188
+ return end2, end1
189
+ return end1,end2
190
+ end1,end2 = exchange_end(end1,end2)
191
+ role = Roledictionary()
192
+ role.id = assoc.id
193
+ role.is_assoc_table = assoc.is_assoc_class
194
+ role.assoc_tableid = assoc.assoc_class_id
195
+ role.underline = '_id' in stereotype
196
+ role.ownertableid = assoc.parentid
197
+ role.ddid = self.database.id
198
+ role.req = 'req' in stereotype
199
+ if not role.req:
200
+ end_multiplicity = '0'
201
+ if getMultiplicitye(end1.multiplicity)==1:
202
+ end_multiplicity = end1.multiplicity
203
+ elif getMultiplicitye(end2.multiplicity)==1:
204
+ end_multiplicity = end2.multiplicity
205
+ role.req = getReqire(end_multiplicity)
206
+ role.ref = 'ref' in stereotype
207
+ role.flt = get_st_code('flt',stereotype)
208
+ role.ord = get_st_code('ord',stereotype)
209
+ role.end1_lazy = get_st_code('lazy',end1.stereotype)
210
+ role.end2_lazy = get_st_code('lazy',end2.stereotype)
211
+ # role.end1 = end1
212
+ # route.end2= end2
213
+ role.end1_aggregation = end1.aggregation.lower()
214
+ role.end2_aggregation = end2.aggregation.lower()
215
+ role.end1_multiplicity = getMultiplicitye(end1.multiplicity)
216
+ role.end1_rolename = end1.name.lower().replace(' ', '')
217
+ if role.end1_rolename == '':
218
+ role.end1_rolename = end1.reference.name.lower()
219
+ role.end1_mapid = get_map_name(end1)
220
+ role.end1_navigable = end1.navigable
221
+ role.end1_reftableid = end1.referenceid
222
+ role.end2_reftableid = end2.referenceid
223
+ role.end2_rolename = end2.name.lower().replace(' ', '')
224
+ if role.end2_rolename== '' :
225
+ role.end2_rolename=end2.reference.name.lower()
226
+ role.end2_multiplicity = getMultiplicitye(end2.multiplicity)
227
+ role.end2_navigable = end2.navigable
228
+ role.end2_mapid = get_map_name(end2)
229
+ # 图形上都为True或False时再图上效果一样,都为False时设为True
230
+ if not role.end1_navigable and not role.end2_navigable:
231
+ role.end1_navigable = True
232
+ role.end2_navigable = True
233
+ return role
234
+
235
+ if not memb.end1 or not memb.end2:
236
+ return
237
+ stereotype = []
238
+ if memb.stereotype:
239
+ stereotype = memb.stereotype.split('/')
240
+ return getRole(memb,memb.end1,memb.end2,table,stereotype)
241
+
242
+ def __create_operations(self,table,operation):
243
+ op = Ddoperation()
244
+ op.parentid = table.id
245
+ op.id = operation.id
246
+ op.stereotype = operation.stereotype
247
+ op.doc = operation.doc
248
+ op.name = operation.name
249
+ op.isabstract = operation.isabstract
250
+ op.isquery = operation.isquery
251
+ op.isstatic = operation.isstatic
252
+ op.specification = operation.specification
253
+ op.py_params = operation.py_params
254
+ return op
255
+
256
+ def handle_cls(self,cls):
257
+ table = self._create_tb(cls)
258
+ if not table:
259
+ return
260
+ self.tables[table.id] = table
261
+ self.session.add(table)
262
+ hasid = False
263
+ for attr in cls.propertys:
264
+ field = self._create_fld(attr,table)
265
+ if field.keytype == Keytype.key.value:
266
+ hasid = True
267
+ self.session.add(field)
268
+ if not hasid:
269
+ self.session.add(self._create_idfld(table.id))
270
+
271
+ for op in cls.operations:
272
+ self.session.add(self.__create_operations(table,op))
273
+
274
+ for assoc in cls.associations:
275
+ roles = self._create_role(assoc, table)
276
+ self.roles.append(roles)
277
+ # for gen in cls.umlgeneralizations:
278
+
279
+
280
+ def handle_classes(self):
281
+ classes = self.session.query(Class).\
282
+ filter(Class.isswagger==False).\
283
+ filter(Class.type=='UMLClass').\
284
+ filter(Class.projectid==self.project.id).all()
285
+ for cls in classes:
286
+ self.handle_cls(cls)
287
+
288
+ def handle_generalization(self):
289
+ gens = self.session.query(Umlgeneralization).\
290
+ join(Class,Class.id==Umlgeneralization.parentid).\
291
+ filter(Umlgeneralization.isswagger==False). \
292
+ filter(Class.type == 'UMLClass'). \
293
+ filter(Class.projectid == self.project.id).all()
294
+ for gen in gens:
295
+ stereotype = gen.stereotype.split('/')
296
+ target = self.session.query(Tabledictionary).filter(Tabledictionary.id == gen.targetid).first()
297
+ # target = Tabledictionary()
298
+ target.is_sigletable='sng' in stereotype
299
+ # sng 类不需要子类,orm中查询出错
300
+ target.is_need_sonboclass = not target.is_sigletable
301
+ target.is_parentclass=True
302
+ source = self.session.query(Tabledictionary).filter(Tabledictionary.id==gen.sourceid).first()
303
+ # source = Tabledictionary()
304
+ source.is_sigletable = 'sng' in stereotype
305
+ # sng 类不需要子类,orm中查询出错
306
+ source.is_need_sonboclass = not source.is_sigletable
307
+ source.parentid = target.id
308
+ # source.parent = target
309
+ source_key = target.get_keyfield()
310
+ target_key = source.get_keyfield()
311
+ self._assign_fld_value(source_key,target_key)
312
+ self.session.add_all([source,target,target_key])
313
+ self.session.commit()
314
+
315
+
316
+ def init_database(self):
317
+ Base.metadata.create_all(engine) # 创建资料库结构
318
+
319
+ def handleRoles(self):
320
+ for role in self.roles:
321
+ if role.end2_rolename == '':
322
+ role.end2_rolename=role.end2_reftable.tablename.lower()
323
+ self.session.add_all(self.roles)
324
+ self.session.commit()
325
+
326
+ def handleEnum(self):
327
+ enumrations = self.session.query(Enumeration).\
328
+ filter(Enumeration.isswagger==False).\
329
+ filter(Enumeration.projectid==self.project.id).\
330
+ all()
331
+ get_value = lambda v_st,v_ind:v_st if v_st else str(v_ind)
332
+ for enuma in enumrations:
333
+ dbenma = DBEnumeration(id = enuma.id,
334
+ name=enuma.name.lower(),
335
+ doc=enuma.doc,
336
+ type=enuma.stereotype.lower(),
337
+ ddid=self.database.id
338
+ )
339
+ self.session.add(dbenma)
340
+ for indx,eitm in enumerate(enuma.enumeitems,1):
341
+ dbeitm = DBEnumeitem(id=eitm.id,
342
+ name=eitm.name.lower(),
343
+ doc=eitm.doc,
344
+ type=dbenma.type.lower(),
345
+ value = get_value(eitm.stereotype.split('value')[-1][1:-1],indx),
346
+ enumerationid=eitm.enumerationid)
347
+ self.session.add(dbeitm)
348
+ self.session.commit()
349
+
350
+ def impUMLModels(self,file):
351
+ self.project = Import_uml_models(file).import_model()
352
+ self.init_database()
353
+ self.database = self._create_db(self.project)
354
+ self.session.add(self.database)
355
+ self.session.commit()
356
+ self.handle_classes()
357
+ self.handleRoles()
358
+ self.handleEnum()
359
+ self.handle_generalization()
360
+ return self.database
361
+
362
+
363
+ if __name__ == '__main__':
364
+ session = Session()
365
+ i = ImportDDModels()
366
+ i.impUMLModels(r"D:\mwwork\projects\gencode\docs\test5.json")
367
+ print(session.query(DBEnumeration).all())
368
+ print(session.query(DBEnumeitem).all())
369
+ # i.impxml(r"test.xml")