From 3eb90a69e637bd7bf00bcc76aec72716f5ea2b54 Mon Sep 17 00:00:00 2001 From: Justin Black Date: Wed, 23 Nov 2022 09:52:11 -0500 Subject: [PATCH] Adds fix and tests (#14102) --- .../openapitools/codegen/DefaultCodegen.java | 25 +++++++++++------- .../languages/PythonClientCodegen.java | 19 +++++--------- .../codegen/DefaultCodegenTest.java | 18 ++++++------- .../codegen/python/PythonClientTest.java | 26 +++++++++++++++++++ 4 files changed, 57 insertions(+), 31 deletions(-) diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/DefaultCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/DefaultCodegen.java index e6f0dd8d22e..81f2e83b838 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/DefaultCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/DefaultCodegen.java @@ -3033,17 +3033,17 @@ public class DefaultCodegen implements CodegenConfig { if (schema.getAdditionalProperties() == null) { if (!disallowAdditionalPropertiesIfNotPresent) { isAdditionalPropertiesTrue = true; - addPropProp = fromProperty("", new Schema(), false); + addPropProp = fromProperty(getAdditionalPropertiesName(), new Schema(), false); additionalPropertiesIsAnyType = true; } } else if (schema.getAdditionalProperties() instanceof Boolean) { if (Boolean.TRUE.equals(schema.getAdditionalProperties())) { isAdditionalPropertiesTrue = true; - addPropProp = fromProperty("", new Schema(), false); + addPropProp = fromProperty(getAdditionalPropertiesName(), new Schema(), false); additionalPropertiesIsAnyType = true; } } else { - addPropProp = fromProperty("", (Schema) schema.getAdditionalProperties(), false); + addPropProp = fromProperty(getAdditionalPropertiesName(), (Schema) schema.getAdditionalProperties(), false); if (ModelUtils.isAnyType((Schema) schema.getAdditionalProperties())) { additionalPropertiesIsAnyType = true; } @@ -3853,13 +3853,7 @@ public class DefaultCodegen implements CodegenConfig { } // handle inner property - String itemName = null; - if (p.getExtensions() != null && p.getExtensions().get("x-item-name") != null) { - itemName = p.getExtensions().get("x-item-name").toString(); - } - if (itemName == null) { - itemName = property.name; - } + String itemName = getItemsName(p, name); ArraySchema arraySchema = (ArraySchema) p; Schema innerSchema = unaliasSchema(getSchemaItems(arraySchema)); CodegenProperty cp = fromProperty(itemName, innerSchema, false); @@ -7355,6 +7349,17 @@ public class DefaultCodegen implements CodegenConfig { addRequiredVarsMap(schema, property); } + protected String getItemsName(Schema containingSchema, String containingSchemaName) { + // fromProperty use case + if (containingSchema.getExtensions() != null && containingSchema.getExtensions().get("x-item-name") != null) { + return containingSchema.getExtensions().get("x-item-name").toString(); + } + return toVarName(containingSchemaName); + } + + protected String getAdditionalPropertiesName() { + return "additional_properties"; + } private void addJsonSchemaForBodyRequestInCaseItsNotPresent(CodegenParameter codegenParameter, RequestBody body) { if (codegenParameter.jsonSchema == null) codegenParameter.jsonSchema = Json.pretty(body); diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/PythonClientCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/PythonClientCodegen.java index 965bbd35354..3eecc392a80 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/PythonClientCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/PythonClientCodegen.java @@ -29,6 +29,7 @@ import io.swagger.v3.oas.models.tags.Tag; import org.apache.commons.io.FileUtils; import org.openapitools.codegen.api.TemplatePathLocator; +import org.openapitools.codegen.config.GlobalSettings; import org.openapitools.codegen.ignore.CodegenIgnoreProcessor; import org.openapitools.codegen.model.ModelMap; import org.openapitools.codegen.model.ModelsMap; @@ -239,6 +240,7 @@ public class PythonClientCodegen extends AbstractPythonCodegen { // When the 'additionalProperties' keyword is not present in a OAS schema, allow // undeclared properties. This is compliant with the JSON schema specification. this.setDisallowAdditionalPropertiesIfNotPresent(false); + GlobalSettings.setProperty("x-disallow-additional-properties-if-not-present", "false"); // this may set datatype right for additional properties instantiationTypes.put("map", "dict"); @@ -1063,19 +1065,9 @@ public class PythonClientCodegen extends AbstractPythonCodegen { if (cp.isPrimitiveType && unaliasedSchema.get$ref() != null) { cp.complexType = cp.dataType; } - setAdditionalPropsAndItemsVarNames(cp); return cp; } - private void setAdditionalPropsAndItemsVarNames(IJsonSchemaValidationProperties item) { - if (item.getAdditionalProperties() != null) { - item.getAdditionalProperties().setBaseName("additional_properties"); - } - if (item.getItems() != null) { - item.getItems().setBaseName("items"); - } - } - /** * checks if the data should be classified as "string" in enum * e.g. double in C# needs to be double-quoted (e.g. "2.8") by treating it as a string @@ -1089,6 +1081,10 @@ public class PythonClientCodegen extends AbstractPythonCodegen { return "str".equals(dataType); } + protected String getItemsName(Schema containingSchema, String containingSchemaName) { + return "items"; + } + /** * Update codegen property's enum by adding "enumVars" (with name and value) * @@ -1510,7 +1506,6 @@ public class PythonClientCodegen extends AbstractPythonCodegen { cm.setHasMultipleTypes(true); } Boolean isNotPythonModelSimpleModel = (ModelUtils.isComposedSchema(sc) || ModelUtils.isObjectSchema(sc) || ModelUtils.isMapSchema(sc)); - setAdditionalPropsAndItemsVarNames(cm); if (isNotPythonModelSimpleModel) { return cm; } @@ -2272,7 +2267,7 @@ public class PythonClientCodegen extends AbstractPythonCodegen { if (addPropsSchema == null) { return; } - CodegenProperty addPropProp = fromProperty("", addPropsSchema, false, false); + CodegenProperty addPropProp = fromProperty(getAdditionalPropertiesName(), addPropsSchema, false, false); property.setAdditionalProperties(addPropProp); } diff --git a/modules/openapi-generator/src/test/java/org/openapitools/codegen/DefaultCodegenTest.java b/modules/openapi-generator/src/test/java/org/openapitools/codegen/DefaultCodegenTest.java index 6df19a13118..05ca4fc6022 100644 --- a/modules/openapi-generator/src/test/java/org/openapitools/codegen/DefaultCodegenTest.java +++ b/modules/openapi-generator/src/test/java/org/openapitools/codegen/DefaultCodegenTest.java @@ -2592,7 +2592,7 @@ public class DefaultCodegenTest { String modelName; Schema sc; CodegenModel cm; - CodegenProperty anyTypeSchema = codegen.fromProperty("", new Schema()); + CodegenProperty anyTypeSchema = codegen.fromProperty("additional_properties", new Schema()); modelName = "AdditionalPropertiesUnset"; sc = openAPI.getComponents().getSchemas().get(modelName); @@ -2615,7 +2615,7 @@ public class DefaultCodegenTest { modelName = "AdditionalPropertiesSchema"; sc = openAPI.getComponents().getSchemas().get(modelName); cm = codegen.fromModel(modelName, sc); - CodegenProperty stringCp = codegen.fromProperty("", new Schema().type("string")); + CodegenProperty stringCp = codegen.fromProperty("additional_properties", new Schema().type("string")); assertEquals(cm.getAdditionalProperties(), stringCp); assertFalse(cm.getAdditionalPropertiesIsAnyType()); } @@ -2630,8 +2630,8 @@ public class DefaultCodegenTest { String modelName; Schema sc; CodegenModel cm; - CodegenProperty anyTypeSchema = codegen.fromProperty("", new Schema()); - CodegenProperty stringCp = codegen.fromProperty("", new Schema().type("string")); + CodegenProperty anyTypeSchema = codegen.fromProperty("additional_properties", new Schema()); + CodegenProperty stringCp = codegen.fromProperty("additional_properties", new Schema().type("string")); CodegenProperty mapWithAddPropsUnset; CodegenProperty mapWithAddPropsTrue; CodegenProperty mapWithAddPropsFalse; @@ -2691,8 +2691,8 @@ public class DefaultCodegenTest { Operation operation; CodegenOperation co; - CodegenProperty anyTypeSchema = codegen.fromProperty("", new Schema()); - CodegenProperty stringCp = codegen.fromProperty("", new Schema().type("string")); + CodegenProperty anyTypeSchema = codegen.fromProperty("additional_properties", new Schema()); + CodegenProperty stringCp = codegen.fromProperty("additional_properties", new Schema().type("string")); CodegenParameter mapWithAddPropsUnset; CodegenParameter mapWithAddPropsTrue; CodegenParameter mapWithAddPropsFalse; @@ -2752,8 +2752,8 @@ public class DefaultCodegenTest { Operation operation; CodegenOperation co; - CodegenProperty anyTypeSchema = codegen.fromProperty("", new Schema()); - CodegenProperty stringCp = codegen.fromProperty("", new Schema().type("string")); + CodegenProperty anyTypeSchema = codegen.fromProperty("additional_properties", new Schema()); + CodegenProperty stringCp = codegen.fromProperty("additional_properties", new Schema().type("string")); CodegenResponse mapWithAddPropsUnset; CodegenResponse mapWithAddPropsTrue; CodegenResponse mapWithAddPropsFalse; @@ -2808,7 +2808,7 @@ public class DefaultCodegenTest { final DefaultCodegen codegen = new DefaultCodegen(); codegen.setOpenAPI(openAPI); - CodegenProperty anyTypeSchema = codegen.fromProperty("", new Schema()); + CodegenProperty anyTypeSchema = codegen.fromProperty("additional_properties", new Schema()); Schema sc; CodegenModel cm; diff --git a/modules/openapi-generator/src/test/java/org/openapitools/codegen/python/PythonClientTest.java b/modules/openapi-generator/src/test/java/org/openapitools/codegen/python/PythonClientTest.java index 698aaf89dbc..8a4cbe73d31 100644 --- a/modules/openapi-generator/src/test/java/org/openapitools/codegen/python/PythonClientTest.java +++ b/modules/openapi-generator/src/test/java/org/openapitools/codegen/python/PythonClientTest.java @@ -233,4 +233,30 @@ public class PythonClientTest { String importValue = codegen.toModelImport("model_name"); Assert.assertEquals(importValue, "from openapi.client.model.model_name import ModelName"); } + + @Test + public void testIdenticalSchemasHaveDifferentBasenames() { + final PythonClientCodegen codegen = new PythonClientCodegen(); + + Schema objSchema = new Schema(); + objSchema.setType("object"); + Schema addProp = new Schema(); + addProp.setType("object"); + objSchema.setAdditionalProperties(addProp); + + Schema arraySchema = new ArraySchema(); + Schema items = new Schema(); + items.setType("object"); + arraySchema.setItems(items); + + CodegenProperty objSchemaProp = codegen.fromProperty("objSchemaProp", objSchema, false, false); + CodegenProperty arraySchemaProp = codegen.fromProperty("arraySchemaProp", arraySchema, false, false); + Assert.assertEquals(objSchemaProp.getAdditionalProperties().baseName, "additional_properties"); + Assert.assertEquals(arraySchemaProp.getItems().baseName, "items"); + + CodegenModel objSchemaModel = codegen.fromModel("objSchemaModel", objSchema); + CodegenModel arraySchemaModel = codegen.fromModel("arraySchemaModel", arraySchema); + Assert.assertEquals(objSchemaModel.getAdditionalProperties().baseName, "additional_properties"); + Assert.assertEquals(arraySchemaModel.getItems().baseName, "items"); + } } \ No newline at end of file