@darabonba/python-generator 2.0.12 → 2.0.13

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 (36) hide show
  1. package/ChangeLog.md +3 -0
  2. package/lib/generator.js +50 -50
  3. package/lib/helper.js +45 -3
  4. package/package.json +1 -1
  5. package/tests/expected/complex/tea_python_tests/client.py +7 -5
  6. package/tests/expected/function/tea_python_tests/client.py +12 -0
  7. package/tests/expected/model/tea_python_tests/models/_my_model.py +36 -0
  8. package/tests/fixtures/complex/Darafile +5 -0
  9. package/tests/fixtures/complex/libraries/Darafile +4 -1
  10. package/tests/fixtures/complex/libraries/import.dara +1 -0
  11. package/tests/fixtures/complex/main.dara +1 -0
  12. package/tests/fixtures/function/Darafile +7 -1
  13. package/tests/fixtures/function/main.dara +8 -0
  14. package/tests/fixtures/model/Darafile +8 -0
  15. package/tests/fixtures/model/main.dara +4 -0
  16. package/tests/output/alias/setup.py +1 -1
  17. package/tests/output/annotation/setup.py +1 -1
  18. package/tests/output/api/setup.py +1 -1
  19. package/tests/output/builtin/setup.py +1 -1
  20. package/tests/output/comment/setup.py +1 -1
  21. package/tests/output/complex/setup.py +1 -1
  22. package/tests/output/complex/tea_python_tests/client.py +7 -5
  23. package/tests/output/const/setup.py +1 -1
  24. package/tests/output/empty/setup.py +1 -1
  25. package/tests/output/exec/setup.py +1 -1
  26. package/tests/output/function/setup.py +1 -1
  27. package/tests/output/function/tea_python_tests/client.py +12 -0
  28. package/tests/output/import/setup.py +1 -1
  29. package/tests/output/map/setup.py +1 -1
  30. package/tests/output/model/setup.py +1 -1
  31. package/tests/output/model/tea_python_tests/models/_my_model.py +36 -0
  32. package/tests/output/modelConfig/setup.py +1 -1
  33. package/tests/output/multi/setup.py +1 -1
  34. package/tests/output/statements/setup.py +1 -1
  35. package/tests/output/super/setup.py +1 -1
  36. package/tests/output/typedef/setup.py +1 -1
package/ChangeLog.md CHANGED
@@ -1,5 +1,8 @@
1
1
  # ChangeLog
2
2
 
3
+ # 2.0.13
4
+ - Support snake case with keywords.
5
+
3
6
  # 2.0.12
4
7
  - Fixed the catch id error.
5
8
 
package/lib/generator.js CHANGED
@@ -46,7 +46,7 @@ class Visitor {
46
46
  this.modelPackage = 'models';
47
47
  this.exceptionPath = path.join(this.outputDir, this.config.package, 'exceptions');
48
48
  this.exceptionPackage = 'exceptions';
49
- this.config.clientPath = path.join(this.outputDir, this.config.package, `${_snakeCase(this.config.clientName)}.py`);
49
+ this.config.clientPath = path.join(this.outputDir, this.config.package, `${_snakeCase(this.config.clientName, this.config.keywords)}.py`);
50
50
  this.classNamespace = new Map();
51
51
  // 新增:用于存储已使用的类型
52
52
  this.isAsyncFunction = false; // 新增:用于标记是否为异步函数
@@ -376,7 +376,7 @@ setup(
376
376
  types.forEach((type) => {
377
377
  let comments = DSL.comment.getFrontComments(this.comments, type.tokenRange[0]);
378
378
  this.visitComments(comments, level + 2);
379
- this.emit(`${_snakeCase(_vid(type.vid))}: `, level + 2);
379
+ this.emit(`${_snakeCase(_vid(type.vid), this.config.keywords)}: `, level + 2);
380
380
  this.visitType(type.value);
381
381
  this.emit(' = None\n');
382
382
  });
@@ -558,7 +558,7 @@ setup(
558
558
  types.forEach((item) => {
559
559
  let comments = DSL.comment.getFrontComments(this.comments, item.tokenRange[0]);
560
560
  this.visitComments(comments, level + 2);
561
- this.emit(`${_snakeCase(_vid(item.vid))}: `, level + 2);
561
+ this.emit(`${_snakeCase(_vid(item.vid), this.config.keywords)}: `, level + 2);
562
562
  this.visitType(item.value);
563
563
  this.emit(' = None\n', level);
564
564
  });
@@ -569,7 +569,7 @@ setup(
569
569
  for (var i = 0; i < ast.params.params.length; i++) {
570
570
  const node = ast.params.params[i];
571
571
  assert.equal(node.type, 'param');
572
- const name = _avoidKeywords(_snakeCase(_name(node.paramName)));
572
+ const name = _avoidKeywords(_snakeCase(_name(node.paramName), this.config.keywords));
573
573
  this.emit(`${name}: `, level + 4);
574
574
  this.visitType(node.paramType, level);
575
575
  this.emit(',');
@@ -607,17 +607,17 @@ setup(
607
607
  if (!moduleDir && innerPath) {
608
608
  let pyPath = innerPath.replace(/(\.tea)$|(\.spec)$|(\.dara)$/gi, '') + '.py';
609
609
  if (pyPath.startsWith('./') || pyPath.startsWith('../')) {
610
- pyPath = pyPath.split('/').map(dir => _snakeCase(dir)).join(path.sep);
610
+ pyPath = pyPath.split('/').map(dir => _snakeCase(dir, this.config.keywords)).join(path.sep);
611
611
  pyPath = path.join(path.dirname(filepath), `${pyPath}`);
612
612
  } else if (pyPath.startsWith('/')) {
613
- pyPath = pyPath.split('/').map(dir => _snakeCase(dir)).join(path.sep);
613
+ pyPath = pyPath.split('/').map(dir => _snakeCase(dir, this.config.keywords)).join(path.sep);
614
614
  pyPath = `${pyPath}`;
615
615
  }
616
616
 
617
617
  const classNamespace = this.getClassNamespace(pyPath);
618
618
  const className = this.getInnerClient(aliasId, pyPath);
619
619
  const aliasName = this.getAliasName(className, aliasId);
620
- const filename = _snakeCase(path.basename(pyPath, '.py'));
620
+ const filename = _snakeCase(path.basename(pyPath, '.py'), this.config.keywords);
621
621
  this.packageInfo[aliasId] = {
622
622
  aliasName: aliasName || className,
623
623
  clientName: className,
@@ -646,7 +646,7 @@ setup(
646
646
  throw new Error(`The '${aliasId}' has no Python supported.`);
647
647
  }
648
648
  let className = _camelCase(pyPkg.clientName || 'client');
649
- let filename = _snakeCase(className);
649
+ let filename = _snakeCase(className, this.config.keywords);
650
650
  let classNamespace = pyPkg.package;
651
651
  let models = 'models';
652
652
  let exceptions = 'exceptions';
@@ -657,7 +657,7 @@ setup(
657
657
  exceptions = filename + '_exceptions';
658
658
  const arr = pyPath.split(path.sep).slice(1, -1);
659
659
  arr.map(key => {
660
- classNamespace += '.' + _snakeCase(key);
660
+ classNamespace += '.' + _snakeCase(key, this.config.keywords);
661
661
  });
662
662
  const exportClientName = pyPkg.exports && pyPkg.exports[inner];
663
663
  className = _camelCase(exportClientName || 'Client');
@@ -756,7 +756,7 @@ setup(
756
756
  for (var i = 0; i < ast.params.length; i++) {
757
757
  const node = ast.params[i];
758
758
  assert.equal(node.type, 'param');
759
- const name = _avoidKeywords(_snakeCase(_name(node.paramName)));
759
+ const name = _avoidKeywords(_snakeCase(_name(node.paramName), this.config.keywords));
760
760
  this.emit(`${name}: `, level);
761
761
  this.visitType(node.paramType, level);
762
762
  this.emit(',');
@@ -1024,7 +1024,7 @@ setup(
1024
1024
  node = ast.nodes[i];
1025
1025
  let comments = DSL.comment.getFrontComments(this.comments, node.tokenRange[0]);
1026
1026
  this.visitComments(comments, level);
1027
- let param = _avoidKeywords(_snakeCase(_escape(_name(node.fieldName))));
1027
+ let param = _avoidKeywords(_snakeCase(_escape(_name(node.fieldName)), this.config.keywords));
1028
1028
  const description = this.getAttributes(node, 'description');
1029
1029
  if (description) {
1030
1030
  const descriptions = description.trimEnd().split('\n');
@@ -1101,7 +1101,7 @@ setup(
1101
1101
  const minimum = this.getAttributes(node, 'minimum') || 0;
1102
1102
  let comments = DSL.comment.getFrontComments(this.comments, node.tokenRange[0]);
1103
1103
  this.visitComments(comments, level);
1104
- let param = _avoidKeywords(_snakeCase(_escape(_name(node.fieldName))));
1104
+ let param = _avoidKeywords(_snakeCase(_escape(_name(node.fieldName)), this.config.keywords));
1105
1105
  // 这里判断类中属性是否是必填
1106
1106
  if (node.required) {
1107
1107
  notPass = true;
@@ -1200,7 +1200,7 @@ setup(
1200
1200
  let realName = this.getRealName(node);
1201
1201
  let comments = DSL.comment.getFrontComments(this.comments, node.tokenRange[0]);
1202
1202
  this.visitComments(comments, level);
1203
- let param = _avoidKeywords(_snakeCase(_escape(_name(node.fieldName))));
1203
+ let param = _avoidKeywords(_snakeCase(_escape(_name(node.fieldName)), this.config.keywords));
1204
1204
  const hasModel = this.checkFieldHasModel(node.fieldValue);
1205
1205
  let arr = false;
1206
1206
  if (hasModel && !this.config.noneEmpty) {
@@ -1310,7 +1310,7 @@ setup(
1310
1310
  let realName = this.getRealName(node);
1311
1311
  let comments = DSL.comment.getFrontComments(this.comments, node.tokenRange[0]);
1312
1312
  this.visitComments(comments, level);
1313
- let param = _avoidKeywords(_snakeCase(_escape(_name(node.fieldName))));
1313
+ let param = _avoidKeywords(_snakeCase(_escape(_name(node.fieldName)), this.config.keywords));
1314
1314
  const hasModel = this.checkFieldHasModel(node.fieldValue);
1315
1315
  let arr = false;
1316
1316
  if (hasModel && !this.config.noneEmpty) {
@@ -1443,7 +1443,7 @@ setup(
1443
1443
  this.visitExtendOn(extendOn);
1444
1444
  this.emit(':\n');
1445
1445
  this.visitModelBody(modelBody, level + 2, modelName);
1446
- this.saveBuffer(path.join(this.modelPath, filename || `_${_snakeCase(modelName)}.py`));
1446
+ this.saveBuffer(path.join(this.modelPath, filename || `_${_snakeCase(modelName, this.config.keywords)}.py`));
1447
1447
  this.usedTypes = [];
1448
1448
  this.imports = [];
1449
1449
  this.output = '';
@@ -1492,7 +1492,7 @@ setup(
1492
1492
  const ast = models[i];
1493
1493
  const modelName = _subModelName(_name(ast.modelName));
1494
1494
  modelNames.push(modelName);
1495
- this.emit(`from ._${_snakeCase(modelName)} import ${modelName}\n`);
1495
+ this.emit(`from ._${_snakeCase(modelName, this.config.keywords)} import ${modelName}\n`);
1496
1496
  }
1497
1497
 
1498
1498
  for (let i = 0; i < subModels.length; i++) {
@@ -1500,7 +1500,7 @@ setup(
1500
1500
  const modelName = _subModelName(_name(ast.modelName));
1501
1501
  const mainModelName = _name(ast.modelName).split('.')[0];
1502
1502
  modelNames.push(modelName);
1503
- this.emit(`from ._${_snakeCase(mainModelName)} import ${modelName}\n`);
1503
+ this.emit(`from ._${_snakeCase(mainModelName, this.config.keywords)} import ${modelName}\n`);
1504
1504
  }
1505
1505
 
1506
1506
  this.emit('\n__all__ = [\n');
@@ -1533,7 +1533,7 @@ setup(
1533
1533
  let comments = DSL.comment.getFrontComments(this.comments, node.tokenRange[0]);
1534
1534
  this.visitComments(comments, level);
1535
1535
  }
1536
- let param = _avoidKeywords(_snakeCase(_escape(_name(node.fieldName))));
1536
+ let param = _avoidKeywords(_snakeCase(_escape(_name(node.fieldName)), this.config.keywords));
1537
1537
  if (param === 'name' && type === 'exception') {
1538
1538
  continue;
1539
1539
  }
@@ -1549,7 +1549,7 @@ setup(
1549
1549
  this.emit('{\n');
1550
1550
  for (let i = 0; i < ast.extendFileds.length; i++) {
1551
1551
  node = ast.extendFileds[i];
1552
- let value = _snakeCase(_escape(_name(node.fieldName)));
1552
+ let value = _snakeCase(_escape(_name(node.fieldName)), this.config.keywords);
1553
1553
  let key = _avoidKeywords(_escape(_name(node.fieldName)));
1554
1554
  if (key === 'name' && type === 'exception') {
1555
1555
  continue;
@@ -1561,7 +1561,7 @@ setup(
1561
1561
  this.emit('\n');
1562
1562
  for (let i = 0; i < ast.extendFileds.length; i++) {
1563
1563
  node = ast.extendFileds[i];
1564
- let param = _avoidKeywords(_snakeCase(_escape(_name(node.fieldName))));
1564
+ let param = _avoidKeywords(_snakeCase(_escape(_name(node.fieldName)), this.config.keywords));
1565
1565
  if (param === 'name' && type === 'exception') {
1566
1566
  continue;
1567
1567
  }
@@ -1582,7 +1582,7 @@ setup(
1582
1582
  node = ast.nodes[i];
1583
1583
  let comments = DSL.comment.getFrontComments(this.comments, node.tokenRange[0]);
1584
1584
  this.visitComments(comments, level);
1585
- let param = _avoidKeywords(_snakeCase(_escape(_name(node.fieldName))));
1585
+ let param = _avoidKeywords(_snakeCase(_escape(_name(node.fieldName)), this.config.keywords));
1586
1586
  if (param === 'name') {
1587
1587
  continue;
1588
1588
  }
@@ -1607,7 +1607,7 @@ setup(
1607
1607
  this.visitExtendOn(extendOn, 'exception');
1608
1608
  this.emit(':\n');
1609
1609
  this.visitEcxceptionBody(exceptionBody, extendOn, exceptionName, level + 2);
1610
- this.saveBuffer(path.join(this.exceptionPath, `_${_snakeCase(exceptionName)}.py`));
1610
+ this.saveBuffer(path.join(this.exceptionPath, `_${_snakeCase(exceptionName, this.config.keywords)}.py`));
1611
1611
  this.usedTypes = [];
1612
1612
  this.imports = [];
1613
1613
  this.output = '';
@@ -1628,7 +1628,7 @@ setup(
1628
1628
  const ast = excpetions[i];
1629
1629
  const exceptionName = _subModelName(_name(ast.exceptionName));
1630
1630
  exceptionNames.push(exceptionName);
1631
- this.emit(`from ._${_snakeCase(exceptionName)} import ${exceptionName}Exception\n`);
1631
+ this.emit(`from ._${_snakeCase(exceptionName, this.config.keywords)} import ${exceptionName}Exception\n`);
1632
1632
  }
1633
1633
 
1634
1634
  this.emit('\n__all__ = [\n');
@@ -1642,7 +1642,7 @@ setup(
1642
1642
  assert.equal(ast.type, 'model');
1643
1643
  const modelName = _subModelName(_name(ast.modelName));
1644
1644
  const mainModelName = _name(ast.modelName).split('.')[0];
1645
- this.visitModel(ast.modelBody, modelName, ast.extendOn, level, `_${_snakeCase(mainModelName)}.py`);
1645
+ this.visitModel(ast.modelBody, modelName, ast.extendOn, level, `_${_snakeCase(mainModelName, this.config.keywords)}.py`);
1646
1646
  }
1647
1647
 
1648
1648
  visitObjectFieldValue(ast, level) {
@@ -1673,7 +1673,7 @@ setup(
1673
1673
  if (ast.type === 'objectField') {
1674
1674
  // TODO 这里粗暴处理的双引号,可以考虑优化
1675
1675
  var key = _escape(_name(ast.fieldName) || _string(ast.fieldName)).replace(/['"]/g, '');
1676
- this.emit(`${_avoidKeywords(_snakeCase(key))} = `, level + 2);
1676
+ this.emit(`${_avoidKeywords(_snakeCase(key, this.config.keywords))} = `, level + 2);
1677
1677
  this.visitObjectFieldValue(ast.expr, level + 2);
1678
1678
  if (!end) {
1679
1679
  this.emit(',\n');
@@ -1740,7 +1740,7 @@ setup(
1740
1740
  visitMethodCall(ast, level) {
1741
1741
  assert.equal(ast.left.type, 'method_call');
1742
1742
  const name = _name(ast.left.id);
1743
- const functionName = _avoidKeywords(_snakeCase(name));
1743
+ const functionName = _avoidKeywords(_snakeCase(name, this.config.keywords));
1744
1744
  const sse = ast.notes && ast.notes.find(note => note.note.lexeme === '@sse');
1745
1745
  const isSSE = sse && sse.arg.value;
1746
1746
  if (name.startsWith('$') && this.builtin[name]) {
@@ -1754,7 +1754,7 @@ setup(
1754
1754
  } else if (ast.isAsync && this.isAsyncFunction) {
1755
1755
  this.emit(`${isSSE ? '' : 'await '}${this.className}.${functionName}_async`);
1756
1756
  } else {
1757
- const functionName = _snakeCase(name);
1757
+ const functionName = _snakeCase(name, this.config.keywords);
1758
1758
  this.emit(`${this.className}.${functionName}`);
1759
1759
  }
1760
1760
  this.visitArgs(ast.args, level);
@@ -1774,12 +1774,12 @@ setup(
1774
1774
  this.builtin[ast.builtinModule][method](ast, level, async);
1775
1775
  } else {
1776
1776
  if (ast.left.id.tag === DSL.Tag.Tag.VID) {
1777
- this.emit(`self.${_snakeCase(_vid(ast.left.id))}`);
1777
+ this.emit(`self.${_snakeCase(_vid(ast.left.id), this.config.keywords)}`);
1778
1778
  } else {
1779
- const aliasId = _snakeCase(_name(ast.left.id));
1779
+ const aliasId = _snakeCase(_name(ast.left.id), this.config.keywords);
1780
1780
  this.emit(aliasId);
1781
1781
  }
1782
- this.emit(`.${(_avoidKeywords(_snakeCase(method)))}`);
1782
+ this.emit(`.${(_avoidKeywords(_snakeCase(method, this.config.keywords)))}`);
1783
1783
  if (async) {
1784
1784
  this.emit('_async');
1785
1785
  }
@@ -1798,7 +1798,7 @@ setup(
1798
1798
  const aliasId = _name(ast.left.id);
1799
1799
  let clientName = this.getModelName('', aliasId, 'module');
1800
1800
 
1801
- const functionName = _avoidKeywords(_snakeCase(_name(ast.left.propertyPath[0])));
1801
+ const functionName = _avoidKeywords(_snakeCase(_name(ast.left.propertyPath[0]), this.config.keywords));
1802
1802
 
1803
1803
  const sse = ast.notes && ast.notes.find(note => note.note.lexeme === '@sse');
1804
1804
  const isSSE = sse && sse.arg.value;
@@ -1877,9 +1877,9 @@ setup(
1877
1877
 
1878
1878
  visitPropertyAccess(ast, env = {}) {
1879
1879
  assert.ok(ast.type === 'property_access' || ast.type === 'property');
1880
- var id = _snakeCase(_name(ast.id));
1880
+ var id = _snakeCase(_name(ast.id), this.config.keywords);
1881
1881
  if (ast.id.tag === Tag.VID) {
1882
- id = `self.${_snakeCase(_vid(ast.id))}`;
1882
+ id = `self.${_snakeCase(_vid(ast.id), this.config.keywords)}`;
1883
1883
  }
1884
1884
  var expr = _avoidKeywords(id);
1885
1885
  const prefix = env.left ? '[' : '.get(';
@@ -1889,7 +1889,7 @@ setup(
1889
1889
  for (var i = 0; i < ast.propertyPath.length; i++) {
1890
1890
  var name = _name(ast.propertyPath[i]);
1891
1891
  if (current.type === 'model') {
1892
- expr += `.${_avoidKeywords(_snakeCase(name))}`;
1892
+ expr += `.${_avoidKeywords(_snakeCase(name, this.config.keywords))}`;
1893
1893
  } else {
1894
1894
  expr += `${prefix}"${name}"${suffix}`;
1895
1895
  }
@@ -1915,10 +1915,10 @@ setup(
1915
1915
  if (ast.inferred && ast.inferred.type === 'basic' && ast.inferred.name === 'class') {
1916
1916
  this.emit(this.getModelName('', _name(ast.id), 'module'));
1917
1917
  } else {
1918
- this.emit(_avoidKeywords(_snakeCase(_name(ast.id))));
1918
+ this.emit(_avoidKeywords(_snakeCase(_name(ast.id), this.config.keywords)));
1919
1919
  }
1920
1920
  } else if (ast.type === 'virtualVariable') {
1921
- this.emit(`self.${_snakeCase(_vid(ast.vid))}`);
1921
+ this.emit(`self.${_snakeCase(_vid(ast.vid), this.config.keywords)}`);
1922
1922
  } else if (ast.type === 'decrement') {
1923
1923
  this.visitExpr(ast.expr, level, { left: true });
1924
1924
  this.emit('-= 1');
@@ -2055,9 +2055,9 @@ setup(
2055
2055
  assert.equal(ast.type, 'map_access');
2056
2056
  let expr;
2057
2057
  if (ast.id.tag === DSL.Tag.Tag.VID) {
2058
- expr = `self.${_snakeCase(_vid(ast.id))}`;
2058
+ expr = `self.${_snakeCase(_vid(ast.id), this.config.keywords)}`;
2059
2059
  } else {
2060
- expr = `${_avoidKeywords(_snakeCase(_name(ast.id)))}`;
2060
+ expr = `${_avoidKeywords(_snakeCase(_name(ast.id), this.config.keywords))}`;
2061
2061
  }
2062
2062
  const prefix = env.left ? '[' : '.get(';
2063
2063
  const suffix = env.left ? ']' : ')';
@@ -2066,7 +2066,7 @@ setup(
2066
2066
  for (var i = 0; i < ast.propertyPath.length; i++) {
2067
2067
  var name = _name(ast.propertyPath[i]);
2068
2068
  if (current.type === 'model') {
2069
- expr += `.${_avoidKeywords(_snakeCase(name))}`;
2069
+ expr += `.${_avoidKeywords(_snakeCase(name, this.config.keywords))}`;
2070
2070
  } else {
2071
2071
  expr += `${prefix}"${name}"${suffix}`;
2072
2072
  }
@@ -2083,16 +2083,16 @@ setup(
2083
2083
  let expr;
2084
2084
  if (ast.id.tag === DSL.Tag.Tag.VID) {
2085
2085
  // 这个判断很奇怪诶
2086
- expr = `self.${_snakeCase(_vid(ast.id))}`;
2086
+ expr = `self.${_snakeCase(_vid(ast.id, this.config.keywords))}`;
2087
2087
  } else {
2088
- expr = `${_avoidKeywords(_snakeCase(_name(ast.id)))}`;
2088
+ expr = `${_avoidKeywords(_snakeCase(_name(ast.id), this.config.keywords))}`;
2089
2089
  }
2090
2090
  if (ast.propertyPath && ast.propertyPath.length) {
2091
2091
  var current = ast.id.inferred;
2092
2092
  for (var i = 0; i < ast.propertyPath.length; i++) {
2093
2093
  var name = _name(ast.propertyPath[i]);
2094
2094
  if (current.type === 'model') {
2095
- expr += `.${_avoidKeywords(_snakeCase(name))}`;
2095
+ expr += `.${_avoidKeywords(_snakeCase(name, this.config.keywords))}`;
2096
2096
  } else {
2097
2097
  expr += `["${name}"]`;
2098
2098
  }
@@ -2250,7 +2250,7 @@ setup(
2250
2250
  this.emit('k, v in ');
2251
2251
  this.visitExpr(ast.list, level);
2252
2252
  } else {
2253
- this.emit(`${_avoidKeywords(_snakeCase(_name(ast.id)))} in `);
2253
+ this.emit(`${_avoidKeywords(_snakeCase(_name(ast.id), this.config.keywords))} in `);
2254
2254
  this.visitExpr(ast.list, level);
2255
2255
  }
2256
2256
  this.emit(':\n');
@@ -2306,9 +2306,9 @@ setup(
2306
2306
  this.emit('', level);
2307
2307
  this.visitPropertyAccess(ast.left, { left: true });
2308
2308
  } else if (ast.left.type === 'virtualVariable') { // vid
2309
- this.emit(`self.${_snakeCase(_vid((ast.left.vid)))}`, level);
2309
+ this.emit(`self.${_snakeCase(_vid((ast.left.vid)), this.config.keywords)}`, level);
2310
2310
  } else if (ast.left.type === 'variable') {
2311
- this.emit(`${_avoidKeywords(_snakeCase(_name(ast.left.id)))}`, level);
2311
+ this.emit(`${_avoidKeywords(_snakeCase(_name(ast.left.id), this.config.keywords))}`, level);
2312
2312
  } else if (ast.left.type === 'map_access') {
2313
2313
  // 声明时不能用get去赋值
2314
2314
  this.emit('', level);
@@ -2333,7 +2333,7 @@ setup(
2333
2333
 
2334
2334
  // 实例初始化 new的地方
2335
2335
  visitDeclare(ast, level) {
2336
- var id = _avoidKeywords(_snakeCase(_name(ast.id)));
2336
+ var id = _avoidKeywords(_snakeCase(_name(ast.id), this.config.keywords));
2337
2337
  this.emit(`${id}`, level);
2338
2338
  if (id === 'new_full_str') {
2339
2339
  this.emit('');
@@ -2399,7 +2399,7 @@ setup(
2399
2399
  // this.visitAnnotation(ast.annotation, level);
2400
2400
  // let comments = DSL.comment.getFrontComments(this.comments, ast.tokenRange[0]);
2401
2401
  // this.visitComments(comments, level);
2402
- const functionName = _avoidKeywords(_snakeCase(_name(ast.functionName)));
2402
+ const functionName = _avoidKeywords(_snakeCase(_name(ast.functionName), this.config.keywords));
2403
2403
 
2404
2404
  if (ast.isStatic) {
2405
2405
  this.emit('@staticmethod\n', level);
@@ -2477,7 +2477,7 @@ setup(
2477
2477
  let comments = DSL.comment.getFrontComments(this.comments, ast.tokenRange[0]);
2478
2478
  this.visitComments(comments, level);
2479
2479
  // set api name to _snakeCase
2480
- const apiName = _avoidKeywords(_snakeCase(_name(ast.apiName)));
2480
+ const apiName = _avoidKeywords(_snakeCase(_name(ast.apiName), this.config.keywords));
2481
2481
  this.isStaticFunction = false;
2482
2482
  this.emit(`def ${apiName}`, level);
2483
2483
  this.visitParams(ast.params, level, true);
@@ -2755,7 +2755,7 @@ setup(
2755
2755
 
2756
2756
  if (type === 'model' && moduleName) {
2757
2757
  const { namemespace, models } = this.packageInfo[moduleName];
2758
- const aliasName = `${_snakeCase(moduleName.replace(/-/g, ''))}_models`;
2758
+ const aliasName = `${_snakeCase(moduleName.replace(/-/g, ''), this.config.keywords)}_models`;
2759
2759
  this.imports.push({
2760
2760
  aliasName,
2761
2761
  packageName: namemespace,
@@ -2776,7 +2776,7 @@ setup(
2776
2776
 
2777
2777
  if (type === 'exception' && moduleName) {
2778
2778
  const { namemespace, exceptions } = this.packageInfo[moduleName];
2779
- const aliasName = `${_snakeCase(moduleName.replace(/-/g, ''))}_exceptions`;
2779
+ const aliasName = `${_snakeCase(moduleName.replace(/-/g, ''), this.config.keywords)}_exceptions`;
2780
2780
  this.imports.push({
2781
2781
  aliasName,
2782
2782
  packageName: namemespace,
package/lib/helper.js CHANGED
@@ -213,13 +213,34 @@ function _camelCase(str, split = '_') {
213
213
  return str;
214
214
  }
215
215
 
216
- function _snakeCase(str) {
216
+ function _snakeCase(str, keys = []) {
217
217
  if (!str) {
218
218
  return '';
219
219
  }
220
+
221
+ // Convert keys to array if it's a single string
222
+ if (typeof keys === 'string') {
223
+ keys = [keys];
224
+ }
225
+
226
+ let result = str;
227
+
228
+ // First, handle the keywords by replacing them with placeholders
229
+ const placeholders = {};
230
+ for (let i = 0; i < keys.length; i++) {
231
+ const key = keys[i];
232
+ if (key && result.includes(key)) {
233
+ const placeholder = `@@_${i}@@`;
234
+ placeholders[placeholder] = `_${key.toLowerCase()}_`;
235
+ result = result.split(key).join(placeholder);
236
+ }
237
+ }
238
+
239
+ // Process the string normally
220
240
  let res = '';
221
241
  let tmp = '';
222
- for (const c of str) {
242
+
243
+ for (const c of result) {
223
244
  if (/[A-Z|0-9]/.test(c)) {
224
245
  tmp += c;
225
246
  } else {
@@ -230,13 +251,34 @@ function _snakeCase(str) {
230
251
  res += c;
231
252
  }
232
253
  }
254
+
233
255
  if (tmp.length > 0) {
234
- res += '_' + tmp.toLowerCase();
256
+ res += (res === '' ? '' : '_') + tmp.toLowerCase();
235
257
  }
258
+
236
259
  res = res.replace(/-/g, '_');
260
+
261
+ // Clean up any double underscores
262
+ res = res.replace(/_+/g, '_');
263
+
264
+ // Restore the special keywords from placeholders
265
+ for (const [placeholder, value] of Object.entries(placeholders)) {
266
+ const regex = new RegExp(placeholder, 'g');
267
+ res = res.replace(regex, value);
268
+ }
269
+
270
+ res = res.replace(/_+/g, '_');
271
+
272
+ // Remove leading underscore if original string didn't start with one
237
273
  if (res[0] === '_' && str[0] !== '_') {
238
274
  res = res.substring(1);
239
275
  }
276
+
277
+ // Remove trailing underscore if original string didn't end with one
278
+ if (res[res.length - 1] === '_' && str[str.length - 1] !== '_') {
279
+ res = res.substring(0, res.length - 1);
280
+ }
281
+
240
282
  return res;
241
283
  }
242
284
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@darabonba/python-generator",
3
- "version": "2.0.12",
3
+ "version": "2.0.13",
4
4
  "description": "The darabonba generator for Python",
5
5
  "main": "lib/generator.js",
6
6
  "directories": {
@@ -20,7 +20,7 @@ from tea_python_tests import models as main_models
20
20
  class Client(SourceClient):
21
21
  _protocol: str = None
22
22
  _pathname: str = None
23
- __strs: List[str] = None
23
+ _strs: List[str] = None
24
24
  _comple_list: List[List[str]] = None
25
25
  _endpoint_map: Dict[str, str] = None
26
26
  _configs: List[source_models.Config] = None
@@ -206,11 +206,11 @@ class Client(SourceClient):
206
206
  any_map = {}
207
207
  any_map[item] = 'test'
208
208
  break
209
- self.__strs = request.strs
209
+ self._strs = request.strs
210
210
  self._protocol = 'test'
211
211
  self._endpoint_map.get(self._protocol)
212
212
  self._endpoint_map['test'] = 'ok'
213
- request.strs = self.__strs
213
+ request.strs = self._strs
214
214
  _request.protocol = self._protocol
215
215
  _request.port = request.num
216
216
  _request.method = 'GET'
@@ -421,11 +421,11 @@ class Client(SourceClient):
421
421
  any_map = {}
422
422
  any_map[item] = 'test'
423
423
  break
424
- self.__strs = request.strs
424
+ self._strs = request.strs
425
425
  self._protocol = 'test'
426
426
  self._endpoint_map.get(self._protocol)
427
427
  self._endpoint_map['test'] = 'ok'
428
- request.strs = self.__strs
428
+ request.strs = self._strs
429
429
  _request.protocol = self._protocol
430
430
  _request.port = request.num
431
431
  _request.method = 'GET'
@@ -611,6 +611,7 @@ class Client(SourceClient):
611
611
  x = y
612
612
  resp = _response
613
613
  req = source_models.Request(
614
+ cors_rules = 'test',
614
615
  accesskey = request.access_key,
615
616
  region = resp.status_message
616
617
  )
@@ -653,6 +654,7 @@ class Client(SourceClient):
653
654
  x = y
654
655
  resp = _response
655
656
  req = source_models.Request(
657
+ cors_rules = 'test',
656
658
  accesskey = request.access_key,
657
659
  region = resp.status_message
658
660
  )
@@ -63,3 +63,15 @@ class Client:
63
63
 
64
64
  async def a_params_async(self) -> None:
65
65
  await self.hello_params_async('a', 'b')
66
+
67
+ def test_jwt_with_option(self) -> None:
68
+ self.hello_params('a', 'b')
69
+
70
+ async def test_jwt_with_option_async(self) -> None:
71
+ await self.hello_params_async('a', 'b')
72
+
73
+ def test_oauth2_for_option(self) -> None:
74
+ self.hello_params('a', 'b')
75
+
76
+ async def test_oauth2_for_option_async(self) -> None:
77
+ await self.hello_params_async('a', 'b')
@@ -14,6 +14,10 @@ class MyModel(DaraModel):
14
14
  def __init__(
15
15
  self,
16
16
  model: main_models.MyModelModel = None,
17
+ cors_rules: str = None,
18
+ cors_rules_cors_r: str = None,
19
+ xml_parser_http_message: str = None,
20
+ test_oauth2_name: str = None,
17
21
  stringfield: str = None,
18
22
  bytesfield: bytes = None,
19
23
  stringarrayfield: List[str] = None,
@@ -60,6 +64,10 @@ class MyModel(DaraModel):
60
64
  link: str = None,
61
65
  ):
62
66
  self.model = model
67
+ self.cors_rules = cors_rules
68
+ self.cors_rules_cors_r = cors_rules_cors_r
69
+ self.xml_parser_http_message = xml_parser_http_message
70
+ self.test_oauth2_name = test_oauth2_name
63
71
  self.stringfield = stringfield
64
72
  self.bytesfield = bytesfield
65
73
  self.stringarrayfield = stringarrayfield
@@ -109,6 +117,10 @@ class MyModel(DaraModel):
109
117
  self.validate_required(self.model, 'model')
110
118
  if self.model:
111
119
  self.model.validate()
120
+ self.validate_required(self.cors_rules, 'cors_rules')
121
+ self.validate_required(self.cors_rules_cors_r, 'cors_rules_cors_r')
122
+ self.validate_required(self.xml_parser_http_message, 'xml_parser_http_message')
123
+ self.validate_required(self.test_oauth2_name, 'test_oauth2_name')
112
124
  self.validate_required(self.stringfield, 'stringfield')
113
125
  self.validate_required(self.bytesfield, 'bytesfield')
114
126
  self.validate_required(self.stringarrayfield, 'stringarrayfield')
@@ -220,6 +232,18 @@ class MyModel(DaraModel):
220
232
  if self.model is not None:
221
233
  result['model'] = self.model.to_map()
222
234
 
235
+ if self.cors_rules is not None:
236
+ result['CORSRules'] = self.cors_rules
237
+
238
+ if self.cors_rules_cors_r is not None:
239
+ result['CORSRulesCORSR'] = self.cors_rules_cors_r
240
+
241
+ if self.xml_parser_http_message is not None:
242
+ result['XMLParserHTTPMessage'] = self.xml_parser_http_message
243
+
244
+ if self.test_oauth2_name is not None:
245
+ result['TestOAuth2Name'] = self.test_oauth2_name
246
+
223
247
  if self.stringfield is not None:
224
248
  result['stringfield'] = self.stringfield
225
249
 
@@ -405,6 +429,18 @@ class MyModel(DaraModel):
405
429
  temp_model = main_models.MyModelModel()
406
430
  self.model = temp_model.from_map(m.get('model'))
407
431
 
432
+ if m.get('CORSRules') is not None:
433
+ self.cors_rules = m.get('CORSRules')
434
+
435
+ if m.get('CORSRulesCORSR') is not None:
436
+ self.cors_rules_cors_r = m.get('CORSRulesCORSR')
437
+
438
+ if m.get('XMLParserHTTPMessage') is not None:
439
+ self.xml_parser_http_message = m.get('XMLParserHTTPMessage')
440
+
441
+ if m.get('TestOAuth2Name') is not None:
442
+ self.test_oauth2_name = m.get('TestOAuth2Name')
443
+
408
444
  if m.get('stringfield') is not None:
409
445
  self.stringfield = m.get('stringfield')
410
446
 
@@ -5,5 +5,10 @@
5
5
  "main": "./main.dara",
6
6
  "libraries": {
7
7
  "Source": "alibabacloud:Import:*"
8
+ },
9
+ "python": {
10
+ "keywords": [
11
+ "CORS"
12
+ ]
8
13
  }
9
14
  }
@@ -23,7 +23,10 @@
23
23
  },
24
24
  "python": {
25
25
  "package": "Source",
26
- "clientName": "source_client"
26
+ "clientName": "source_client",
27
+ "keywords": [
28
+ "CORS"
29
+ ]
27
30
  },
28
31
  "python2": {
29
32
  "package": "Source",
@@ -30,6 +30,7 @@ static function parse(c: class): void;
30
30
  static async function asyncFunc(): void;
31
31
 
32
32
  model Request = {
33
+ CORSRules: string,
33
34
  accesskey?: string(name='accesskey', description='accesskey'),
34
35
  region?: string(name='region', description='region'),
35
36
  instance: {
@@ -300,6 +300,7 @@ api Complex3(request: ComplexRequest, name: string): ComplexRequest {
300
300
  }
301
301
  var resp = __response;
302
302
  var req = new Source.Request{
303
+ CORSRules = "test",
303
304
  accesskey = request.accessKey,
304
305
  region = resp.statusMessage
305
306
  };
@@ -2,5 +2,11 @@
2
2
  "scope": "alibabacloud",
3
3
  "name": "main",
4
4
  "version": "0.0.1",
5
- "main": "./main.dara"
5
+ "main": "./main.dara",
6
+ "python": {
7
+ "keywords": [
8
+ "JWT",
9
+ "OAuth2"
10
+ ]
11
+ }
6
12
  }
@@ -34,4 +34,12 @@ static async function helloInterface(): void;
34
34
 
35
35
  async function aParams(): void {
36
36
  helloParams("a", "b");
37
+ }
38
+
39
+ async function testJWTWithOption(): void {
40
+ helloParams("a", "b");
41
+ }
42
+
43
+ async function testOAuth2forOption(): void {
44
+ helloParams("a", "b");
37
45
  }
@@ -5,5 +5,13 @@
5
5
  "main": "./main.dara",
6
6
  "libraries": {
7
7
  "Source": "darabonba:Import:*"
8
+ },
9
+ "python": {
10
+ "keywords": [
11
+ "CORS",
12
+ "XML",
13
+ "HTTP",
14
+ "OAuth2"
15
+ ]
8
16
  }
9
17
  }
@@ -28,6 +28,10 @@ model MyModel = {
28
28
  str: string
29
29
  },
30
30
  },
31
+ CORSRules: string,
32
+ CORSRulesCORSR: string,
33
+ XMLParserHTTPMessage: string,
34
+ TestOAuth2Name: string,
31
35
  stringfield: string,
32
36
  bytesfield: bytes,
33
37
  stringarrayfield: [ string ],
@@ -24,7 +24,7 @@ from setuptools import setup, find_packages
24
24
  """
25
25
  setup module for tea-python-tests.
26
26
 
27
- Created on 13/08/2025
27
+ Created on 19/12/2025
28
28
 
29
29
  @author: AlibabaCloud SDK Team
30
30
  """
@@ -24,7 +24,7 @@ from setuptools import setup, find_packages
24
24
  """
25
25
  setup module for tea_python_tests.
26
26
 
27
- Created on 13/08/2025
27
+ Created on 19/12/2025
28
28
 
29
29
  @author: Alibaba
30
30
  """
@@ -24,7 +24,7 @@ from setuptools import setup, find_packages
24
24
  """
25
25
  setup module for tea_python_tests.
26
26
 
27
- Created on 13/08/2025
27
+ Created on 19/12/2025
28
28
 
29
29
  @author: Alibaba
30
30
  """
@@ -24,7 +24,7 @@ from setuptools import setup, find_packages
24
24
  """
25
25
  setup module for tea_python_tests.
26
26
 
27
- Created on 13/08/2025
27
+ Created on 19/12/2025
28
28
 
29
29
  @author: Alibaba
30
30
  """
@@ -24,7 +24,7 @@ from setuptools import setup, find_packages
24
24
  """
25
25
  setup module for tea_python_tests.
26
26
 
27
- Created on 13/08/2025
27
+ Created on 19/12/2025
28
28
 
29
29
  @author: Alibaba
30
30
  """
@@ -24,7 +24,7 @@ from setuptools import setup, find_packages
24
24
  """
25
25
  setup module for tea_python_tests.
26
26
 
27
- Created on 13/08/2025
27
+ Created on 19/12/2025
28
28
 
29
29
  @author: Alibaba
30
30
  """
@@ -20,7 +20,7 @@ from tea_python_tests import models as main_models
20
20
  class Client(SourceClient):
21
21
  _protocol: str = None
22
22
  _pathname: str = None
23
- __strs: List[str] = None
23
+ _strs: List[str] = None
24
24
  _comple_list: List[List[str]] = None
25
25
  _endpoint_map: Dict[str, str] = None
26
26
  _configs: List[source_models.Config] = None
@@ -206,11 +206,11 @@ class Client(SourceClient):
206
206
  any_map = {}
207
207
  any_map[item] = 'test'
208
208
  break
209
- self.__strs = request.strs
209
+ self._strs = request.strs
210
210
  self._protocol = 'test'
211
211
  self._endpoint_map.get(self._protocol)
212
212
  self._endpoint_map['test'] = 'ok'
213
- request.strs = self.__strs
213
+ request.strs = self._strs
214
214
  _request.protocol = self._protocol
215
215
  _request.port = request.num
216
216
  _request.method = 'GET'
@@ -421,11 +421,11 @@ class Client(SourceClient):
421
421
  any_map = {}
422
422
  any_map[item] = 'test'
423
423
  break
424
- self.__strs = request.strs
424
+ self._strs = request.strs
425
425
  self._protocol = 'test'
426
426
  self._endpoint_map.get(self._protocol)
427
427
  self._endpoint_map['test'] = 'ok'
428
- request.strs = self.__strs
428
+ request.strs = self._strs
429
429
  _request.protocol = self._protocol
430
430
  _request.port = request.num
431
431
  _request.method = 'GET'
@@ -611,6 +611,7 @@ class Client(SourceClient):
611
611
  x = y
612
612
  resp = _response
613
613
  req = source_models.Request(
614
+ cors_rules = 'test',
614
615
  accesskey = request.access_key,
615
616
  region = resp.status_message
616
617
  )
@@ -653,6 +654,7 @@ class Client(SourceClient):
653
654
  x = y
654
655
  resp = _response
655
656
  req = source_models.Request(
657
+ cors_rules = 'test',
656
658
  accesskey = request.access_key,
657
659
  region = resp.status_message
658
660
  )
@@ -24,7 +24,7 @@ from setuptools import setup, find_packages
24
24
  """
25
25
  setup module for tea_python_tests.
26
26
 
27
- Created on 13/08/2025
27
+ Created on 19/12/2025
28
28
 
29
29
  @author: Alibaba
30
30
  """
@@ -24,7 +24,7 @@ from setuptools import setup, find_packages
24
24
  """
25
25
  setup module for tea_python_tests.
26
26
 
27
- Created on 13/08/2025
27
+ Created on 19/12/2025
28
28
 
29
29
  @author: Alibaba
30
30
  """
@@ -24,7 +24,7 @@ from setuptools import setup, find_packages
24
24
  """
25
25
  setup module for tea_python_tests.
26
26
 
27
- Created on 13/08/2025
27
+ Created on 19/12/2025
28
28
 
29
29
  @author: Alibaba
30
30
  """
@@ -24,7 +24,7 @@ from setuptools import setup, find_packages
24
24
  """
25
25
  setup module for tea_python_tests.
26
26
 
27
- Created on 13/08/2025
27
+ Created on 19/12/2025
28
28
 
29
29
  @author: Alibaba
30
30
  """
@@ -63,3 +63,15 @@ class Client:
63
63
 
64
64
  async def a_params_async(self) -> None:
65
65
  await self.hello_params_async('a', 'b')
66
+
67
+ def test_jwt_with_option(self) -> None:
68
+ self.hello_params('a', 'b')
69
+
70
+ async def test_jwt_with_option_async(self) -> None:
71
+ await self.hello_params_async('a', 'b')
72
+
73
+ def test_oauth2_for_option(self) -> None:
74
+ self.hello_params('a', 'b')
75
+
76
+ async def test_oauth2_for_option_async(self) -> None:
77
+ await self.hello_params_async('a', 'b')
@@ -24,7 +24,7 @@ from setuptools import setup, find_packages
24
24
  """
25
25
  setup module for tea_python_tests.
26
26
 
27
- Created on 13/08/2025
27
+ Created on 19/12/2025
28
28
 
29
29
  @author: Alibaba
30
30
  """
@@ -24,7 +24,7 @@ from setuptools import setup, find_packages
24
24
  """
25
25
  setup module for tea_python_tests.
26
26
 
27
- Created on 13/08/2025
27
+ Created on 19/12/2025
28
28
 
29
29
  @author: Alibaba
30
30
  """
@@ -24,7 +24,7 @@ from setuptools import setup, find_packages
24
24
  """
25
25
  setup module for tea_python_tests.
26
26
 
27
- Created on 13/08/2025
27
+ Created on 19/12/2025
28
28
 
29
29
  @author: Alibaba
30
30
  """
@@ -14,6 +14,10 @@ class MyModel(DaraModel):
14
14
  def __init__(
15
15
  self,
16
16
  model: main_models.MyModelModel = None,
17
+ cors_rules: str = None,
18
+ cors_rules_cors_r: str = None,
19
+ xml_parser_http_message: str = None,
20
+ test_oauth2_name: str = None,
17
21
  stringfield: str = None,
18
22
  bytesfield: bytes = None,
19
23
  stringarrayfield: List[str] = None,
@@ -60,6 +64,10 @@ class MyModel(DaraModel):
60
64
  link: str = None,
61
65
  ):
62
66
  self.model = model
67
+ self.cors_rules = cors_rules
68
+ self.cors_rules_cors_r = cors_rules_cors_r
69
+ self.xml_parser_http_message = xml_parser_http_message
70
+ self.test_oauth2_name = test_oauth2_name
63
71
  self.stringfield = stringfield
64
72
  self.bytesfield = bytesfield
65
73
  self.stringarrayfield = stringarrayfield
@@ -109,6 +117,10 @@ class MyModel(DaraModel):
109
117
  self.validate_required(self.model, 'model')
110
118
  if self.model:
111
119
  self.model.validate()
120
+ self.validate_required(self.cors_rules, 'cors_rules')
121
+ self.validate_required(self.cors_rules_cors_r, 'cors_rules_cors_r')
122
+ self.validate_required(self.xml_parser_http_message, 'xml_parser_http_message')
123
+ self.validate_required(self.test_oauth2_name, 'test_oauth2_name')
112
124
  self.validate_required(self.stringfield, 'stringfield')
113
125
  self.validate_required(self.bytesfield, 'bytesfield')
114
126
  self.validate_required(self.stringarrayfield, 'stringarrayfield')
@@ -220,6 +232,18 @@ class MyModel(DaraModel):
220
232
  if self.model is not None:
221
233
  result['model'] = self.model.to_map()
222
234
 
235
+ if self.cors_rules is not None:
236
+ result['CORSRules'] = self.cors_rules
237
+
238
+ if self.cors_rules_cors_r is not None:
239
+ result['CORSRulesCORSR'] = self.cors_rules_cors_r
240
+
241
+ if self.xml_parser_http_message is not None:
242
+ result['XMLParserHTTPMessage'] = self.xml_parser_http_message
243
+
244
+ if self.test_oauth2_name is not None:
245
+ result['TestOAuth2Name'] = self.test_oauth2_name
246
+
223
247
  if self.stringfield is not None:
224
248
  result['stringfield'] = self.stringfield
225
249
 
@@ -405,6 +429,18 @@ class MyModel(DaraModel):
405
429
  temp_model = main_models.MyModelModel()
406
430
  self.model = temp_model.from_map(m.get('model'))
407
431
 
432
+ if m.get('CORSRules') is not None:
433
+ self.cors_rules = m.get('CORSRules')
434
+
435
+ if m.get('CORSRulesCORSR') is not None:
436
+ self.cors_rules_cors_r = m.get('CORSRulesCORSR')
437
+
438
+ if m.get('XMLParserHTTPMessage') is not None:
439
+ self.xml_parser_http_message = m.get('XMLParserHTTPMessage')
440
+
441
+ if m.get('TestOAuth2Name') is not None:
442
+ self.test_oauth2_name = m.get('TestOAuth2Name')
443
+
408
444
  if m.get('stringfield') is not None:
409
445
  self.stringfield = m.get('stringfield')
410
446
 
@@ -24,7 +24,7 @@ from setuptools import setup, find_packages
24
24
  """
25
25
  setup module for tea_python_tests.
26
26
 
27
- Created on 13/08/2025
27
+ Created on 19/12/2025
28
28
 
29
29
  @author: Alibaba
30
30
  """
@@ -24,7 +24,7 @@ from setuptools import setup, find_packages
24
24
  """
25
25
  setup module for tea_python_tests.
26
26
 
27
- Created on 13/08/2025
27
+ Created on 19/12/2025
28
28
 
29
29
  @author: Alibaba
30
30
  """
@@ -24,7 +24,7 @@ from setuptools import setup, find_packages
24
24
  """
25
25
  setup module for tea_python_tests.
26
26
 
27
- Created on 13/08/2025
27
+ Created on 19/12/2025
28
28
 
29
29
  @author: Alibaba
30
30
  """
@@ -24,7 +24,7 @@ from setuptools import setup, find_packages
24
24
  """
25
25
  setup module for tea_python_tests.
26
26
 
27
- Created on 13/08/2025
27
+ Created on 19/12/2025
28
28
 
29
29
  @author: Alibaba
30
30
  """
@@ -24,7 +24,7 @@ from setuptools import setup, find_packages
24
24
  """
25
25
  setup module for tea_python_tests.
26
26
 
27
- Created on 13/08/2025
27
+ Created on 19/12/2025
28
28
 
29
29
  @author: Alibaba
30
30
  """