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,295 @@
|
|
|
1
|
+
########################################
|
|
2
|
+
# create by :cxh-pc
|
|
3
|
+
# create time :2018-04-26 20:44:58.281737
|
|
4
|
+
########################################
|
|
5
|
+
from sqlalchemy import Table,Column, Integer, String, ForeignKey, Boolean,\
|
|
6
|
+
DateTime,Time,Date,Float
|
|
7
|
+
from sqlalchemy.orm import relationship,aliased
|
|
8
|
+
from sqlalchemy import or_
|
|
9
|
+
from .ext import Base as Model
|
|
10
|
+
import json
|
|
11
|
+
from enum import Enum
|
|
12
|
+
class Class_uml(Enum):
|
|
13
|
+
umlclass ="UMLClass"
|
|
14
|
+
umlsignal ="UMLSignal"
|
|
15
|
+
umlprimitivetype ="UMLPrimitiveType"
|
|
16
|
+
umldatatype ="UMLDataType"
|
|
17
|
+
class Package(Model):
|
|
18
|
+
__tablename__ = 'package'
|
|
19
|
+
name = Column(String(50))
|
|
20
|
+
stereotype = Column(String(50))
|
|
21
|
+
doc = Column(String(50))
|
|
22
|
+
# UMLModel
|
|
23
|
+
type = Column(String(50))
|
|
24
|
+
id = Column(String(50), primary_key=True)
|
|
25
|
+
isswagger = Column(Boolean, default= False)
|
|
26
|
+
parentid = Column(String(50),ForeignKey("package.id"))
|
|
27
|
+
projectid = Column(String(50),ForeignKey("project.id"), nullable= False)
|
|
28
|
+
packages = relationship("Package", back_populates="parent", foreign_keys="Package.parentid") # , lazy="dynamic")
|
|
29
|
+
parent = relationship("Package", back_populates="packages", foreign_keys="Package.parentid", remote_side=[id])
|
|
30
|
+
project = relationship("Project", back_populates="packages", foreign_keys="Package.projectid")
|
|
31
|
+
diagrams = relationship("Diagram", back_populates="parent", foreign_keys="Diagram.parentid", cascade="all, delete-orphan")
|
|
32
|
+
classs = relationship("Class", back_populates="parent", foreign_keys="Class.parentid", cascade="all, delete-orphan")
|
|
33
|
+
enumerations = relationship("Enumeration", back_populates="package", foreign_keys="Enumeration.packageid", cascade="all, delete-orphan")
|
|
34
|
+
def __repr__(self):
|
|
35
|
+
return json.dumps(self.to_json())
|
|
36
|
+
def to_json(self):
|
|
37
|
+
return {key: getattr(self, key) for key in self.__table__.columns.keys()
|
|
38
|
+
if hasattr(self,key)
|
|
39
|
+
}
|
|
40
|
+
class Diagram(Model):
|
|
41
|
+
__tablename__ = 'diagram'
|
|
42
|
+
name = Column(String(50))
|
|
43
|
+
isdefault = Column(Boolean, default= False)
|
|
44
|
+
id = Column(String(50), primary_key=True)
|
|
45
|
+
type = Column(String(50))
|
|
46
|
+
isswagger = Column(Boolean, default= False)
|
|
47
|
+
parentid = Column(String(50),ForeignKey("package.id"), nullable= False)
|
|
48
|
+
parent = relationship("Package", back_populates="diagrams", foreign_keys="Diagram.parentid")
|
|
49
|
+
def __repr__(self):
|
|
50
|
+
return json.dumps(self.to_json())
|
|
51
|
+
def to_json(self):
|
|
52
|
+
return {key: getattr(self, key) for key in self.__table__.columns.keys()
|
|
53
|
+
if hasattr(self,key)
|
|
54
|
+
}
|
|
55
|
+
class Class(Model):
|
|
56
|
+
__tablename__ = 'class'
|
|
57
|
+
name = Column(String(50))
|
|
58
|
+
stereotype = Column(String(50))
|
|
59
|
+
doc = Column(String(50))
|
|
60
|
+
isabstract = Column(Boolean, default= False)
|
|
61
|
+
id = Column(String(50), primary_key=True)
|
|
62
|
+
isswagger = Column(Boolean, default= False)
|
|
63
|
+
type = Column(String(50))
|
|
64
|
+
is_assoc_class = Column(Boolean, default= False)
|
|
65
|
+
projectid = Column(String(50))
|
|
66
|
+
parentid = Column(String(50),ForeignKey("package.id"), nullable= False)
|
|
67
|
+
association_id = Column(String(50),ForeignKey("association.id"))
|
|
68
|
+
parent = relationship("Package", back_populates="classs", foreign_keys="Class.parentid")
|
|
69
|
+
association = relationship("Association", foreign_keys="Class.association_id")
|
|
70
|
+
propertys = relationship("Property", back_populates="parent", foreign_keys="Property.parentid", cascade="all, delete-orphan")
|
|
71
|
+
associations = relationship("Association", back_populates="parent", foreign_keys="Association.parentid", cascade="all, delete-orphan")
|
|
72
|
+
operations = relationship("Operation", back_populates="parent", foreign_keys="Operation.parentid", cascade="all, delete-orphan")
|
|
73
|
+
umlgeneralizations = relationship("Umlgeneralization", back_populates="parent", foreign_keys="Umlgeneralization.parentid", cascade="all, delete-orphan")
|
|
74
|
+
def assign_propertys(self,session):
|
|
75
|
+
if self.type != Class_uml.umlclass.value:
|
|
76
|
+
return
|
|
77
|
+
def assign_assoc_id(cls):
|
|
78
|
+
Assoc_end1 = aliased(Assoc_end)
|
|
79
|
+
Assoc_end2 = aliased(Assoc_end)
|
|
80
|
+
associations = session.query(Association).\
|
|
81
|
+
join(Assoc_end1,Assoc_end1.id==Association.end1id).\
|
|
82
|
+
join(Assoc_end2,Assoc_end2.id==Association.end2id).\
|
|
83
|
+
filter(or_(Assoc_end1.referenceid==cls.id,Assoc_end2.referenceid==cls.id)). \
|
|
84
|
+
distinct().all()
|
|
85
|
+
get_name = lambda end:end.name.lower() if end.name else end.reference.name.lower()
|
|
86
|
+
for assoc in associations:
|
|
87
|
+
end = assoc.end1
|
|
88
|
+
if end.referenceid==cls.id:
|
|
89
|
+
end = assoc.end2
|
|
90
|
+
if end.navigable and end.multiplicity.split('..')[-1]=='1':
|
|
91
|
+
if '_id' in assoc.stereotype.split('/'):
|
|
92
|
+
id = '_id'
|
|
93
|
+
else:
|
|
94
|
+
id = 'id'
|
|
95
|
+
assoc_id = None
|
|
96
|
+
for pro in end.reference.propertys:
|
|
97
|
+
if pro.name=='id':
|
|
98
|
+
assoc_id = Property(**pro.to_json())
|
|
99
|
+
assoc_id.name = get_name(end)+id
|
|
100
|
+
# 不能用cls的name,因为cls可能是target,这样会id重复
|
|
101
|
+
assoc_id.id = '%s_%s'%(self.name,end.id)
|
|
102
|
+
break
|
|
103
|
+
if assoc_id is None:
|
|
104
|
+
assoc_id = Property(id='%s_%s'%(self.name,end.id),
|
|
105
|
+
name=get_name(end)+'id',
|
|
106
|
+
type='integer')
|
|
107
|
+
self.propertys.append(assoc_id)
|
|
108
|
+
for gen in self.umlgeneralizations:
|
|
109
|
+
for property in gen.target.propertys:
|
|
110
|
+
pro = Property(**property.to_json())
|
|
111
|
+
pro.id='%s_%s'%(self.name,pro.id)
|
|
112
|
+
self.propertys.append(pro)
|
|
113
|
+
assign_assoc_id(gen.target)
|
|
114
|
+
assign_assoc_id(self)
|
|
115
|
+
def __repr__(self):
|
|
116
|
+
return json.dumps(self.to_json())
|
|
117
|
+
def to_json(self):
|
|
118
|
+
return {key: getattr(self, key) for key in self.__table__.columns.keys()
|
|
119
|
+
if hasattr(self,key)
|
|
120
|
+
}
|
|
121
|
+
class Property(Model):
|
|
122
|
+
__tablename__ = 'property'
|
|
123
|
+
name = Column(String(50))
|
|
124
|
+
stereotype = Column(String(50))
|
|
125
|
+
doc = Column(String(50))
|
|
126
|
+
type = Column(String(50))
|
|
127
|
+
multiplicity = Column(String(50))
|
|
128
|
+
isreadonly = Column(Boolean, default= False)
|
|
129
|
+
isordered = Column(Boolean, default= False)
|
|
130
|
+
isunique = Column(Boolean, default= False)
|
|
131
|
+
defaultvalue = Column(String(50), default= '')
|
|
132
|
+
isid = Column(Boolean, default= False)
|
|
133
|
+
id = Column(String(50), primary_key=True)
|
|
134
|
+
isswagger = Column(Boolean, default= False)
|
|
135
|
+
parentid = Column(String(50),ForeignKey("class.id"), nullable= False)
|
|
136
|
+
objectid = Column(String(50),ForeignKey("class.id"))
|
|
137
|
+
parent = relationship("Class", back_populates="propertys", foreign_keys="Property.parentid")
|
|
138
|
+
object = relationship("Class", foreign_keys="Property.objectid")
|
|
139
|
+
def __repr__(self):
|
|
140
|
+
return json.dumps(self.to_json())
|
|
141
|
+
def to_json(self):
|
|
142
|
+
return {key: getattr(self, key) for key in self.__table__.columns.keys()
|
|
143
|
+
if hasattr(self,key)
|
|
144
|
+
}
|
|
145
|
+
class Association(Model):
|
|
146
|
+
__tablename__ = 'association'
|
|
147
|
+
id = Column(String(50), primary_key=True)
|
|
148
|
+
name = Column(String(50))
|
|
149
|
+
stereotype = Column(String(50))
|
|
150
|
+
doc = Column(String(50))
|
|
151
|
+
isswagger = Column(Boolean, default= False)
|
|
152
|
+
is_assoc_class = Column(Boolean, default= False)
|
|
153
|
+
projectid = Column(String(50))
|
|
154
|
+
parentid = Column(String(50),ForeignKey("class.id"), nullable= False)
|
|
155
|
+
end1id = Column(String(50),ForeignKey("assoc_end.id"), nullable= False)
|
|
156
|
+
end2id = Column(String(50),ForeignKey("assoc_end.id"), nullable= False)
|
|
157
|
+
assoc_class_id = Column(String(50),ForeignKey("class.id"))
|
|
158
|
+
parent = relationship("Class", back_populates="associations", foreign_keys="Association.parentid")
|
|
159
|
+
end1 = relationship("Assoc_end", foreign_keys="Association.end1id")
|
|
160
|
+
end2 = relationship("Assoc_end", foreign_keys="Association.end2id")
|
|
161
|
+
assoc_class = relationship("Class", foreign_keys="Association.assoc_class_id")
|
|
162
|
+
def __repr__(self):
|
|
163
|
+
return json.dumps(self.to_json())
|
|
164
|
+
def to_json(self):
|
|
165
|
+
return {key: getattr(self, key) for key in self.__table__.columns.keys()
|
|
166
|
+
if hasattr(self,key)
|
|
167
|
+
}
|
|
168
|
+
class Assoc_end(Model):
|
|
169
|
+
__tablename__ = 'assoc_end'
|
|
170
|
+
id = Column(String(50), primary_key=True)
|
|
171
|
+
name = Column(String(50))
|
|
172
|
+
stereotype = Column(String(50))
|
|
173
|
+
navigable = Column(Boolean)
|
|
174
|
+
aggregation = Column(String(50))
|
|
175
|
+
multiplicity = Column(String(50))
|
|
176
|
+
isswagger = Column(Boolean, default= False)
|
|
177
|
+
isderived = Column(Boolean, default= False)
|
|
178
|
+
referenceid = Column(String(50),ForeignKey("class.id"))
|
|
179
|
+
reference = relationship("Class", foreign_keys="Assoc_end.referenceid")
|
|
180
|
+
def __repr__(self):
|
|
181
|
+
return json.dumps(self.to_json())
|
|
182
|
+
def to_json(self):
|
|
183
|
+
return {key: getattr(self, key) for key in self.__table__.columns.keys()
|
|
184
|
+
if hasattr(self,key)
|
|
185
|
+
}
|
|
186
|
+
class Project(Model):
|
|
187
|
+
__tablename__ = 'project'
|
|
188
|
+
id = Column(String(50), primary_key=True)
|
|
189
|
+
author = Column(String(50))
|
|
190
|
+
version = Column(String(50))
|
|
191
|
+
doc = Column(String(50))
|
|
192
|
+
isswagger = Column(Boolean, default= False)
|
|
193
|
+
name = Column(String(50))
|
|
194
|
+
# 增加一个flag,确保id不重复,解决文件拷贝导致id重复的问题
|
|
195
|
+
flag = Column(String(50))
|
|
196
|
+
file_name = Column(String(200))
|
|
197
|
+
packages = relationship("Package", back_populates="project", foreign_keys="Package.projectid", cascade="all, delete-orphan")
|
|
198
|
+
def __repr__(self):
|
|
199
|
+
return json.dumps(self.to_json())
|
|
200
|
+
def to_json(self):
|
|
201
|
+
return {key: getattr(self, key) for key in self.__table__.columns.keys()
|
|
202
|
+
if hasattr(self,key)
|
|
203
|
+
}
|
|
204
|
+
class Operation(Model):
|
|
205
|
+
__tablename__ = 'operation'
|
|
206
|
+
isswagger = Column(Boolean, default= False)
|
|
207
|
+
id = Column(String(50), primary_key=True)
|
|
208
|
+
name = Column(String(50))
|
|
209
|
+
stereotype = Column(String(50))
|
|
210
|
+
doc = Column(String(50))
|
|
211
|
+
# python function的参数定义
|
|
212
|
+
py_params = Column(String(50))
|
|
213
|
+
# 代码内容
|
|
214
|
+
specification = Column(String(500))
|
|
215
|
+
isabstract = Column(Boolean, default= False)
|
|
216
|
+
isquery = Column(Boolean, default= False)
|
|
217
|
+
isstatic = Column(Boolean, default= False)
|
|
218
|
+
in_param_id = Column(String(50),ForeignKey("parameter.id"), nullable= False)
|
|
219
|
+
return_param_id = Column(String(50),ForeignKey("parameter.id"), nullable= False)
|
|
220
|
+
parentid = Column(String(50),ForeignKey("class.id"), nullable= False)
|
|
221
|
+
in_param = relationship("Parameter", foreign_keys="Operation.in_param_id")
|
|
222
|
+
return_param = relationship("Parameter", foreign_keys="Operation.return_param_id")
|
|
223
|
+
parent = relationship("Class", back_populates="operations", foreign_keys="Operation.parentid")
|
|
224
|
+
def __repr__(self):
|
|
225
|
+
return json.dumps(self.to_json())
|
|
226
|
+
def to_json(self):
|
|
227
|
+
return {key: getattr(self, key) for key in self.__table__.columns.keys()
|
|
228
|
+
if hasattr(self,key)
|
|
229
|
+
}
|
|
230
|
+
class Parameter(Model):
|
|
231
|
+
__tablename__ = 'parameter'
|
|
232
|
+
isswagger = Column(Boolean, default= False)
|
|
233
|
+
id = Column(String(50), primary_key=True)
|
|
234
|
+
name = Column(String(50))
|
|
235
|
+
stereotype = Column(String(50))
|
|
236
|
+
type = Column(String(50))
|
|
237
|
+
multiplicity = Column(String(50))
|
|
238
|
+
object_type_id = Column(String(50),ForeignKey("class.id"))
|
|
239
|
+
object_type = relationship("Class", foreign_keys="Parameter.object_type_id")
|
|
240
|
+
def __repr__(self):
|
|
241
|
+
return json.dumps(self.to_json())
|
|
242
|
+
def to_json(self):
|
|
243
|
+
return {key: getattr(self, key) for key in self.__table__.columns.keys()
|
|
244
|
+
if hasattr(self,key)
|
|
245
|
+
}
|
|
246
|
+
class Enumeration(Model):
|
|
247
|
+
__tablename__ = 'enumeration'
|
|
248
|
+
name = Column(String(50))
|
|
249
|
+
id = Column(String(50), primary_key=True)
|
|
250
|
+
doc = Column(String(50))
|
|
251
|
+
stereotype = Column(String(50))
|
|
252
|
+
isswagger = Column(Boolean, default= False)
|
|
253
|
+
projectid = Column(String(50))
|
|
254
|
+
packageid = Column(String(50),ForeignKey("package.id"), nullable= False)
|
|
255
|
+
package = relationship("Package", back_populates="enumerations", foreign_keys="Enumeration.packageid")
|
|
256
|
+
enumeitems = relationship("Enumeitem", back_populates="enumeration", foreign_keys="Enumeitem.enumerationid", cascade="all, delete-orphan")
|
|
257
|
+
def __repr__(self):
|
|
258
|
+
return json.dumps(self.to_json())
|
|
259
|
+
def to_json(self):
|
|
260
|
+
return {key: getattr(self, key) for key in self.__table__.columns.keys()
|
|
261
|
+
if hasattr(self,key)
|
|
262
|
+
}
|
|
263
|
+
class Enumeitem(Model):
|
|
264
|
+
__tablename__ = 'enumeitem'
|
|
265
|
+
name = Column(String(50))
|
|
266
|
+
stereotype = Column(String(50))
|
|
267
|
+
doc = Column(String(50))
|
|
268
|
+
id = Column(String(50), primary_key=True)
|
|
269
|
+
isswagger = Column(Boolean, default= False)
|
|
270
|
+
enumerationid = Column(String(50),ForeignKey("enumeration.id"), nullable= False)
|
|
271
|
+
enumeration = relationship("Enumeration", back_populates="enumeitems", foreign_keys="Enumeitem.enumerationid")
|
|
272
|
+
def __repr__(self):
|
|
273
|
+
return json.dumps(self.to_json())
|
|
274
|
+
def to_json(self):
|
|
275
|
+
return {key: getattr(self, key) for key in self.__table__.columns.keys()
|
|
276
|
+
if hasattr(self,key)
|
|
277
|
+
}
|
|
278
|
+
class Umlgeneralization(Model):
|
|
279
|
+
__tablename__ = 'umlgeneralization'
|
|
280
|
+
discriminator = Column(String(50))
|
|
281
|
+
stereotype = Column(String(50))
|
|
282
|
+
isswagger = Column(Boolean, default= False)
|
|
283
|
+
id = Column(String(50), nullable= False, primary_key=True)
|
|
284
|
+
sourceid = Column(String(50),ForeignKey("class.id"), nullable= False)
|
|
285
|
+
targetid = Column(String(50),ForeignKey("class.id"), nullable= False)
|
|
286
|
+
parentid = Column(String(50),ForeignKey("class.id"), nullable= False)
|
|
287
|
+
source = relationship("Class", foreign_keys="Umlgeneralization.sourceid")
|
|
288
|
+
target = relationship("Class", foreign_keys="Umlgeneralization.targetid")
|
|
289
|
+
parent = relationship("Class", back_populates="umlgeneralizations", foreign_keys="Umlgeneralization.parentid")
|
|
290
|
+
def __repr__(self):
|
|
291
|
+
return json.dumps(self.to_json())
|
|
292
|
+
def to_json(self):
|
|
293
|
+
return {key: getattr(self, key) for key in self.__table__.columns.keys()
|
|
294
|
+
if hasattr(self,key)
|
|
295
|
+
}
|
gencode/upgrade.py
ADDED
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
import codecs
|
|
2
|
+
import os
|
|
3
|
+
import logging # 引入logging模块
|
|
4
|
+
from datetime import datetime
|
|
5
|
+
import socket
|
|
6
|
+
from pathlib import Path
|
|
7
|
+
|
|
8
|
+
logging.basicConfig(level= int(os.environ.get('LOG_LEVEL', logging.INFO)),
|
|
9
|
+
format='%(asctime)s - %(filename)s[line:%(lineno)d] - %(levelname)s: %(message)s')
|
|
10
|
+
|
|
11
|
+
def hostname():
|
|
12
|
+
return socket.gethostname()
|
|
13
|
+
def write_gen_info(f):
|
|
14
|
+
f.write('#' * 40+'\n')
|
|
15
|
+
f.write('# create by :%s'%hostname()+'\n')
|
|
16
|
+
f.write('# create time :%s'%datetime.now().strftime('%Y-%m-%d %H:%M:%S.%f')+'\n')
|
|
17
|
+
f.write('#' * 40+'\n')
|
|
18
|
+
|
|
19
|
+
class Upgrade_base:
|
|
20
|
+
def __init__(self,dir,swagger):
|
|
21
|
+
self.root_path =dir
|
|
22
|
+
self.swagger = swagger
|
|
23
|
+
|
|
24
|
+
def load_file(self,filename):
|
|
25
|
+
assert os.path.exists(filename), '该文件(%s)不存在' % filename
|
|
26
|
+
codes = []
|
|
27
|
+
with codecs.open(filename, "r", "utf-8") as file:
|
|
28
|
+
for code in file.readlines():
|
|
29
|
+
codes.append(code.rstrip())
|
|
30
|
+
return codes
|
|
31
|
+
|
|
32
|
+
def saveUTF8File(self,filename, codes, writegeninfo=False, exist_ok=True):
|
|
33
|
+
'''
|
|
34
|
+
把list 中的数据存UTF8格式
|
|
35
|
+
:param filename:
|
|
36
|
+
:param codes: 存放代码的 list
|
|
37
|
+
:return:
|
|
38
|
+
'''
|
|
39
|
+
if not codes:
|
|
40
|
+
return
|
|
41
|
+
if not exist_ok and os.path.exists(filename):
|
|
42
|
+
logging.info('the file(%s) is exist' % filename)
|
|
43
|
+
return
|
|
44
|
+
os.makedirs(os.path.dirname(filename), exist_ok=True)
|
|
45
|
+
with codecs.open(filename, "w", "utf-8") as file:
|
|
46
|
+
if writegeninfo:
|
|
47
|
+
write_gen_info(file)
|
|
48
|
+
for line in codes:
|
|
49
|
+
if not line:
|
|
50
|
+
continue
|
|
51
|
+
file.write(line + '\n')
|
|
52
|
+
|
|
53
|
+
def merge_code(self):
|
|
54
|
+
pass
|
|
55
|
+
class Upgrade_k8s(Upgrade_base):
|
|
56
|
+
def merge_config(self):
|
|
57
|
+
filename = os.path.join(os.path.realpath(self.root_path),'app','config.py')
|
|
58
|
+
scodes = self.load_file(filename)
|
|
59
|
+
code_ins = f'''
|
|
60
|
+
# 支持k8s
|
|
61
|
+
SUPPORT_K8S = os.environ.get('SUPPORT_K8S', 'false').lower() == 'true'
|
|
62
|
+
@classmethod
|
|
63
|
+
def get_host_addr(cls):
|
|
64
|
+
from mwsdk import AgentConf
|
|
65
|
+
if cls.SUPPORT_K8S:
|
|
66
|
+
return '{self.swagger.name}-server'
|
|
67
|
+
return AgentConf().bind_ip
|
|
68
|
+
'''
|
|
69
|
+
try:
|
|
70
|
+
scodes.index(' def get_host_addr(cls):')
|
|
71
|
+
except Exception as e:
|
|
72
|
+
code_ins_indx = scodes.index(' def init_app(app):') + 2
|
|
73
|
+
scodes.insert(code_ins_indx, code_ins)
|
|
74
|
+
self.saveUTF8File(filename, scodes, exist_ok=True)
|
|
75
|
+
|
|
76
|
+
def merge_run(self):
|
|
77
|
+
filename = os.path.join(os.path.realpath(self.root_path),'run.py')
|
|
78
|
+
scodes = self.load_file(filename)
|
|
79
|
+
for indx,code in enumerate(scodes):
|
|
80
|
+
if code.startswith(' service_host') :
|
|
81
|
+
scodes[indx] = ''' service_host = f"{config.get_host_addr()}:{ web_port}"'''
|
|
82
|
+
scodes[indx]=scodes[indx].replace('service_host(),','service_host,')
|
|
83
|
+
self.saveUTF8File(filename, scodes, exist_ok=True)
|
|
84
|
+
|
|
85
|
+
def merge_uwsigrun(self):
|
|
86
|
+
filename = os.path.join(os.path.realpath(self.root_path),'uwsgi_run.py')
|
|
87
|
+
scodes = self.load_file(filename)
|
|
88
|
+
for indx,code in enumerate(scodes) :
|
|
89
|
+
if code.startswith(' service_host'):
|
|
90
|
+
scodes[indx] = ''' service_host = f"{config.get_host_addr()}:{ web_port}"'''
|
|
91
|
+
# scodes[indx]= code.replace('service_host(),', 'service_host,')
|
|
92
|
+
# 不能用code替换,避免覆盖上次修改了的值
|
|
93
|
+
scodes[indx] = scodes[indx].replace('service_host(),', 'service_host,')
|
|
94
|
+
self.saveUTF8File(filename, scodes, exist_ok=True)
|
|
95
|
+
#
|
|
96
|
+
# def gen_k8s_yml(self):
|
|
97
|
+
# tmp_path = os.path.join(os.path.realpath(self.root_path), 'gencode', 'template')
|
|
98
|
+
# # 创建其他专案文件
|
|
99
|
+
# from jinja2 import FileSystemLoader, Environment
|
|
100
|
+
# load = FileSystemLoader(tmp_path)
|
|
101
|
+
# env = Environment(loader=load)
|
|
102
|
+
# self.saveUTF8File(os.path.join(os.path.realpath(self.root_path), f'{self.swager.name}-k8s.yml'),
|
|
103
|
+
# [env.get_template('k8s-tmp.yml').render(root_path=os.path.split(self.root_path)[-1],
|
|
104
|
+
# swagger=self.swager, plugins=None)],
|
|
105
|
+
# exist_ok=False)
|
|
106
|
+
|
|
107
|
+
def merge_code(self):
|
|
108
|
+
self.merge_uwsigrun()
|
|
109
|
+
self.merge_run()
|
|
110
|
+
self.merge_config()
|
|
111
|
+
|
|
112
|
+
|
|
113
|
+
|
gencode/utils.py
ADDED
|
@@ -0,0 +1,225 @@
|
|
|
1
|
+
from enum import Enum
|
|
2
|
+
import socket
|
|
3
|
+
from datetime import datetime
|
|
4
|
+
import codecs
|
|
5
|
+
import os
|
|
6
|
+
import logging # 引入logging模块
|
|
7
|
+
|
|
8
|
+
logging.basicConfig(level= int(os.environ.get('LOG_LEVEL', logging.INFO)),
|
|
9
|
+
format='%(asctime)s - %(filename)s[line:%(lineno)d] - %(levelname)s: %(message)s')
|
|
10
|
+
|
|
11
|
+
class Keytype(Enum):
|
|
12
|
+
# TKeyType=(ktUnkown,ktKey,ktForeignKey,ktNotKey,ktsys);
|
|
13
|
+
# 访问方法 Keytype.key.value,Keytype.foreignkey.value
|
|
14
|
+
unkown = 0
|
|
15
|
+
key = 1
|
|
16
|
+
foreignkey = 2
|
|
17
|
+
notkey = 3
|
|
18
|
+
sys = 4
|
|
19
|
+
|
|
20
|
+
# TFieldFrom=(ffUnknown,ffDatabase,ffLookup,ffCustom);
|
|
21
|
+
class FieldFrom(Enum):
|
|
22
|
+
unknown = 0
|
|
23
|
+
database =1
|
|
24
|
+
lookup = 2
|
|
25
|
+
custom =3
|
|
26
|
+
|
|
27
|
+
class DBDataType(Enum):
|
|
28
|
+
Unknown=''
|
|
29
|
+
bit='bit'
|
|
30
|
+
char='char'
|
|
31
|
+
varchar='varchar'
|
|
32
|
+
datetime='datetime'
|
|
33
|
+
time='time'
|
|
34
|
+
float='float'
|
|
35
|
+
int='int'
|
|
36
|
+
nchar='nchar'
|
|
37
|
+
numeric='numeric'
|
|
38
|
+
guid='uniqueidentifier'
|
|
39
|
+
text='text'
|
|
40
|
+
autoint='AutoInt'
|
|
41
|
+
date='date'
|
|
42
|
+
image='image'
|
|
43
|
+
|
|
44
|
+
class DBDataType_len(Enum):
|
|
45
|
+
Unknown=0
|
|
46
|
+
bit=1
|
|
47
|
+
char=10
|
|
48
|
+
varchar=50
|
|
49
|
+
datetime=8
|
|
50
|
+
time=8
|
|
51
|
+
float=8
|
|
52
|
+
int=4
|
|
53
|
+
nchar=50
|
|
54
|
+
numeric=13
|
|
55
|
+
guid=16
|
|
56
|
+
text=16
|
|
57
|
+
autoint=4
|
|
58
|
+
date=4
|
|
59
|
+
image=32
|
|
60
|
+
|
|
61
|
+
def convert2dbType(umlType):
|
|
62
|
+
if umlType.upper() == 'STRING':
|
|
63
|
+
return DBDataType.varchar.value
|
|
64
|
+
elif umlType.upper() == 'INTEGER':
|
|
65
|
+
return DBDataType.int.value
|
|
66
|
+
elif umlType.upper() == 'AUTOINT':
|
|
67
|
+
return DBDataType.autoint.value
|
|
68
|
+
elif umlType.upper()=='DOUBLE' or umlType.upper()=='EXTEND':
|
|
69
|
+
return DBDataType.float.value
|
|
70
|
+
elif umlType.upper()=='TDATE' or umlType.upper()=='DATE':
|
|
71
|
+
return DBDataType.date.value
|
|
72
|
+
elif umlType.upper()=='TDATETIME' or umlType.upper()=='DATETIME':
|
|
73
|
+
return DBDataType.datetime.value
|
|
74
|
+
elif umlType.upper()=='TTIME' or umlType.upper()=='TIME':
|
|
75
|
+
return DBDataType.time.value
|
|
76
|
+
elif umlType.upper()=='BOOLEAN':
|
|
77
|
+
return DBDataType.bit.value
|
|
78
|
+
elif umlType.upper() =='STRING':
|
|
79
|
+
return DBDataType.varchar.value
|
|
80
|
+
elif umlType.upper() =='INT64'or umlType.upper() =='UINT64':
|
|
81
|
+
return DBDataType.numeric.value
|
|
82
|
+
elif umlType.upper() =='VARIANT':
|
|
83
|
+
return DBDataType.varchar.value
|
|
84
|
+
elif umlType.upper() =='TEXT':
|
|
85
|
+
return DBDataType.text.value
|
|
86
|
+
elif umlType.upper() =='IMAGE':
|
|
87
|
+
return DBDataType.image.value
|
|
88
|
+
else:
|
|
89
|
+
return DBDataType.varchar.value
|
|
90
|
+
|
|
91
|
+
def covert2pytype(dbtype,size):
|
|
92
|
+
if dbtype == 'bit':
|
|
93
|
+
return 'db.Boolean'
|
|
94
|
+
elif dbtype == 'char' or dbtype == 'varchar' or\
|
|
95
|
+
dbtype == 'nchar':
|
|
96
|
+
return 'db.String(%s)'%size
|
|
97
|
+
elif dbtype == 'datetime':
|
|
98
|
+
return 'db.DateTime'
|
|
99
|
+
elif dbtype == 'time':
|
|
100
|
+
return 'db.Time'
|
|
101
|
+
elif dbtype == 'float':
|
|
102
|
+
return 'db.Float'
|
|
103
|
+
elif dbtype == 'int':
|
|
104
|
+
return 'db.Integer'
|
|
105
|
+
elif dbtype == 'numeric':
|
|
106
|
+
return 'db.Float'
|
|
107
|
+
elif dbtype == 'text':
|
|
108
|
+
return 'db.Text'
|
|
109
|
+
elif dbtype == 'AutoInt':
|
|
110
|
+
return 'db.Integer'
|
|
111
|
+
elif dbtype == 'date':
|
|
112
|
+
return 'db.Date'
|
|
113
|
+
elif dbtype == 'image':
|
|
114
|
+
return 'db.LargeBinary'
|
|
115
|
+
|
|
116
|
+
def hostname():
|
|
117
|
+
return socket.gethostname()
|
|
118
|
+
|
|
119
|
+
def write_gen_info(f):
|
|
120
|
+
f.write('#' * 40+'\n')
|
|
121
|
+
f.write('# create by :%s'%hostname()+'\n')
|
|
122
|
+
f.write('# create time :%s'%datetime.now().strftime('%Y-%m-%d %H:%M:%S.%f')+'\n')
|
|
123
|
+
f.write('#' * 40+'\n')
|
|
124
|
+
|
|
125
|
+
|
|
126
|
+
def saveUTF8File(filename,codes,writegeninfo=False,exist_ok=True):
|
|
127
|
+
'''
|
|
128
|
+
把list 中的数据存UTF8格式
|
|
129
|
+
:param filename:
|
|
130
|
+
:param codes: 存放代码的 list
|
|
131
|
+
:return:
|
|
132
|
+
'''
|
|
133
|
+
if not codes:
|
|
134
|
+
return
|
|
135
|
+
if not exist_ok and os.path.exists(filename):
|
|
136
|
+
logging.info('the file(%s) is exist' % filename)
|
|
137
|
+
return
|
|
138
|
+
os.makedirs(os.path.dirname(filename),exist_ok=True)
|
|
139
|
+
with codecs.open(filename, "w", "utf-8") as file:
|
|
140
|
+
if writegeninfo:
|
|
141
|
+
write_gen_info(file)
|
|
142
|
+
for line in codes:
|
|
143
|
+
if not line:
|
|
144
|
+
continue
|
|
145
|
+
file.write(line + '\n')
|
|
146
|
+
|
|
147
|
+
def get_merge_codes(scodes,dcodes):
|
|
148
|
+
# scodes :新产生的代码集合,dcodes:需更新的代码集合
|
|
149
|
+
isexist = False
|
|
150
|
+
if not scodes:
|
|
151
|
+
return
|
|
152
|
+
# 記錄丟失的屬於方法的代碼
|
|
153
|
+
pass_code = []
|
|
154
|
+
for sindx,sc in enumerate(scodes,0):
|
|
155
|
+
if sc.startswith('from '):
|
|
156
|
+
continue
|
|
157
|
+
if sc.startswith('@'):
|
|
158
|
+
pass_code.append(sc)
|
|
159
|
+
continue
|
|
160
|
+
# isexist = False
|
|
161
|
+
if sc.startswith('def '):
|
|
162
|
+
isexist = False
|
|
163
|
+
c_func = sc.split('(')[0]+'('
|
|
164
|
+
for dindex,dc in enumerate(dcodes,0):
|
|
165
|
+
if dc.startswith(c_func):
|
|
166
|
+
dcodes[dindex] = scodes[sindx]
|
|
167
|
+
isexist = True
|
|
168
|
+
pass_code.clear()
|
|
169
|
+
break
|
|
170
|
+
else:
|
|
171
|
+
dcodes.extend(pass_code)
|
|
172
|
+
dcodes.append(scodes[sindx])
|
|
173
|
+
pass_code.clear()
|
|
174
|
+
elif not isexist:
|
|
175
|
+
dcodes.append(scodes[sindx])
|
|
176
|
+
|
|
177
|
+
return dcodes
|
|
178
|
+
|
|
179
|
+
def get_merge_file(scodes,dfile):
|
|
180
|
+
assert os.path.exists(dfile),'该文件(%s)不存在'%dfile
|
|
181
|
+
codes = []
|
|
182
|
+
with codecs.open(dfile,"r", "utf-8") as file:
|
|
183
|
+
start = True
|
|
184
|
+
for code in file.readlines():
|
|
185
|
+
if start and code.startswith('#'):
|
|
186
|
+
continue
|
|
187
|
+
else:
|
|
188
|
+
start = False
|
|
189
|
+
codes.append(code.rstrip())
|
|
190
|
+
return get_merge_codes(scodes,codes)
|
|
191
|
+
|
|
192
|
+
if __name__ == '__main__':
|
|
193
|
+
codes = get_merge_codes(['##############',
|
|
194
|
+
'#cxh',
|
|
195
|
+
'#############',
|
|
196
|
+
'def test(a1)',
|
|
197
|
+
' pass',
|
|
198
|
+
'def test1(a1)',
|
|
199
|
+
' print(a)',
|
|
200
|
+
' print(c)',
|
|
201
|
+
'def test2(a1)',
|
|
202
|
+
' print(test2)'],
|
|
203
|
+
['##############',
|
|
204
|
+
'#xxxx',
|
|
205
|
+
'#############',
|
|
206
|
+
'def test(a2,b2)',
|
|
207
|
+
' print(1)',
|
|
208
|
+
' #print(2)',
|
|
209
|
+
'def test2(a2,b2)',
|
|
210
|
+
' print(3)',
|
|
211
|
+
' print(4)',
|
|
212
|
+
'def test3(a2,b2)',
|
|
213
|
+
' print(5)'])
|
|
214
|
+
for c in codes:
|
|
215
|
+
print(c)
|
|
216
|
+
# codes = []
|
|
217
|
+
# with codecs.open(r'D:\mwwork\projects\its\mobile_gateway_server\app\api\v1_0\rtdatamng.py',
|
|
218
|
+
# "r", "utf-8") as file:
|
|
219
|
+
# for l in file.readlines():
|
|
220
|
+
# codes.append(l.strip())
|
|
221
|
+
# print(l.strip())
|
|
222
|
+
# print(codes)
|
|
223
|
+
#
|
|
224
|
+
|
|
225
|
+
|