add python generator

This commit is contained in:
wing328 2018-03-28 11:48:42 +08:00
parent 7ccdca36ad
commit 0b89519cf8

View File

@ -9,10 +9,11 @@ import org.openapitools.codegen.CodegenProperty;
import org.openapitools.codegen.CodegenType; import org.openapitools.codegen.CodegenType;
import org.openapitools.codegen.DefaultCodegen; import org.openapitools.codegen.DefaultCodegen;
import org.openapitools.codegen.SupportingFile; import org.openapitools.codegen.SupportingFile;
import io.swagger.v3.oas.models.OpenAPI; import io.swagger.v3.oas.models.OpenAPI;
import io.swagger.v3.oas.models.Operation; import io.swagger.v3.oas.models.Operation;
import io.swagger.v3.oas.models.media.*; import io.swagger.v3.oas.models.media.*;
import io.swagger.v3.oas.models.responses.ApiResponse;
import io.swagger.v3.parser.util.SchemaTypeUtil;
import java.io.File; import java.io.File;
import java.util.ArrayList; import java.util.ArrayList;
@ -101,16 +102,16 @@ public class PythonClientCodegen extends DefaultCodegen implements CodegenConfig
// from https://docs.python.org/3/reference/lexical_analysis.html#keywords // from https://docs.python.org/3/reference/lexical_analysis.html#keywords
setReservedWordsLowerCase( setReservedWordsLowerCase(
Arrays.asList( Arrays.asList(
// local variable name used in API methods (endpoints) // local variable name used in API methods (endpoints)
"all_params", "resource_path", "path_params", "query_params", "all_params", "resource_path", "path_params", "query_params",
"header_params", "form_params", "local_var_files", "body_params", "auth_settings", "header_params", "form_params", "local_var_files", "body_params", "auth_settings",
// @property // @property
"property", "property",
// python reserved words // python reserved words
"and", "del", "from", "not", "while", "as", "elif", "global", "or", "with", "and", "del", "from", "not", "while", "as", "elif", "global", "or", "with",
"assert", "else", "if", "pass", "yield", "break", "except", "import", "assert", "else", "if", "pass", "yield", "break", "except", "import",
"print", "class", "exec", "in", "raise", "continue", "finally", "is", "print", "class", "exec", "in", "raise", "continue", "finally", "is",
"return", "def", "for", "lambda", "try", "self", "nonlocal", "None", "True", "False")); "return", "def", "for", "lambda", "try", "self", "nonlocal", "None", "True", "False"));
regexModifiers = new HashMap<Character, String>(); regexModifiers = new HashMap<Character, String>();
regexModifiers.put('i', "IGNORECASE"); regexModifiers.put('i', "IGNORECASE");
@ -146,21 +147,19 @@ public class PythonClientCodegen extends DefaultCodegen implements CodegenConfig
super.processOpts(); super.processOpts();
Boolean excludeTests = false; Boolean excludeTests = false;
if(additionalProperties.containsKey(CodegenConstants.EXCLUDE_TESTS)) { if (additionalProperties.containsKey(CodegenConstants.EXCLUDE_TESTS)) {
excludeTests = Boolean.valueOf(additionalProperties.get(CodegenConstants.EXCLUDE_TESTS).toString()); excludeTests = Boolean.valueOf(additionalProperties.get(CodegenConstants.EXCLUDE_TESTS).toString());
} }
if (additionalProperties.containsKey(CodegenConstants.PACKAGE_NAME)) { if (additionalProperties.containsKey(CodegenConstants.PACKAGE_NAME)) {
setPackageName((String) additionalProperties.get(CodegenConstants.PACKAGE_NAME)); setPackageName((String) additionalProperties.get(CodegenConstants.PACKAGE_NAME));
} } else {
else {
setPackageName("swagger_client"); setPackageName("swagger_client");
} }
if (additionalProperties.containsKey(CodegenConstants.PROJECT_NAME)) { if (additionalProperties.containsKey(CodegenConstants.PROJECT_NAME)) {
setProjectName((String) additionalProperties.get(CodegenConstants.PROJECT_NAME)); setProjectName((String) additionalProperties.get(CodegenConstants.PROJECT_NAME));
} } else {
else {
// default: set project based on package name // default: set project based on package name
// e.g. petstore_api (package name) => petstore-api (project name) // e.g. petstore_api (package name) => petstore-api (project name)
setProjectName(packageName.replaceAll("_", "-")); setProjectName(packageName.replaceAll("_", "-"));
@ -168,8 +167,7 @@ public class PythonClientCodegen extends DefaultCodegen implements CodegenConfig
if (additionalProperties.containsKey(CodegenConstants.PACKAGE_VERSION)) { if (additionalProperties.containsKey(CodegenConstants.PACKAGE_VERSION)) {
setPackageVersion((String) additionalProperties.get(CodegenConstants.PACKAGE_VERSION)); setPackageVersion((String) additionalProperties.get(CodegenConstants.PACKAGE_VERSION));
} } else {
else {
setPackageVersion("1.0.0"); setPackageVersion("1.0.0");
} }
@ -204,7 +202,7 @@ public class PythonClientCodegen extends DefaultCodegen implements CodegenConfig
supportingFiles.add(new SupportingFile("__init__model.mustache", packageName + File.separatorChar + modelPackage, "__init__.py")); supportingFiles.add(new SupportingFile("__init__model.mustache", packageName + File.separatorChar + modelPackage, "__init__.py"));
supportingFiles.add(new SupportingFile("__init__api.mustache", packageName + File.separatorChar + apiPackage, "__init__.py")); supportingFiles.add(new SupportingFile("__init__api.mustache", packageName + File.separatorChar + apiPackage, "__init__.py"));
if(Boolean.FALSE.equals(excludeTests)) { if (Boolean.FALSE.equals(excludeTests)) {
supportingFiles.add(new SupportingFile("__init__test.mustache", testFolder, "__init__.py")); supportingFiles.add(new SupportingFile("__init__test.mustache", testFolder, "__init__.py"));
} }
supportingFiles.add(new SupportingFile("git_push.sh.mustache", "", "git_push.sh")); supportingFiles.add(new SupportingFile("git_push.sh.mustache", "", "git_push.sh"));
@ -235,14 +233,14 @@ public class PythonClientCodegen extends DefaultCodegen implements CodegenConfig
@Override @Override
public String toModelImport(String name) { public String toModelImport(String name) {
String modelImport; String modelImport;
if (StringUtils.startsWithAny(name,"import", "from")) { if (StringUtils.startsWithAny(name, "import", "from")) {
modelImport = name; modelImport = name;
} else { } else {
modelImport = "from "; modelImport = "from ";
if (!"".equals(modelPackage())) { if (!"".equals(modelPackage())) {
modelImport += modelPackage() + "."; modelImport += modelPackage() + ".";
} }
modelImport += toModelFilename(name)+ " import " + name; modelImport += toModelFilename(name) + " import " + name;
} }
return modelImport; return modelImport;
} }
@ -254,7 +252,7 @@ public class PythonClientCodegen extends DefaultCodegen implements CodegenConfig
} }
@Override @Override
public void postProcessParameter(CodegenParameter parameter){ public void postProcessParameter(CodegenParameter parameter) {
postProcessPattern(parameter.pattern, parameter.vendorExtensions); postProcessPattern(parameter.pattern, parameter.vendorExtensions);
} }
@ -268,21 +266,21 @@ public class PythonClientCodegen extends DefaultCodegen implements CodegenConfig
* does not support this in as natural a way so it needs to convert it. See * does not support this in as natural a way so it needs to convert it. See
* https://docs.python.org/2/howto/regex.html#compilation-flags for details. * https://docs.python.org/2/howto/regex.html#compilation-flags for details.
*/ */
public void postProcessPattern(String pattern, Map<String, Object> vendorExtensions){ public void postProcessPattern(String pattern, Map<String, Object> vendorExtensions) {
if(pattern != null) { if (pattern != null) {
int i = pattern.lastIndexOf('/'); int i = pattern.lastIndexOf('/');
//Must follow Perl /pattern/modifiers convention //Must follow Perl /pattern/modifiers convention
if(pattern.charAt(0) != '/' || i < 2) { if (pattern.charAt(0) != '/' || i < 2) {
throw new IllegalArgumentException("Pattern must follow the Perl " throw new IllegalArgumentException("Pattern must follow the Perl "
+ "/pattern/modifiers convention. "+pattern+" is not valid."); + "/pattern/modifiers convention. " + pattern + " is not valid.");
} }
String regex = pattern.substring(1, i).replace("'", "\\'"); String regex = pattern.substring(1, i).replace("'", "\\'");
List<String> modifiers = new ArrayList<String>(); List<String> modifiers = new ArrayList<String>();
for(char c : pattern.substring(i).toCharArray()) { for (char c : pattern.substring(i).toCharArray()) {
if(regexModifiers.containsKey(c)) { if (regexModifiers.containsKey(c)) {
String modifier = regexModifiers.get(c); String modifier = regexModifiers.get(c);
modifiers.add(modifier); modifiers.add(modifier);
} }
@ -310,7 +308,7 @@ public class PythonClientCodegen extends DefaultCodegen implements CodegenConfig
@Override @Override
public String escapeReservedWord(String name) { public String escapeReservedWord(String name) {
if(this.reservedWordsMappings().containsKey(name)) { if (this.reservedWordsMappings().containsKey(name)) {
return this.reservedWordsMappings().get(name); return this.reservedWordsMappings().get(name);
} }
return "_" + name; return "_" + name;
@ -521,7 +519,7 @@ public class PythonClientCodegen extends DefaultCodegen implements CodegenConfig
} }
public void setProjectName(String projectName) { public void setProjectName(String projectName) {
this.projectName= projectName; this.projectName = projectName;
} }
public void setPackageVersion(String packageVersion) { public void setPackageVersion(String packageVersion) {
@ -534,7 +532,7 @@ public class PythonClientCodegen extends DefaultCodegen implements CodegenConfig
/** /**
* Generate Python package name from String `packageName` * Generate Python package name from String `packageName`
* * <p>
* (PEP 0008) Python packages should also have short, all-lowercase names, * (PEP 0008) Python packages should also have short, all-lowercase names,
* although the use of underscores is discouraged. * although the use of underscores is discouraged.
* *