@darabonba/python-generator 2.0.4 → 2.0.6

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 (111) hide show
  1. package/ChangeLog.md +8 -1
  2. package/lib/generator.js +120 -80
  3. package/package.json +1 -1
  4. package/tests/expected/annotation/tea_python_tests/models/_test.py +5 -4
  5. package/tests/expected/comment/tea_python_tests/models/_test_1.py +15 -4
  6. package/tests/expected/comment/tea_python_tests/models/_test_2.py +7 -4
  7. package/tests/expected/comment/tea_python_tests/models/_test_3.py +7 -4
  8. package/tests/expected/complex/tea_python_tests/exceptions/_err_1.py +1 -1
  9. package/tests/expected/complex/tea_python_tests/exceptions/_err_2.py +1 -1
  10. package/tests/expected/complex/tea_python_tests/models/_complex_request.py +85 -63
  11. package/tests/expected/complex/tea_python_tests/models/_complex_request_configs.py +9 -4
  12. package/tests/expected/complex/tea_python_tests/models/_complex_request_header.py +5 -4
  13. package/tests/expected/complex/tea_python_tests/models/_complex_request_part.py +5 -4
  14. package/tests/expected/complex/tea_python_tests/models/_response.py +5 -4
  15. package/tests/expected/model/tea_python_tests/exceptions/_main_file.py +1 -1
  16. package/tests/expected/model/tea_python_tests/models/_class.py +2 -3
  17. package/tests/expected/model/tea_python_tests/models/_m.py +3 -4
  18. package/tests/expected/model/tea_python_tests/models/_main_file_model.py +5 -4
  19. package/tests/expected/model/tea_python_tests/models/_main_file_model_model.py +5 -4
  20. package/tests/expected/model/tea_python_tests/models/_model.py +5 -4
  21. package/tests/expected/model/tea_python_tests/models/_msub_m.py +2 -3
  22. package/tests/expected/model/tea_python_tests/models/_my_model.py +216 -74
  23. package/tests/expected/model/tea_python_tests/models/_my_model_model.py +5 -4
  24. package/tests/expected/model/tea_python_tests/models/_my_model_model_model.py +5 -4
  25. package/tests/expected/model/tea_python_tests/models/_my_model_subarraymodel.py +2 -3
  26. package/tests/expected/model/tea_python_tests/models/_my_model_submodel.py +5 -4
  27. package/tests/expected/model/tea_python_tests/models/_my_model_submodel_model.py +5 -4
  28. package/tests/expected/modelConfig/tea_python_tests/__init__.py +1 -0
  29. package/tests/expected/modelConfig/tea_python_tests/client.py +10 -0
  30. package/tests/expected/modelConfig/tea_python_tests/exceptions/__init__.py +11 -0
  31. package/tests/expected/modelConfig/tea_python_tests/exceptions/_main_file.py +28 -0
  32. package/tests/expected/modelConfig/tea_python_tests/models/__init__.py +33 -0
  33. package/tests/expected/modelConfig/tea_python_tests/models/_class.py +23 -0
  34. package/tests/expected/modelConfig/tea_python_tests/models/_m.py +37 -0
  35. package/tests/expected/modelConfig/tea_python_tests/models/_main_file_model.py +46 -0
  36. package/tests/expected/modelConfig/tea_python_tests/models/_main_file_model_model.py +33 -0
  37. package/tests/expected/modelConfig/tea_python_tests/models/_model.py +33 -0
  38. package/tests/expected/modelConfig/tea_python_tests/models/_msub_m.py +25 -0
  39. package/tests/expected/modelConfig/tea_python_tests/models/_my_model.py +600 -0
  40. package/tests/expected/modelConfig/tea_python_tests/models/_my_model_model.py +46 -0
  41. package/tests/expected/modelConfig/tea_python_tests/models/_my_model_model_model.py +33 -0
  42. package/tests/expected/modelConfig/tea_python_tests/models/_my_model_subarraymodel.py +23 -0
  43. package/tests/expected/modelConfig/tea_python_tests/models/_my_model_submodel.py +46 -0
  44. package/tests/expected/modelConfig/tea_python_tests/models/_my_model_submodel_model.py +33 -0
  45. package/tests/expected/multi/tea_python_tests/api_models/_test_model_dir_2.py +5 -4
  46. package/tests/expected/multi/tea_python_tests/exceptions/_err.py +2 -2
  47. package/tests/expected/multi/tea_python_tests/model/user_exceptions/_err.py +1 -1
  48. package/tests/expected/multi/tea_python_tests/model/user_exceptions/_err_1.py +1 -1
  49. package/tests/expected/multi/tea_python_tests/model/user_exceptions/_err_2.py +1 -1
  50. package/tests/expected/multi/tea_python_tests/model/user_models/_base_info.py +5 -4
  51. package/tests/expected/multi/tea_python_tests/model/user_models/_info.py +7 -4
  52. package/tests/expected/multi/tea_python_tests/models/_test_model_dir.py +12 -8
  53. package/tests/expected/typedef/tea_python_tests/models/_m.py +7 -4
  54. package/tests/fixtures/model/main.dara +4 -0
  55. package/tests/fixtures/modelConfig/.libraries.json +3 -0
  56. package/tests/fixtures/modelConfig/Darafile +13 -0
  57. package/tests/fixtures/modelConfig/libraries/Darafile +20 -0
  58. package/tests/fixtures/modelConfig/libraries/import.dara +27 -0
  59. package/tests/fixtures/modelConfig/main.dara +81 -0
  60. package/tests/main.tests.js +18 -0
  61. package/tests/output/annotation/tea_python_tests/models/_test.py +5 -4
  62. package/tests/output/comment/tea_python_tests/models/_test_1.py +15 -4
  63. package/tests/output/comment/tea_python_tests/models/_test_2.py +7 -4
  64. package/tests/output/comment/tea_python_tests/models/_test_3.py +7 -4
  65. package/tests/output/complex/tea_python_tests/exceptions/_err_1.py +1 -1
  66. package/tests/output/complex/tea_python_tests/exceptions/_err_2.py +1 -1
  67. package/tests/output/complex/tea_python_tests/models/_complex_request.py +85 -63
  68. package/tests/output/complex/tea_python_tests/models/_complex_request_configs.py +9 -4
  69. package/tests/output/complex/tea_python_tests/models/_complex_request_header.py +5 -4
  70. package/tests/output/complex/tea_python_tests/models/_complex_request_part.py +5 -4
  71. package/tests/output/complex/tea_python_tests/models/_response.py +5 -4
  72. package/tests/output/model/tea_python_tests/exceptions/_main_file.py +1 -1
  73. package/tests/output/model/tea_python_tests/models/_class.py +2 -3
  74. package/tests/output/model/tea_python_tests/models/_m.py +3 -4
  75. package/tests/output/model/tea_python_tests/models/_main_file_model.py +5 -4
  76. package/tests/output/model/tea_python_tests/models/_main_file_model_model.py +5 -4
  77. package/tests/output/model/tea_python_tests/models/_model.py +5 -4
  78. package/tests/output/model/tea_python_tests/models/_msub_m.py +2 -3
  79. package/tests/output/model/tea_python_tests/models/_my_model.py +216 -74
  80. package/tests/output/model/tea_python_tests/models/_my_model_model.py +5 -4
  81. package/tests/output/model/tea_python_tests/models/_my_model_model_model.py +5 -4
  82. package/tests/output/model/tea_python_tests/models/_my_model_subarraymodel.py +2 -3
  83. package/tests/output/model/tea_python_tests/models/_my_model_submodel.py +5 -4
  84. package/tests/output/model/tea_python_tests/models/_my_model_submodel_model.py +5 -4
  85. package/tests/output/modelConfig/setup.py +77 -0
  86. package/tests/output/modelConfig/tea_python_tests/__init__.py +1 -0
  87. package/tests/output/modelConfig/tea_python_tests/client.py +10 -0
  88. package/tests/output/modelConfig/tea_python_tests/exceptions/__init__.py +11 -0
  89. package/tests/output/modelConfig/tea_python_tests/exceptions/_main_file.py +28 -0
  90. package/tests/output/modelConfig/tea_python_tests/models/__init__.py +33 -0
  91. package/tests/output/modelConfig/tea_python_tests/models/_class.py +23 -0
  92. package/tests/output/modelConfig/tea_python_tests/models/_m.py +37 -0
  93. package/tests/output/modelConfig/tea_python_tests/models/_main_file_model.py +46 -0
  94. package/tests/output/modelConfig/tea_python_tests/models/_main_file_model_model.py +33 -0
  95. package/tests/output/modelConfig/tea_python_tests/models/_model.py +33 -0
  96. package/tests/output/modelConfig/tea_python_tests/models/_msub_m.py +25 -0
  97. package/tests/output/modelConfig/tea_python_tests/models/_my_model.py +600 -0
  98. package/tests/output/modelConfig/tea_python_tests/models/_my_model_model.py +46 -0
  99. package/tests/output/modelConfig/tea_python_tests/models/_my_model_model_model.py +33 -0
  100. package/tests/output/modelConfig/tea_python_tests/models/_my_model_subarraymodel.py +23 -0
  101. package/tests/output/modelConfig/tea_python_tests/models/_my_model_submodel.py +46 -0
  102. package/tests/output/modelConfig/tea_python_tests/models/_my_model_submodel_model.py +33 -0
  103. package/tests/output/multi/tea_python_tests/api_models/_test_model_dir_2.py +5 -4
  104. package/tests/output/multi/tea_python_tests/exceptions/_err.py +2 -2
  105. package/tests/output/multi/tea_python_tests/model/user_exceptions/_err.py +1 -1
  106. package/tests/output/multi/tea_python_tests/model/user_exceptions/_err_1.py +1 -1
  107. package/tests/output/multi/tea_python_tests/model/user_exceptions/_err_2.py +1 -1
  108. package/tests/output/multi/tea_python_tests/model/user_models/_base_info.py +5 -4
  109. package/tests/output/multi/tea_python_tests/model/user_models/_info.py +7 -4
  110. package/tests/output/multi/tea_python_tests/models/_test_model_dir.py +12 -8
  111. package/tests/output/typedef/tea_python_tests/models/_m.py +7 -4
package/ChangeLog.md CHANGED
@@ -1,6 +1,13 @@
1
1
  # ChangeLog
2
2
 
3
- # 2.0.3
3
+ # 2.0.6
4
+ - Fixed the from map init submodel name.
5
+
6
+ # 2.0.5
7
+ - Add the model generate config.
8
+ - Fixed the model validate function error.
9
+
10
+ # 2.0.4
4
11
  - Fixed the writable & readable assert logic.
5
12
 
6
13
  # 2.0.3
package/lib/generator.js CHANGED
@@ -921,7 +921,7 @@ setup(
921
921
 
922
922
  visitFieldType(value, level, modelName, fieldName) {
923
923
  if (value.type === 'modelBody') {
924
- const subModelName = _subModelName([modelName, fieldName].join('.'))
924
+ const subModelName = _subModelName([modelName, fieldName].join('.'));
925
925
  this.emit(this.getModelName(subModelName));
926
926
  } else if (value.type === 'array') {
927
927
  this.visitType(value);
@@ -1062,6 +1062,30 @@ setup(
1062
1062
 
1063
1063
  }
1064
1064
 
1065
+ visitFieldValidate(fieldValue, fieldName, value, level) {
1066
+ const deep = Math.floor(level / 4);
1067
+ if (fieldValue.type === 'modelBody' || fieldValue.type === 'moduleModel' ||
1068
+ fieldValue.type === 'subModel' || fieldValue.idType === 'model' ||
1069
+ (fieldValue.fieldType && (fieldValue.fieldType.type === 'moduleModel' ||
1070
+ fieldValue.fieldType.idType === 'model' || fieldValue.fieldType.idType === 'builtin_model'))) {
1071
+ if(deep > 1) {
1072
+ this.emit(` if ${value}:\n`, level);
1073
+ }
1074
+ this.emit(`${value}.validate()\n`, level + 2);
1075
+ } else if (fieldValue.type === 'array' || fieldValue.fieldType === 'array') {
1076
+ this.emit(`for v${deep} in ${value}:\n`, level);
1077
+ this.visitFieldValidate(fieldValue.fieldItemType || fieldValue.subType, fieldName, `v${deep}`, level + 2);
1078
+ } else if (fieldValue.fieldType === 'map' || fieldValue.type === 'map') {
1079
+ this.emit(`for v${deep} in self.${fieldName}.values():\n`, level);
1080
+ this.visitFieldValidate(fieldValue.valueType, fieldName, `v${deep}`, level + 2);
1081
+ } else {
1082
+ if(deep > 1) {
1083
+ this.emit(` if ${value}:\n`, level);
1084
+ }
1085
+ this.emit(`${value}.validate()\n`, level + 2);
1086
+ }
1087
+ }
1088
+
1065
1089
  visitModelValidate(ast, level) {
1066
1090
  let notPass = false;
1067
1091
  for (let i = 0; i < ast.nodes.length; i++) {
@@ -1080,47 +1104,16 @@ setup(
1080
1104
  this.emit(`self.validate_required(self.${param}, '${param}')\n`, level + 2);
1081
1105
  }
1082
1106
  // 这里判断类中属性的结构
1083
- if(node.fieldValue.fieldType === 'array' && node.fieldValue.fieldItemType.type !== 'map' && node.fieldValue.fieldItemType.lexeme !== 'string') {
1084
- // 最底下是string的就不需要validate
1085
- if(this.checkFieldItemTypeAllString(node.fieldValue)){
1086
- continue;
1087
- }
1088
- notPass = true;
1089
- this.emit(`if self.${param}:\n`, level + 2);
1090
- this.emit(`for k in self.${param}:\n`, level + 4);
1091
- let baseLevel = level + 6;
1092
- // 二层数组
1093
- if(node.fieldValue.fieldItemType && node.fieldValue.fieldItemType.fieldType === 'array' || node.fieldValue.fieldItemType.fieldType === 'string') {
1094
- this.emit('for k1 in k:\n', baseLevel);
1095
- this.emit('if k1:\n', baseLevel += 2);
1096
- this.emit('k1.validate()\n', baseLevel += 2);
1097
- } else {
1098
- this.emit('if k:\n', baseLevel);
1099
- this.emit('k.validate()\n', baseLevel + 2);
1100
- }
1101
- } else if(node.fieldValue.fieldType === 'map' && node.fieldValue.valueType.lexeme !== 'string') {
1102
- // TODO: 这里为array的时候不做validate
1103
- // $dara.Model.validateMap
1104
- if(this.checkFieldItemTypeAllString(node.fieldValue)){
1107
+ if(node.fieldValue.fieldType === 'array' || node.fieldValue.fieldType === 'map' ||
1108
+ node.fieldValue.type === 'array' || node.fieldValue.type === 'map'
1109
+ ) {
1110
+ // 下面不包含model的就不需要validate
1111
+ if(!this.checkFieldHasModel(node.fieldValue)){
1105
1112
  continue;
1106
1113
  }
1107
1114
  notPass = true;
1108
1115
  this.emit(`if self.${param}:\n`, level + 2);
1109
- this.emit(`for v in self.${param}.values():\n`, level + 4);
1110
- let baseLevel = level + 6;
1111
- // 二层map 或 array 特殊操作
1112
- if(node.fieldValue.fieldItemType && node.fieldValue.fieldItemType.fieldType === 'array') {
1113
- this.emit('for v1 in k:\n', baseLevel);
1114
- this.emit('if v1:\n', baseLevel += 2);
1115
- this.emit('v1.validate()\n', baseLevel += 2);
1116
- } else if(node.fieldValue.valueType.type === 'array'){
1117
- this.emit('for k1 in v:\n', baseLevel);
1118
- this.emit('if k1:\n', baseLevel += 2);
1119
- this.emit('k1.validate()\n', baseLevel += 2);
1120
- } else {
1121
- this.emit('if v:\n', baseLevel);
1122
- this.emit('v.validate()\n', baseLevel + 2);
1123
- }
1116
+ this.visitFieldValidate(node.fieldValue, param, `self.${param}`, level + 4);
1124
1117
  } else if(node.fieldValue.fieldType && node.fieldValue.fieldType.idType === 'model' || node.fieldValue.type === 'modelBody'){
1125
1118
  notPass = true;
1126
1119
  this.emit(`if self.${param}:\n`, level + 2);
@@ -1154,7 +1147,7 @@ setup(
1154
1147
  }
1155
1148
 
1156
1149
  visitToMapField(fieldValue, fieldName, key, value, level, arr = false) {
1157
- const deep = Math.floor(level / 4);
1150
+ const deep = Math.floor((level - 4) / 2);
1158
1151
  if (fieldValue.type === 'modelBody' || fieldValue.type === 'moduleModel' ||
1159
1152
  fieldValue.type === 'subModel' || fieldValue.idType === 'model' ||
1160
1153
  (fieldValue.fieldType && (fieldValue.fieldType.type === 'moduleModel' ||
@@ -1165,13 +1158,27 @@ setup(
1165
1158
  }
1166
1159
  this.emitFieldConvert(key, realVal, level, arr);
1167
1160
  } else if (fieldValue.type === 'array' || fieldValue.fieldType === 'array') {
1168
- this.emit(`${key} = []\n`, level);
1161
+ let subKey = key;
1162
+ if(deep > 1) {
1163
+ subKey = `l${deep - 1}`;
1164
+ this.emit(`${subKey} = []\n`, level);
1165
+ }
1169
1166
  this.emit(`for k${deep} in ${value}:\n`, level);
1170
- this.visitToMapField(fieldValue.fieldItemType || fieldValue.subType, fieldName, `${key}`, `k${deep}`, level + 2, true);
1167
+ this.visitToMapField(fieldValue.fieldItemType || fieldValue.subType, fieldName, `${subKey}`, `k${deep}`, level + 2, true);
1168
+ if(deep > 1) {
1169
+ this.emitFieldConvert(key, subKey, level, arr);
1170
+ }
1171
1171
  } else if (fieldValue.fieldType === 'map' || fieldValue.type === 'map') {
1172
- this.emit(`${key} = {}\n`, level);
1172
+ let subKey = key;
1173
+ if(deep > 1) {
1174
+ subKey = `d${deep - 1}`;
1175
+ this.emit(`${subKey} = {}\n`, level);
1176
+ }
1173
1177
  this.emit(`for k${deep}, v${deep} in self.${fieldName}.items():\n`, level);
1174
- this.visitToMapField(fieldValue.valueType, fieldName, `${key}[k${deep}]`, `v${deep}`, level + 2);
1178
+ this.visitToMapField(fieldValue.valueType, fieldName, `${subKey}[k${deep}]`, `v${deep}`, level + 2);
1179
+ if(deep > 1) {
1180
+ this.emitFieldConvert(key, subKey, level, arr);
1181
+ }
1175
1182
  } else {
1176
1183
  this.emitFieldConvert(key, value, level, arr);
1177
1184
  }
@@ -1180,22 +1187,39 @@ setup(
1180
1187
 
1181
1188
  visitToMap(ast, level) {
1182
1189
  this.emit('def to_map(self):\n', level);
1183
- this.emit(` _map = super().to_map()
1184
- if _map is not None:
1185
- return _map
1186
-
1187
- result = dict()\n`);
1190
+ this.emit('result = dict()\n' , level + 2);
1191
+ this.emit('_map = super().to_map()\n' , level + 2);
1192
+ this.emit('if _map is not None:\n' , level + 2);
1193
+ this.emit('result = _map\n', level + 4);
1188
1194
  for (let i = 0; i < ast.nodes.length; i++) {
1189
1195
  const node = ast.nodes[i];
1190
1196
  let realName = this.getRealName(node);
1191
1197
  let comments = DSL.comment.getFrontComments(this.comments, node.tokenRange[0]);
1192
1198
  this.visitComments(comments, level);
1193
1199
  let param = _avoidKeywords(_snakeCase(_escape(_name(node.fieldName))));
1200
+ const hasModel = this.checkFieldHasModel(node.fieldValue);
1201
+ let arr = false;
1202
+ if(hasModel && !this.config.noneEmpty) {
1203
+ if (node.fieldValue.type === 'array' || node.fieldValue.fieldType === 'array') {
1204
+ this.emit(`result['${realName}'] = []\n`, level + 2);
1205
+ arr = true;
1206
+ } else if (node.fieldValue.fieldType === 'map' || node.fieldValue.type === 'map') {
1207
+ this.emit(`result['${realName}'] = {}\n`, level + 2);
1208
+ }
1209
+ }
1194
1210
  this.emit(`if self.${param} is not None:\n`, level + 2);
1195
- if(!this.checkFieldHasModel(node.fieldValue)) {
1196
- this.emit(`result['${realName}'] = self.${param}`, level + 4);
1211
+ if(!hasModel) {
1212
+ this.emit(`result['${realName}'] = self.${param}\n`, level + 4);
1197
1213
  } else {
1198
- this.visitToMapField(node.fieldValue, param, `result['${realName}']`, `self.${param}`, level + 4);
1214
+ if(this.config.noneEmpty) {
1215
+ if (node.fieldValue.type === 'array' || node.fieldValue.fieldType === 'array') {
1216
+ this.emit(`result['${realName}'] = []\n`, level + 4);
1217
+ arr = true;
1218
+ } else if (node.fieldValue.fieldType === 'map' || node.fieldValue.type === 'map') {
1219
+ this.emit(`result['${realName}'] = {}\n`, level + 4);
1220
+ }
1221
+ }
1222
+ this.visitToMapField(node.fieldValue, param, `result['${realName}']`, `self.${param}`, level + 4, arr);
1199
1223
  }
1200
1224
  this.emit('\n');
1201
1225
  }
@@ -1212,20 +1236,33 @@ setup(
1212
1236
  }
1213
1237
 
1214
1238
  visitFromField(fieldValue, fieldName, key, value, level, arr = false) {
1215
- const deep = Math.floor(level / 4);
1239
+ const deep = Math.floor((level - 4) / 2);
1216
1240
  if (fieldValue.type === 'modelBody') {
1217
- const subModelName = _subModelName(_camelCase(fieldName));
1241
+ const subModelName = _subModelName(fieldName);
1218
1242
  this.emit(`temp_model = ${this.getModelName(subModelName)}()\n`, level);
1219
1243
  this.emitFieldConvert(key, `temp_model.from_map(${value})`, level, arr);
1220
1244
  } else if (fieldValue.type === 'array' || fieldValue.fieldType === 'array') {
1221
- this.emit(`l${deep} = 0\n`, level);
1222
- this.emit(`${key} = []\n`, level);
1223
1245
  this.emit(`for k${deep} in ${value}:\n`, level);
1224
- this.visitFromField(fieldValue.fieldItemType || fieldValue.subType, fieldName, `${key}`, `k${deep}`, level + 2, true);
1246
+ let subKey = key;
1247
+ if(deep > 1) {
1248
+ subKey = `l${deep - 1}`;
1249
+ this.emit(`${subKey} = []\n`, level + 2);
1250
+ }
1251
+ this.visitFromField(fieldValue.fieldItemType || fieldValue.subType, fieldName, `${subKey}`, `k${deep}`, level + 2, true);
1252
+ if(deep > 1) {
1253
+ this.emitFieldConvert(key, subKey, level, arr);
1254
+ }
1225
1255
  } else if (fieldValue.fieldType === 'map' || fieldValue.type === 'map') {
1226
- this.emit(`${key} = {}\n`, level);
1227
1256
  this.emit(`for k${deep}, v${deep} in ${value}.items():\n`, level);
1228
- this.visitFromField(fieldValue.valueType, fieldName, `${key}[k${deep}]`, `v${deep}`, level + 2);
1257
+ let subKey = key;
1258
+ if(deep > 1) {
1259
+ subKey = `d${deep - 1}`;
1260
+ this.emit(`${subKey} = {}\n`, level + 2);
1261
+ }
1262
+ this.visitFromField(fieldValue.valueType, fieldName, `${subKey}[k${deep}]`, `v${deep}`, level + 2);
1263
+ if(deep > 1) {
1264
+ this.emitFieldConvert(key, subKey, level, arr);
1265
+ }
1229
1266
  } else if (fieldValue.type === 'moduleModel' ||
1230
1267
  (fieldValue.fieldType && fieldValue.fieldType.type === 'moduleModel')) {
1231
1268
  const [moduleId, ...rest] = fieldValue.path || fieldValue.fieldType.path;
@@ -1257,6 +1294,7 @@ setup(
1257
1294
  } else {
1258
1295
  this.emitFieldConvert(key, value, level, arr);
1259
1296
  }
1297
+
1260
1298
  }
1261
1299
 
1262
1300
  visitFromMap(ast, modelName, level) {
@@ -1269,11 +1307,31 @@ setup(
1269
1307
  let comments = DSL.comment.getFrontComments(this.comments, node.tokenRange[0]);
1270
1308
  this.visitComments(comments, level);
1271
1309
  let param = _avoidKeywords(_snakeCase(_escape(_name(node.fieldName))));
1310
+ const hasModel = this.checkFieldHasModel(node.fieldValue);
1311
+ let arr = false;
1312
+ if(hasModel && !this.config.noneEmpty) {
1313
+ if (node.fieldValue.type === 'array' || node.fieldValue.fieldType === 'array') {
1314
+ this.emit(`self.${param} = []\n`, level + 2);
1315
+ arr = true;
1316
+ } else if (node.fieldValue.fieldType === 'map' || node.fieldValue.type === 'map') {
1317
+ this.emit(`self.${param} = {}\n`, level + 2);
1318
+ arr = false;
1319
+ }
1320
+ }
1272
1321
  this.emit(`if m.get('${realName}') is not None:\n`, level + 2);
1273
- if(!this.checkFieldHasModel(node.fieldValue)) {
1274
- this.emit(`self.${param} = m.get('${realName}')`, level + 4);
1322
+ if(!hasModel) {
1323
+ this.emit(`self.${param} = m.get('${realName}')\n`, level + 4);
1275
1324
  } else {
1276
- this.visitFromField(node.fieldValue, [modelName, param].join('.'), `self.${param}`, `m.get('${realName}')`, level + 4);
1325
+ if(this.config.noneEmpty) {
1326
+ if (node.fieldValue.type === 'array' || node.fieldValue.fieldType === 'array') {
1327
+ this.emit(`self.${param} = []\n`, level + 4);
1328
+ arr = true;
1329
+ } else if (node.fieldValue.fieldType === 'map' || node.fieldValue.type === 'map') {
1330
+ this.emit(`self.${param} = {}\n`, level + 4);
1331
+ arr = false;
1332
+ }
1333
+ }
1334
+ this.visitFromField(node.fieldValue, [modelName, _name(node.fieldName)].join('.'), `self.${param}`, `m.get('${realName}')`, level + 4, arr);
1277
1335
  }
1278
1336
  this.emit('\n');
1279
1337
  }
@@ -1291,24 +1349,6 @@ setup(
1291
1349
  return attr.attrValue.string || attr.attrValue.lexeme || attr.attrValue.value;
1292
1350
  }
1293
1351
 
1294
- visitFieldValidate(value, level, name) {
1295
- if (value.type === 'array' || value.fieldType === 'array') {
1296
- this.emit(`if(Array.isArray(${name})) {\n`, level);
1297
- this.emit(`$dara.Model.validateArray(${name})\n`, level + 1);
1298
- this.emit('}\n', level);
1299
- } else if (value.fieldType === 'map' || value.type === 'map') {
1300
- this.emit(`if(${name}) {\n`, level);
1301
- this.emit(`$dara.Model.validateMap(${name})\n`, level + 1);
1302
- this.emit('}\n', level);
1303
- } else if (value.type === 'moduleModel' || value.type === 'modelBody'
1304
- || value.type === 'subModel' || value.fieldType.type === 'moduleModel'
1305
- || value.fieldType.idType === 'model' || value.fieldType.idType === 'module') {
1306
- this.emit(`if(${name} && typeof (${name} as any).validate === 'function') {\n`, level);
1307
- this.emit(`(${name} as any).validate()\n`, level + 1);
1308
- this.emit('}\n', level);
1309
- }
1310
- }
1311
-
1312
1352
  extendBaseErr(extendOn){
1313
1353
  if (!extendOn) {
1314
1354
  return true;
@@ -1474,7 +1514,7 @@ setup(
1474
1514
  return;
1475
1515
  }
1476
1516
  this.emit('\n');
1477
- this.emit('self, *,\n', level + 2);
1517
+ this.emit(`self,${ this.config.strictModel ? ' *,' : '' }\n`, level + 2);
1478
1518
  for (let i = 0; i < paramNodes.length; i++) {
1479
1519
  node = paramNodes[i];
1480
1520
  if(!node.extend) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@darabonba/python-generator",
3
- "version": "2.0.4",
3
+ "version": "2.0.6",
4
4
  "description": "The darabonba generator for Python",
5
5
  "main": "lib/generator.js",
6
6
  "directories": {
@@ -10,7 +10,7 @@ from darabonba.model import DaraModel
10
10
  """
11
11
  class Test(DaraModel):
12
12
  def __init__(
13
- self, *,
13
+ self,
14
14
  test: str = None,
15
15
  ):
16
16
  # Alichange app id
@@ -20,18 +20,19 @@ class Test(DaraModel):
20
20
  self.validate_required(self.test, 'test')
21
21
 
22
22
  def to_map(self):
23
+ result = dict()
23
24
  _map = super().to_map()
24
25
  if _map is not None:
25
- return _map
26
-
27
- result = dict()
26
+ result = _map
28
27
  if self.test is not None:
29
28
  result['test'] = self.test
29
+
30
30
  return result
31
31
 
32
32
  def from_map(self, m: dict = None):
33
33
  m = m or dict()
34
34
  if m.get('test') is not None:
35
35
  self.test = m.get('test')
36
+
36
37
  return self
37
38
 
@@ -14,7 +14,7 @@ from typing import List
14
14
  """
15
15
  class Test1(DaraModel):
16
16
  def __init__(
17
- self, *,
17
+ self,
18
18
  test: str = None,
19
19
  # odel的test back comment
20
20
  test_2: str = None,
@@ -50,42 +50,53 @@ class Test1(DaraModel):
50
50
  self.validate_required(self.a_sts, 'a_sts')
51
51
 
52
52
  def to_map(self):
53
+ result = dict()
53
54
  _map = super().to_map()
54
55
  if _map is not None:
55
- return _map
56
-
57
- result = dict()
56
+ result = _map
58
57
  if self.test is not None:
59
58
  result['test'] = self.test
59
+
60
60
  # odel的test back comment
61
61
  if self.test_2 is not None:
62
62
  result['test2'] = self.test_2
63
+
63
64
  # odel的test2 back comment
64
65
  if self.test_3 is not None:
65
66
  result['test3'] = self.test_3
67
+
66
68
  if self.test_5 is not None:
67
69
  result['test5'] = self.test_5
70
+
68
71
  if self.sts is not None:
69
72
  result['sts'] = self.sts
73
+
70
74
  if self.a_sts is not None:
71
75
  result['asts'] = self.a_sts
76
+
72
77
  return result
73
78
 
74
79
  def from_map(self, m: dict = None):
75
80
  m = m or dict()
76
81
  if m.get('test') is not None:
77
82
  self.test = m.get('test')
83
+
78
84
  # odel的test back comment
79
85
  if m.get('test2') is not None:
80
86
  self.test_2 = m.get('test2')
87
+
81
88
  # odel的test2 back comment
82
89
  if m.get('test3') is not None:
83
90
  self.test_3 = m.get('test3')
91
+
84
92
  if m.get('test5') is not None:
85
93
  self.test_5 = m.get('test5')
94
+
86
95
  if m.get('sts') is not None:
87
96
  self.sts = m.get('sts')
97
+
88
98
  if m.get('asts') is not None:
89
99
  self.a_sts = m.get('asts')
100
+
90
101
  return self
91
102
 
@@ -10,7 +10,7 @@ from darabonba.model import DaraModel
10
10
  """
11
11
  class Test2(DaraModel):
12
12
  def __init__(
13
- self, *,
13
+ self,
14
14
  # model的test front comment
15
15
  test: str = None,
16
16
  # model的test front comment
@@ -30,17 +30,18 @@ class Test2(DaraModel):
30
30
  self.validate_required(self.test_2, 'test_2')
31
31
 
32
32
  def to_map(self):
33
+ result = dict()
33
34
  _map = super().to_map()
34
35
  if _map is not None:
35
- return _map
36
-
37
- result = dict()
36
+ result = _map
38
37
  # model的test front comment
39
38
  if self.test is not None:
40
39
  result['test'] = self.test
40
+
41
41
  # model的test front comment
42
42
  if self.test_2 is not None:
43
43
  result['test2'] = self.test_2
44
+
44
45
  return result
45
46
 
46
47
  def from_map(self, m: dict = None):
@@ -48,8 +49,10 @@ class Test2(DaraModel):
48
49
  # model的test front comment
49
50
  if m.get('test') is not None:
50
51
  self.test = m.get('test')
52
+
51
53
  # model的test front comment
52
54
  if m.get('test2') is not None:
53
55
  self.test_2 = m.get('test2')
56
+
54
57
  return self
55
58
 
@@ -10,7 +10,7 @@ from darabonba.model import DaraModel
10
10
  """
11
11
  class Test3(DaraModel):
12
12
  def __init__(
13
- self, *,
13
+ self,
14
14
  # model的test front comment
15
15
  test: str = None,
16
16
  # empty comment1
@@ -33,18 +33,19 @@ class Test3(DaraModel):
33
33
  self.validate_required(self.test_1, 'test_1')
34
34
 
35
35
  def to_map(self):
36
+ result = dict()
36
37
  _map = super().to_map()
37
38
  if _map is not None:
38
- return _map
39
-
40
- result = dict()
39
+ result = _map
41
40
  # model的test front comment
42
41
  if self.test is not None:
43
42
  result['test'] = self.test
43
+
44
44
  # empty comment1
45
45
  # empy comment2
46
46
  if self.test_1 is not None:
47
47
  result['test1'] = self.test_1
48
+
48
49
  return result
49
50
 
50
51
  def from_map(self, m: dict = None):
@@ -52,10 +53,12 @@ class Test3(DaraModel):
52
53
  # model的test front comment
53
54
  if m.get('test') is not None:
54
55
  self.test = m.get('test')
56
+
55
57
  # empty comment1
56
58
  # empy comment2
57
59
  if m.get('test1') is not None:
58
60
  self.test_1 = m.get('test1')
61
+
59
62
  return self
60
63
 
61
64
  # odel的test back comment
@@ -7,7 +7,7 @@ from typing import Dict
7
7
 
8
8
  class Err1Exception(DaraException):
9
9
  def __init__(
10
- self, *,
10
+ self,
11
11
  message: str = None,
12
12
  code: str = None,
13
13
  stack: str = None,
@@ -6,7 +6,7 @@ from darabonba.exceptions import DaraException
6
6
 
7
7
  class Err2Exception(DaraException):
8
8
  def __init__(
9
- self, *,
9
+ self,
10
10
  message: str = None,
11
11
  code: str = None,
12
12
  stack: str = None,