diff --git a/modules/openapi-json-schema-generator/src/main/java/org/openapitools/codegen/languages/PythonClientCodegen.java b/modules/openapi-json-schema-generator/src/main/java/org/openapitools/codegen/languages/PythonClientCodegen.java index 1bbae6ebca9..afa1dd2cd86 100644 --- a/modules/openapi-json-schema-generator/src/main/java/org/openapitools/codegen/languages/PythonClientCodegen.java +++ b/modules/openapi-json-schema-generator/src/main/java/org/openapitools/codegen/languages/PythonClientCodegen.java @@ -1273,7 +1273,10 @@ public String toEnumVarName(String value, String datatype) { // Replace " " with _ String usedValue = value.replaceAll("\\s+", "_"); // strip first character if it is invalid + int lengthBeforeFirstCharStrip = usedValue.length(); + Character firstChar = usedValue.charAt(0); usedValue = usedValue.replaceAll("^[^_a-zA-Z]", ""); + boolean firstCharStripped = usedValue.length() == lengthBeforeFirstCharStrip - 1; // Replace / with _ for path enums usedValue = usedValue.replaceAll("/", "_"); // Replace . with _ for tag enums @@ -1296,6 +1299,14 @@ public String toEnumVarName(String value, String datatype) { // remove trailing _ usedValue = usedValue.replaceAll("[_]$", ""); } + // check first character to see if it is valid + // if not then add a valid prefix + boolean validFirstChar = Pattern.matches("^[_a-zA-Z]", usedValue.substring(0,1)); + if (!validFirstChar && firstCharStripped) { + String charName = Character.getName(firstChar.hashCode()); + usedValue = charNameToVarName(charName) + "_" + usedValue; + } + return usedValue; } diff --git a/modules/openapi-json-schema-generator/src/test/java/org/openapitools/codegen/python/PythonClientTest.java b/modules/openapi-json-schema-generator/src/test/java/org/openapitools/codegen/python/PythonClientTest.java index 2b7aabae46a..2617a4566fd 100644 --- a/modules/openapi-json-schema-generator/src/test/java/org/openapitools/codegen/python/PythonClientTest.java +++ b/modules/openapi-json-schema-generator/src/test/java/org/openapitools/codegen/python/PythonClientTest.java @@ -23,6 +23,8 @@ import org.openapitools.codegen.*; import org.openapitools.codegen.config.CodegenConfigurator; import org.openapitools.codegen.languages.PythonClientCodegen; +import org.openapitools.codegen.model.ModelMap; +import org.openapitools.codegen.model.ModelsMap; import org.openapitools.codegen.utils.ModelUtils; import org.testng.Assert; import org.testng.annotations.Test; @@ -32,6 +34,7 @@ import java.nio.charset.StandardCharsets; import java.nio.file.Files; import java.nio.file.Path; +import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.List; @@ -197,4 +200,28 @@ public void testRegexWithMultipleFlagsWorks() { Assert.assertEquals(cm.vendorExtensions.get("x-regex"), expectedRegexPattern); Assert.assertEquals(cm.vendorExtensions.get("x-modifiers"), Arrays.asList("DOTALL", "IGNORECASE", "MULTILINE")); } + + @Test + public void testEnumNames() { + OpenAPI openAPI = TestUtils.parseFlattenSpec("src/test/resources/3_0/70_schema_enum_names.yaml"); + PythonClientCodegen codegen = new PythonClientCodegen(); + codegen.setOpenAPI(openAPI); + + String modelName = "StringEnum"; + Schema schema = openAPI.getComponents().getSchemas().get(modelName); + + CodegenModel cm = codegen.fromModel(modelName, schema); + + ModelMap modelMap = new ModelMap(); + modelMap.setModel(cm); + + ModelsMap modelsMap = new ModelsMap(); + modelsMap.setModels(Collections.singletonList(modelMap)); + codegen.postProcessModels(modelsMap); + + ArrayList> enumVars = (ArrayList>) cm.getAllowableValues().get("enumVars"); + Assert.assertEquals(enumVars.size(), 2); + Assert.assertEquals(enumVars.get(0).get("name"), "DIGIT_THREE_67B9C"); + Assert.assertEquals(enumVars.get(1).get("name"), "FFA5A4"); + } } diff --git a/modules/openapi-json-schema-generator/src/test/resources/3_0/70_schema_enum_names.yaml b/modules/openapi-json-schema-generator/src/test/resources/3_0/70_schema_enum_names.yaml new file mode 100644 index 00000000000..8c441ea0325 --- /dev/null +++ b/modules/openapi-json-schema-generator/src/test/resources/3_0/70_schema_enum_names.yaml @@ -0,0 +1,12 @@ +openapi: 3.0.3 +info: + title: Test + version: 1.0.0-SNAPSHOT +paths: {} +components: + schemas: + StringEnum: + type: string + enum: + - "#367B9C" + - "#FFA5A4" \ No newline at end of file