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/__init__.py ADDED
@@ -0,0 +1,140 @@
1
+ # from sqlalchemy import create_engine
2
+ # from sqlalchemy.orm import sessionmaker
3
+ from enum import Enum
4
+ from mwutils.utils import none2default
5
+ # from . import importxmi
6
+ import logging
7
+ # engine = create_engine('sqlite:///:memory:')
8
+ # Session = sessionmaker(bind=engine)
9
+
10
+ uml="http://schema.omg.org/spec/UML/2.0"
11
+ xmi="{http://schema.omg.org/spec/XMI/2.1}"
12
+ _id = xmi+"id"
13
+ _type = xmi+"type"
14
+ _extension = xmi+'Extension'
15
+
16
+ # 可以用来定义企业相关的规则的物件类别
17
+ bo_types=['uml:DataType','uml:Signal','uml:PrimitiveType','uml:Class']
18
+
19
+ class AttribType(Enum):
20
+ none = 'none'
21
+ data = 'data'
22
+ object = 'object'
23
+
24
+ class ImportBase():
25
+ def find_bo_classes(self, pkg_p, types=bo_types, result = None):
26
+ # 查找package下所有符合类型的object
27
+ if result is None:
28
+ result = []
29
+ pkgs = pkg_p.findall('packagedElement')
30
+ for pkg in pkgs:
31
+ if pkg.attrib.get(_type) in ['uml:Model', 'uml:Package', 'uml:Subsystem']:
32
+ self.find_bo_classes(pkg, types, result)
33
+ if pkg.attrib.get(_type, None) in types:
34
+ result.append({'id': pkg.attrib.get(_id), 'obj': pkg})
35
+ return result
36
+
37
+ def _get_exten_value(self, attr,name):
38
+ extens = attr.find(_extension)
39
+ if extens is not None:
40
+ stereotype = extens.find(name)
41
+ if stereotype is not None:
42
+ return stereotype.attrib.get('value')
43
+ return None
44
+
45
+ def get_stereotype(self, attr):
46
+ return none2default(self._get_exten_value(attr,'stereotype'),'').split('/')
47
+
48
+ def get_doc(self, attr):
49
+ result = self._get_exten_value(attr, 'documentation')
50
+ result = result if result else ''
51
+ # 替换“,避免yaml出错
52
+ return result.replace('"','\'')
53
+
54
+ def get_operations(self, pkg):
55
+ assert pkg.attrib.get(_type, None) in bo_types,'pkg必输是企业物件类型(%s)'%bo_types
56
+ own_op =pkg.findall('ownedOperation')
57
+ result = []
58
+ for op in own_op:
59
+ if op.attrib.get(_type)!= 'uml:Operation' :
60
+ continue
61
+ op_d= {}
62
+ is_array = False
63
+ # get,put,post,delete 等方法
64
+ op_d['stereotype'] = self.get_stereotype(op)
65
+ op_d['name'] = op.attrib.get('name')
66
+ op_d['doc'] = self.get_doc(op)
67
+ own_params = op.findall('ownedParameter')
68
+ for param in own_params:
69
+ type = param.attrib.get('type')
70
+ if type is None :
71
+ continue
72
+ try:
73
+ if type.endswith('_id'):
74
+ type = AttribType.data.value
75
+ typename = type.split('_')[0]
76
+ # 判断是否是数组
77
+ else:
78
+ typename = type
79
+ type = AttribType.object.value
80
+ is_array = param.find('upperValue') is not None
81
+
82
+ except Exception as e:
83
+ logging.error('参数没有指定type,example:【in:g_xxx_i(r)】,error:', e, param.attrib)
84
+ raise
85
+ direction = param.attrib.get('direction')
86
+ param_d = {#'id':param.attrib.get(_id),
87
+ 'name':param.attrib.get('name'),
88
+ 'type':type,
89
+ 'typename':typename,
90
+ 'is_array':is_array,
91
+ 'doc':self.get_doc(param),
92
+ 'stereotype':self.get_stereotype(param)}
93
+ op_d[direction] = param_d
94
+ result.append(op_d)
95
+ return result
96
+
97
+ def get_defaultvalue(self,attr):
98
+ def_value = attr.find('defaultValue')
99
+ if def_value is not None:
100
+ return def_value.get('value')
101
+ return ''
102
+
103
+ def get_attributes(self, pkg):
104
+ attrs = pkg.findall('ownedAttribute')
105
+ result = []
106
+ for attr in attrs:
107
+ if attr.attrib.get(_type) != 'uml:Property':
108
+ continue
109
+ type = attr.attrib.get('type')
110
+ is_array = False
111
+ if type is None :
112
+ typename = 'none'
113
+ type = AttribType.none.value
114
+ elif type.endswith('_id'):
115
+ typename = type.split('_')[0]
116
+ type = AttribType.data.value
117
+ is_array = attr.find('upperValue') is not None
118
+ # 判断是否是数组
119
+ else:
120
+ typename = type
121
+ type = AttribType.object.value
122
+ is_array = attr.find('upperValue') is not None
123
+ result.append({#'id': attr.attrib.get(_id),
124
+ 'name': attr.attrib.get('name'),
125
+ 'type': type,
126
+ 'typename': typename,
127
+ 'is_array':is_array,
128
+ 'doc': self.get_doc(attr),
129
+ 'stereotype': self.get_stereotype(attr),
130
+ 'defaultvalue':self.get_defaultvalue(attr)})
131
+ return result
132
+
133
+ def get_bo_class(self, pkg):
134
+ return {'name': pkg.attrib.get('name'),
135
+ 'id' : pkg.attrib.get(_id),
136
+ 'doc': self.get_doc(pkg),
137
+ 'stereotype': self.get_stereotype(pkg),
138
+ 'type':pkg.attrib.get(_type),
139
+ 'attrs': self.get_attributes(pkg),
140
+ 'ops': self.get_operations(pkg)}
gencode/dd_models.py ADDED
@@ -0,0 +1,256 @@
1
+ from sqlalchemy import Column, Integer, String, ForeignKey, Boolean
2
+ from sqlalchemy.orm import relationship
3
+ from sqlalchemy.ext.declarative import declarative_base
4
+ import json
5
+ from .ext import Base
6
+ from enum import Enum
7
+ # Base = declarative_base()
8
+
9
+ class Relationship_type(Enum):
10
+ o2o = 'one_to_one'
11
+ o2m = 'one_to_many'
12
+ m2o = 'many_to_one'
13
+ m2m = 'many_to_many'
14
+
15
+ def get_relationship_type(multi1,multi2,navig1,navig2):
16
+ if (multi1 == 1) and (multi2 == 1):
17
+ return Relationship_type.o2o.value
18
+ elif (multi1 == 1 and multi2 > 1) or (multi1 > 1 and multi2 == 1 ):
19
+ if (navig1 and navig2) or (multi1 > multi2 and navig1) or (multi1 < multi2 and navig2):
20
+ return Relationship_type.o2m.value
21
+ else:
22
+ return Relationship_type.m2o.value
23
+ elif (multi1 > 1 and multi2 > 1):
24
+ return Relationship_type.m2m.value
25
+ return ''
26
+
27
+ def new_id():
28
+ from datetime import datetime
29
+ return datetime.today().strftime("%Y%m%d%H%M%S%f")
30
+
31
+ class Databasedictionary(Base):
32
+ __tablename__ = 'databasedictionary'
33
+ name = Column(String(50))
34
+ description = Column(String(255))
35
+ dbtype = Column(Integer)
36
+ id = Column(String(50), primary_key=True)
37
+ tabledictionarys = relationship("Tabledictionary", backref="databasedictionary",
38
+ cascade="all, delete-orphan")
39
+
40
+ def __repr__(self):
41
+ return json.dumps(self.to_json())
42
+
43
+ def to_json(self):
44
+ return {key: getattr(self, key) for key in self.__table__.columns.keys()}
45
+
46
+ class Fielddictionary(Base):
47
+ __tablename__ = 'fielddictionary'
48
+ gb32name = Column(String(50))
49
+ doc = Column(String(50))
50
+ repfields = Column(String(50))
51
+ plkfieldpath = Column(String(50))
52
+ plkfieldcode = Column(String(50))
53
+ fieldname = Column(String(50), nullable=False)
54
+
55
+ #类图属性名可能同资料库的名称不同
56
+ mapname = Column(String(50))
57
+ fieldsize = Column(Integer)
58
+ englishname = Column(String(50))
59
+ isallownull = Column(Boolean,default=True)
60
+ # TKeyType=(ktUnkown,ktKey,ktForeignKey,ktNotKey,ktsys);
61
+ keytype = Column(Integer)
62
+ fieldtype = Column(String(50))
63
+ big5name = Column(String(50))
64
+ # TFieldFrom=(ffUnknown,ffDatabase,ffLookup,ffCustom);
65
+ fieldfrom = Column(Integer)
66
+ othername = Column(String(50))
67
+ defaultvalue = Column(String(50))
68
+ id = Column(String(50), primary_key=True)
69
+ tabledictionaryid = Column(String(50), ForeignKey("tabledictionary.id"), nullable=False)
70
+
71
+ def __repr__(self):
72
+ return json.dumps(self.to_json())
73
+
74
+ def to_json(self):
75
+ return {key: getattr(self, key) for key in self.__table__.columns.keys()}
76
+
77
+
78
+ class Roledictionary(Base):
79
+ __tablename__ = 'roledictionary'
80
+ end1_rolename = Column(String(50))
81
+ end1_multiplicity = Column(Integer,default=0)
82
+ end1_navigable = Column(Boolean)
83
+ end1_reftableid = Column(String(50), ForeignKey("tabledictionary.id"))
84
+ end1_reftable = relationship("Tabledictionary", foreign_keys=[end1_reftableid], uselist=False)
85
+ end1_mapid = Column(String(50))
86
+ end1_aggregation = Column(String(50))
87
+ end2_multiplicity = Column(Integer, default=0)
88
+ end2_navigable = Column(Boolean)
89
+ end2_rolename = Column(String(50))
90
+ end2_reftableid = Column(String(50), ForeignKey("tabledictionary.id"))
91
+ end2_reftable = relationship("Tabledictionary", foreign_keys=[end2_reftableid], uselist=False)
92
+ end2_mapid = Column(String(50))
93
+ end2_aggregation = Column(String(50))
94
+ # masterdetail = Column(Boolean)
95
+ ref = Column(Boolean)
96
+ req = Column(Boolean)
97
+ # primaryjoin
98
+ flt = Column(String(100))
99
+ # order_by
100
+ ord = Column(String(50))
101
+ ownertableid = Column(String(50), ForeignKey("tabledictionary.id"))
102
+ ownertable = relationship("Tabledictionary", foreign_keys=[ownertableid], backref="roledictionarys")
103
+
104
+ # 多对多关联类
105
+ is_assoc_table = Column(Boolean)
106
+ assoc_tableid = Column(String(50), ForeignKey("tabledictionary.id"))
107
+ assoc_table = relationship("Tabledictionary", foreign_keys=[assoc_tableid],uselist=False)
108
+
109
+ # refmasterdetail = Column(Boolean)
110
+ id = Column(String(50), primary_key=True)
111
+ # 关联id 是否要加下划线
112
+ underline = Column(Boolean,default=False)
113
+ # 记录database的id,用以区分是哪个资料库
114
+ ddid = Column(String(50))
115
+ end1_lazy = Column(String(50))
116
+ end2_lazy = Column(String(50))
117
+ @property
118
+ def end1_foreign_key_name(self):
119
+ get_id = lambda underline: '_id' if underline else 'id'
120
+ return (self.end1_rolename + get_id(self.underline)).lower()
121
+
122
+ @property
123
+ def end2_foreign_key_name(self):
124
+ get_id = lambda underline: '_id' if underline else 'id'
125
+ return (self.end2_rolename + get_id(self.underline)).lower()
126
+
127
+ def __get_relationship_type(self):
128
+ return get_relationship_type(self.end1_multiplicity, self.end2_multiplicity,
129
+ self.end1_navigable, self.end2_navigable)
130
+ # 是一对一关系,做双向
131
+ def is_o2o(self):
132
+ return self.__get_relationship_type()==Relationship_type.o2o.value
133
+ # 多对一关系,只处理单向,当lookup关系
134
+ def is_m2o(self):
135
+ return self.__get_relationship_type()==Relationship_type.m2o.value
136
+ # 一对多,做双向
137
+ def is_o2m(self):
138
+ return self.__get_relationship_type()==Relationship_type.o2m.value
139
+
140
+ # 多对多
141
+ def is_m2m(self):
142
+ return self.__get_relationship_type() == Relationship_type.m2m.value
143
+
144
+ # master-detail关系
145
+ def is_md(self):
146
+ return (self.end1_aggregation == 'composite' or
147
+ self.end2_aggregation == 'composite')\
148
+ and self.is_o2m()
149
+
150
+ # 自引用
151
+ def is_tree(self):
152
+ return (self.end1_reftableid== self.end2_reftableid)or\
153
+ (self.end1_reftable.is_sigletable and self.end2_reftable.is_sigletable and
154
+ self.end1_reftable.parentid==self.end2_reftable.id
155
+ )
156
+
157
+ def __repr__(self):
158
+ return json.dumps(self.to_json())
159
+
160
+ def to_json(self):
161
+ return {key: getattr(self, key) for key in self.__table__.columns.keys()}
162
+
163
+ class Tabledictionary(Base):
164
+ __tablename__ = 'tabledictionary'
165
+ # viewsql = Column(String(2048))
166
+ id = Column(String(50), primary_key=True)
167
+ databasedictionaryid = Column(String(50), ForeignKey("databasedictionary.id"), nullable=False)
168
+ tablename = Column(String(50), nullable=False, unique=True)
169
+ maptablename = Column(String(50))
170
+ # 第二个资料库
171
+ bind_db = Column(String(50))
172
+ description = Column(String(250))
173
+ fielddictionarys = relationship("Fielddictionary", backref="tabledictionary",
174
+ cascade="all, delete-orphan")
175
+ ddoperations = relationship("Ddoperation", backref="parent",
176
+ cascade="all, delete-orphan")
177
+ # 是父类
178
+ is_parentclass = Column(Boolean,default=False)
179
+
180
+ # 儿子类有parent
181
+ parentid = Column(String(50),ForeignKey("tabledictionary.id"))
182
+ parent = relationship("Tabledictionary", foreign_keys="Tabledictionary.parentid", remote_side=[id])
183
+ # 继承关系只有一个table
184
+ is_sigletable = Column(Boolean,default=False)
185
+ # 是多对多关联类
186
+ is_assoc_table = Column(Boolean)
187
+ # 纯多对多关联类,没有任何栏位的不需要在model中产生后代类
188
+ is_need_sonboclass = Column(Boolean, default=True)
189
+ # 抽象类
190
+ isabstract = Column(Boolean, default=False)
191
+
192
+ def get_keyfield(self):
193
+ for fld in self.fielddictionarys:
194
+ if fld.keytype==1:
195
+ return fld
196
+ return None
197
+
198
+ def __repr__(self):
199
+ return json.dumps(self.to_json())
200
+
201
+ def to_json(self):
202
+ return {key: getattr(self, key) for key in self.__table__.columns.keys()}
203
+
204
+
205
+ class Ddoperation(Base):
206
+ __tablename__ = 'ddoperation'
207
+ id = Column(String(50), primary_key=True)
208
+ name = Column(String(50))
209
+ stereotype = Column(String(50))
210
+ doc = Column(String(50))
211
+ py_params = Column(String(50))
212
+ specification = Column(String(500))
213
+ isabstract = Column(Boolean, default= False)
214
+ isquery = Column(Boolean, default= False)
215
+ isstatic = Column(Boolean, default= False)
216
+ parentid = Column(String(50),ForeignKey("tabledictionary.id"), nullable= False)
217
+ # parent = relationship("Tabledictionary", back_populates="ddoperations", foreign_keys="Ddoperation.parentid")
218
+ def __repr__(self):
219
+ return json.dumps(self.to_json())
220
+ def to_json(self):
221
+ return {key: getattr(self, key) for key in self.__table__.columns.keys()
222
+ if hasattr(self,key)
223
+ }
224
+
225
+
226
+ class DBEnumeration(Base):
227
+ __tablename__ = "dbenumeration"
228
+ name = Column(String(50))
229
+ # 支持string,integer,boolean
230
+ type = Column(String(50))
231
+ doc = Column(String(50))
232
+ # 关联类的关联
233
+ enumeitems = relationship("DBEnumeitem")
234
+ id = Column(String(50), primary_key=True)
235
+ # 记录database的id,用以区分专案
236
+ ddid = Column(String(50))
237
+ def __repr__(self):
238
+ return json.dumps(self.to_json())
239
+
240
+ def to_json(self):
241
+ return {key: getattr(self, key) for key in self.__table__.columns.keys()}
242
+
243
+ class DBEnumeitem(Base):
244
+ __tablename__ = "dbenumeitem"
245
+ name = Column(String(50))
246
+ type = Column(String(50))
247
+ value = Column(String(50))
248
+ doc = Column(String(50))
249
+ id = Column(String(50), primary_key=True)
250
+ enumerationid = Column(String(50), ForeignKey("dbenumeration.id"))
251
+
252
+ def __repr__(self):
253
+ return json.dumps(self.to_json())
254
+
255
+ def to_json(self):
256
+ return {key: getattr(self, key) for key in self.__table__.columns.keys()}
gencode/ext.py ADDED
@@ -0,0 +1,19 @@
1
+ from sqlalchemy.ext.declarative import declarative_base
2
+ from sqlalchemy import create_engine
3
+ from sqlalchemy.orm import sessionmaker
4
+
5
+ Base = declarative_base()
6
+
7
+ # class Base(Model):
8
+ # # # create_at这个属性也是创建表结构默认都包含的
9
+ # # create_at = Column(DateTime, default=datetime.utcnow())
10
+ # def to_json(self):
11
+ # columns = self.__table__.columns.keys()
12
+ # return {key: getattr(self, key) for key in columns}
13
+
14
+ engine = create_engine('sqlite:///:memory:')
15
+ Session = sessionmaker(bind=engine)
16
+
17
+ def new_id():
18
+ from datetime import datetime
19
+ return datetime.today().strftime("%Y%m%d%H%M%S%f")