Skip to content
This repository was archived by the owner on Dec 25, 2024. It is now read-only.

Commit de31b68

Browse files
authored
Issue 93, fixes addProps break (#93)
* Fixes bug, adds test, two new methods added * Fixes tests in DefaultCodegenTest
1 parent e55be49 commit de31b68

File tree

4 files changed

+66
-32
lines changed

4 files changed

+66
-32
lines changed

modules/openapi-json-schema-generator/src/main/java/org/openapitools/codegen/DefaultCodegen.java

Lines changed: 24 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -2934,7 +2934,8 @@ public CodegenModel fromModel(String name, Schema schema) {
29342934
m.setFormat(schema.getFormat());
29352935
m.setComposedSchemas(getComposedSchemas(schema));
29362936
if (ModelUtils.isArraySchema(schema)) {
2937-
CodegenProperty arrayProperty = fromProperty(name, schema, false);
2937+
String itemName = getItemsName(null, name);
2938+
CodegenProperty arrayProperty = fromProperty(itemName, schema, false);
29382939
m.setItems(arrayProperty.items);
29392940
m.arrayModelType = arrayProperty.complexType;
29402941
addParentContainer(m, name, schema);
@@ -3032,17 +3033,17 @@ protected void setAddProps(Schema schema, IJsonSchemaValidationProperties proper
30323033
if (schema.getAdditionalProperties() == null) {
30333034
if (!disallowAdditionalPropertiesIfNotPresent) {
30343035
isAdditionalPropertiesTrue = true;
3035-
addPropProp = fromProperty("", new Schema(), false);
3036+
addPropProp = fromProperty(getAdditionalPropertiesName(), new Schema(), false);
30363037
additionalPropertiesIsAnyType = true;
30373038
}
30383039
} else if (schema.getAdditionalProperties() instanceof Boolean) {
30393040
if (Boolean.TRUE.equals(schema.getAdditionalProperties())) {
30403041
isAdditionalPropertiesTrue = true;
3041-
addPropProp = fromProperty("", new Schema(), false);
3042+
addPropProp = fromProperty(getAdditionalPropertiesName(), new Schema(), false);
30423043
additionalPropertiesIsAnyType = true;
30433044
}
30443045
} else {
3045-
addPropProp = fromProperty("", (Schema) schema.getAdditionalProperties(), false);
3046+
addPropProp = fromProperty(getAdditionalPropertiesName(), (Schema) schema.getAdditionalProperties(), false);
30463047
if (ModelUtils.isAnyType((Schema) schema.getAdditionalProperties())) {
30473048
additionalPropertiesIsAnyType = true;
30483049
}
@@ -3850,13 +3851,7 @@ public CodegenProperty fromProperty(String name, Schema p, boolean required, boo
38503851
}
38513852

38523853
// handle inner property
3853-
String itemName = null;
3854-
if (p.getExtensions() != null && p.getExtensions().get("x-item-name") != null) {
3855-
itemName = p.getExtensions().get("x-item-name").toString();
3856-
}
3857-
if (itemName == null) {
3858-
itemName = property.name;
3859-
}
3854+
String itemName = getItemsName(p, name);
38603855
ArraySchema arraySchema = (ArraySchema) p;
38613856
Schema innerSchema = unaliasSchema(getSchemaItems(arraySchema));
38623857
CodegenProperty cp = fromProperty(itemName, innerSchema, false);
@@ -7914,6 +7909,24 @@ public List<VendorExtension> getSupportedVendorExtensions() {
79147909
*/
79157910
protected String handleSpecialCharacters(String name) { return name; }
79167911

7912+
public String getItemsName(Schema containingSchema, String containingSchemaName) {
7913+
String itemName = null;
7914+
if (containingSchema != null) {
7915+
// fromProperty use case
7916+
if (containingSchema.getExtensions() != null && containingSchema.getExtensions().get("x-item-name") != null) {
7917+
return containingSchema.getExtensions().get("x-item-name").toString();
7918+
}
7919+
return toVarName(containingSchemaName);
7920+
}
7921+
// fromModel use case
7922+
return containingSchemaName;
7923+
}
7924+
7925+
public String getAdditionalPropertiesName() {
7926+
return "additional_properties";
7927+
}
7928+
7929+
79177930
/**
79187931
* Used to ensure that null or Schema is returned given an input Boolean/Schema/null
79197932
* This will be used in openapi 3.1.0 spec processing to ensure that Booleans become Schemas

modules/openapi-json-schema-generator/src/main/java/org/openapitools/codegen/languages/PythonClientCodegen.java

Lines changed: 7 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929

3030
import org.apache.commons.io.FileUtils;
3131
import org.openapitools.codegen.api.TemplatePathLocator;
32+
import org.openapitools.codegen.config.GlobalSettings;
3233
import org.openapitools.codegen.ignore.CodegenIgnoreProcessor;
3334
import org.openapitools.codegen.model.ModelMap;
3435
import org.openapitools.codegen.model.ModelsMap;
@@ -239,6 +240,7 @@ public PythonClientCodegen() {
239240
// When the 'additionalProperties' keyword is not present in a OAS schema, allow
240241
// undeclared properties. This is compliant with the JSON schema specification.
241242
this.setDisallowAdditionalPropertiesIfNotPresent(false);
243+
GlobalSettings.setProperty("x-disallow-additional-properties-if-not-present", "false");
242244

243245
// this may set datatype right for additional properties
244246
instantiationTypes.put("map", "dict");
@@ -1063,19 +1065,9 @@ public CodegenProperty fromProperty(String name, Schema p, boolean required, boo
10631065
if (cp.isPrimitiveType && unaliasedSchema.get$ref() != null) {
10641066
cp.complexType = cp.dataType;
10651067
}
1066-
setAdditionalPropsAndItemsVarNames(cp);
10671068
return cp;
10681069
}
10691070

1070-
private void setAdditionalPropsAndItemsVarNames(IJsonSchemaValidationProperties item) {
1071-
if (item.getAdditionalProperties() != null) {
1072-
item.getAdditionalProperties().setBaseName("additional_properties");
1073-
}
1074-
if (item.getItems() != null) {
1075-
item.getItems().setBaseName("items");
1076-
}
1077-
}
1078-
10791071
/**
10801072
* checks if the data should be classified as "string" in enum
10811073
* 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 boolean isDataTypeString(String dataType) {
10891081
return "str".equals(dataType);
10901082
}
10911083

1084+
public String getItemsName(Schema containingSchema, String containingSchemaName) {
1085+
return "items";
1086+
}
1087+
10921088
/**
10931089
* Update codegen property's enum by adding "enumVars" (with name and value)
10941090
*
@@ -1510,7 +1506,6 @@ public CodegenModel fromModel(String name, Schema sc) {
15101506
cm.setHasMultipleTypes(true);
15111507
}
15121508
Boolean isNotPythonModelSimpleModel = (ModelUtils.isComposedSchema(sc) || ModelUtils.isObjectSchema(sc) || ModelUtils.isMapSchema(sc));
1513-
setAdditionalPropsAndItemsVarNames(cm);
15141509
if (isNotPythonModelSimpleModel) {
15151510
return cm;
15161511
}
@@ -2272,7 +2267,7 @@ protected void setAddProps(Schema schema, IJsonSchemaValidationProperties proper
22722267
if (addPropsSchema == null) {
22732268
return;
22742269
}
2275-
CodegenProperty addPropProp = fromProperty("", addPropsSchema, false, false);
2270+
CodegenProperty addPropProp = fromProperty(getAdditionalPropertiesName(), addPropsSchema, false, false);
22762271
property.setAdditionalProperties(addPropProp);
22772272
}
22782273

modules/openapi-json-schema-generator/src/test/java/org/openapitools/codegen/DefaultCodegenTest.java

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2592,7 +2592,7 @@ public void testAdditionalPropertiesPresentInModels() {
25922592
String modelName;
25932593
Schema sc;
25942594
CodegenModel cm;
2595-
CodegenProperty anyTypeSchema = codegen.fromProperty("", new Schema());
2595+
CodegenProperty anyTypeSchema = codegen.fromProperty("additional_properties", new Schema());
25962596

25972597
modelName = "AdditionalPropertiesUnset";
25982598
sc = openAPI.getComponents().getSchemas().get(modelName);
@@ -2615,7 +2615,7 @@ public void testAdditionalPropertiesPresentInModels() {
26152615
modelName = "AdditionalPropertiesSchema";
26162616
sc = openAPI.getComponents().getSchemas().get(modelName);
26172617
cm = codegen.fromModel(modelName, sc);
2618-
CodegenProperty stringCp = codegen.fromProperty("", new Schema().type("string"));
2618+
CodegenProperty stringCp = codegen.fromProperty("additional_properties", new Schema().type("string"));
26192619
assertEquals(cm.getAdditionalProperties(), stringCp);
26202620
assertFalse(cm.getAdditionalPropertiesIsAnyType());
26212621
}
@@ -2630,8 +2630,8 @@ public void testAdditionalPropertiesPresentInModelProperties() {
26302630
String modelName;
26312631
Schema sc;
26322632
CodegenModel cm;
2633-
CodegenProperty anyTypeSchema = codegen.fromProperty("", new Schema());
2634-
CodegenProperty stringCp = codegen.fromProperty("", new Schema().type("string"));
2633+
CodegenProperty anyTypeSchema = codegen.fromProperty("additional_properties", new Schema());
2634+
CodegenProperty stringCp = codegen.fromProperty("additional_properties", new Schema().type("string"));
26352635
CodegenProperty mapWithAddPropsUnset;
26362636
CodegenProperty mapWithAddPropsTrue;
26372637
CodegenProperty mapWithAddPropsFalse;
@@ -2691,8 +2691,8 @@ public void testAdditionalPropertiesPresentInParameters() {
26912691
Operation operation;
26922692
CodegenOperation co;
26932693

2694-
CodegenProperty anyTypeSchema = codegen.fromProperty("", new Schema());
2695-
CodegenProperty stringCp = codegen.fromProperty("", new Schema().type("string"));
2694+
CodegenProperty anyTypeSchema = codegen.fromProperty("additional_properties", new Schema());
2695+
CodegenProperty stringCp = codegen.fromProperty("additional_properties", new Schema().type("string"));
26962696
CodegenParameter mapWithAddPropsUnset;
26972697
CodegenParameter mapWithAddPropsTrue;
26982698
CodegenParameter mapWithAddPropsFalse;
@@ -2752,8 +2752,8 @@ public void testAdditionalPropertiesPresentInResponses() {
27522752
Operation operation;
27532753
CodegenOperation co;
27542754

2755-
CodegenProperty anyTypeSchema = codegen.fromProperty("", new Schema());
2756-
CodegenProperty stringCp = codegen.fromProperty("", new Schema().type("string"));
2755+
CodegenProperty anyTypeSchema = codegen.fromProperty("additional_properties", new Schema());
2756+
CodegenProperty stringCp = codegen.fromProperty("additional_properties", new Schema().type("string"));
27572757
CodegenResponse mapWithAddPropsUnset;
27582758
CodegenResponse mapWithAddPropsTrue;
27592759
CodegenResponse mapWithAddPropsFalse;
@@ -2808,7 +2808,7 @@ public void testAdditionalPropertiesAnyType() {
28082808
final DefaultCodegen codegen = new DefaultCodegen();
28092809
codegen.setOpenAPI(openAPI);
28102810

2811-
CodegenProperty anyTypeSchema = codegen.fromProperty("", new Schema());
2811+
CodegenProperty anyTypeSchema = codegen.fromProperty("additional_properties", new Schema());
28122812

28132813
Schema sc;
28142814
CodegenModel cm;

modules/openapi-json-schema-generator/src/test/java/org/openapitools/codegen/python/PythonClientTest.java

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -233,4 +233,30 @@ public void testImportWithQualifiedPackageName() throws Exception {
233233
String importValue = codegen.toModelImport("model_name");
234234
Assert.assertEquals(importValue, "from openapi.client.model.model_name import ModelName");
235235
}
236+
237+
@Test
238+
public void testIdenticalSchemasHaveDifferentBasenames() {
239+
final PythonClientCodegen codegen = new PythonClientCodegen();
240+
241+
Schema objSchema = new Schema();
242+
objSchema.setType("object");
243+
Schema addProp = new Schema();
244+
addProp.setType("object");
245+
objSchema.setAdditionalProperties(addProp);
246+
247+
Schema arraySchema = new ArraySchema();
248+
Schema items = new Schema();
249+
items.setType("object");
250+
arraySchema.setItems(items);
251+
252+
CodegenProperty objSchemaProp = codegen.fromProperty("objSchemaProp", objSchema, false, false);
253+
CodegenProperty arraySchemaProp = codegen.fromProperty("arraySchemaProp", arraySchema, false, false);
254+
Assert.assertEquals(objSchemaProp.getAdditionalProperties().baseName, "additional_properties");
255+
Assert.assertEquals(arraySchemaProp.getItems().baseName, "items");
256+
257+
CodegenModel objSchemaModel = codegen.fromModel("objSchemaModel", objSchema);
258+
CodegenModel arraySchemaModel = codegen.fromModel("arraySchemaModel", arraySchema);
259+
Assert.assertEquals(objSchemaModel.getAdditionalProperties().baseName, "additional_properties");
260+
Assert.assertEquals(arraySchemaModel.getItems().baseName, "items");
261+
}
236262
}

0 commit comments

Comments
 (0)