@darabonba/python-generator 2.0.3 → 2.0.5

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 (114) hide show
  1. package/ChangeLog.md +7 -0
  2. package/lib/builtin.js +6 -12
  3. package/lib/generator.js +118 -78
  4. package/package.json +1 -1
  5. package/tests/expected/annotation/tea_python_tests/models/_test.py +5 -4
  6. package/tests/expected/builtin/tea_python_tests/client.py +5 -5
  7. package/tests/expected/comment/tea_python_tests/models/_test_1.py +15 -4
  8. package/tests/expected/comment/tea_python_tests/models/_test_2.py +7 -4
  9. package/tests/expected/comment/tea_python_tests/models/_test_3.py +7 -4
  10. package/tests/expected/complex/tea_python_tests/exceptions/_err_1.py +1 -1
  11. package/tests/expected/complex/tea_python_tests/exceptions/_err_2.py +1 -1
  12. package/tests/expected/complex/tea_python_tests/models/_complex_request.py +85 -63
  13. package/tests/expected/complex/tea_python_tests/models/_complex_request_configs.py +9 -4
  14. package/tests/expected/complex/tea_python_tests/models/_complex_request_header.py +5 -4
  15. package/tests/expected/complex/tea_python_tests/models/_complex_request_part.py +5 -4
  16. package/tests/expected/complex/tea_python_tests/models/_response.py +5 -4
  17. package/tests/expected/model/tea_python_tests/exceptions/_main_file.py +1 -1
  18. package/tests/expected/model/tea_python_tests/models/_class.py +2 -3
  19. package/tests/expected/model/tea_python_tests/models/_m.py +3 -4
  20. package/tests/expected/model/tea_python_tests/models/_main_file_model.py +5 -4
  21. package/tests/expected/model/tea_python_tests/models/_main_file_model_model.py +5 -4
  22. package/tests/expected/model/tea_python_tests/models/_model.py +5 -4
  23. package/tests/expected/model/tea_python_tests/models/_msub_m.py +2 -3
  24. package/tests/expected/model/tea_python_tests/models/_my_model.py +216 -74
  25. package/tests/expected/model/tea_python_tests/models/_my_model_model.py +5 -4
  26. package/tests/expected/model/tea_python_tests/models/_my_model_model_model.py +5 -4
  27. package/tests/expected/model/tea_python_tests/models/_my_model_subarraymodel.py +2 -3
  28. package/tests/expected/model/tea_python_tests/models/_my_model_submodel.py +5 -4
  29. package/tests/expected/model/tea_python_tests/models/_my_model_submodel_model.py +5 -4
  30. package/tests/expected/modelConfig/tea_python_tests/__init__.py +1 -0
  31. package/tests/expected/modelConfig/tea_python_tests/client.py +10 -0
  32. package/tests/expected/modelConfig/tea_python_tests/exceptions/__init__.py +11 -0
  33. package/tests/expected/modelConfig/tea_python_tests/exceptions/_main_file.py +28 -0
  34. package/tests/expected/modelConfig/tea_python_tests/models/__init__.py +33 -0
  35. package/tests/expected/modelConfig/tea_python_tests/models/_class.py +23 -0
  36. package/tests/expected/modelConfig/tea_python_tests/models/_m.py +37 -0
  37. package/tests/expected/modelConfig/tea_python_tests/models/_main_file_model.py +46 -0
  38. package/tests/expected/modelConfig/tea_python_tests/models/_main_file_model_model.py +33 -0
  39. package/tests/expected/modelConfig/tea_python_tests/models/_model.py +33 -0
  40. package/tests/expected/modelConfig/tea_python_tests/models/_msub_m.py +25 -0
  41. package/tests/expected/modelConfig/tea_python_tests/models/_my_model.py +600 -0
  42. package/tests/expected/modelConfig/tea_python_tests/models/_my_model_model.py +46 -0
  43. package/tests/expected/modelConfig/tea_python_tests/models/_my_model_model_model.py +33 -0
  44. package/tests/expected/modelConfig/tea_python_tests/models/_my_model_subarraymodel.py +23 -0
  45. package/tests/expected/modelConfig/tea_python_tests/models/_my_model_submodel.py +46 -0
  46. package/tests/expected/modelConfig/tea_python_tests/models/_my_model_submodel_model.py +33 -0
  47. package/tests/expected/multi/tea_python_tests/api_models/_test_model_dir_2.py +5 -4
  48. package/tests/expected/multi/tea_python_tests/exceptions/_err.py +2 -2
  49. package/tests/expected/multi/tea_python_tests/model/user_exceptions/_err.py +1 -1
  50. package/tests/expected/multi/tea_python_tests/model/user_exceptions/_err_1.py +1 -1
  51. package/tests/expected/multi/tea_python_tests/model/user_exceptions/_err_2.py +1 -1
  52. package/tests/expected/multi/tea_python_tests/model/user_models/_base_info.py +5 -4
  53. package/tests/expected/multi/tea_python_tests/model/user_models/_info.py +7 -4
  54. package/tests/expected/multi/tea_python_tests/models/_test_model_dir.py +12 -8
  55. package/tests/expected/typedef/tea_python_tests/models/_m.py +7 -4
  56. package/tests/fixtures/model/main.dara +4 -0
  57. package/tests/fixtures/modelConfig/.libraries.json +3 -0
  58. package/tests/fixtures/modelConfig/Darafile +13 -0
  59. package/tests/fixtures/modelConfig/libraries/Darafile +20 -0
  60. package/tests/fixtures/modelConfig/libraries/import.dara +27 -0
  61. package/tests/fixtures/modelConfig/main.dara +81 -0
  62. package/tests/main.tests.js +18 -0
  63. package/tests/output/annotation/tea_python_tests/models/_test.py +5 -4
  64. package/tests/output/builtin/tea_python_tests/client.py +5 -5
  65. package/tests/output/comment/tea_python_tests/models/_test_1.py +15 -4
  66. package/tests/output/comment/tea_python_tests/models/_test_2.py +7 -4
  67. package/tests/output/comment/tea_python_tests/models/_test_3.py +7 -4
  68. package/tests/output/complex/tea_python_tests/exceptions/_err_1.py +1 -1
  69. package/tests/output/complex/tea_python_tests/exceptions/_err_2.py +1 -1
  70. package/tests/output/complex/tea_python_tests/models/_complex_request.py +85 -63
  71. package/tests/output/complex/tea_python_tests/models/_complex_request_configs.py +9 -4
  72. package/tests/output/complex/tea_python_tests/models/_complex_request_header.py +5 -4
  73. package/tests/output/complex/tea_python_tests/models/_complex_request_part.py +5 -4
  74. package/tests/output/complex/tea_python_tests/models/_response.py +5 -4
  75. package/tests/output/model/tea_python_tests/exceptions/_main_file.py +1 -1
  76. package/tests/output/model/tea_python_tests/models/_class.py +2 -3
  77. package/tests/output/model/tea_python_tests/models/_m.py +3 -4
  78. package/tests/output/model/tea_python_tests/models/_main_file_model.py +5 -4
  79. package/tests/output/model/tea_python_tests/models/_main_file_model_model.py +5 -4
  80. package/tests/output/model/tea_python_tests/models/_model.py +5 -4
  81. package/tests/output/model/tea_python_tests/models/_msub_m.py +2 -3
  82. package/tests/output/model/tea_python_tests/models/_my_model.py +216 -74
  83. package/tests/output/model/tea_python_tests/models/_my_model_model.py +5 -4
  84. package/tests/output/model/tea_python_tests/models/_my_model_model_model.py +5 -4
  85. package/tests/output/model/tea_python_tests/models/_my_model_subarraymodel.py +2 -3
  86. package/tests/output/model/tea_python_tests/models/_my_model_submodel.py +5 -4
  87. package/tests/output/model/tea_python_tests/models/_my_model_submodel_model.py +5 -4
  88. package/tests/output/modelConfig/setup.py +77 -0
  89. package/tests/output/modelConfig/tea_python_tests/__init__.py +1 -0
  90. package/tests/output/modelConfig/tea_python_tests/client.py +10 -0
  91. package/tests/output/modelConfig/tea_python_tests/exceptions/__init__.py +11 -0
  92. package/tests/output/modelConfig/tea_python_tests/exceptions/_main_file.py +28 -0
  93. package/tests/output/modelConfig/tea_python_tests/models/__init__.py +33 -0
  94. package/tests/output/modelConfig/tea_python_tests/models/_class.py +23 -0
  95. package/tests/output/modelConfig/tea_python_tests/models/_m.py +37 -0
  96. package/tests/output/modelConfig/tea_python_tests/models/_main_file_model.py +46 -0
  97. package/tests/output/modelConfig/tea_python_tests/models/_main_file_model_model.py +33 -0
  98. package/tests/output/modelConfig/tea_python_tests/models/_model.py +33 -0
  99. package/tests/output/modelConfig/tea_python_tests/models/_msub_m.py +25 -0
  100. package/tests/output/modelConfig/tea_python_tests/models/_my_model.py +600 -0
  101. package/tests/output/modelConfig/tea_python_tests/models/_my_model_model.py +46 -0
  102. package/tests/output/modelConfig/tea_python_tests/models/_my_model_model_model.py +33 -0
  103. package/tests/output/modelConfig/tea_python_tests/models/_my_model_subarraymodel.py +23 -0
  104. package/tests/output/modelConfig/tea_python_tests/models/_my_model_submodel.py +46 -0
  105. package/tests/output/modelConfig/tea_python_tests/models/_my_model_submodel_model.py +33 -0
  106. package/tests/output/multi/tea_python_tests/api_models/_test_model_dir_2.py +5 -4
  107. package/tests/output/multi/tea_python_tests/exceptions/_err.py +2 -2
  108. package/tests/output/multi/tea_python_tests/model/user_exceptions/_err.py +1 -1
  109. package/tests/output/multi/tea_python_tests/model/user_exceptions/_err_1.py +1 -1
  110. package/tests/output/multi/tea_python_tests/model/user_exceptions/_err_2.py +1 -1
  111. package/tests/output/multi/tea_python_tests/model/user_models/_base_info.py +5 -4
  112. package/tests/output/multi/tea_python_tests/model/user_models/_info.py +7 -4
  113. package/tests/output/multi/tea_python_tests/models/_test_model_dir.py +12 -8
  114. package/tests/output/typedef/tea_python_tests/models/_m.py +7 -4
package/ChangeLog.md CHANGED
@@ -1,5 +1,12 @@
1
1
  # ChangeLog
2
2
 
3
+ # 2.0.5
4
+ - Add the model generate config.
5
+ - Fixed the model validate function error.
6
+
7
+ # 2.0.4
8
+ - Fixed the writable & readable assert logic.
9
+
3
10
  # 2.0.3
4
11
  - Optimized the directory structure of models and exceptions.
5
12
 
package/lib/builtin.js CHANGED
@@ -401,24 +401,18 @@ class Converter {
401
401
 
402
402
  readable(ast) {
403
403
  const expr = ast.args[0];
404
- this.generator.usedTypes.push('StringIO');
405
- this.generator.imports.push({
406
- className: 'json',
407
- });
408
- this.generator.emit('StringIO(json.dumps(');
404
+ this.generator.imports.push(_getImport(`${CORE}Stream`));
405
+ this.generator.emit(`${CORE}Stream.to_readable(`);
409
406
  this.generator.visitExpr(expr);
410
- this.generator.emit('))');
407
+ this.generator.emit(')');
411
408
  }
412
409
 
413
410
  writable(ast) {
414
411
  const expr = ast.args[0];
415
- this.generator.usedTypes.push('BytesIO');
416
- this.generator.imports.push({
417
- className: 'json',
418
- });
419
- this.generator.emit('BytesIO(json.dumps(');
412
+ this.generator.imports.push(_getImport(`${CORE}Stream`));
413
+ this.generator.emit(`${CORE}Stream.to_writable(`);
420
414
  this.generator.visitExpr(expr);
421
- this.generator.emit(').encode(\'utf-8\'))');
415
+ this.generator.emit(')');
422
416
  }
423
417
  }
424
418
 
package/lib/generator.js CHANGED
@@ -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
1241
  const subModelName = _subModelName(_camelCase(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, param].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.3",
3
+ "version": "2.0.5",
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
 
@@ -16,7 +16,7 @@ from darabonba.utils.stream import Stream as DaraStream
16
16
  from darabonba.url import Url as DaraURL
17
17
  from darabonba.utils.xml import XML as DaraXML
18
18
  import sys
19
- from typing import List, Any, BytesIO, StringIO
19
+ from typing import List, Any
20
20
 
21
21
 
22
22
  class Client:
@@ -618,8 +618,8 @@ class Client:
618
618
  'key': 'value'
619
619
  }
620
620
  obj = maps
621
- ws = BytesIO(json.dumps(obj).encode('utf-8'))
622
- rs = StringIO(json.dumps(maps))
621
+ ws = DaraStream.to_writable(obj)
622
+ rs = DaraStream.to_readable(maps)
623
623
  data = rs.read(30)
624
624
  if not DaraCore.is_null(data):
625
625
  ws.write(data)
@@ -669,8 +669,8 @@ class Client:
669
669
  'key': 'value'
670
670
  }
671
671
  obj = maps
672
- ws = BytesIO(json.dumps(obj).encode('utf-8'))
673
- rs = StringIO(json.dumps(maps))
672
+ ws = DaraStream.to_writable(obj)
673
+ rs = DaraStream.to_readable(maps)
674
674
  data = rs.read(30)
675
675
  if not DaraCore.is_null(data):
676
676
  ws.write(data)
@@ -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,