diff --git a/lib/generator.js b/lib/generator.js index 91539af..97ab1b9 100644 --- a/lib/generator.js +++ b/lib/generator.js @@ -10,7 +10,8 @@ const { _name, _vid, _string, _upperFirst, _type, _escape, _subModelName, _camelCase, _snakeCase, _getImport, _isBinaryOp, _adaptedQuotes, CORE, REQUEST, RESPONSE, - _avoidKeywords, _removeFilesInDirectory + _avoidKeywords, _removeFilesInDirectory, _sortImports, + _importsToString, } = require('./helper'); const getBuiltin = require('./builtin'); const { Tag } = require('@darabonba/parser/lib/tag'); @@ -68,7 +69,7 @@ class Visitor { recursive: true }); } - this.package = {}; + this.package = this.config.packageInfo || {}; this.initSetupPy(); } @@ -76,18 +77,18 @@ class Visitor { // 初始化包信息 this.package.name = this.package.name || this.config.package; this.package.version = this.package.version || '1.0.0'; - this.package.description = this.package.description || ''; + this.package.description = this.package.desc || ''; this.package.author = this.package.author || 'Alibaba'; - this.package.author_email = this.package.author_email || 'sdk-team@alibabacloud.com'; - this.package.url = this.package.url || 'https://github.com/'; + this.package.author_email = this.package.email || 'sdk-team@alibabacloud.com'; + this.package.url = this.package.github || 'https://github.com/'; this.package.license = this.package.license || 'Apache License 2.0'; - this.package.requires = this.package.requires || []; - + this.package.requires = this.package.require || []; + // 收集依赖信息 if (!this.package.dependencies) { this.package.dependencies = {}; } - + Object.keys(this.typedef).forEach(type => { if (this.typedef[type].package) { let [pkgName, version] = this.typedef[type].package.split(':'); @@ -96,7 +97,8 @@ class Visitor { } } }); - + const date = new Date(); + // 创建 setup.py 内容 const setupPyContent = ` # -*- coding: utf-8 -*- @@ -123,14 +125,14 @@ import os from setuptools import setup, find_packages """ -setup module for tea_python_tests. +setup module for ${this.package.name}. -Created on * +Created on ${('0' + date.getDate()).slice(-2) + '/' + ('0' + (date.getMonth() + 1)).slice(-2) + '/' + date.getFullYear()} -@author: Alibaba +@author: ${this.package.author} """ -PACKAGE = "${this.package.name}" +PACKAGE = "${this.config.package}" NAME = "${this.package.name}" DESCRIPTION = "${this.package.description}" AUTHOR = "${this.package.author}" @@ -138,13 +140,13 @@ AUTHOR_EMAIL = "${this.package.author_email}" URL = "${this.package.url}" VERSION = __import__(PACKAGE).__version__ REQUIRES = [ - "darabonba-core>=1.0.0, <2.0.0", + "darabonba-core>=1.0.0, <2.0.0"${this.package.requires.length > 0 || Object.keys(this.package.dependencies).length > 0 ? ',' : ''} ${Object.keys(this.package.dependencies).map(pkg => { - if(this.package.dependencies[pkg].includes('rc')) { + if (this.package.dependencies[pkg].includes('rc')) { return ` "${pkg}==${this.package.dependencies[pkg]}"`; } return ` "${pkg}>=${this.package.dependencies[pkg]}, <${+this.package.dependencies[pkg].split('.')[0] + 1}.0.0"`; - }).join(',\n')} + }).join(',\n')}${this.package.requires.length > 0 ? ',\n "' + this.package.requires.join('",\n "') + '"' : ''} ] LONG_DESCRIPTION = '' @@ -162,34 +164,36 @@ setup( author_email=AUTHOR_EMAIL, license="Apache License 2.0", url=URL, - keywords=["tea","python","tests"], + keywords=${JSON.stringify(this.package.name ? this.package.name.split(/_|-/) : [])}, packages=find_packages(exclude=["tests*"]), include_package_data=True, platforms="any", install_requires=REQUIRES, - python_requires=">=3.6", + python_requires=">=3.7", classifiers=( "Development Status :: 4 - Beta", "Intended Audience :: Developers", "License :: OSI Approved :: Apache Software License", "Programming Language :: Python", "Programming Language :: Python :: 3", - "Programming Language :: Python :: 3.6", "Programming Language :: Python :: 3.7", "Programming Language :: Python :: 3.8", "Programming Language :: Python :: 3.9", + "Programming Language :: Python :: 3.10", + "Programming Language :: Python :: 3.11", + "Programming Language :: Python :: 3.12", "Topic :: Software Development" ) ) `.trim(); - + // 将内容写入 setup.py 文件 const setupPath = path.join(this.outputDir, 'setup.py'); fs.writeFileSync(setupPath, setupPyContent); } - - - + + + saveInnerModule(ast) { const keys = ast.innerModule.keys(); @@ -213,7 +217,7 @@ setup( save(filepath) { let targetPath = filepath; - if(path.resolve(filepath).startsWith(path.resolve(this.outputDir))) { + if (path.resolve(filepath).startsWith(path.resolve(this.outputDir))) { const baseDir = path.join(this.outputDir, path.sep); filepath = filepath.replace(baseDir, ''); } @@ -238,18 +242,18 @@ setup( } overwrite(ast, filepath) { - if(!ast.moduleBody.nodes || !ast.moduleBody.nodes.length) { + if (!ast.moduleBody.nodes || !ast.moduleBody.nodes.length) { return; } const beginNotes = DSL.note.getNotes(this.notes, 0, ast.moduleBody.nodes[0].tokenRange[0]); const overwirte = beginNotes.find(note => note.note.lexeme === '@overwrite'); let targetPath = filepath; - if(path.resolve(filepath).startsWith(path.resolve(this.outputDir))) { + if (path.resolve(filepath).startsWith(path.resolve(this.outputDir))) { const baseDir = path.join(this.outputDir, path.sep); filepath = filepath.replace(baseDir, ''); } targetPath = path.join(this.outputDir, filepath); - if(overwirte && overwirte.arg.value === false && fs.existsSync(targetPath)) { + if (overwirte && overwirte.arg.value === false && fs.existsSync(targetPath)) { return false; } return true; @@ -257,7 +261,7 @@ setup( modelBefore() { // clear model.py - if(fs.existsSync(this.modelPath + '.py')) { + if (fs.existsSync(this.modelPath + '.py')) { fs.unlinkSync(this.modelPath + '.py'); } _removeFilesInDirectory(this.modelPath); @@ -266,8 +270,8 @@ setup( visitModuleInit() { const initFile = path.join(this.outputDir, this.config.package, '__init__.py'); - if(!fs.existsSync(initFile)) { - if(!fs.existsSync(path.dirname(initFile))) { + if (!fs.existsSync(initFile)) { + if (!fs.existsSync(path.dirname(initFile))) { fs.mkdirSync(path.dirname(initFile), { recursive: true }); @@ -293,11 +297,11 @@ setup( this.fileBuffer = {}; this.usedTypes = []; this.imports = []; - if(this.overwrite(ast, filepath) === false) { + if (this.overwrite(ast, filepath) === false) { return; } - if(!this.className) { + if (!this.className) { let clientName = this.config.clientName.replace(/(?:^|_)([a-z])/g, (_, c) => (c ? c.toUpperCase() : '')); this.className = clientName; } @@ -335,7 +339,7 @@ setup( return item.type === 'exception'; }); - + if (exceptions.length > 0) { for (let i = 0; i < exceptions.length; i++) { this.eachException(exceptions[i], level); @@ -350,7 +354,7 @@ setup( this.visitAnnotation(ast.annotation, level); - + // models definition this.apiBefore(level); @@ -380,7 +384,7 @@ setup( this.emit(` def __init__(self): pass\n`); } - + const apis = ast.moduleBody.nodes.filter((item) => { return item.type === 'api'; }); @@ -558,7 +562,7 @@ setup( this.visitType(item.value); this.emit(' = None\n', level); }); - if(ast.params.params.length !== 0) { + if (ast.params.params.length !== 0) { this.emit('\n'); this.emit('def __init__(\n', level + 2); this.emit('self,\n', level + 4); @@ -577,7 +581,7 @@ setup( } else { this.emit('def __init__(self):\n', level + 2); } - if (ast.initBody && ast.initBody.stmts.length !==0 ) { + if (ast.initBody && ast.initBody.stmts.length !== 0) { this.isStaticFunction = false; this.visitStmts(ast.initBody, level + 4); this.isStaticFunction = true; @@ -609,7 +613,7 @@ setup( pyPath = pyPath.split('/').map(dir => _snakeCase(dir)).join(path.sep); pyPath = `${pyPath}`; } - + const classNamespace = this.getClassNamespace(pyPath); const className = this.getInnerClient(aliasId, pyPath); const aliasName = this.getAliasName(className, aliasId); @@ -628,7 +632,7 @@ setup( } let targetPath = ''; if (moduleDir.startsWith('./') || moduleDir.startsWith('../')) { - targetPath = path.join( this.config.pkgDir, moduleDir); + targetPath = path.join(this.config.pkgDir, moduleDir); } else if (moduleDir.startsWith('/')) { targetPath = moduleDir; } else { @@ -646,7 +650,7 @@ setup( let classNamespace = pyPkg.package; let models = 'models'; let exceptions = 'exceptions'; - if(inner && pkg.exports[inner]) { + if (inner && pkg.exports[inner]) { let pyPath = pkg.exports[inner]; filename = pyPath.split(path.sep).slice(-1)[0].replace(/(\.tea)$|(\.spec)$|(\.dara)$/gi, ''); models = filename + '_models'; @@ -669,7 +673,7 @@ setup( }; // 这部分处理setup.py if (pkg.releases && pkg.releases.python) { - const REQUIRE = pkg.releases.python ; + const REQUIRE = pkg.releases.python; const [pkgName, version] = REQUIRE.split(':'); this.package.dependencies[pkgName] = `${version}`; } @@ -699,7 +703,7 @@ setup( className: this.moduleTypedef[aliasId][type].type, }); } - + return this.getTypedefType(this.moduleTypedef[aliasId][type].type); } } @@ -719,19 +723,19 @@ setup( } getTypedefType(type) { - if(/\bDict\b/.test(type)) { + if (/\bDict\b/.test(type)) { this.usedTypes.push('Dict'); } - if(/\bList\b/.test(type)) { + if (/\bList\b/.test(type)) { this.usedTypes.push('List'); } - if(/\bAny\b/.test(type)) { + if (/\bAny\b/.test(type)) { this.usedTypes.push('Any'); } - if(/\bBinaryIO\b/.test(type)) { + if (/\bBinaryIO\b/.test(type)) { this.usedTypes.push('BinaryIO'); } @@ -746,7 +750,7 @@ setup( return; } this.emit('(\n'); - if (instanceFunc){ + if (instanceFunc) { this.emit('self,\n', level); } for (var i = 0; i < ast.params.length; i++) { @@ -761,7 +765,7 @@ setup( } } this.emit('\n'); - this.emit(')',level - 2); + this.emit(')', level - 2); } visitType(ast, level) { @@ -829,17 +833,17 @@ setup( this.emit(typeName); } } - + visitTypeWithNone(ast, level) { this.visitType(ast, level); this.emit(' = None'); } - + visitReturnType(ast, level) { this.emit(' -> '); - if(this.isIterator(ast.returnType)) { - if(this.isAsyncFunction) { + if (this.isIterator(ast.returnType)) { + if (this.isAsyncFunction) { this.usedTypes.push('AsyncGenerator'); this.emit('AsyncGenerator['); } else { @@ -847,7 +851,7 @@ setup( this.emit('Generator['); } } - + this.visitType(ast.returnType, level); if (this.isIterator(ast.returnType)) { this.emit(', None, None]'); @@ -864,16 +868,16 @@ setup( visitRuntimeBefore(ast, level) { assert.equal(ast.type, 'object'); this.emit('_runtime = {\n', level + 2); - if(ast.fields.length !== 0){ + if (ast.fields.length !== 0) { ast.fields.forEach((field) => { this.emit(`'${field.fieldName.lexeme}': `, level + 4); this.visitExpr(field.expr); this.emit(',\n'); }); } - this.emit('}\n', level +2); - this.emit('_last_request = None\n', level+2); - this.emit('_last_response = None\n', level+2); + this.emit('}\n', level + 2); + this.emit('_last_request = None\n', level + 2); + this.emit('_last_response = None\n', level + 2); this.emit('_retries_attempted = 0\n', level + 2); this.emit(`_context = RetryPolicyContext( retries_attempted= _retries_attempted @@ -956,16 +960,16 @@ setup( if (externEx && externEx.has(modelName)) { type = 'exception'; } - + this.emit(this.getModelName(modelName, _name(moduleId)), type); - + } else if (value.type === 'subModel') { const [moduleId, ...rest] = value.path; const modelName = _subModelName([moduleId.lexeme, ...rest.map((item) => { return item.lexeme; })].join('.')); this.emit(this.getModelName(modelName)); - } else if (typeof value.fieldType === 'string'){ + } else if (typeof value.fieldType === 'string') { const type = _type(value.fieldType); this.pushImports(type); this.emit(type); @@ -978,7 +982,7 @@ setup( type = 'exception'; } this.emit(this.getModelName(modelName, _name(moduleId), type)); - + } else if (value.fieldType.type === 'moduleTypedef') { const [moduleId, ...rest] = value.fieldType.path; const type = rest.map((item) => { return item.lexeme; }).join('.'); @@ -1015,7 +1019,7 @@ setup( assert.equal(ast.type, 'modelBody'); this.visitFieldsInit(ast, level, modelName); let node; - + for (let i = 0; i < ast.nodes.length; i++) { node = ast.nodes[i]; let comments = DSL.comment.getFrontComments(this.comments, node.tokenRange[0]); @@ -1033,7 +1037,7 @@ setup( this.emit('\n'); // validate this.emit('def validate(self):\n', level); - if(ast.nodes.length > 0) { + if (ast.nodes.length > 0) { this.visitModelValidate(ast, level); } else { this.emit('pass\n', level + 2); @@ -1047,7 +1051,7 @@ setup( // from_map this.visitFromMap(ast, modelName, level); - + if (node) { //find the last node's back comment let comments = DSL.comment.getBetweenComments(this.comments, node.tokenRange[0], ast.tokenRange[1]); @@ -1064,11 +1068,11 @@ setup( visitFieldValidate(fieldValue, fieldName, value, level) { const deep = Math.floor(level / 4); - if (fieldValue.type === 'modelBody' || fieldValue.type === 'moduleModel' || - fieldValue.type === 'subModel' || fieldValue.idType === 'model' || - (fieldValue.fieldType && (fieldValue.fieldType.type === 'moduleModel' || - fieldValue.fieldType.idType === 'model' || fieldValue.fieldType.idType === 'builtin_model'))) { - if(deep > 1) { + if (fieldValue.type === 'modelBody' || fieldValue.type === 'moduleModel' || + fieldValue.type === 'subModel' || fieldValue.idType === 'model' || + (fieldValue.fieldType && (fieldValue.fieldType.type === 'moduleModel' || + fieldValue.fieldType.idType === 'model' || fieldValue.fieldType.idType === 'builtin_model'))) { + if (deep > 1) { this.emit(` if ${value}:\n`, level); } this.emit(`${value}.validate()\n`, level + 2); @@ -1079,7 +1083,7 @@ setup( this.emit(`for v${deep} in self.${fieldName}.values():\n`, level); this.visitFieldValidate(fieldValue.valueType, fieldName, `v${deep}`, level + 2); } else { - if(deep > 1) { + if (deep > 1) { this.emit(` if ${value}:\n`, level); } this.emit(`${value}.validate()\n`, level + 2); @@ -1101,95 +1105,95 @@ setup( // 这里判断类中属性是否是必填 if (node.required) { notPass = true; - this.emit(`self.validate_required(self.${param}, '${param}')\n`, level + 2); + this.emit(`self.validate_required(self.${param}, '${param}')\n`, level + 2); } // 这里判断类中属性的结构 - if(node.fieldValue.fieldType === 'array' || node.fieldValue.fieldType === 'map' || + if (node.fieldValue.fieldType === 'array' || node.fieldValue.fieldType === 'map' || node.fieldValue.type === 'array' || node.fieldValue.type === 'map' ) { // 下面不包含model的就不需要validate - if(!this.checkFieldHasModel(node.fieldValue)){ + if (!this.checkFieldHasModel(node.fieldValue)) { continue; } notPass = true; this.emit(`if self.${param}:\n`, level + 2); this.visitFieldValidate(node.fieldValue, param, `self.${param}`, level + 4); - } else if(node.fieldValue.fieldType && node.fieldValue.fieldType.idType === 'model' || node.fieldValue.type === 'modelBody'){ + } else if (node.fieldValue.fieldType && node.fieldValue.fieldType.idType === 'model' || node.fieldValue.type === 'modelBody') { notPass = true; this.emit(`if self.${param}:\n`, level + 2); this.emit(`self.${param}.validate()\n`, level + 4); - } else if(pattern !== ''){ + } else if (pattern !== '') { notPass = true; this.emit(`if self.${param} is not None:\n`, level + 2); this.emit(`self.validate_pattern(self.${param}, '${param}', '${pattern}')\n`, level + 4); - } else if(maxLength > 0 && maxLength <= 2147483647){ + } else if (maxLength > 0 && maxLength <= 2147483647) { notPass = true; this.emit(`if self.${param} is not None:\n`, level + 2); this.emit(`self.validate_max_length(self.${param}, '${param}', ${maxLength})\n`, level + 4); - } else if(minLength > 0 && minLength <= 2147483647){ + } else if (minLength > 0 && minLength <= 2147483647) { notPass = true; this.emit(`if self.${param} is not None:\n`, level + 2); this.emit(`self.validate_min_length(self.${param}, '${param}', ${minLength})\n`, level + 4); - } else if(maximum > 0 && maximum <= Number.MAX_SAFE_INTEGER){ + } else if (maximum > 0 && maximum <= Number.MAX_SAFE_INTEGER) { notPass = true; this.emit(`if self.${param} is not None:\n`, level + 2); this.emit(`self.validate_maximum(self.${param}, '${param}', ${maximum})\n`, level + 4); - } else if(minimum > 0 && minimum <= Number.MAX_SAFE_INTEGER){ + } else if (minimum > 0 && minimum <= Number.MAX_SAFE_INTEGER) { notPass = true; this.emit(`if self.${param} is not None:\n`, level + 2); this.emit(`self.validate_minimum(self.${param}, '${param}', ${minimum})\n`, level + 4); } } - if(!notPass) { + if (!notPass) { this.emit('pass\n', level + 2); } } visitToMapField(fieldValue, fieldName, key, value, level, arr = false) { const deep = Math.floor((level - 4) / 2); - if (fieldValue.type === 'modelBody' || fieldValue.type === 'moduleModel' || - fieldValue.type === 'subModel' || fieldValue.idType === 'model' || - (fieldValue.fieldType && (fieldValue.fieldType.type === 'moduleModel' || - fieldValue.fieldType.idType === 'model' || fieldValue.fieldType.idType === 'builtin_model'))) { + if (fieldValue.type === 'modelBody' || fieldValue.type === 'moduleModel' || + fieldValue.type === 'subModel' || fieldValue.idType === 'model' || + (fieldValue.fieldType && (fieldValue.fieldType.type === 'moduleModel' || + fieldValue.fieldType.idType === 'model' || fieldValue.fieldType.idType === 'builtin_model'))) { let realVal = `${value}.to_map()`; - if(deep > 1) { + if (deep > 1) { realVal += ` if ${value} else None`; } this.emitFieldConvert(key, realVal, level, arr); } else if (fieldValue.type === 'array' || fieldValue.fieldType === 'array') { - let subKey = key; - if(deep > 1) { + let subKey = key; + if (deep > 1) { subKey = `l${deep - 1}`; this.emit(`${subKey} = []\n`, level); } this.emit(`for k${deep} in ${value}:\n`, level); this.visitToMapField(fieldValue.fieldItemType || fieldValue.subType, fieldName, `${subKey}`, `k${deep}`, level + 2, true); - if(deep > 1) { + if (deep > 1) { this.emitFieldConvert(key, subKey, level, arr); } } else if (fieldValue.fieldType === 'map' || fieldValue.type === 'map') { - let subKey = key; - if(deep > 1) { + let subKey = key; + if (deep > 1) { subKey = `d${deep - 1}`; this.emit(`${subKey} = {}\n`, level); } this.emit(`for k${deep}, v${deep} in self.${fieldName}.items():\n`, level); this.visitToMapField(fieldValue.valueType, fieldName, `${subKey}[k${deep}]`, `v${deep}`, level + 2); - if(deep > 1) { + if (deep > 1) { this.emitFieldConvert(key, subKey, level, arr); } } else { this.emitFieldConvert(key, value, level, arr); } - + } visitToMap(ast, level) { this.emit('def to_map(self):\n', level); - this.emit('result = dict()\n' , level + 2); - this.emit('_map = super().to_map()\n' , level + 2); - this.emit('if _map is not None:\n' , level + 2); + this.emit('result = dict()\n', level + 2); + this.emit('_map = super().to_map()\n', level + 2); + this.emit('if _map is not None:\n', level + 2); this.emit('result = _map\n', level + 4); for (let i = 0; i < ast.nodes.length; i++) { const node = ast.nodes[i]; @@ -1199,7 +1203,7 @@ setup( let param = _avoidKeywords(_snakeCase(_escape(_name(node.fieldName)))); const hasModel = this.checkFieldHasModel(node.fieldValue); let arr = false; - if(hasModel && !this.config.noneEmpty) { + if (hasModel && !this.config.noneEmpty) { if (node.fieldValue.type === 'array' || node.fieldValue.fieldType === 'array') { this.emit(`result['${realName}'] = []\n`, level + 2); arr = true; @@ -1208,10 +1212,10 @@ setup( } } this.emit(`if self.${param} is not None:\n`, level + 2); - if(!hasModel) { + if (!hasModel) { this.emit(`result['${realName}'] = self.${param}\n`, level + 4); } else { - if(this.config.noneEmpty) { + if (this.config.noneEmpty) { if (node.fieldValue.type === 'array' || node.fieldValue.fieldType === 'array') { this.emit(`result['${realName}'] = []\n`, level + 4); arr = true; @@ -1228,7 +1232,7 @@ setup( } emitFieldConvert(key, value, level, arr) { - if(arr) { + if (arr) { this.emit(`${key}.append(${value})\n`, level); return; } @@ -1243,28 +1247,28 @@ setup( this.emitFieldConvert(key, `temp_model.from_map(${value})`, level, arr); } else if (fieldValue.type === 'array' || fieldValue.fieldType === 'array') { let subKey = key; - if(deep > 1) { + if (deep > 1) { subKey = `l${deep - 1}`; this.emit(`${subKey} = []\n`, level); } this.emit(`for k${deep} in ${value}:\n`, level); this.visitFromField(fieldValue.fieldItemType || fieldValue.subType, fieldName, `${subKey}`, `k${deep}`, level + 2, true); - if(deep > 1) { + if (deep > 1) { this.emitFieldConvert(key, subKey, level, arr); } } else if (fieldValue.fieldType === 'map' || fieldValue.type === 'map') { let subKey = key; - if(deep > 1) { + if (deep > 1) { subKey = `d${deep - 1}`; this.emit(`${subKey} = {}\n`, level); } this.emit(`for k${deep}, v${deep} in ${value}.items():\n`, level); this.visitFromField(fieldValue.valueType, fieldName, `${subKey}[k${deep}]`, `v${deep}`, level + 2); - if(deep > 1) { + if (deep > 1) { this.emitFieldConvert(key, subKey, level, arr); } - } else if (fieldValue.type === 'moduleModel' || - (fieldValue.fieldType && fieldValue.fieldType.type === 'moduleModel')) { + } else if (fieldValue.type === 'moduleModel' || + (fieldValue.fieldType && fieldValue.fieldType.type === 'moduleModel')) { const [moduleId, ...rest] = fieldValue.path || fieldValue.fieldType.path; const modelName = _subModelName(rest.map((item) => { return item.lexeme; @@ -1294,7 +1298,7 @@ setup( } else { this.emitFieldConvert(key, value, level, arr); } - + } visitFromMap(ast, modelName, level) { @@ -1309,7 +1313,7 @@ setup( let param = _avoidKeywords(_snakeCase(_escape(_name(node.fieldName)))); const hasModel = this.checkFieldHasModel(node.fieldValue); let arr = false; - if(hasModel && !this.config.noneEmpty) { + if (hasModel && !this.config.noneEmpty) { if (node.fieldValue.type === 'array' || node.fieldValue.fieldType === 'array') { this.emit(`self.${param} = []\n`, level + 2); arr = true; @@ -1319,10 +1323,10 @@ setup( } } this.emit(`if m.get('${realName}') is not None:\n`, level + 2); - if(!hasModel) { + if (!hasModel) { this.emit(`self.${param} = m.get('${realName}')\n`, level + 4); } else { - if(this.config.noneEmpty) { + if (this.config.noneEmpty) { if (node.fieldValue.type === 'array' || node.fieldValue.fieldType === 'array') { this.emit(`self.${param} = []\n`, level + 4); arr = true; @@ -1339,21 +1343,21 @@ setup( this.emit('\n'); } - getAttributes(ast, name){ + getAttributes(ast, name) { const attr = ast.attrs.find((item) => { return item.attrName.lexeme === name; }); - if(!attr) { + if (!attr) { return; } return attr.attrValue.string || attr.attrValue.lexeme || attr.attrValue.value; } - extendBaseErr(extendOn){ + extendBaseErr(extendOn) { if (!extendOn) { return true; } - if(_name(extendOn) === '$Error') { + if (_name(extendOn) === '$Error') { return true; } @@ -1366,21 +1370,21 @@ setup( return type === 'model' ? this.emit(`(${CORE}Model)`) : this.emit(`(${CORE}Exception)`); } - switch(_name(extendOn)) { - case '$Error': + switch (_name(extendOn)) { + case '$Error': this.pushImports(`${CORE}Exception`); this.emit(`(${CORE}Exception)`); return; - case '$ResponseError': + case '$ResponseError': this.pushImports('ResponseException'); this.emit('(ResponseException)'); return; - case '$Model': + case '$Model': this.pushImports(`${CORE}Model`); this.emit(`(${CORE}Model)`); return; } - + let needBaseException = false; if (extendOn.type === 'moduleModel') { @@ -1406,7 +1410,7 @@ setup( this.emit('('); this.emit(this.getModelName(_upperFirst(_name(extendOn)), extendOn.moduleName, type)); } - if(needBaseException) { + if (needBaseException) { this.emit(`, ${CORE}Exception`); } this.emit(')'); @@ -1420,11 +1424,11 @@ setup( fileds.push(fieldName); } const extendFileds = []; - for (let i = 0; i < ast.extendFileds.length; i++) { + for (let i = 0; i < ast.extendFileds.length; i++) { const node = ast.extendFileds[i]; node.extend = true; const fieldName = _name(node.fieldName); - if(fileds.includes(fieldName)) { + if (fileds.includes(fieldName)) { continue; } extendFileds.push(node); @@ -1446,7 +1450,7 @@ setup( } saveBuffer(filepath) { - if(this.fileBuffer[filepath]) { + if (this.fileBuffer[filepath]) { this.fileBuffer[filepath].imports = this.imports.concat(this.fileBuffer[filepath].imports); this.fileBuffer[filepath].usedTypes = this.usedTypes.concat(this.fileBuffer[filepath].usedTypes); this.fileBuffer[filepath].output = this.output + this.fileBuffer[filepath].output; @@ -1498,39 +1502,39 @@ setup( modelNames.push(modelName); this.emit(`from ._${_snakeCase(mainModelName)} import ${modelName}\n`); } - + this.emit('\n__all__ = [\n'); this.emit(modelNames.join(',\n '), 2); - if(moreExports && moreExports.length > 0) { + if (moreExports && moreExports.length > 0) { this.emit((',\n')); this.emit(moreExports.join(',\n '), 2); } - + this.emit('\n]\n'); this.save(path.join(this.modelPath, '__init__.py')); this.moreExports = []; } - visitFieldsInit(ast, level, modelName, type = 'model', baseErr = false){ + visitFieldsInit(ast, level, modelName, type = 'model', baseErr = false) { let node; this.emit(' def __init__('); const paramNodes = this.dealExtendFileds(ast); - if (!paramNodes.length) { + if (!paramNodes.length) { this.emit('self):\n'); this.emit('pass', level + 2); return; } this.emit('\n'); - this.emit(`self,${ this.config.strictModel ? ' *,' : '' }\n`, level + 2); + this.emit(`self,${this.config.strictModel ? ' *,' : ''}\n`, level + 2); for (let i = 0; i < paramNodes.length; i++) { node = paramNodes[i]; - if(!node.extend) { + if (!node.extend) { let comments = DSL.comment.getFrontComments(this.comments, node.tokenRange[0]); this.visitComments(comments, level); } let param = _avoidKeywords(_snakeCase(_escape(_name(node.fieldName)))); - if(param === 'name' && type === 'exception') { + if (param === 'name' && type === 'exception') { continue; } this.emit(`${param}: `, level + 2); @@ -1538,16 +1542,16 @@ setup( this.emit(' = None,\n'); } this.emit('):\n', level); - - if(ast.extendFileds && ast.extendFileds.length > 0) { + + if (ast.extendFileds && ast.extendFileds.length > 0) { this.emit('super().__init__(', level + 2); - if(baseErr) { + if (baseErr) { this.emit('{\n'); for (let i = 0; i < ast.extendFileds.length; i++) { node = ast.extendFileds[i]; let value = _snakeCase(_escape(_name(node.fieldName))); let key = _avoidKeywords(_escape(_name(node.fieldName))); - if(key === 'name' && type === 'exception') { + if (key === 'name' && type === 'exception') { continue; } this.emit(`'${key}': ${value},\n`, level + 4); @@ -1558,7 +1562,7 @@ setup( for (let i = 0; i < ast.extendFileds.length; i++) { node = ast.extendFileds[i]; let param = _avoidKeywords(_snakeCase(_escape(_name(node.fieldName)))); - if(param === 'name' && type === 'exception') { + if (param === 'name' && type === 'exception') { continue; } this.emit(`${param} = ${param},\n`, level + 4); @@ -1572,14 +1576,14 @@ setup( assert.equal(ast.type, 'exceptionBody'); this.visitFieldsInit(ast, level, exceptionName, 'exception', this.extendBaseErr(extendOn)); let node; - + this.emit(`self.name = '${exceptionName}Exception'\n`, level + 2); for (let i = 0; i < ast.nodes.length; i++) { node = ast.nodes[i]; let comments = DSL.comment.getFrontComments(this.comments, node.tokenRange[0]); this.visitComments(comments, level); let param = _avoidKeywords(_snakeCase(_escape(_name(node.fieldName)))); - if(param === 'name') { + if (param === 'name') { continue; } this.emit(`self.${param} = ${param}\n`, level + 2); @@ -1626,7 +1630,7 @@ setup( exceptionNames.push(exceptionName); this.emit(`from ._${_snakeCase(exceptionName)} import ${exceptionName}Exception\n`); } - + this.emit('\n__all__ = [\n'); this.emit(exceptionNames.join('Exception,\n '), 2); this.emit('Exception\n]\n'); @@ -1658,7 +1662,7 @@ setup( } else { this.emit('\n'); } - } else if (ast.type !== 'expandField'){ + } else if (ast.type !== 'expandField') { throw new Error('unimpelemented'); } } @@ -1676,7 +1680,7 @@ setup( } else { this.emit('\n'); } - } else if (ast.type !== 'expandField'){ + } else if (ast.type !== 'expandField') { throw new Error('unimpelemented'); } } @@ -1700,10 +1704,10 @@ setup( } expandFields.push(ast.fields[i]); } - if (expandFields.length !== 0){ + if (expandFields.length !== 0) { this.pushImports(`${CORE}Core`); this.emit(`${CORE}Core.merge({`); - if(ast.fields.length !== expandFields.length) { + if (ast.fields.length !== expandFields.length) { this.emit('\n'); } } else { @@ -1714,7 +1718,7 @@ setup( } if (expandFields.length !== 0) { - if(ast.fields.length !== expandFields.length) { + if (ast.fields.length !== expandFields.length) { this.emit('', level); } this.emit('}, '); @@ -1727,7 +1731,7 @@ setup( } else { this.emit('}', level); } - + let comments = DSL.comment.getBetweenComments(this.comments, ast.fields[i - 1].tokenRange[0], ast.tokenRange[1]); this.visitComments(comments, level + 1); } @@ -1741,13 +1745,13 @@ setup( const method = name.replace('$', ''); this.builtin[name][method](ast, level, ast.isAsync && this.isAsyncFunction); return; - } else if(this.isStaticFunction === false && this.isAsyncFunction && ast.isAsync){ + } else if (this.isStaticFunction === false && this.isAsyncFunction && ast.isAsync) { this.emit(`await self.${functionName}_async`); - } else if(this.isStaticFunction === false) { + } else if (this.isStaticFunction === false) { this.emit(`self.${functionName}`); - } else if(ast.isAsync && this.isAsyncFunction) { + } else if (ast.isAsync && this.isAsyncFunction) { this.emit(`await ${this.className}.${functionName}_async`); - } else { + } else { const functionName = _snakeCase(name); this.emit(`${this.className}.${functionName}`); } @@ -1772,7 +1776,7 @@ setup( this.emit(aliasId); } this.emit(`.${(_avoidKeywords(_snakeCase(method)))}`); - if(async) { + if (async) { this.emit('_async'); } this.visitArgs(ast.args, level); @@ -1828,18 +1832,18 @@ setup( visitConstruct(ast, level) { assert.equal(ast.type, 'construct'); const aliasId = _name(ast.aliasId); - - if(this.builtin[aliasId]) { + + if (this.builtin[aliasId]) { const type = _type(aliasId); this.pushImports(type); this.emit(type); } else { this.emit(this.getModelName('', aliasId, 'module')); } - + this.visitArgs(ast.args, level); } - + visitSuper(ast, level) { assert.equal(ast.type, 'super'); @@ -1902,7 +1906,7 @@ setup( } else if (ast.type === 'object') { this.visitObject(ast, level); } else if (ast.type === 'variable') { - if(ast.inferred && ast.inferred.type === 'basic' && ast.inferred.name === 'class') { + if (ast.inferred && ast.inferred.type === 'basic' && ast.inferred.name === 'class') { this.emit(this.getModelName('', _name(ast.id), 'module')); } else { this.emit(_avoidKeywords(_snakeCase(_name(ast.id)))); @@ -1931,7 +1935,7 @@ setup( } } const quote = _adaptedQuotes(this.output); - this.output = tmp + `f${quote}${this.output}${quote}`; + this.output = tmp + `f${quote}${this.output}${quote}`; } else if (ast.type === 'call') { // 调用函数 this.visitCall(ast, level); @@ -1957,7 +1961,7 @@ setup( this.emit(' * '); } else if (ast.type === 'and') { this.emit(' and '); - // eslint-disable-next-line no-dupe-else-if + // eslint-disable-next-line no-dupe-else-if } else if (ast.type === 'or') { this.emit(' or '); } else if (ast.type === 'lte') { @@ -1975,7 +1979,7 @@ setup( } this.visitExpr(ast.right, level, env); } else if (ast.type === 'not') { - this.emit('not ',level); + this.emit('not ', level); this.visitExpr(ast.expr, level, env); } else if (ast.type === 'construct_model') { // 生成实例的初始化赋值 @@ -2014,7 +2018,7 @@ setup( return item.lexeme; })].join('.')); - if(mainModelName.startsWith('$') && _type(mainModelName)) { + if (mainModelName.startsWith('$') && _type(mainModelName)) { mainModelName = _type(mainModelName); this.pushImports(mainModelName); this.emit(mainModelName); @@ -2035,7 +2039,7 @@ setup( this.visitModelField(ast.object.fields[i], level, i === ast.object.fields.length - 1); } this.emit(')', level); - } else{ + } else { this.emit(')'); } @@ -2114,7 +2118,7 @@ setup( item = ast.items[i]; let comments = DSL.comment.getFrontComments(this.comments, item.tokenRange[0]); this.visitComments(comments, level); - this.emit('', level +2); + this.emit('', level + 2); this.visitExpr(item, level + 2); if (i < ast.items.length - 1) { this.emit(','); @@ -2137,7 +2141,7 @@ setup( return; } this.emit(' '); - + if (ast.needCast) { this.emit(`${CORE}Core.from_map(\n`); this.emit('', level + 2); @@ -2179,7 +2183,7 @@ setup( this.emit('\n'); this.emit(')', level); } - + this.emit('\n'); } @@ -2225,7 +2229,7 @@ setup( this.emit(':\n'); this.visitStmts(ast.stmts, level + 2); } - + visitFor(ast, level) { assert.equal(ast.type, 'for'); // this.emit('\n'); @@ -2235,8 +2239,8 @@ setup( this.emit('for ', level); } - if (ast.list.inferred && ast.list.inferred.itemType - && ast.list.inferred.itemType.type === 'entry'){ + if (ast.list.inferred && ast.list.inferred.itemType + && ast.list.inferred.itemType.type === 'entry') { this.emit('k, v in '); this.visitExpr(ast.list, level); } else { @@ -2253,11 +2257,11 @@ setup( this.visitExpr(ast.condition); this.emit(':\n'); this.visitStmts(ast.stmts, level + 2); - + if (ast.elseIfs) { for (let i = 0; i < ast.elseIfs.length; i++) { const branch = ast.elseIfs[i]; - this.emit('elif ',level); + this.emit('elif ', level); this.visitExpr(branch.condition); this.emit(':\n'); this.visitStmts(branch.stmts, level + 2); @@ -2325,7 +2329,7 @@ setup( visitDeclare(ast, level) { var id = _avoidKeywords(_snakeCase(_name(ast.id))); this.emit(`${id}`, level); - if(id === 'new_full_str'){ + if (id === 'new_full_str') { this.emit(''); } @@ -2356,7 +2360,7 @@ setup( //empty block's comment let comments = DSL.comment.getBetweenComments(this.comments, ast.tokenRange[0], ast.tokenRange[1]); this.visitComments(comments, level); - this.emit('pass\n',level); + this.emit('pass\n', level); } } @@ -2396,7 +2400,7 @@ setup( } else { this.isStaticFunction = false; } - + this.emit('', level); this.emit('def '); @@ -2409,7 +2413,7 @@ setup( } else { this.visitParams(ast.params, level, true); } - + // 返回值类型 this.visitReturnType(ast); this.emit(':\n'); @@ -2448,7 +2452,7 @@ setup( this.visitFunctionBody(ast.functionBody, secondLevel); } else { let comments = DSL.comment.getFrontComments(this.comments, ast.tokenRange[0]); - this.visitComments(comments, level+2); + this.visitComments(comments, level + 2); this.emit('raise Exception(\'Un-implemented\')\n', level + 2); } } @@ -2559,61 +2563,49 @@ setup( tempOutput += '# This file is auto-generated, don\'t edit it. Thanks.\n'; } - tempOutput += 'from __future__ import annotations\n'; - - const imports = []; - this.imports.forEach(ele => { - let header = ''; - if(ele.packageName) { - header += `from ${ele.packageName} `; - } - - if(ele.className) { - header += `import ${ele.className} `; - } - - if(ele.aliasName) { - header += `as ${ele.aliasName} `; - } - imports.push(header); + this.imports.push({ + packageName: '__future__', + className: 'annotations', }); - tempOutput += [...new Set(imports)].join('\n') + '\n'; - if (this.usedTypes.length > 0) { - tempOutput += 'from typing import ' - + [...new Set(this.usedTypes)].join(', '); - tempOutput += '\n'; + this.imports.push({ + packageName: 'typing', + className: [...new Set(this.usedTypes)].join(', '), + }); } - + const imports = _sortImports(this.imports); + + tempOutput += _importsToString(imports); + // 将临时输出插入到 this.output 的开头 this.output = tempOutput + '\n\n' + this.output; } modelInitBefore(ast, level) { let beginToken = 0; - if(ast.imports.length > 0) { + if (ast.imports.length > 0) { const lastIndex = ast.imports.length - 1; beginToken = ast.imports[lastIndex].tokenRange[0]; } let endToken = 0; - if(ast.moduleBody.nodes.length > 0) { + if (ast.moduleBody.nodes.length > 0) { endToken = ast.moduleBody.nodes[0].tokenRange[0]; } const beginNotes = DSL.note.getNotes(this.notes, beginToken, endToken); const part = beginNotes.find(note => note.note.lexeme === '@pythonModel'); - if(part && part.arg.value) { + if (part && part.arg.value) { this.emit(_string(part.arg.value)); } - if(part && part.arg.type === 'object') { + if (part && part.arg.type === 'object') { part.arg.fields.map(field => { - if(_name(field.fieldName) === 'header') { + if (_name(field.fieldName) === 'header') { this.emit(_string(field.expr.value)); } - if(_name(field.fieldName) === 'exports') { + if (_name(field.fieldName) === 'exports') { this.moreExports = field.expr.items.map(item => { return _string(item.value); }); @@ -2624,23 +2616,23 @@ setup( moduleBefore(ast, level) { let beginToken = 0; - if(ast.imports.length > 0) { + if (ast.imports.length > 0) { const lastIndex = ast.imports.length - 1; beginToken = ast.imports[lastIndex].tokenRange[0]; } - let endToken = 0; - if(ast.moduleBody.nodes.length > 0) { + let endToken = 0; + if (ast.moduleBody.nodes.length > 0) { endToken = ast.moduleBody.nodes[0].tokenRange[0]; } const beginNotes = DSL.note.getNotes(this.notes, beginToken, endToken); const part = beginNotes.find(note => note.note.lexeme === '@python'); - if(part && part.arg.value) { + if (part && part.arg.value) { this.emit(_string(part.arg.value)); } } apiBefore(level) { - + this.emit(`class ${this.className}`, level); if (this.parentModule) { const aliasId = _name(this.parentModule); @@ -2657,8 +2649,8 @@ setup( return this.checkFieldHasModel(fieldValue.fieldItemType || fieldValue.subType); } else if (fieldValue.fieldType === 'map' || fieldValue.type === 'map') { return this.checkFieldHasModel(fieldValue.valueType); - } else if (fieldValue.type === 'moduleModel' || - (fieldValue.fieldType && fieldValue.fieldType.type === 'moduleModel')) { + } else if (fieldValue.type === 'moduleModel' || + (fieldValue.fieldType && fieldValue.fieldType.type === 'moduleModel')) { return true; } else if (fieldValue.type === 'subModel') { return true; @@ -2681,15 +2673,15 @@ setup( } else if (obj.fieldItemType.fieldType === 'array') { // 如果 fieldItemType 仍然是数组 return this.checkFieldItemTypeAllString(obj.fieldItemType); - } else if (obj.fieldItemType.valueType && obj.fieldItemType.valueType.lexeme === 'any'){ + } else if (obj.fieldItemType.valueType && obj.fieldItemType.valueType.lexeme === 'any') { return true; } } - if (obj && obj.fieldType ==='map'){ + if (obj && obj.fieldType === 'map') { return this.checkFieldItemTypeAllString(obj.valueType); } - if (obj && obj.subType){ - if (obj.subType.type === 'map'){ + if (obj && obj.subType) { + if (obj.subType.type === 'map') { return this.checkFieldItemTypeAllString(obj.subType); } } @@ -2702,7 +2694,7 @@ setup( } getClassNamespace(pyPath) { - if(path.resolve(pyPath).startsWith(path.resolve(this.outputDir))) { + if (path.resolve(pyPath).startsWith(path.resolve(this.outputDir))) { const baseDir = path.join(this.outputDir, path.sep, this.config.package); pyPath = pyPath.replace(baseDir, ''); } @@ -2712,12 +2704,12 @@ setup( let className = this.config.package; arr.map(key => { - if(!key) { + if (!key) { return; } className += '.' + key; }); - + return className; } @@ -2740,11 +2732,11 @@ setup( const nameAttr = node.attrs.find((item) => { return item.attrName.lexeme === 'name'; }); - return nameAttr ?_string(nameAttr.attrValue) : _name(node.fieldName); + return nameAttr ? _string(nameAttr.attrValue) : _name(node.fieldName); } - getModelName(name, moduleName, type = 'model'){ - if(type === 'model' && !moduleName) { + getModelName(name, moduleName, type = 'model') { + if (type === 'model' && !moduleName) { const aliasName = 'main_models'; this.imports.push({ aliasName, @@ -2754,7 +2746,7 @@ setup( return `${aliasName}.${name}`; } - if(type === 'model' && moduleName) { + if (type === 'model' && moduleName) { const { namemespace, models } = this.packageInfo[moduleName]; const aliasName = `${_snakeCase(moduleName.replace(/-/g, ''))}_models`; this.imports.push({ @@ -2765,7 +2757,7 @@ setup( return `${aliasName}.${name}`; } - if(type === 'exception' && !moduleName) { + if (type === 'exception' && !moduleName) { const aliasName = 'main_exceptions'; this.imports.push({ aliasName, @@ -2775,7 +2767,7 @@ setup( return `${aliasName}.${name}Exception`; } - if(type === 'exception' && moduleName) { + if (type === 'exception' && moduleName) { const { namemespace, exceptions } = this.packageInfo[moduleName]; const aliasName = `${_snakeCase(moduleName.replace(/-/g, ''))}_exceptions`; this.imports.push({ @@ -2786,7 +2778,7 @@ setup( return `${aliasName}.${name}Exception`; } - if(type === 'module') { + if (type === 'module') { const { aliasName, clientName, @@ -2811,7 +2803,7 @@ setup( const moduleAst = this.ast.innerDep.get(aliasId); const beginNotes = DSL.note.getNotes(moduleAst.notes, 0, moduleAst.moduleBody.nodes[0].tokenRange[0]); const clientNote = beginNotes.find(note => note.note.lexeme === '@clientName'); - if(clientNote) { + if (clientNote) { return _string(clientNote.arg.value); } return 'Client'; @@ -2819,30 +2811,30 @@ setup( pushImports(type) { const pkg = _getImport(type); - if(pkg) { + if (pkg) { this.imports.push(pkg); return; } - if(type === 'sys') { + if (type === 'sys') { this.imports.push({ className: 'sys', }); } - if(type === 'Any' ) { + if (type === 'Any') { this.usedTypes.push('Any'); } - if(type === 'array') { + if (type === 'array') { this.usedTypes.push('List'); } - if(type === 'map') { + if (type === 'map') { this.usedTypes.push('Dict'); } - if(type === 'BinaryIO') { + if (type === 'BinaryIO') { this.usedTypes.push('BinaryIO'); } diff --git a/lib/helper.js b/lib/helper.js index 68ef3cd..c09f9e4 100644 --- a/lib/helper.js +++ b/lib/helper.js @@ -11,6 +11,23 @@ const keywords = [ 'lambda', 'nonlocal', 'not', 'or', 'pass', 'raise', 'return', 'try', 'while', 'with', 'yield' ]; +// 定义标准库模块列表(Python 3.x常用标准库) +const standardLibraries = new Set([ + '__future__', 'abc', 'argparse', 'ast', 'asyncio', 'base64', 'bisect', + 'builtins', 'calendar', 'collections', 'concurrent', 'configparser', + 'contextlib', 'copy', 'csv', 'datetime', 'decimal', 'difflib', + 'email', 'enum', 'errno', 'faulthandler', 'fileinput', 'fnmatch', + 'fractions', 'functools', 'gc', 'glob', 'gzip', 'hashlib', 'heapq', + 'hmac', 'html', 'http', 'importlib', 'inspect', 'io', 'ipaddress', + 'itertools', 'json', 'keyword', 'linecache', 'locale', 'logging', + 'lzma', 'math', 'mimetypes', 'multiprocessing', 'numbers', 'operator', + 'os', 'pathlib', 'pickle', 'platform', 'pprint', 'queue', 'random', + 're', 'reprlib', 'secrets', 'shlex', 'shutil', 'signal', 'socket', + 'sqlite3', 'ssl', 'statistics', 'string', 'subprocess', 'sys', + 'tarfile', 'tempfile', 'textwrap', 'threading', 'time', 'timeit', + 'traceback', 'types', 'typing', 'unittest', 'urllib', 'uuid', + 'warnings', 'weakref', 'xml', 'zipfile', 'zlib' +]); const builtinModels = [ '$Request', '$Response', '$Error', '$SSEEvent', '$Model', @@ -192,7 +209,7 @@ function _camelCase(str, split = '_') { // 如果没有下划线,对整个字符串首字母大写 str = _upperFirst(str); } - + return str; } @@ -258,12 +275,12 @@ function _isBuiltinModel(name) { } function _isDefault(expr) { - if(expr.type !== 'call' || expr.left.type !== 'method_call') { + if (expr.type !== 'call' || expr.left.type !== 'method_call') { return false; } const name = _name(expr.left.id); - if(name !== '$default') { + if (name !== '$default') { return false; } @@ -296,7 +313,7 @@ function _type(name) { return 'int'; } - if(name === 'float' || name === 'double') { + if (name === 'float' || name === 'double') { return 'float'; } @@ -395,7 +412,7 @@ function _escape(str) { } function _removeFilesInDirectory(directoryPath) { - if(!fs.existsSync(directoryPath)) { + if (!fs.existsSync(directoryPath)) { return; } const files = fs.readdirSync(directoryPath); @@ -412,6 +429,212 @@ function _removeFilesInDirectory(directoryPath) { } } +/** + * 按照Python PEP 8标准对imports进行排序 + * @param {Array} imports - import对象数组 + * @returns {Array} 排序后的imports数组 + */ +function _sortImports(imports) { + function isStandardLibrary(packageName) { + if (!packageName) { return false; } + + // 处理子模块,如 os.path -> os + const rootModule = packageName.split('.')[0]; + return standardLibraries.has(rootModule); + } + + function isThirdPartyLibrary(packageName) { + if (!packageName) { return false; } + + // 不是标准库且不是相对导入(不以.开头) + return !isStandardLibrary(packageName) && !packageName.startsWith('.'); + } + + function isLocalImport(packageName) { + if (!packageName) { return false; } + + // 以.开头的相对导入,或者看起来像本地模块的导入 + return packageName.startsWith('.') || + (!isStandardLibrary(packageName) && !isThirdPartyLibrary(packageName)); + } + + function getImportPriority(importObj) { + const { packageName, className } = importObj; + + // 1. __future__ imports (最高优先级) + if (packageName === '__future__') { + return 1; + } + + // 2. 标准库 import 语句 + if (!packageName && isStandardLibrary(className)) { + return 2; + } + + // 3. 标准库 from...import 语句 + if (packageName && isStandardLibrary(packageName)) { + return 3; + } + + // 4. 第三方库 import 语句 + if (!packageName && isThirdPartyLibrary(className)) { + return 4; + } + + // 5. 第三方库 from...import 语句 + if (packageName && isThirdPartyLibrary(packageName)) { + return 5; + } + + // 6. 本地/相对 import 语句 + if (!packageName && isLocalImport(className)) { + return 6; + } + + // 7. 本地/相对 from...import 语句 + if (packageName && isLocalImport(packageName)) { + return 7; + } + + // 8. 其他情况 + return 8; + } + + + // 生成排序键 + function getSortKey(importObj) { + const { packageName, className } = importObj; + const priority = getImportPriority(importObj); + + // 构建排序键:优先级 + 包名 + 类名 + const sortPackage = packageName || ''; + const sortClass = className || ''; + + return `${priority.toString().padStart(2, '0')}_${sortPackage}_${sortClass}`; + } + + //合并同一包的from imports + function mergeFromImportsByPackage(imports) { + const packageGroups = new Map(); + const nonFromImports = []; + + for (const importObj of imports) { + if (importObj.packageName) { + if (!packageGroups.has(importObj.packageName)) { + packageGroups.set(importObj.packageName, []); + } + packageGroups.get(importObj.packageName).push(importObj); + } else { + nonFromImports.push(importObj); + } + } + + const mergedImports = [...nonFromImports]; + for (const [packageName, packageImports] of packageGroups) { + if (packageImports.length === 1) { + mergedImports.push(packageImports[0]); + } else { + const canMerge = packageImports.every(imp => !imp.aliasName); + + if (canMerge) { + const classNames = packageImports.map(imp => imp.className).sort(); + mergedImports.push({ + packageName: packageName, + className: classNames.join(', '), + aliasName: '', + _isMerged: true + }); + } else { + mergedImports.push(...packageImports); + } + } + } + + return mergedImports; + } + + + const importMap = new Map(); + for (const importObj of imports) { + const key = `${importObj.packageName}|${importObj.className}|${importObj.aliasName}`; + + if (importMap.has(key)) { + continue; + } + importMap.set(key, importObj); + } + + + const mergedImports = mergeFromImportsByPackage(Array.from(importMap.values())); + + // 对imports进行排序 + const sortedImports = [...mergedImports].sort((a, b) => { + const keyA = getSortKey(a); + const keyB = getSortKey(b); + return keyA.localeCompare(keyB); + }); + + return sortedImports; +} + +// 辅助函数:将排序后的导入转换为Python代码字符串 +function _importsToString(sortedImports) { + const lines = []; + let lastPriority = -1; + + // 内部函数需要访问外部的getImportPriority + function getImportPriority(importObj) { + const { packageName, className } = importObj; + + function isStandardLibrary(packageName) { + if (!packageName) { return false; } + const rootModule = packageName.split('.')[0]; + return standardLibraries.has(rootModule); + } + + if (packageName === '__future__') { return 1; } + if (!packageName && isStandardLibrary(className)) { return 2; } + if (packageName && isStandardLibrary(packageName)) { return 3; } + if (!packageName && !isStandardLibrary(className)) { return 4; } + if (packageName && !isStandardLibrary(packageName)) { return 5; } + return 6; + } + + sortedImports.forEach(importObj => { + const { packageName, className, aliasName } = importObj; + const currentPriority = getImportPriority(importObj); + + // 在不同优先级组之间添加空行 + if (lastPriority !== -1 && currentPriority !== lastPriority) { + lines.push(''); + } + + // 生成import语句 + let importLine; + if (packageName) { + // from...import 语句 + if (aliasName) { + importLine = `from ${packageName} import ${className} as ${aliasName}`; + } else { + importLine = `from ${packageName} import ${className}`; + } + } else { + // import 语句 + if (aliasName) { + importLine = `import ${className} as ${aliasName}`; + } else { + importLine = `import ${className}`; + } + } + + lines.push(importLine); + lastPriority = currentPriority; + }); + + return lines.join('\n'); +} + + module.exports = { _removeFilesInDirectory, _name, @@ -433,6 +656,8 @@ module.exports = { _type, _getImport, _adaptedQuotes, + _sortImports, + _importsToString, CORE, REQUEST, RESPONSE, diff --git a/tests/expected/alias/setup.py b/tests/expected/alias/setup.py index f3910f9..7819633 100644 --- a/tests/expected/alias/setup.py +++ b/tests/expected/alias/setup.py @@ -22,25 +22,27 @@ from setuptools import setup, find_packages """ -setup module for tea_python_tests. +setup module for tea-python-tests. Created on * -@author: Alibaba +@author: AlibabaCloud SDK Team """ PACKAGE = "tea_python_tests" -NAME = "tea_python_tests" -DESCRIPTION = "" -AUTHOR = "Alibaba" -AUTHOR_EMAIL = "sdk-team@alibabacloud.com" -URL = "https://github.com/" +NAME = "tea-python-tests" +DESCRIPTION = "Generate setup.py" +AUTHOR = "AlibabaCloud SDK Team" +AUTHOR_EMAIL = "sdkteam@alibabacloud.com" +URL = "https://github.com/dara" VERSION = __import__(PACKAGE).__version__ REQUIRES = [ - "alibabacloud-tea>=1.0.0", - "source==0.0.1", - "import==1.1.2", - "alibabacloud_tea_util==0.3.11" + "darabonba-core>=1.0.0, <2.0.0", + "source>=0.0.1, <1.0.0", + "import>=1.1.2, <2.0.0", + "alibabacloud_tea_util>=0.3.11, <1.0.0", + "xxx1>=0.0.1, <1.0.0", + "xxx2>=0.0.1, <1.0.0" ] LONG_DESCRIPTION = '' @@ -63,17 +65,19 @@ include_package_data=True, platforms="any", install_requires=REQUIRES, - python_requires=">=3.6", + python_requires=">=3.7", classifiers=( "Development Status :: 4 - Beta", "Intended Audience :: Developers", "License :: OSI Approved :: Apache Software License", "Programming Language :: Python", "Programming Language :: Python :: 3", - "Programming Language :: Python :: 3.6", "Programming Language :: Python :: 3.7", "Programming Language :: Python :: 3.8", "Programming Language :: Python :: 3.9", + "Programming Language :: Python :: 3.10", + "Programming Language :: Python :: 3.11", + "Programming Language :: Python :: 3.12", "Topic :: Software Development" ) ) \ No newline at end of file diff --git a/tests/expected/alias/tea_python_tests/client.py b/tests/expected/alias/tea_python_tests/client.py index 4705131..a59f883 100644 --- a/tests/expected/alias/tea_python_tests/client.py +++ b/tests/expected/alias/tea_python_tests/client.py @@ -1,13 +1,13 @@ # -*- coding: utf-8 -*- # This file is auto-generated, don't edit it. Thanks. from __future__ import annotations -from Import.client import Client as ImportClient -from Source.client import Client as SourceClient -from Alias.alias_client import AliasClient -from alias_source.source_client import SourceClient as AliasSourceSourceClient -from alias_symbol.client import Client as AliasSymbolClient -from alias_symbol import models as alias_symbol_models +from alias_source.source_client import SourceClient as AliasSourceSourceClient +from alias_symbol import models as alias_symbol_models +from alias_symbol.client import Client as AliasSymbolClient +from Alias.alias_client import AliasClient +from Import.client import Client as ImportClient +from Source.client import Client as SourceClient diff --git a/tests/expected/annotation/tea_python_tests/client.py b/tests/expected/annotation/tea_python_tests/client.py index 68c50d5..94864dd 100644 --- a/tests/expected/annotation/tea_python_tests/client.py +++ b/tests/expected/annotation/tea_python_tests/client.py @@ -1,11 +1,11 @@ # -*- coding: utf-8 -*- # This file is auto-generated, don't edit it. Thanks. from __future__ import annotations -from darabonba.core import DaraCore -from darabonba.exceptions import UnretryableException -from darabonba.policy.retry import RetryPolicyContext -from darabonba.request import DaraRequest +from darabonba.core import DaraCore +from darabonba.exceptions import UnretryableException +from darabonba.policy.retry import RetryPolicyContext +from darabonba.request import DaraRequest """ * @remarks diff --git a/tests/expected/annotation/tea_python_tests/models/__init__.py b/tests/expected/annotation/tea_python_tests/models/__init__.py index 1efea09..82a6d16 100644 --- a/tests/expected/annotation/tea_python_tests/models/__init__.py +++ b/tests/expected/annotation/tea_python_tests/models/__init__.py @@ -2,8 +2,6 @@ # This file is auto-generated, don't edit it. Thanks. from __future__ import annotations - - from ._test import Test __all__ = [ diff --git a/tests/expected/annotation/tea_python_tests/models/_test.py b/tests/expected/annotation/tea_python_tests/models/_test.py index 866b1c2..918e45c 100644 --- a/tests/expected/annotation/tea_python_tests/models/_test.py +++ b/tests/expected/annotation/tea_python_tests/models/_test.py @@ -1,8 +1,8 @@ # -*- coding: utf-8 -*- # This file is auto-generated, don't edit it. Thanks. from __future__ import annotations -from darabonba.model import DaraModel +from darabonba.model import DaraModel """ * @remarks diff --git a/tests/expected/api/tea_python_tests/client.py b/tests/expected/api/tea_python_tests/client.py index 6f7c69f..246da64 100644 --- a/tests/expected/api/tea_python_tests/client.py +++ b/tests/expected/api/tea_python_tests/client.py @@ -1,11 +1,11 @@ # -*- coding: utf-8 -*- # This file is auto-generated, don't edit it. Thanks. from __future__ import annotations -from darabonba.core import DaraCore -from darabonba.request import DaraRequest -from darabonba.exceptions import UnretryableException -from darabonba.policy.retry import RetryPolicyContext +from darabonba.core import DaraCore +from darabonba.exceptions import UnretryableException +from darabonba.policy.retry import RetryPolicyContext +from darabonba.request import DaraRequest class Client: def __init__(self): diff --git a/tests/expected/builtin/tea_python_tests/client.py b/tests/expected/builtin/tea_python_tests/client.py index 4257c16..fd55b77 100644 --- a/tests/expected/builtin/tea_python_tests/client.py +++ b/tests/expected/builtin/tea_python_tests/client.py @@ -1,23 +1,25 @@ # -*- coding: utf-8 -*- # This file is auto-generated, don't edit it. Thanks. from __future__ import annotations -import base64 -from darabonba.utils.bytes import Bytes as DaraBytes -from darabonba.date import Date as DaraDate -import os -from darabonba.file import File as DaraFile -from darabonba.utils.form import Form as DaraForm -from darabonba.core import DaraCore as DaraCore -import json -import logging -import random -import math -from darabonba.utils.stream import Stream as DaraStream -from darabonba.url import Url as DaraURL -from darabonba.utils.xml import XML as DaraXML -import sys + +import base64 +import json +import logging +import math +import os +import random +import sys + from typing import List, Any +from darabonba.core import DaraCore as DaraCore +from darabonba.date import Date as DaraDate +from darabonba.file import File as DaraFile +from darabonba.url import Url as DaraURL +from darabonba.utils.bytes import Bytes as DaraBytes +from darabonba.utils.form import Form as DaraForm +from darabonba.utils.stream import Stream as DaraStream +from darabonba.utils.xml import XML as DaraXML class Client: diff --git a/tests/expected/comment/tea_python_tests/client.py b/tests/expected/comment/tea_python_tests/client.py index b43bf56..ab449fe 100644 --- a/tests/expected/comment/tea_python_tests/client.py +++ b/tests/expected/comment/tea_python_tests/client.py @@ -1,13 +1,14 @@ # -*- coding: utf-8 -*- # This file is auto-generated, don't edit it. Thanks. from __future__ import annotations -from tea_python_tests import models as main_models -from darabonba.core import DaraCore -from darabonba.exceptions import UnretryableException -from darabonba.policy.retry import RetryPolicyContext -from darabonba.request import DaraRequest + from typing import List, Dict, BinaryIO, Any +from darabonba.core import DaraCore +from darabonba.exceptions import UnretryableException +from darabonba.policy.retry import RetryPolicyContext +from darabonba.request import DaraRequest +from tea_python_tests import models as main_models # top comment """ diff --git a/tests/expected/comment/tea_python_tests/models/__init__.py b/tests/expected/comment/tea_python_tests/models/__init__.py index 7795e1b..83d51f2 100644 --- a/tests/expected/comment/tea_python_tests/models/__init__.py +++ b/tests/expected/comment/tea_python_tests/models/__init__.py @@ -2,8 +2,6 @@ # This file is auto-generated, don't edit it. Thanks. from __future__ import annotations - - from ._test_1 import Test1 from ._test_2 import Test2 from ._test_3 import Test3 diff --git a/tests/expected/comment/tea_python_tests/models/_test_1.py b/tests/expected/comment/tea_python_tests/models/_test_1.py index ce61d12..931c52d 100644 --- a/tests/expected/comment/tea_python_tests/models/_test_1.py +++ b/tests/expected/comment/tea_python_tests/models/_test_1.py @@ -1,9 +1,10 @@ # -*- coding: utf-8 -*- # This file is auto-generated, don't edit it. Thanks. from __future__ import annotations -from darabonba.model import DaraModel + from typing import List +from darabonba.model import DaraModel # import comment diff --git a/tests/expected/comment/tea_python_tests/models/_test_2.py b/tests/expected/comment/tea_python_tests/models/_test_2.py index f2ad65e..3d72112 100644 --- a/tests/expected/comment/tea_python_tests/models/_test_2.py +++ b/tests/expected/comment/tea_python_tests/models/_test_2.py @@ -1,8 +1,8 @@ # -*- coding: utf-8 -*- # This file is auto-generated, don't edit it. Thanks. from __future__ import annotations -from darabonba.model import DaraModel +from darabonba.model import DaraModel """ * @remarks diff --git a/tests/expected/comment/tea_python_tests/models/_test_3.py b/tests/expected/comment/tea_python_tests/models/_test_3.py index fa0f980..b700057 100644 --- a/tests/expected/comment/tea_python_tests/models/_test_3.py +++ b/tests/expected/comment/tea_python_tests/models/_test_3.py @@ -1,8 +1,8 @@ # -*- coding: utf-8 -*- # This file is auto-generated, don't edit it. Thanks. from __future__ import annotations -from darabonba.model import DaraModel +from darabonba.model import DaraModel """ * @remarks diff --git a/tests/expected/complex/tea_python_tests/client.py b/tests/expected/complex/tea_python_tests/client.py index e70aef5..35246f1 100644 --- a/tests/expected/complex/tea_python_tests/client.py +++ b/tests/expected/complex/tea_python_tests/client.py @@ -1,20 +1,21 @@ # -*- coding: utf-8 -*- # This file is auto-generated, don't edit it. Thanks. from __future__ import annotations -from Source.source_client import SourceClient -from Source import models as source_models -from darabonba.core import DaraCore -from tea_python_tests import models as main_models -from darabonba.exceptions import UnretryableException -from darabonba.policy.retry import RetryPolicyContext -from darabonba.request import DaraRequest -import logging -from darabonba.response import DaraResponse -from darabonba.exceptions import DaraException -from tea_python_tests import exceptions as main_exceptions -from Source import exceptions as source_exceptions + +import logging + from typing import List, Dict, Any +from darabonba.core import DaraCore +from darabonba.exceptions import DaraException, UnretryableException +from darabonba.policy.retry import RetryPolicyContext +from darabonba.request import DaraRequest +from darabonba.response import DaraResponse +from Source import exceptions as source_exceptions +from Source import models as source_models +from Source.source_client import SourceClient +from tea_python_tests import exceptions as main_exceptions +from tea_python_tests import models as main_models class Client(SourceClient): _protocol: str = None diff --git a/tests/expected/complex/tea_python_tests/exceptions/__init__.py b/tests/expected/complex/tea_python_tests/exceptions/__init__.py index 9d2b218..4994ff7 100644 --- a/tests/expected/complex/tea_python_tests/exceptions/__init__.py +++ b/tests/expected/complex/tea_python_tests/exceptions/__init__.py @@ -2,8 +2,6 @@ # This file is auto-generated, don't edit it. Thanks. from __future__ import annotations - - from ._err_1 import Err1Exception from ._err_2 import Err2Exception diff --git a/tests/expected/complex/tea_python_tests/exceptions/_err_1.py b/tests/expected/complex/tea_python_tests/exceptions/_err_1.py index 824eeda..576be73 100644 --- a/tests/expected/complex/tea_python_tests/exceptions/_err_1.py +++ b/tests/expected/complex/tea_python_tests/exceptions/_err_1.py @@ -1,9 +1,10 @@ # -*- coding: utf-8 -*- # This file is auto-generated, don't edit it. Thanks. from __future__ import annotations -from darabonba.exceptions import DaraException + from typing import Dict +from darabonba.exceptions import DaraException class Err1Exception(DaraException): def __init__( diff --git a/tests/expected/complex/tea_python_tests/exceptions/_err_2.py b/tests/expected/complex/tea_python_tests/exceptions/_err_2.py index c5fbab2..afe9031 100644 --- a/tests/expected/complex/tea_python_tests/exceptions/_err_2.py +++ b/tests/expected/complex/tea_python_tests/exceptions/_err_2.py @@ -1,8 +1,8 @@ # -*- coding: utf-8 -*- # This file is auto-generated, don't edit it. Thanks. from __future__ import annotations -from darabonba.exceptions import DaraException +from darabonba.exceptions import DaraException class Err2Exception(DaraException): def __init__( diff --git a/tests/expected/complex/tea_python_tests/models/__init__.py b/tests/expected/complex/tea_python_tests/models/__init__.py index 2a02dc3..f69d110 100644 --- a/tests/expected/complex/tea_python_tests/models/__init__.py +++ b/tests/expected/complex/tea_python_tests/models/__init__.py @@ -2,8 +2,6 @@ # This file is auto-generated, don't edit it. Thanks. from __future__ import annotations - - from ._complex_request import ComplexRequest from ._response import Response from ._complex_request import ComplexRequestHeader diff --git a/tests/expected/complex/tea_python_tests/models/_complex_request.py b/tests/expected/complex/tea_python_tests/models/_complex_request.py index 6cc716a..3b963ba 100644 --- a/tests/expected/complex/tea_python_tests/models/_complex_request.py +++ b/tests/expected/complex/tea_python_tests/models/_complex_request.py @@ -1,14 +1,15 @@ # -*- coding: utf-8 -*- # This file is auto-generated, don't edit it. Thanks. from __future__ import annotations -from darabonba.model import DaraModel -from tea_python_tests import models as main_models -from darabonba.request import DaraRequest -from darabonba.response import DaraResponse -from Source import models as source_models -from Source.source_client import SourceClient + from typing import BinaryIO, List, Dict, Any +from darabonba.model import DaraModel +from darabonba.request import DaraRequest +from darabonba.response import DaraResponse +from Source import models as source_models +from Source.source_client import SourceClient +from tea_python_tests import models as main_models class ComplexRequest(DaraModel): def __init__( diff --git a/tests/expected/complex/tea_python_tests/models/_response.py b/tests/expected/complex/tea_python_tests/models/_response.py index 16c9e97..5014345 100644 --- a/tests/expected/complex/tea_python_tests/models/_response.py +++ b/tests/expected/complex/tea_python_tests/models/_response.py @@ -1,9 +1,9 @@ # -*- coding: utf-8 -*- # This file is auto-generated, don't edit it. Thanks. from __future__ import annotations -from darabonba.model import DaraModel -from tea_python_tests import models as main_models +from darabonba.model import DaraModel +from tea_python_tests import models as main_models class Response(DaraModel): def __init__( diff --git a/tests/expected/const/tea_python_tests/client.py b/tests/expected/const/tea_python_tests/client.py index 0557dd0..d1ad8f9 100644 --- a/tests/expected/const/tea_python_tests/client.py +++ b/tests/expected/const/tea_python_tests/client.py @@ -2,8 +2,6 @@ # This file is auto-generated, don't edit it. Thanks. from __future__ import annotations - - class Client: def __init__(self): diff --git a/tests/expected/empty/tea_python_tests/client.py b/tests/expected/empty/tea_python_tests/client.py index 11c7b19..210627d 100644 --- a/tests/expected/empty/tea_python_tests/client.py +++ b/tests/expected/empty/tea_python_tests/client.py @@ -2,8 +2,6 @@ # This file is auto-generated, don't edit it. Thanks. from __future__ import annotations - - class Client: def __init__(self): diff --git a/tests/expected/exec/tea_python_tests/exec_client.py b/tests/expected/exec/tea_python_tests/exec_client.py index 45e75a9..fdc6e7f 100644 --- a/tests/expected/exec/tea_python_tests/exec_client.py +++ b/tests/expected/exec/tea_python_tests/exec_client.py @@ -1,9 +1,10 @@ # -*- coding: utf-8 -*- # This file is auto-generated, don't edit it. Thanks. from __future__ import annotations -import sys -from typing import List +import sys + +from typing import List class ExecClient: diff --git a/tests/expected/function/tea_python_tests/client.py b/tests/expected/function/tea_python_tests/client.py index b0940c3..ed627ab 100644 --- a/tests/expected/function/tea_python_tests/client.py +++ b/tests/expected/function/tea_python_tests/client.py @@ -1,9 +1,10 @@ # -*- coding: utf-8 -*- # This file is auto-generated, don't edit it. Thanks. from __future__ import annotations -from darabonba.core import DaraCore + from typing import Dict, List +from darabonba.core import DaraCore class Client: def __init__(self): diff --git a/tests/expected/import/setup.py b/tests/expected/import/setup.py index f3aae12..ee19513 100644 --- a/tests/expected/import/setup.py +++ b/tests/expected/import/setup.py @@ -62,17 +62,19 @@ include_package_data=True, platforms="any", install_requires=REQUIRES, - python_requires=">=3.6", + python_requires=">=3.7", classifiers=( "Development Status :: 4 - Beta", "Intended Audience :: Developers", "License :: OSI Approved :: Apache Software License", "Programming Language :: Python", "Programming Language :: Python :: 3", - "Programming Language :: Python :: 3.6", "Programming Language :: Python :: 3.7", "Programming Language :: Python :: 3.8", "Programming Language :: Python :: 3.9", + "Programming Language :: Python :: 3.10", + "Programming Language :: Python :: 3.11", + "Programming Language :: Python :: 3.12", "Topic :: Software Development" ) ) \ No newline at end of file diff --git a/tests/expected/import/tea_python_tests/client.py b/tests/expected/import/tea_python_tests/client.py index 0c625e5..d4a87b5 100644 --- a/tests/expected/import/tea_python_tests/client.py +++ b/tests/expected/import/tea_python_tests/client.py @@ -1,11 +1,12 @@ # -*- coding: utf-8 -*- # This file is auto-generated, don't edit it. Thanks. from __future__ import annotations -from Local import models as local_models -from Source.source_client import SourceClient -from Source import models as source_models + from typing import List +from Local import models as local_models +from Source import models as source_models +from Source.source_client import SourceClient diff --git a/tests/expected/map/tea_python_tests/client.py b/tests/expected/map/tea_python_tests/client.py index dcd9f07..97cf813 100644 --- a/tests/expected/map/tea_python_tests/client.py +++ b/tests/expected/map/tea_python_tests/client.py @@ -1,10 +1,10 @@ # -*- coding: utf-8 -*- # This file is auto-generated, don't edit it. Thanks. from __future__ import annotations -from Source.source_client import SourceClient -from Source import models as source_models -from darabonba.core import DaraCore +from darabonba.core import DaraCore +from Source import models as source_models +from Source.source_client import SourceClient diff --git a/tests/expected/model/tea_python_tests/client.py b/tests/expected/model/tea_python_tests/client.py index 11c7b19..210627d 100644 --- a/tests/expected/model/tea_python_tests/client.py +++ b/tests/expected/model/tea_python_tests/client.py @@ -2,8 +2,6 @@ # This file is auto-generated, don't edit it. Thanks. from __future__ import annotations - - class Client: def __init__(self): diff --git a/tests/expected/model/tea_python_tests/exceptions/__init__.py b/tests/expected/model/tea_python_tests/exceptions/__init__.py index cc92471..c054722 100644 --- a/tests/expected/model/tea_python_tests/exceptions/__init__.py +++ b/tests/expected/model/tea_python_tests/exceptions/__init__.py @@ -2,8 +2,6 @@ # This file is auto-generated, don't edit it. Thanks. from __future__ import annotations - - from ._main_file import MainFileException __all__ = [ diff --git a/tests/expected/model/tea_python_tests/exceptions/_main_file.py b/tests/expected/model/tea_python_tests/exceptions/_main_file.py index 0c52132..71f6cbf 100644 --- a/tests/expected/model/tea_python_tests/exceptions/_main_file.py +++ b/tests/expected/model/tea_python_tests/exceptions/_main_file.py @@ -1,10 +1,11 @@ # -*- coding: utf-8 -*- # This file is auto-generated, don't edit it. Thanks. from __future__ import annotations -from darabonba.exceptions import DaraException -from tea_python_tests import models as main_models + from typing import Dict +from darabonba.exceptions import DaraException +from tea_python_tests import models as main_models class MainFileException(DaraException): def __init__( diff --git a/tests/expected/model/tea_python_tests/models/__init__.py b/tests/expected/model/tea_python_tests/models/__init__.py index 707ff19..21f14be 100644 --- a/tests/expected/model/tea_python_tests/models/__init__.py +++ b/tests/expected/model/tea_python_tests/models/__init__.py @@ -2,8 +2,6 @@ # This file is auto-generated, don't edit it. Thanks. from __future__ import annotations - - from ._m import M from ._class import Class from ._model import Model diff --git a/tests/expected/model/tea_python_tests/models/_class.py b/tests/expected/model/tea_python_tests/models/_class.py index a9e2034..f1c4d22 100644 --- a/tests/expected/model/tea_python_tests/models/_class.py +++ b/tests/expected/model/tea_python_tests/models/_class.py @@ -1,8 +1,8 @@ # -*- coding: utf-8 -*- # This file is auto-generated, don't edit it. Thanks. from __future__ import annotations -from darabonba.model import DaraModel +from darabonba.model import DaraModel class Class(DaraModel): def __init__(self): diff --git a/tests/expected/model/tea_python_tests/models/_m.py b/tests/expected/model/tea_python_tests/models/_m.py index 9ab664d..fe7b532 100644 --- a/tests/expected/model/tea_python_tests/models/_m.py +++ b/tests/expected/model/tea_python_tests/models/_m.py @@ -1,9 +1,9 @@ # -*- coding: utf-8 -*- # This file is auto-generated, don't edit it. Thanks. from __future__ import annotations -from darabonba.model import DaraModel -from tea_python_tests import models as main_models +from darabonba.model import DaraModel +from tea_python_tests import models as main_models class M(DaraModel): def __init__( diff --git a/tests/expected/model/tea_python_tests/models/_main_file.py b/tests/expected/model/tea_python_tests/models/_main_file.py index 7c3a68f..f12baf6 100644 --- a/tests/expected/model/tea_python_tests/models/_main_file.py +++ b/tests/expected/model/tea_python_tests/models/_main_file.py @@ -1,9 +1,9 @@ # -*- coding: utf-8 -*- # This file is auto-generated, don't edit it. Thanks. from __future__ import annotations -from darabonba.model import DaraModel -from tea_python_tests import models as main_models +from darabonba.model import DaraModel +from tea_python_tests import models as main_models class MainFileModel(DaraModel): def __init__( diff --git a/tests/expected/model/tea_python_tests/models/_model.py b/tests/expected/model/tea_python_tests/models/_model.py index e6e8af0..81749a2 100644 --- a/tests/expected/model/tea_python_tests/models/_model.py +++ b/tests/expected/model/tea_python_tests/models/_model.py @@ -1,8 +1,8 @@ # -*- coding: utf-8 -*- # This file is auto-generated, don't edit it. Thanks. from __future__ import annotations -from darabonba.model import DaraModel +from darabonba.model import DaraModel class Model(DaraModel): def __init__( diff --git a/tests/expected/model/tea_python_tests/models/_my_model.py b/tests/expected/model/tea_python_tests/models/_my_model.py index 0ef7055..67672ec 100644 --- a/tests/expected/model/tea_python_tests/models/_my_model.py +++ b/tests/expected/model/tea_python_tests/models/_my_model.py @@ -1,13 +1,14 @@ # -*- coding: utf-8 -*- # This file is auto-generated, don't edit it. Thanks. from __future__ import annotations -from darabonba.model import DaraModel -from tea_python_tests import models as main_models -from Source.client import Client as SourceClient -from Source import models as source_models -from darabonba.request import DaraRequest + from typing import List, Dict, Any, BinaryIO +from darabonba.model import DaraModel +from darabonba.request import DaraRequest +from Source import models as source_models +from Source.client import Client as SourceClient +from tea_python_tests import models as main_models class MyModel(DaraModel): def __init__( diff --git a/tests/expected/modelConfig/tea_python_tests/client.py b/tests/expected/modelConfig/tea_python_tests/client.py index 11c7b19..210627d 100644 --- a/tests/expected/modelConfig/tea_python_tests/client.py +++ b/tests/expected/modelConfig/tea_python_tests/client.py @@ -2,8 +2,6 @@ # This file is auto-generated, don't edit it. Thanks. from __future__ import annotations - - class Client: def __init__(self): diff --git a/tests/expected/modelConfig/tea_python_tests/exceptions/__init__.py b/tests/expected/modelConfig/tea_python_tests/exceptions/__init__.py index cc92471..c054722 100644 --- a/tests/expected/modelConfig/tea_python_tests/exceptions/__init__.py +++ b/tests/expected/modelConfig/tea_python_tests/exceptions/__init__.py @@ -2,8 +2,6 @@ # This file is auto-generated, don't edit it. Thanks. from __future__ import annotations - - from ._main_file import MainFileException __all__ = [ diff --git a/tests/expected/modelConfig/tea_python_tests/exceptions/_main_file.py b/tests/expected/modelConfig/tea_python_tests/exceptions/_main_file.py index 67949ea..539bf64 100644 --- a/tests/expected/modelConfig/tea_python_tests/exceptions/_main_file.py +++ b/tests/expected/modelConfig/tea_python_tests/exceptions/_main_file.py @@ -1,10 +1,11 @@ # -*- coding: utf-8 -*- # This file is auto-generated, don't edit it. Thanks. from __future__ import annotations -from darabonba.exceptions import DaraException -from tea_python_tests import models as main_models + from typing import Dict +from darabonba.exceptions import DaraException +from tea_python_tests import models as main_models class MainFileException(DaraException): def __init__( diff --git a/tests/expected/modelConfig/tea_python_tests/models/__init__.py b/tests/expected/modelConfig/tea_python_tests/models/__init__.py index 707ff19..21f14be 100644 --- a/tests/expected/modelConfig/tea_python_tests/models/__init__.py +++ b/tests/expected/modelConfig/tea_python_tests/models/__init__.py @@ -2,8 +2,6 @@ # This file is auto-generated, don't edit it. Thanks. from __future__ import annotations - - from ._m import M from ._class import Class from ._model import Model diff --git a/tests/expected/modelConfig/tea_python_tests/models/_class.py b/tests/expected/modelConfig/tea_python_tests/models/_class.py index a9e2034..f1c4d22 100644 --- a/tests/expected/modelConfig/tea_python_tests/models/_class.py +++ b/tests/expected/modelConfig/tea_python_tests/models/_class.py @@ -1,8 +1,8 @@ # -*- coding: utf-8 -*- # This file is auto-generated, don't edit it. Thanks. from __future__ import annotations -from darabonba.model import DaraModel +from darabonba.model import DaraModel class Class(DaraModel): def __init__(self): diff --git a/tests/expected/modelConfig/tea_python_tests/models/_m.py b/tests/expected/modelConfig/tea_python_tests/models/_m.py index cecb93d..ee6bb7a 100644 --- a/tests/expected/modelConfig/tea_python_tests/models/_m.py +++ b/tests/expected/modelConfig/tea_python_tests/models/_m.py @@ -1,9 +1,9 @@ # -*- coding: utf-8 -*- # This file is auto-generated, don't edit it. Thanks. from __future__ import annotations -from darabonba.model import DaraModel -from tea_python_tests import models as main_models +from darabonba.model import DaraModel +from tea_python_tests import models as main_models class M(DaraModel): def __init__( diff --git a/tests/expected/modelConfig/tea_python_tests/models/_main_file.py b/tests/expected/modelConfig/tea_python_tests/models/_main_file.py index 3da3613..b1a1d76 100644 --- a/tests/expected/modelConfig/tea_python_tests/models/_main_file.py +++ b/tests/expected/modelConfig/tea_python_tests/models/_main_file.py @@ -1,9 +1,9 @@ # -*- coding: utf-8 -*- # This file is auto-generated, don't edit it. Thanks. from __future__ import annotations -from darabonba.model import DaraModel -from tea_python_tests import models as main_models +from darabonba.model import DaraModel +from tea_python_tests import models as main_models class MainFileModel(DaraModel): def __init__( diff --git a/tests/expected/modelConfig/tea_python_tests/models/_model.py b/tests/expected/modelConfig/tea_python_tests/models/_model.py index 7b2967a..38dbf96 100644 --- a/tests/expected/modelConfig/tea_python_tests/models/_model.py +++ b/tests/expected/modelConfig/tea_python_tests/models/_model.py @@ -1,8 +1,8 @@ # -*- coding: utf-8 -*- # This file is auto-generated, don't edit it. Thanks. from __future__ import annotations -from darabonba.model import DaraModel +from darabonba.model import DaraModel class Model(DaraModel): def __init__( diff --git a/tests/expected/modelConfig/tea_python_tests/models/_my_model.py b/tests/expected/modelConfig/tea_python_tests/models/_my_model.py index 9369af9..18dfd4e 100644 --- a/tests/expected/modelConfig/tea_python_tests/models/_my_model.py +++ b/tests/expected/modelConfig/tea_python_tests/models/_my_model.py @@ -1,13 +1,14 @@ # -*- coding: utf-8 -*- # This file is auto-generated, don't edit it. Thanks. from __future__ import annotations -from darabonba.model import DaraModel -from tea_python_tests import models as main_models -from Source.client import Client as SourceClient -from Source import models as source_models -from darabonba.request import DaraRequest + from typing import List, Dict, Any, BinaryIO +from darabonba.model import DaraModel +from darabonba.request import DaraRequest +from Source import models as source_models +from Source.client import Client as SourceClient +from tea_python_tests import models as main_models class MyModel(DaraModel): def __init__( diff --git a/tests/expected/multi/tea_python_tests/api.py b/tests/expected/multi/tea_python_tests/api.py index 43716ee..ead8eca 100644 --- a/tests/expected/multi/tea_python_tests/api.py +++ b/tests/expected/multi/tea_python_tests/api.py @@ -1,12 +1,12 @@ # -*- coding: utf-8 -*- # This file is auto-generated, don't edit it. Thanks. from __future__ import annotations -from darabonba.core import DaraCore -from darabonba.exceptions import UnretryableException -from darabonba.policy.retry import RetryPolicyContext -from darabonba.request import DaraRequest -from tea_python_tests.lib.util import Util +from darabonba.core import DaraCore +from darabonba.exceptions import UnretryableException +from darabonba.policy.retry import RetryPolicyContext +from darabonba.request import DaraRequest +from tea_python_tests.lib.util import Util class Client: def __init__(self): diff --git a/tests/expected/multi/tea_python_tests/api_models/__init__.py b/tests/expected/multi/tea_python_tests/api_models/__init__.py index 334b54e..d8262e1 100644 --- a/tests/expected/multi/tea_python_tests/api_models/__init__.py +++ b/tests/expected/multi/tea_python_tests/api_models/__init__.py @@ -2,8 +2,6 @@ # This file is auto-generated, don't edit it. Thanks. from __future__ import annotations - - from ._test_model_dir_2 import TestModelDir2 __all__ = [ diff --git a/tests/expected/multi/tea_python_tests/api_models/_test_model_dir_2.py b/tests/expected/multi/tea_python_tests/api_models/_test_model_dir_2.py index e8e8886..0b2d671 100644 --- a/tests/expected/multi/tea_python_tests/api_models/_test_model_dir_2.py +++ b/tests/expected/multi/tea_python_tests/api_models/_test_model_dir_2.py @@ -1,8 +1,8 @@ # -*- coding: utf-8 -*- # This file is auto-generated, don't edit it. Thanks. from __future__ import annotations -from darabonba.model import DaraModel +from darabonba.model import DaraModel diff --git a/tests/expected/multi/tea_python_tests/client.py b/tests/expected/multi/tea_python_tests/client.py index 6964727..94ec764 100644 --- a/tests/expected/multi/tea_python_tests/client.py +++ b/tests/expected/multi/tea_python_tests/client.py @@ -1,11 +1,12 @@ # -*- coding: utf-8 -*- # This file is auto-generated, don't edit it. Thanks. from __future__ import annotations -from tea_python_tests.model import user_models as user_models -from tea_python_tests.lib.util import Util -from tea_python_tests.api import Client as APIClient + from typing import Generator, AsyncGenerator +from tea_python_tests.api import Client as APIClient +from tea_python_tests.lib.util import Util +from tea_python_tests.model import user_models as user_models class Client: _user: user_models.Info = None diff --git a/tests/expected/multi/tea_python_tests/exceptions/__init__.py b/tests/expected/multi/tea_python_tests/exceptions/__init__.py index c563a2a..316de49 100644 --- a/tests/expected/multi/tea_python_tests/exceptions/__init__.py +++ b/tests/expected/multi/tea_python_tests/exceptions/__init__.py @@ -2,8 +2,6 @@ # This file is auto-generated, don't edit it. Thanks. from __future__ import annotations - - from ._err import ErrException from ._err import ERRException diff --git a/tests/expected/multi/tea_python_tests/exceptions/_err.py b/tests/expected/multi/tea_python_tests/exceptions/_err.py index 8786fb3..066f114 100644 --- a/tests/expected/multi/tea_python_tests/exceptions/_err.py +++ b/tests/expected/multi/tea_python_tests/exceptions/_err.py @@ -1,8 +1,8 @@ # -*- coding: utf-8 -*- # This file is auto-generated, don't edit it. Thanks. from __future__ import annotations -from darabonba.exceptions import DaraException +from darabonba.exceptions import DaraException class ERRException(DaraException): def __init__( diff --git a/tests/expected/multi/tea_python_tests/lib/util.py b/tests/expected/multi/tea_python_tests/lib/util.py index d174c8c..81efdb3 100644 --- a/tests/expected/multi/tea_python_tests/lib/util.py +++ b/tests/expected/multi/tea_python_tests/lib/util.py @@ -4,7 +4,6 @@ from typing import Generator, Dict - class Util: def __init__(self): diff --git a/tests/expected/multi/tea_python_tests/model/user.py b/tests/expected/multi/tea_python_tests/model/user.py index 03eef52..7039daa 100644 --- a/tests/expected/multi/tea_python_tests/model/user.py +++ b/tests/expected/multi/tea_python_tests/model/user.py @@ -1,10 +1,11 @@ # -*- coding: utf-8 -*- # This file is auto-generated, don't edit it. Thanks. from __future__ import annotations -from alibabacloud_tea_util.util import Utils -from tea_python_tests.lib.util import Util + from typing import Generator, AsyncGenerator +from alibabacloud_tea_util.util import Utils +from tea_python_tests.lib.util import Util class Client: diff --git a/tests/expected/multi/tea_python_tests/model/user_exceptions/__init__.py b/tests/expected/multi/tea_python_tests/model/user_exceptions/__init__.py index 333b710..6434192 100644 --- a/tests/expected/multi/tea_python_tests/model/user_exceptions/__init__.py +++ b/tests/expected/multi/tea_python_tests/model/user_exceptions/__init__.py @@ -2,8 +2,6 @@ # This file is auto-generated, don't edit it. Thanks. from __future__ import annotations - - from ._err import ErrException from ._err_1 import Err1Exception from ._err_2 import Err2Exception diff --git a/tests/expected/multi/tea_python_tests/model/user_exceptions/_err.py b/tests/expected/multi/tea_python_tests/model/user_exceptions/_err.py index 56270d1..255c093 100644 --- a/tests/expected/multi/tea_python_tests/model/user_exceptions/_err.py +++ b/tests/expected/multi/tea_python_tests/model/user_exceptions/_err.py @@ -1,8 +1,8 @@ # -*- coding: utf-8 -*- # This file is auto-generated, don't edit it. Thanks. from __future__ import annotations -from darabonba.exceptions import DaraException +from darabonba.exceptions import DaraException class ErrException(DaraException): def __init__( diff --git a/tests/expected/multi/tea_python_tests/model/user_exceptions/_err_1.py b/tests/expected/multi/tea_python_tests/model/user_exceptions/_err_1.py index e55a643..02413b1 100644 --- a/tests/expected/multi/tea_python_tests/model/user_exceptions/_err_1.py +++ b/tests/expected/multi/tea_python_tests/model/user_exceptions/_err_1.py @@ -1,8 +1,8 @@ # -*- coding: utf-8 -*- # This file is auto-generated, don't edit it. Thanks. from __future__ import annotations -from tea_python_tests import user_exceptions as main_exceptions +from tea_python_tests import user_exceptions as main_exceptions class Err1Exception(main_exceptions.BaseInfoException): def __init__( diff --git a/tests/expected/multi/tea_python_tests/model/user_exceptions/_err_2.py b/tests/expected/multi/tea_python_tests/model/user_exceptions/_err_2.py index dd81d17..8439f31 100644 --- a/tests/expected/multi/tea_python_tests/model/user_exceptions/_err_2.py +++ b/tests/expected/multi/tea_python_tests/model/user_exceptions/_err_2.py @@ -1,8 +1,8 @@ # -*- coding: utf-8 -*- # This file is auto-generated, don't edit it. Thanks. from __future__ import annotations -from tea_python_tests import user_exceptions as main_exceptions +from tea_python_tests import user_exceptions as main_exceptions class Err2Exception(main_exceptions.ErrException): def __init__( diff --git a/tests/expected/multi/tea_python_tests/model/user_models/__init__.py b/tests/expected/multi/tea_python_tests/model/user_models/__init__.py index a468a56..69478ac 100644 --- a/tests/expected/multi/tea_python_tests/model/user_models/__init__.py +++ b/tests/expected/multi/tea_python_tests/model/user_models/__init__.py @@ -2,8 +2,6 @@ # This file is auto-generated, don't edit it. Thanks. from __future__ import annotations - - from ._base_info import BaseInfo from ._info import Info diff --git a/tests/expected/multi/tea_python_tests/model/user_models/_base_info.py b/tests/expected/multi/tea_python_tests/model/user_models/_base_info.py index 3f294a0..ca65fa8 100644 --- a/tests/expected/multi/tea_python_tests/model/user_models/_base_info.py +++ b/tests/expected/multi/tea_python_tests/model/user_models/_base_info.py @@ -1,8 +1,8 @@ # -*- coding: utf-8 -*- # This file is auto-generated, don't edit it. Thanks. from __future__ import annotations -from alibabacloud_tea_util import models as darautil_models +from alibabacloud_tea_util import models as darautil_models diff --git a/tests/expected/multi/tea_python_tests/model/user_models/_info.py b/tests/expected/multi/tea_python_tests/model/user_models/_info.py index e15fc53..ef1679b 100644 --- a/tests/expected/multi/tea_python_tests/model/user_models/_info.py +++ b/tests/expected/multi/tea_python_tests/model/user_models/_info.py @@ -1,8 +1,8 @@ # -*- coding: utf-8 -*- # This file is auto-generated, don't edit it. Thanks. from __future__ import annotations -from tea_python_tests import user_models as main_models +from tea_python_tests import user_models as main_models class Info(main_models.BaseInfo): def __init__( diff --git a/tests/expected/multi/tea_python_tests/models/__init__.py b/tests/expected/multi/tea_python_tests/models/__init__.py index 8c839b0..3eac2e6 100644 --- a/tests/expected/multi/tea_python_tests/models/__init__.py +++ b/tests/expected/multi/tea_python_tests/models/__init__.py @@ -2,8 +2,6 @@ # This file is auto-generated, don't edit it. Thanks. from __future__ import annotations - - from ._test_model_dir import TestModelDir from ._test_model_dir import TestModelDIR diff --git a/tests/expected/multi/tea_python_tests/models/_test_model_dir.py b/tests/expected/multi/tea_python_tests/models/_test_model_dir.py index 0477f60..3858b8b 100644 --- a/tests/expected/multi/tea_python_tests/models/_test_model_dir.py +++ b/tests/expected/multi/tea_python_tests/models/_test_model_dir.py @@ -1,10 +1,11 @@ # -*- coding: utf-8 -*- # This file is auto-generated, don't edit it. Thanks. from __future__ import annotations -from darabonba.model import DaraModel -from tea_python_tests.model import user_models as user_models + from typing import Any +from darabonba.model import DaraModel +from tea_python_tests.model import user_models as user_models class TestModelDIR(DaraModel): def __init__( diff --git a/tests/expected/statements/tea_python_tests/client.py b/tests/expected/statements/tea_python_tests/client.py index 67317d3..5a42275 100644 --- a/tests/expected/statements/tea_python_tests/client.py +++ b/tests/expected/statements/tea_python_tests/client.py @@ -1,10 +1,10 @@ # -*- coding: utf-8 -*- # This file is auto-generated, don't edit it. Thanks. from __future__ import annotations -from darabonba.core import DaraCore -from darabonba.request import DaraRequest -from darabonba.exceptions import DaraException +from darabonba.core import DaraCore +from darabonba.exceptions import DaraException +from darabonba.request import DaraRequest class Client: def __init__(self): diff --git a/tests/expected/super/tea_python_tests/client.py b/tests/expected/super/tea_python_tests/client.py index dbe4f42..6a5f11b 100644 --- a/tests/expected/super/tea_python_tests/client.py +++ b/tests/expected/super/tea_python_tests/client.py @@ -1,9 +1,9 @@ # -*- coding: utf-8 -*- # This file is auto-generated, don't edit it. Thanks. from __future__ import annotations -from Source.source_client import SourceClient -from Source import models as source_models +from Source import models as source_models +from Source.source_client import SourceClient diff --git a/tests/expected/typedef/tea_python_tests/client.py b/tests/expected/typedef/tea_python_tests/client.py index 032b8a8..2938b1d 100644 --- a/tests/expected/typedef/tea_python_tests/client.py +++ b/tests/expected/typedef/tea_python_tests/client.py @@ -1,13 +1,13 @@ # -*- coding: utf-8 -*- # This file is auto-generated, don't edit it. Thanks. from __future__ import annotations -from requests import Request -from Tea.model import TeaModel -from Source.source_client import SourceClient -from tea_python_tests import models as main_models -from requests import Response + from typing import Dict, Any +from requests import Request, Response +from Source.source_client import SourceClient +from tea_python_tests import models as main_models +from Tea.model import TeaModel class Client: _vid: Request = None diff --git a/tests/expected/typedef/tea_python_tests/models/__init__.py b/tests/expected/typedef/tea_python_tests/models/__init__.py index a40078d..b218fc4 100644 --- a/tests/expected/typedef/tea_python_tests/models/__init__.py +++ b/tests/expected/typedef/tea_python_tests/models/__init__.py @@ -2,8 +2,6 @@ # This file is auto-generated, don't edit it. Thanks. from __future__ import annotations - - from ._m import M __all__ = [ diff --git a/tests/expected/typedef/tea_python_tests/models/_m.py b/tests/expected/typedef/tea_python_tests/models/_m.py index 70b13d2..916af18 100644 --- a/tests/expected/typedef/tea_python_tests/models/_m.py +++ b/tests/expected/typedef/tea_python_tests/models/_m.py @@ -1,10 +1,10 @@ # -*- coding: utf-8 -*- # This file is auto-generated, don't edit it. Thanks. from __future__ import annotations -from darabonba.model import DaraModel -from requests import Request -from Tea.model import TeaModel +from darabonba.model import DaraModel +from requests import Request +from Tea.model import TeaModel diff --git a/tests/fixtures/alias/Darafile b/tests/fixtures/alias/Darafile index f43b38b..94a8678 100644 --- a/tests/fixtures/alias/Darafile +++ b/tests/fixtures/alias/Darafile @@ -14,11 +14,12 @@ "package": "tea_python_tests", "clientName": "client", "packageInfo": { - "name": "tea_python_tests", + "name": "tea-python-tests", "desc": "Generate setup.py", - "github": "https://github.com/", - "author": "Alibaba", - "email": "sdk-team@alibabacloud.com" + "github": "https://github.com/dara", + "author": "AlibabaCloud SDK Team", + "email": "sdkteam@alibabacloud.com", + "require": ["xxx1>=0.0.1, <1.0.0", "xxx2>=0.0.1, <1.0.0"] } } } \ No newline at end of file diff --git a/tests/main.tests.js b/tests/main.tests.js index b62e717..834238e 100644 --- a/tests/main.tests.js +++ b/tests/main.tests.js @@ -75,7 +75,7 @@ describe('Python Generator', function () { }); }); - + it('complex should ok', function () { check('complex', 'tea_python_tests', { @@ -85,7 +85,7 @@ describe('Python Generator', function () { } }); }); - + it('model should ok', function () { check('model', 'tea_python_tests', { @@ -159,14 +159,19 @@ describe('Python Generator', function () { package: 'tea_python_tests', clientName: 'client', packageInfo: { - name: 'tea_python_tests', + name: 'tea-python-tests', desc: 'Generate setup.py', - github: 'https://github.com/', - author: 'Alibaba', - email: 'sdk-team@alibabacloud.com' + github: 'https://github.com/dara', + author: 'AlibabaCloud SDK Team', + email: 'sdkteam@alibabacloud.com', + require: ['xxx>=0.0.1, <1.0.0', 'xxx>=0.0.1, <1.0.0'] } } }); + const expectedContent = fs.readFileSync(path.join(__dirname, 'expected', 'alias', 'setup.py'), 'utf8'); + const acutalContent = fs.readFileSync(path.join(__dirname, 'output', 'alias', 'setup.py'), 'utf8'); + + assert.deepStrictEqual(expectedContent, acutalContent.replace(new RegExp('\\d{2}\\/\\d{2}\\/\\d{4}'), '*')); }); it('const should ok', function () { @@ -188,7 +193,7 @@ describe('Python Generator', function () { } }); }); - + it('function should ok', function () { check('function', 'tea_python_tests', { @@ -197,8 +202,8 @@ describe('Python Generator', function () { clientName: 'client' } }); - }); - + }); + it('api should ok', function () { check('api', 'tea_python_tests', { @@ -261,23 +266,21 @@ describe('Python Generator', function () { it('empty should ok', function () { check('empty', 'tea_python_tests', - { - python: { - package: 'tea_python_tests', - clientName: 'client', - packageInfo: { - name: 'tea_python_tests', - desc: 'Generate setup.py', - github: 'https://github.com/', - author: 'Alibaba', - email: 'sdk-team@alibabacloud.com' + { + python: { + package: 'tea_python_tests', + clientName: 'client', + packageInfo: { + name: 'tea_python_tests', + desc: 'Generate setup.py', + github: 'https://github.com/', + author: 'Alibaba', + email: 'sdk-team@alibabacloud.com' + } } - } - }); + }); }); - - it('super should ok', function () { check('super', 'tea_python_tests', {