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,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
+