From a4d4b0f0bdbb6c944eb0bf7736ccc0c4cab10a6f Mon Sep 17 00:00:00 2001 From: wing328 Date: Wed, 22 Mar 2017 20:41:12 +0800 Subject: [PATCH] fix pattern in python flask (#5155) --- .../languages/FlaskConnexionCodegen.java | 43 +++++++++++++++++++ .../languages/PythonClientCodegen.java | 12 +++--- .../swagger_server/swagger/swagger.yaml | 2 +- 3 files changed, 50 insertions(+), 7 deletions(-) diff --git a/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/FlaskConnexionCodegen.java b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/FlaskConnexionCodegen.java index de16d24b6c9a..5ec8e45411be 100644 --- a/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/FlaskConnexionCodegen.java +++ b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/FlaskConnexionCodegen.java @@ -34,6 +34,7 @@ public class FlaskConnexionCodegen extends DefaultCodegen implements CodegenConf protected String packageVersion; protected String controllerPackage; protected String defaultController; + protected Map regexModifiers; public FlaskConnexionCodegen() { super(); @@ -110,6 +111,14 @@ public class FlaskConnexionCodegen extends DefaultCodegen implements CodegenConf supportingFiles.add(new SupportingFile("Dockerfile.mustache", "", "Dockerfile")); supportingFiles.add(new SupportingFile("dockerignore.mustache", "", ".dockerignore")); + regexModifiers = new HashMap(); + regexModifiers.put('i', "IGNORECASE"); + regexModifiers.put('l', "LOCALE"); + regexModifiers.put('m', "MULTILINE"); + regexModifiers.put('s', "DOTALL"); + regexModifiers.put('u', "UNICODE"); + regexModifiers.put('x', "VERBOSE"); + cliOptions.add(new CliOption(CodegenConstants.PACKAGE_NAME, "python package name (convention: snake_case).") .defaultValue("swagger_server")); cliOptions.add(new CliOption(CodegenConstants.PACKAGE_VERSION, "python package version.") @@ -640,8 +649,42 @@ public class FlaskConnexionCodegen extends DefaultCodegen implements CodegenConf if (StringUtils.isNotEmpty(property.pattern)) { addImport(model, "import re"); } + postProcessPattern(property.pattern, property.vendorExtensions); } + @Override + public void postProcessParameter(CodegenParameter parameter){ + postProcessPattern(parameter.pattern, parameter.vendorExtensions); + } + /* + * The swagger pattern spec follows the Perl convention and style of modifiers. Python + * 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. + */ + public void postProcessPattern(String pattern, Map vendorExtensions){ + if(pattern != null) { + int i = pattern.lastIndexOf('/'); + + //Must follow Perl /pattern/modifiers convention + if(pattern.charAt(0) != '/' || i < 2) { + throw new IllegalArgumentException("Pattern must follow the Perl " + + "/pattern/modifiers convention. "+pattern+" is not valid."); + } + + String regex = pattern.substring(1, i).replace("'", "\\'"); + List modifiers = new ArrayList(); + + for(char c : pattern.substring(i).toCharArray()) { + if(regexModifiers.containsKey(c)) { + String modifier = regexModifiers.get(c); + modifiers.add(modifier); + } + } + + vendorExtensions.put("x-regex", regex); + vendorExtensions.put("x-modifiers", modifiers); + } + } } diff --git a/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/PythonClientCodegen.java b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/PythonClientCodegen.java index 5c0aa0a7916c..92c24648aa9d 100755 --- a/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/PythonClientCodegen.java +++ b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/PythonClientCodegen.java @@ -32,7 +32,7 @@ public class PythonClientCodegen extends DefaultCodegen implements CodegenConfig protected Map regexModifiers; - private String testFolder; + private String testFolder; public PythonClientCodegen() { super(); @@ -292,12 +292,12 @@ public class PythonClientCodegen extends DefaultCodegen implements CodegenConfig @Override public String apiTestFileFolder() { - return outputFolder + File.separatorChar + testFolder; + return outputFolder + File.separatorChar + testFolder; } @Override public String modelTestFileFolder() { - return outputFolder + File.separatorChar + testFolder; + return outputFolder + File.separatorChar + testFolder; } @Override @@ -433,8 +433,8 @@ public class PythonClientCodegen extends DefaultCodegen implements CodegenConfig @Override public String toModelTestFilename(String name) { - return "test_" + toModelFilename(name); - }; + return "test_" + toModelFilename(name); + } @Override public String toApiFilename(String name) { @@ -447,7 +447,7 @@ public class PythonClientCodegen extends DefaultCodegen implements CodegenConfig @Override public String toApiTestFilename(String name) { - return "test_" + toApiFilename(name); + return "test_" + toApiFilename(name); } @Override diff --git a/samples/server/petstore/flaskConnexion/swagger_server/swagger/swagger.yaml b/samples/server/petstore/flaskConnexion/swagger_server/swagger/swagger.yaml index 92590b31bc1f..a12fa87d872c 100644 --- a/samples/server/petstore/flaskConnexion/swagger_server/swagger/swagger.yaml +++ b/samples/server/petstore/flaskConnexion/swagger_server/swagger/swagger.yaml @@ -108,11 +108,11 @@ paths: type: "array" items: type: "string" + default: "available" enum: - "available" - "pending" - "sold" - default: "available" collectionFormat: "csv" responses: 200: