From c44fe8a04a569ea73ce3cf2b33005812e8c138c2 Mon Sep 17 00:00:00 2001 From: Justin Black Date: Wed, 13 Jul 2022 18:17:33 -0700 Subject: [PATCH] Fixes fromProperty when property is required vs optional (#12858) * Adds required boolean to fromProperty * Adds required to other method signatures * pythn-exp sample regenerated * Samples regenerated * Adds java test of fix --- .../openapitools/codegen/DefaultCodegen.java | 150 +++++++++--------- .../IJsonSchemaValidationProperties.java | 2 +- .../codegen/languages/AbstractAdaCodegen.java | 6 +- .../codegen/languages/AbstractCppCodegen.java | 4 +- .../languages/AbstractDartCodegen.java | 4 +- .../languages/AbstractScalaCodegen.java | 4 +- .../languages/CLibcurlClientCodegen.java | 4 +- .../languages/CppPistacheServerCodegen.java | 2 +- .../languages/CppRestSdkClientCodegen.java | 2 +- .../codegen/languages/GoClientCodegen.java | 4 +- .../codegen/languages/KtormSchemaCodegen.java | 2 +- .../languages/PhpLaravelServerCodegen.java | 4 +- .../languages/PythonClientCodegen.java | 6 +- .../PythonExperimentalClientCodegen.java | 14 +- .../TypeScriptFetchClientCodegen.java | 6 +- .../codegen/DefaultCodegenTest.java | 25 +++ .../src/test/resources/3_0/issue_12857.yaml | 17 ++ .../docs/ChildCat.md | 2 +- .../src/Org.OpenAPITools/Model/ChildCat.cs | 11 +- .../OpenAPIClient-httpclient/docs/ChildCat.md | 2 +- .../src/Org.OpenAPITools/Model/ChildCat.cs | 10 +- .../OpenAPIClient-net47/docs/ChildCat.md | 2 +- .../src/Org.OpenAPITools/Model/ChildCat.cs | 10 +- .../OpenAPIClient-net5.0/docs/ChildCat.md | 2 +- .../src/Org.OpenAPITools/Model/ChildCat.cs | 10 +- .../OpenAPIClient/docs/ChildCat.md | 2 +- .../src/Org.OpenAPITools/Model/ChildCat.cs | 10 +- .../OpenAPIClientCore/docs/ChildCat.md | 2 +- .../src/Org.OpenAPITools/Model/ChildCat.cs | 10 +- .../petstore/java/jersey3/docs/ChildCat.md | 2 +- .../openapitools/client/model/ChildCat.java | 8 +- .../builds/test-petstore/api.ts | 2 +- .../java/jersey2-java8/docs/ChildCat.md | 2 +- .../openapitools/client/model/ChildCat.java | 8 +- .../python-experimental/docs/PetApi.md | 2 +- .../fake_api_endpoints/endpoint_parameters.py | 12 ++ .../api/fake_api_endpoints/json_form_data.py | 6 + .../api/fake_api_endpoints/upload_file.py | 3 + .../upload_file_with_required_file.py | 3 + .../api/pet_api_endpoints/upload_image.py | 2 + 40 files changed, 224 insertions(+), 155 deletions(-) create mode 100644 modules/openapi-generator/src/test/resources/3_0/issue_12857.yaml 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 3f4d8cd3429..5d604086d81 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 @@ -2456,26 +2456,29 @@ public class DefaultCodegen implements CodegenConfig { } private static class NamedSchema { - private NamedSchema(String name, Schema s) { + private NamedSchema(String name, Schema s, boolean required) { this.name = name; this.schema = s; + this.required = required; } private String name; private Schema schema; + private boolean required; @Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; NamedSchema that = (NamedSchema) o; - return Objects.equals(name, that.name) && + return Objects.equals(required, that.required) && + Objects.equals(name, that.name) && Objects.equals(schema, that.schema); } @Override public int hashCode() { - return Objects.hash(name, schema); + return Objects.hash(name, schema, required); } } @@ -2548,7 +2551,7 @@ public class DefaultCodegen implements CodegenConfig { if (StringUtils.isBlank(interfaceSchema.get$ref())) { // primitive type String languageType = getTypeDeclaration(interfaceSchema); - CodegenProperty interfaceProperty = fromProperty(languageType, interfaceSchema); + CodegenProperty interfaceProperty = fromProperty(languageType, interfaceSchema, false); if (ModelUtils.isArraySchema(interfaceSchema) || ModelUtils.isMapSchema(interfaceSchema)) { while (interfaceProperty != null) { addImport(m, interfaceProperty.complexType); @@ -2584,7 +2587,7 @@ public class DefaultCodegen implements CodegenConfig { refSchema = allDefinitions.get(ref); } final String modelName = toModelName(ref); - CodegenProperty interfaceProperty = fromProperty(modelName, interfaceSchema); + CodegenProperty interfaceProperty = fromProperty(modelName, interfaceSchema, false); m.interfaces.add(modelName); addImport(composed, refSchema, m, modelName); @@ -2835,7 +2838,7 @@ public class DefaultCodegen implements CodegenConfig { m.setTypeProperties(schema); m.setComposedSchemas(getComposedSchemas(schema)); if (ModelUtils.isArraySchema(schema)) { - CodegenProperty arrayProperty = fromProperty(name, schema); + CodegenProperty arrayProperty = fromProperty(name, schema, false); m.setItems(arrayProperty.items); m.arrayModelType = arrayProperty.complexType; addParentContainer(m, name, schema); @@ -2955,17 +2958,17 @@ public class DefaultCodegen implements CodegenConfig { if (schema.getAdditionalProperties() == null) { if (!disallowAdditionalPropertiesIfNotPresent) { isAdditionalPropertiesTrue = true; - addPropProp = fromProperty("", new Schema()); + addPropProp = fromProperty("", new Schema(), false); additionalPropertiesIsAnyType = true; } } else if (schema.getAdditionalProperties() instanceof Boolean) { if (Boolean.TRUE.equals(schema.getAdditionalProperties())) { isAdditionalPropertiesTrue = true; - addPropProp = fromProperty("", new Schema()); + addPropProp = fromProperty("", new Schema(), false); additionalPropertiesIsAnyType = true; } } else { - addPropProp = fromProperty("", (Schema) schema.getAdditionalProperties()); + addPropProp = fromProperty("", (Schema) schema.getAdditionalProperties(), false); if (ModelUtils.isAnyType((Schema) schema.getAdditionalProperties())) { additionalPropertiesIsAnyType = true; } @@ -3451,7 +3454,7 @@ public class DefaultCodegen implements CodegenConfig { innerSchema = new StringSchema().description("//TODO automatically added by openapi-generator due to undefined type"); p.setAdditionalProperties(innerSchema); } - CodegenProperty cp = fromProperty("inner", innerSchema); + CodegenProperty cp = fromProperty("inner", innerSchema, false); updatePropertyForMap(property, cp); } @@ -3522,6 +3525,19 @@ public class DefaultCodegen implements CodegenConfig { property.pattern = toRegularExpression(p.getPattern()); } + /** + * TODO remove this in 7.0.0 as a breaking change + * This method was kept when required was added to the fromProperty signature + * to ensure that the change was non-breaking + * + * @param name name of the property + * @param p OAS property schema + * @return Codegen Property object + */ + public CodegenProperty fromProperty(String name, Schema p) { + return fromProperty(name, p, false); + } + /** * Convert OAS Property object to Codegen Property object. *

@@ -3531,26 +3547,28 @@ public class DefaultCodegen implements CodegenConfig { * Any subsequent processing of the CodegenModel return value must be idempotent * for a given (String name, Schema schema). * - * @param name name of the property - * @param p OAS property schema + * @param name name of the property + * @param p OAS property schema + * @param required true if the property is required in the next higher object schema, false otherwise * @return Codegen Property object */ - public CodegenProperty fromProperty(String name, Schema p) { + public CodegenProperty fromProperty(String name, Schema p, boolean required) { if (p == null) { LOGGER.error("Undefined property/schema for `{}`. Default to type:string.", name); return null; } LOGGER.debug("debugging fromProperty for {} : {}", name, p); - NamedSchema ns = new NamedSchema(name, p); + NamedSchema ns = new NamedSchema(name, p, required); CodegenProperty cpc = schemaCodegenPropertyCache.get(ns); if (cpc != null) { - LOGGER.debug("Cached fromProperty for {} : {}", name, p.getName()); + LOGGER.debug("Cached fromProperty for {} : {} required={}", name, p.getName(), required); return cpc; } // unalias schema p = unaliasSchema(p, schemaMapping); CodegenProperty property = CodegenModelFactory.newInstance(CodegenModelType.PROPERTY); + property.required = required; ModelUtils.syncValidationProperties(p, property); property.name = toVarName(name); @@ -3717,7 +3735,7 @@ public class DefaultCodegen implements CodegenConfig { } ArraySchema arraySchema = (ArraySchema) p; Schema innerSchema = unaliasSchema(getSchemaItems(arraySchema), schemaMapping); - CodegenProperty cp = fromProperty(itemName, innerSchema); + CodegenProperty cp = fromProperty(itemName, innerSchema, false); updatePropertyForArray(property, cp); } else if (ModelUtils.isTypeObjectSchema(p)) { updatePropertyForObject(property, p); @@ -3965,14 +3983,14 @@ public class DefaultCodegen implements CodegenConfig { Schema responseSchema = unaliasSchema(ModelUtils.getSchemaFromResponse(methodResponse), schemaMapping); if (responseSchema != null) { - CodegenProperty cm = fromProperty("response", responseSchema); + CodegenProperty cm = fromProperty("response", responseSchema, false); if (ModelUtils.isArraySchema(responseSchema)) { ArraySchema as = (ArraySchema) responseSchema; - CodegenProperty innerProperty = fromProperty("response", getSchemaItems(as)); + CodegenProperty innerProperty = fromProperty("response", getSchemaItems(as), false); op.returnBaseType = innerProperty.baseType; } else if (ModelUtils.isMapSchema(responseSchema)) { - CodegenProperty innerProperty = fromProperty("response", getAdditionalProperties(responseSchema)); + CodegenProperty innerProperty = fromProperty("response", getAdditionalProperties(responseSchema), false); op.returnBaseType = innerProperty.baseType; } else { if (cm.complexType != null) { @@ -4430,7 +4448,7 @@ public class DefaultCodegen implements CodegenConfig { r.setPattern(toRegularExpression(responseSchema.getPattern())); } - CodegenProperty cp = fromProperty("response", responseSchema); + CodegenProperty cp = fromProperty("response", responseSchema, false); r.dataType = getTypeDeclaration(responseSchema); if (!ModelUtils.isArraySchema(responseSchema)) { @@ -4453,7 +4471,7 @@ public class DefaultCodegen implements CodegenConfig { r.isArray = true; r.containerType = cp.containerType; ArraySchema as = (ArraySchema) responseSchema; - CodegenProperty items = fromProperty("response", getSchemaItems(as)); + CodegenProperty items = fromProperty("response", getSchemaItems(as), false); r.setItems(items); CodegenProperty innerCp = items; @@ -4612,7 +4630,7 @@ public class DefaultCodegen implements CodegenConfig { private void updateParameterForMap(CodegenParameter codegenParameter, Schema parameterSchema, Set imports) { - CodegenProperty codegenProperty = fromProperty("inner", getAdditionalProperties(parameterSchema)); + CodegenProperty codegenProperty = fromProperty("inner", getAdditionalProperties(parameterSchema), false); codegenParameter.items = codegenProperty; codegenParameter.mostInnerItems = codegenProperty.mostInnerItems; codegenParameter.baseType = codegenProperty.dataType; @@ -4700,11 +4718,11 @@ public class DefaultCodegen implements CodegenConfig { if (this instanceof RustServerCodegen) { // for rust server, we need to do somethings special as it uses // $ref (e.g. #components/schemas/Pet) to determine whether it's a model - prop = fromProperty(parameter.getName(), parameterSchema); + prop = fromProperty(parameter.getName(), parameterSchema, false); } else if (getUseInlineModelResolver()) { - prop = fromProperty(parameter.getName(), getReferencedSchemaWhenNotEnum(parameterSchema)); + prop = fromProperty(parameter.getName(), getReferencedSchemaWhenNotEnum(parameterSchema), false); } else { - prop = fromProperty(parameter.getName(), parameterSchema); + prop = fromProperty(parameter.getName(), parameterSchema, false); } codegenParameter.setSchema(prop); } else if (parameter.getContent() != null) { @@ -4827,7 +4845,7 @@ public class DefaultCodegen implements CodegenConfig { collectionFormat = getCollectionFormat(parameter); // default to csv: collectionFormat = StringUtils.isEmpty(collectionFormat) ? "csv" : collectionFormat; - CodegenProperty itemsProperty = fromProperty("inner", inner); + CodegenProperty itemsProperty = fromProperty("inner", inner, false); codegenParameter.items = itemsProperty; codegenParameter.mostInnerItems = itemsProperty.mostInnerItems; codegenParameter.baseType = itemsProperty.dataType; @@ -4843,15 +4861,10 @@ public class DefaultCodegen implements CodegenConfig { ; } - CodegenProperty codegenProperty = fromProperty(parameter.getName(), parameterSchema); + CodegenProperty codegenProperty = fromProperty(parameter.getName(), parameterSchema, false); if (Boolean.TRUE.equals(codegenProperty.isModel)) { codegenParameter.isModel = true; } - // TODO revise below which seems not working - //if (parameterSchema.getRequired() != null && !parameterSchema.getRequired().isEmpty() && parameterSchema.getRequired().contains(codegenProperty.baseName)) { - codegenProperty.required = Boolean.TRUE.equals(parameter.getRequired()) ? true : false; - //} - //codegenProperty.required = true; if (parameterModelName != null) { codegenParameter.dataType = parameterModelName; @@ -4865,7 +4878,9 @@ public class DefaultCodegen implements CodegenConfig { imports.add(codegenProperty.baseType); } codegenParameter.dataFormat = codegenProperty.dataFormat; - codegenParameter.required = codegenProperty.required; + if (parameter.getRequired() != null) { + codegenParameter.required = parameter.getRequired().booleanValue(); + } if (codegenProperty.isEnum) { codegenParameter.datatypeWithEnum = codegenProperty.datatypeWithEnum; @@ -4902,15 +4917,19 @@ public class DefaultCodegen implements CodegenConfig { if (schema.get$ref() != null) { schema = ModelUtils.getReferencedSchema(openAPI, schema); } - codegenParameter.items = fromProperty(codegenParameter.paramName, schema); + codegenParameter.items = fromProperty(codegenParameter.paramName, schema, false); // https://swagger.io/docs/specification/serialization/ if (schema != null) { Map> properties = schema.getProperties(); + List requiredVarNames = new ArrayList<>(); + if (schema.getRequired() != null) { + requiredVarNames.addAll(schema.getRequired()); + } if (properties != null) { codegenParameter.items.vars = properties.entrySet().stream() .map(entry -> { - CodegenProperty property = fromProperty(entry.getKey(), entry.getValue()); + CodegenProperty property = fromProperty(entry.getKey(), entry.getValue(), requiredVarNames.contains(entry.getKey())); property.baseName = codegenParameter.baseName + "[" + entry.getKey() + "]"; return property; }).collect(Collectors.toList()); @@ -5189,7 +5208,7 @@ public class DefaultCodegen implements CodegenConfig { } else { schema = header.getSchema(); } - CodegenProperty cp = fromProperty(headerEntry.getKey(), schema); + CodegenProperty cp = fromProperty(headerEntry.getKey(), schema, false); cp.setDescription(escapeText(description)); cp.setUnescapedDescription(description); if (header.getRequired() != null) { @@ -5257,7 +5276,7 @@ public class DefaultCodegen implements CodegenConfig { * @param schema the input OAS schema. */ protected void addParentContainer(CodegenModel model, String name, Schema schema) { - final CodegenProperty property = fromProperty(name, schema); + final CodegenProperty property = fromProperty(name, schema, false); addImport(model, property.complexType); model.parent = toInstantiationType(schema); final String containerType = property.containerType; @@ -5423,13 +5442,16 @@ public class DefaultCodegen implements CodegenConfig { if (prop == null) { LOGGER.warn("Please report the issue. There shouldn't be null property for {}", key); } else { - final CodegenProperty cp = fromProperty(key, prop); - cp.required = mandatory.contains(key); + final CodegenProperty cp = fromProperty(key, prop, mandatory.contains(key)); vars.add(cp); + m.setHasVars(true); + if (cp.required) { + m.setHasRequired(true); + m.getRequiredVars().add(cp); + } if (cm == null) { continue; } - cm.hasRequired = cm.hasRequired || cp.required; cm.hasOptional = cm.hasOptional || !cp.required; if (cp.isEnum) { // FIXME: if supporting inheritance, when called a second time for allProperties it is possible for @@ -5445,9 +5467,7 @@ public class DefaultCodegen implements CodegenConfig { addImportsForPropertyType(cm, cp); // if required, add to the list "requiredVars" - if (Boolean.TRUE.equals(cp.required)) { - cm.requiredVars.add(cp); - } else { // else add to the list "optionalVars" for optional property + if (Boolean.FALSE.equals(cp.required)) { cm.optionalVars.add(cp); } @@ -6467,7 +6487,7 @@ public class DefaultCodegen implements CodegenConfig { CodegenParameter codegenParameter = CodegenModelFactory.newInstance(CodegenModelType.PARAMETER); LOGGER.debug("Debugging fromFormProperty {}: {}", name, propertySchema); - CodegenProperty codegenProperty = fromProperty(name, propertySchema); + CodegenProperty codegenProperty = fromProperty(name, propertySchema, false); Schema ps = unaliasSchema(propertySchema, schemaMapping); ModelUtils.syncValidationProperties(ps, codegenParameter); @@ -6553,7 +6573,7 @@ public class DefaultCodegen implements CodegenConfig { ; } else if (ModelUtils.isArraySchema(ps)) { Schema inner = getSchemaItems((ArraySchema) ps); - CodegenProperty arrayInnerProperty = fromProperty("inner", inner); + CodegenProperty arrayInnerProperty = fromProperty("inner", inner, false); codegenParameter.items = arrayInnerProperty; codegenParameter.mostInnerItems = arrayInnerProperty.mostInnerItems; codegenParameter.isPrimitiveType = false; @@ -6648,7 +6668,7 @@ public class DefaultCodegen implements CodegenConfig { codegenParameter.isNullable = codegenModel.isNullable; imports.add(codegenParameter.baseType); } else { - CodegenProperty codegenProperty = fromProperty("property", schema); + CodegenProperty codegenProperty = fromProperty("property", schema, false); if (codegenProperty != null && codegenProperty.getComplexType() != null && codegenProperty.getComplexType().contains(" | ")) { List parts = Arrays.asList(codegenProperty.getComplexType().split(" \\| ")); @@ -6713,7 +6733,7 @@ public class DefaultCodegen implements CodegenConfig { inner = new StringSchema().description("//TODO automatically added by openapi-generator"); schema.setAdditionalProperties(inner); } - CodegenProperty codegenProperty = fromProperty("property", schema); + CodegenProperty codegenProperty = fromProperty("property", schema, false); imports.add(codegenProperty.baseType); @@ -6745,7 +6765,7 @@ public class DefaultCodegen implements CodegenConfig { } protected void updateRequestBodyForPrimitiveType(CodegenParameter codegenParameter, Schema schema, String bodyParameterName, Set imports) { - CodegenProperty codegenProperty = fromProperty("PRIMITIVE_REQUEST_BODY", schema); + CodegenProperty codegenProperty = fromProperty("PRIMITIVE_REQUEST_BODY", schema, false); if (codegenProperty != null) { if (StringUtils.isEmpty(bodyParameterName)) { codegenParameter.baseName = "body"; // default to body @@ -6779,7 +6799,7 @@ public class DefaultCodegen implements CodegenConfig { codegenParameter.isFreeFormObject = true; // HTTP request body is free form object - CodegenProperty codegenProperty = fromProperty("FREE_FORM_REQUEST_BODY", schema); + CodegenProperty codegenProperty = fromProperty("FREE_FORM_REQUEST_BODY", schema, false); if (codegenProperty != null) { if (StringUtils.isEmpty(bodyParameterName)) { codegenParameter.baseName = "body"; // default to body @@ -6808,7 +6828,7 @@ public class DefaultCodegen implements CodegenConfig { } else { final ArraySchema arraySchema = (ArraySchema) schema; Schema inner = getSchemaItems(arraySchema); - CodegenProperty codegenProperty = fromProperty("property", arraySchema); + CodegenProperty codegenProperty = fromProperty("property", arraySchema, false); imports.add(codegenProperty.baseType); CodegenProperty innerCp = codegenProperty; CodegenProperty mostInnerItem = innerCp; @@ -6942,7 +6962,7 @@ public class DefaultCodegen implements CodegenConfig { String contentType = contentEntry.getKey(); CodegenProperty schemaProp = null; if (mt.getSchema() != null) { - schemaProp = fromProperty(toMediaTypeSchemaName(contentType, mediaTypeSchemaSuffix), mt.getSchema()); + schemaProp = fromProperty(toMediaTypeSchemaName(contentType, mediaTypeSchemaSuffix), mt.getSchema(), false); } CodegenMediaType codegenMt = new CodegenMediaType(schemaProp, ceMap); cmtContent.put(contentType, codegenMt); @@ -7049,27 +7069,9 @@ public class DefaultCodegen implements CodegenConfig { protected void addVarsRequiredVarsAdditionalProps(Schema schema, IJsonSchemaValidationProperties property) { setAddProps(schema, property); - if (!"object".equals(schema.getType())) { - return; - } - if (schema instanceof ObjectSchema) { - ObjectSchema objSchema = (ObjectSchema) schema; - HashSet requiredVars = new HashSet<>(); - if (objSchema.getRequired() != null) { - requiredVars.addAll(objSchema.getRequired()); - } - if (objSchema.getProperties() != null && objSchema.getProperties().size() > 0) { - property.setHasVars(true); - } - addVars(property, property.getVars(), objSchema.getProperties(), requiredVars); - List requireCpVars = property.getVars() - .stream() - .filter(p -> Boolean.TRUE.equals(p.required)).collect(Collectors.toList()); - property.setRequiredVars(requireCpVars); - if (property.getRequiredVars() != null && property.getRequiredVars().size() > 0) { - property.setHasRequired(true); - } - } + Set mandatory = schema.getRequired() == null ? Collections.emptySet() + : new TreeSet<>(schema.getRequired()); + addVars(property, property.getVars(), schema.getProperties(), mandatory); } private void addJsonSchemaForBodyRequestInCaseItsNotPresent(CodegenParameter codegenParameter, RequestBody body) { @@ -7576,7 +7578,7 @@ public class DefaultCodegen implements CodegenConfig { Schema notSchema = schema.getNot(); CodegenProperty notProperty = null; if (notSchema != null) { - notProperty = fromProperty("NotSchema", notSchema); + notProperty = fromProperty("NotSchema", notSchema, false); } List allOf = new ArrayList<>(); List oneOf = new ArrayList<>(); @@ -7602,7 +7604,7 @@ public class DefaultCodegen implements CodegenConfig { List xOf = new ArrayList<>(); int i = 0; for (Schema xOfSchema : xOfCollection) { - CodegenProperty cp = fromProperty(collectionName + "_" + i, xOfSchema); + CodegenProperty cp = fromProperty(collectionName + "_" + i, xOfSchema, false); xOf.add(cp); i += 1; } diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/IJsonSchemaValidationProperties.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/IJsonSchemaValidationProperties.java index c3cc9a13032..c3cf15fc36f 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/IJsonSchemaValidationProperties.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/IJsonSchemaValidationProperties.java @@ -129,7 +129,7 @@ public interface IJsonSchemaValidationProperties { boolean getHasVars(); - void setHasVars(boolean hasRequiredVars); + void setHasVars(boolean hasVars); boolean getHasRequired(); diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractAdaCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractAdaCodegen.java index 4a1933e094a..2965605fd3c 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractAdaCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractAdaCodegen.java @@ -385,8 +385,8 @@ abstract public class AbstractAdaCodegen extends DefaultCodegen implements Codeg } @Override - public CodegenProperty fromProperty(String name, Schema p) { - CodegenProperty property = super.fromProperty(name, p); + public CodegenProperty fromProperty(String name, Schema p, boolean required) { + CodegenProperty property = super.fromProperty(name, p, required); if (property != null) { String nameInCamelCase = property.nameInCamelCase; nameInCamelCase = sanitizeName(nameInCamelCase); @@ -566,7 +566,7 @@ abstract public class AbstractAdaCodegen extends DefaultCodegen implements Codeg if (operation.getResponses() != null && !operation.getResponses().isEmpty()) { ApiResponse methodResponse = findMethodResponse(operation.getResponses()); if (methodResponse != null && ModelUtils.getSchemaFromResponse(methodResponse) != null) { - CodegenProperty cm = fromProperty("response", ModelUtils.getSchemaFromResponse(methodResponse)); + CodegenProperty cm = fromProperty("response", ModelUtils.getSchemaFromResponse(methodResponse), false); op.vendorExtensions.put("x-codegen-response", cm); op.vendorExtensions.put("x-is-model-type", isModelType(cm)); op.vendorExtensions.put("x-is-stream-type", isStreamType(cm)); diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractCppCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractCppCodegen.java index a05999bd7ff..7cbb943a98b 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractCppCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractCppCodegen.java @@ -251,8 +251,8 @@ abstract public class AbstractCppCodegen extends DefaultCodegen implements Codeg @SuppressWarnings("rawtypes") @Override - public CodegenProperty fromProperty(String name, Schema p) { - CodegenProperty property = super.fromProperty(name, p); + public CodegenProperty fromProperty(String name, Schema p, boolean required) { + CodegenProperty property = super.fromProperty(name, p, required); String nameInCamelCase = property.nameInCamelCase; if (nameInCamelCase.length() > 1) { nameInCamelCase = sanitizeName(Character.toLowerCase(nameInCamelCase.charAt(0)) + nameInCamelCase.substring(1)); diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractDartCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractDartCodegen.java index bc42591cb25..b560bfd258a 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractDartCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractDartCodegen.java @@ -551,8 +551,8 @@ public abstract class AbstractDartCodegen extends DefaultCodegen { } @Override - public CodegenProperty fromProperty(String name, Schema p) { - final CodegenProperty property = super.fromProperty(name, p); + public CodegenProperty fromProperty(String name, Schema p, boolean required) { + final CodegenProperty property = super.fromProperty(name, p, required); // Handle composed properties if (ModelUtils.isComposedSchema(p)) { diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractScalaCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractScalaCodegen.java index f0dbaed17af..1f1bb974a8f 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractScalaCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractScalaCodegen.java @@ -461,8 +461,8 @@ public abstract class AbstractScalaCodegen extends DefaultCodegen { * @return Codegen Property object */ @Override - public CodegenProperty fromProperty(String name, Schema p) { - CodegenProperty prop = super.fromProperty(name, p); + public CodegenProperty fromProperty(String name, Schema p, boolean required) { + CodegenProperty prop = super.fromProperty(name, p, required); if (ModelUtils.isArraySchema(p)) { ArraySchema as = (ArraySchema) p; if (ModelUtils.isSet(as)) { diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/CLibcurlClientCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/CLibcurlClientCodegen.java index a2bdc183207..c0c49772095 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/CLibcurlClientCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/CLibcurlClientCodegen.java @@ -852,8 +852,8 @@ public class CLibcurlClientCodegen extends DefaultCodegen implements CodegenConf } @Override - public CodegenProperty fromProperty(String name, Schema p) { - CodegenProperty cm = super.fromProperty(name, p); + public CodegenProperty fromProperty(String name, Schema p, boolean required) { + CodegenProperty cm = super.fromProperty(name, p, required); Schema ref = ModelUtils.getReferencedSchema(openAPI, p); if (ref != null) { if (ref.getEnum() != null) { diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/CppPistacheServerCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/CppPistacheServerCodegen.java index e6ce6acc3e2..00cd52dbab8 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/CppPistacheServerCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/CppPistacheServerCodegen.java @@ -242,7 +242,7 @@ public class CppPistacheServerCodegen extends AbstractCppCodegen { if (apiResponse != null) { Schema response = ModelUtils.getSchemaFromResponse(apiResponse); if (response != null) { - CodegenProperty cm = fromProperty("response", response); + CodegenProperty cm = fromProperty("response", response, false); op.vendorExtensions.put("x-codegen-response", cm); if ("HttpContent".equals(cm.dataType)) { op.vendorExtensions.put("x-codegen-response-ishttpcontent", true); diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/CppRestSdkClientCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/CppRestSdkClientCodegen.java index 13be5ab4139..516df642b38 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/CppRestSdkClientCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/CppRestSdkClientCodegen.java @@ -297,7 +297,7 @@ public class CppRestSdkClientCodegen extends AbstractCppCodegen { Schema response = ModelUtils.getSchemaFromResponse(methodResponse); response = ModelUtils.unaliasSchema(this.openAPI, response, schemaMapping); if (response != null) { - CodegenProperty cm = fromProperty("response", response); + CodegenProperty cm = fromProperty("response", response, false); op.vendorExtensions.put("x-codegen-response", cm); if ("std::shared_ptr".equals(cm.dataType)) { op.vendorExtensions.put("x-codegen-response-ishttpcontent", true); diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/GoClientCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/GoClientCodegen.java index 3f95f7a31ee..1c98aefeaff 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/GoClientCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/GoClientCodegen.java @@ -384,8 +384,8 @@ public class GoClientCodegen extends AbstractGoCodegen { } @Override - public CodegenProperty fromProperty(String name, Schema p) { - CodegenProperty prop = super.fromProperty(name, p); + public CodegenProperty fromProperty(String name, Schema p, boolean required) { + CodegenProperty prop = super.fromProperty(name, p, required); String cc = camelize(prop.name, true); if (isReservedWord(cc)) { cc = escapeReservedWord(cc); diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/KtormSchemaCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/KtormSchemaCodegen.java index adfef4bf3c8..1bf5b024ec0 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/KtormSchemaCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/KtormSchemaCodegen.java @@ -323,7 +323,7 @@ public class KtormSchemaCodegen extends AbstractKotlinCodegen { } if (!hasPrimaryKey) { final IntegerSchema schema = new IntegerSchema().format(SchemaTypeUtil.INTEGER64_FORMAT); - CodegenProperty cp = super.fromProperty(primaryKeyConvention, schema); + CodegenProperty cp = super.fromProperty(primaryKeyConvention, schema, false); cp.setRequired(true); model.vars.add(0, cp); model.allVars.add(0, cp); diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/PhpLaravelServerCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/PhpLaravelServerCodegen.java index 71162ddf665..62f7d164eae 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/PhpLaravelServerCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/PhpLaravelServerCodegen.java @@ -307,8 +307,8 @@ public class PhpLaravelServerCodegen extends AbstractPhpCodegen { } @Override - public CodegenProperty fromProperty(String name, Schema p) { - CodegenProperty property = super.fromProperty(name, p); + public CodegenProperty fromProperty(String name, Schema p, boolean required) { + CodegenProperty property = super.fromProperty(name, p, required); Schema referencedSchema = ModelUtils.getReferencedSchema(this.openAPI, p); //Referenced enum case: 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 9c61e903776..f7f886467c8 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 @@ -446,8 +446,8 @@ public class PythonClientCodegen extends PythonLegacyClientCodegen { * @return Codegen Property object */ @Override - public CodegenProperty fromProperty(String name, Schema p) { - CodegenProperty cp = super.fromProperty(name, p); + public CodegenProperty fromProperty(String name, Schema p, boolean required) { + CodegenProperty cp = super.fromProperty(name, p, required); if (cp.isEnum) { updateCodegenPropertyEnum(cp); } @@ -518,7 +518,7 @@ public class PythonClientCodegen extends PythonLegacyClientCodegen { return cp; } Schema unaliasedSchema = unaliasSchema(schema, schemaMapping); - CodegenProperty unaliasedProp = fromProperty("body", unaliasedSchema); + CodegenProperty unaliasedProp = fromProperty("body", unaliasedSchema, false); Boolean dataTypeMismatch = !cp.dataType.equals(unaliasedProp.dataType); Boolean baseTypeMismatch = !cp.baseType.equals(unaliasedProp.complexType) && unaliasedProp.complexType != null; if (dataTypeMismatch || baseTypeMismatch) { diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/PythonExperimentalClientCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/PythonExperimentalClientCodegen.java index b3736774184..3cfb87e3207 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/PythonExperimentalClientCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/PythonExperimentalClientCodegen.java @@ -849,8 +849,8 @@ public class PythonExperimentalClientCodegen extends AbstractPythonCodegen { * @return Codegen Property object */ @Override - public CodegenProperty fromProperty(String name, Schema p) { - CodegenProperty cp = super.fromProperty(name, p); + public CodegenProperty fromProperty(String name, Schema p, boolean required) { + CodegenProperty cp = super.fromProperty(name, p, required); if (cp.isAnyType && cp.isNullable) { cp.isNullable = false; } @@ -964,7 +964,7 @@ public class PythonExperimentalClientCodegen extends AbstractPythonCodegen { return cp; } Schema unaliasedSchema = unaliasSchema(schema, schemaMapping); - CodegenProperty unaliasedProp = fromProperty("body", unaliasedSchema); + CodegenProperty unaliasedProp = fromProperty("body", unaliasedSchema, false); Boolean dataTypeMismatch = !cp.dataType.equals(unaliasedProp.dataType); Boolean baseTypeMismatch = !cp.baseType.equals(unaliasedProp.complexType) && unaliasedProp.complexType != null; if (dataTypeMismatch || baseTypeMismatch) { @@ -1022,7 +1022,7 @@ public class PythonExperimentalClientCodegen extends AbstractPythonCodegen { codegenParameter.isNullable = codegenModel.isNullable; imports.add(codegenParameter.baseType); } else { - CodegenProperty codegenProperty = fromProperty("property", schema); + CodegenProperty codegenProperty = fromProperty("property", schema, false); if (codegenProperty != null && codegenProperty.getComplexType() != null && codegenProperty.getComplexType().contains(" | ")) { List parts = Arrays.asList(codegenProperty.getComplexType().split(" \\| ")); @@ -2033,7 +2033,7 @@ public class PythonExperimentalClientCodegen extends AbstractPythonCodegen { isAdditionalPropertiesTrue = true; // pass in the hashCode as the name to ensure that the returned property is not from the cache // if we need to set indent on every one, then they need to be different - addPropProp = fromProperty(String.valueOf(property.hashCode()), new Schema()); + addPropProp = fromProperty(String.valueOf(property.hashCode()), new Schema(), false); addPropProp.name = ""; addPropProp.baseName = ""; addPropProp.nameInSnakeCase = null; @@ -2042,14 +2042,14 @@ public class PythonExperimentalClientCodegen extends AbstractPythonCodegen { } else if (schema.getAdditionalProperties() instanceof Boolean) { if (Boolean.TRUE.equals(schema.getAdditionalProperties())) { isAdditionalPropertiesTrue = true; - addPropProp = fromProperty(String.valueOf(property.hashCode()), new Schema()); + addPropProp = fromProperty(String.valueOf(property.hashCode()), new Schema(), false); addPropProp.name = ""; addPropProp.baseName = ""; addPropProp.nameInSnakeCase = null; additionalPropertiesIsAnyType = true; } } else { - addPropProp = fromProperty(String.valueOf(property.hashCode()), (Schema) schema.getAdditionalProperties()); + addPropProp = fromProperty(String.valueOf(property.hashCode()), (Schema) schema.getAdditionalProperties(), false); addPropProp.name = ""; addPropProp.baseName = ""; addPropProp.nameInSnakeCase = null; diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/TypeScriptFetchClientCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/TypeScriptFetchClientCodegen.java index 38a75efd9de..195215bdb53 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/TypeScriptFetchClientCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/TypeScriptFetchClientCodegen.java @@ -443,8 +443,8 @@ public class TypeScriptFetchClientCodegen extends AbstractTypeScriptClientCodege } @Override - public ExtendedCodegenProperty fromProperty(String name, Schema p) { - CodegenProperty cp = super.fromProperty(name, p); + public ExtendedCodegenProperty fromProperty(String name, Schema p, boolean required) { + CodegenProperty cp = super.fromProperty(name, p, required); return new ExtendedCodegenProperty(cp); } @@ -515,7 +515,7 @@ public class TypeScriptFetchClientCodegen extends AbstractTypeScriptClientCodege if (op.returnPassthrough instanceof String && cm != null) { cp = (ExtendedCodegenProperty) this.processCodeGenModel(cm).vars.get(1); } else if (responseSchema != null) { - cp = fromProperty("response", responseSchema); + cp = fromProperty("response", responseSchema, false); this.processCodegenProperty(cp, "", null); } 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 4005601df8b..ef0b59a12bc 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 @@ -4220,4 +4220,29 @@ public class DefaultCodegenTest { Assert.assertEquals(codegenParameter.defaultValue, "1971-12-19T03:39:57-08:00"); Assert.assertEquals(codegenParameter.getSchema(), null); } + + @Test + public void testFromPropertyRequiredAndOptional() { + final OpenAPI openAPI = TestUtils.parseFlattenSpec("src/test/resources/3_0/issue_12857.yaml"); + final DefaultCodegen codegen = new DefaultCodegen(); + codegen.setOpenAPI(openAPI); + codegen.setDisallowAdditionalPropertiesIfNotPresent(false); + + String modelName = "FooRequired"; + Schema sc = openAPI.getComponents().getSchemas().get(modelName); + CodegenModel fooRequired = codegen.fromModel(modelName, sc); + modelName = "FooOptional"; + sc = openAPI.getComponents().getSchemas().get(modelName); + CodegenModel fooOptional = codegen.fromModel(modelName, sc); + Assert.assertTrue(fooRequired.vars.get(0).required); + Assert.assertEquals(fooRequired.vars.get(0).name, "foo"); + + Assert.assertEquals(fooRequired.requiredVars.size(), 1); + Assert.assertEquals(fooRequired.requiredVars.get(0).name, "foo"); + Assert.assertTrue(fooRequired.requiredVars.get(0).required); + + Assert.assertFalse(fooOptional.vars.get(0).required); + Assert.assertEquals(fooOptional.vars.get(0).name, "foo"); + Assert.assertEquals(fooOptional.requiredVars.size(), 0); + } } diff --git a/modules/openapi-generator/src/test/resources/3_0/issue_12857.yaml b/modules/openapi-generator/src/test/resources/3_0/issue_12857.yaml new file mode 100644 index 00000000000..88f3af1b9e8 --- /dev/null +++ b/modules/openapi-generator/src/test/resources/3_0/issue_12857.yaml @@ -0,0 +1,17 @@ +openapi: 3.0.3 +info: + title: openapi 3.0.3 sample spec + description: sample spec for testing openapi functionality, built from json schema + tests for draft6 + version: 0.0.1 +paths: {} +components: + schemas: + FooRequired: + properties: + foo: {} + required: + - foo + FooOptional: + properties: + foo: {} \ No newline at end of file diff --git a/samples/client/petstore/csharp-netcore/OpenAPIClient-ConditionalSerialization/docs/ChildCat.md b/samples/client/petstore/csharp-netcore/OpenAPIClient-ConditionalSerialization/docs/ChildCat.md index 8ce6449e5f2..072ad05b36d 100644 --- a/samples/client/petstore/csharp-netcore/OpenAPIClient-ConditionalSerialization/docs/ChildCat.md +++ b/samples/client/petstore/csharp-netcore/OpenAPIClient-ConditionalSerialization/docs/ChildCat.md @@ -5,7 +5,7 @@ Name | Type | Description | Notes ------------ | ------------- | ------------- | ------------- **Name** | **string** | | [optional] -**PetType** | **string** | | [default to PetTypeEnum.ChildCat] +**PetType** | **string** | | [optional] [default to PetTypeEnum.ChildCat] [[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) diff --git a/samples/client/petstore/csharp-netcore/OpenAPIClient-ConditionalSerialization/src/Org.OpenAPITools/Model/ChildCat.cs b/samples/client/petstore/csharp-netcore/OpenAPIClient-ConditionalSerialization/src/Org.OpenAPITools/Model/ChildCat.cs index 6358e859ce1..e5f952880eb 100644 --- a/samples/client/petstore/csharp-netcore/OpenAPIClient-ConditionalSerialization/src/Org.OpenAPITools/Model/ChildCat.cs +++ b/samples/client/petstore/csharp-netcore/OpenAPIClient-ConditionalSerialization/src/Org.OpenAPITools/Model/ChildCat.cs @@ -53,8 +53,8 @@ namespace Org.OpenAPITools.Model /// Gets or Sets PetType /// - [DataMember(Name = "pet_type", IsRequired = true, EmitDefaultValue = false)] - public PetTypeEnum PetType + [DataMember(Name = "pet_type", EmitDefaultValue = false)] + public PetTypeEnum? PetType { get{ return _PetType;} set @@ -63,7 +63,7 @@ namespace Org.OpenAPITools.Model _flagPetType = true; } } - private PetTypeEnum _PetType; + private PetTypeEnum? _PetType; private bool _flagPetType; ///

@@ -86,10 +86,9 @@ namespace Org.OpenAPITools.Model /// Initializes a new instance of the class. /// /// name. - /// petType (required) (default to PetTypeEnum.ChildCat). - public ChildCat(string name = default(string), PetTypeEnum petType = PetTypeEnum.ChildCat) : base() + /// petType (default to PetTypeEnum.ChildCat). + public ChildCat(string name = default(string), PetTypeEnum? petType = PetTypeEnum.ChildCat) : base() { - this._PetType = petType; this._Name = name; if (this.Name != null) { diff --git a/samples/client/petstore/csharp-netcore/OpenAPIClient-httpclient/docs/ChildCat.md b/samples/client/petstore/csharp-netcore/OpenAPIClient-httpclient/docs/ChildCat.md index 8ce6449e5f2..072ad05b36d 100644 --- a/samples/client/petstore/csharp-netcore/OpenAPIClient-httpclient/docs/ChildCat.md +++ b/samples/client/petstore/csharp-netcore/OpenAPIClient-httpclient/docs/ChildCat.md @@ -5,7 +5,7 @@ Name | Type | Description | Notes ------------ | ------------- | ------------- | ------------- **Name** | **string** | | [optional] -**PetType** | **string** | | [default to PetTypeEnum.ChildCat] +**PetType** | **string** | | [optional] [default to PetTypeEnum.ChildCat] [[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) diff --git a/samples/client/petstore/csharp-netcore/OpenAPIClient-httpclient/src/Org.OpenAPITools/Model/ChildCat.cs b/samples/client/petstore/csharp-netcore/OpenAPIClient-httpclient/src/Org.OpenAPITools/Model/ChildCat.cs index a6603b7cb85..2420d129554 100644 --- a/samples/client/petstore/csharp-netcore/OpenAPIClient-httpclient/src/Org.OpenAPITools/Model/ChildCat.cs +++ b/samples/client/petstore/csharp-netcore/OpenAPIClient-httpclient/src/Org.OpenAPITools/Model/ChildCat.cs @@ -53,8 +53,8 @@ namespace Org.OpenAPITools.Model /// /// Gets or Sets PetType /// - [DataMember(Name = "pet_type", IsRequired = true, EmitDefaultValue = false)] - public PetTypeEnum PetType { get; set; } + [DataMember(Name = "pet_type", EmitDefaultValue = false)] + public PetTypeEnum? PetType { get; set; } /// /// Initializes a new instance of the class. /// @@ -67,11 +67,11 @@ namespace Org.OpenAPITools.Model /// Initializes a new instance of the class. /// /// name. - /// petType (required) (default to PetTypeEnum.ChildCat). - public ChildCat(string name = default(string), PetTypeEnum petType = PetTypeEnum.ChildCat) : base() + /// petType (default to PetTypeEnum.ChildCat). + public ChildCat(string name = default(string), PetTypeEnum? petType = PetTypeEnum.ChildCat) : base() { - this.PetType = petType; this.Name = name; + this.PetType = petType; this.AdditionalProperties = new Dictionary(); } diff --git a/samples/client/petstore/csharp-netcore/OpenAPIClient-net47/docs/ChildCat.md b/samples/client/petstore/csharp-netcore/OpenAPIClient-net47/docs/ChildCat.md index 8ce6449e5f2..072ad05b36d 100644 --- a/samples/client/petstore/csharp-netcore/OpenAPIClient-net47/docs/ChildCat.md +++ b/samples/client/petstore/csharp-netcore/OpenAPIClient-net47/docs/ChildCat.md @@ -5,7 +5,7 @@ Name | Type | Description | Notes ------------ | ------------- | ------------- | ------------- **Name** | **string** | | [optional] -**PetType** | **string** | | [default to PetTypeEnum.ChildCat] +**PetType** | **string** | | [optional] [default to PetTypeEnum.ChildCat] [[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) diff --git a/samples/client/petstore/csharp-netcore/OpenAPIClient-net47/src/Org.OpenAPITools/Model/ChildCat.cs b/samples/client/petstore/csharp-netcore/OpenAPIClient-net47/src/Org.OpenAPITools/Model/ChildCat.cs index 7a15a5297df..4c60ed776cd 100644 --- a/samples/client/petstore/csharp-netcore/OpenAPIClient-net47/src/Org.OpenAPITools/Model/ChildCat.cs +++ b/samples/client/petstore/csharp-netcore/OpenAPIClient-net47/src/Org.OpenAPITools/Model/ChildCat.cs @@ -52,8 +52,8 @@ namespace Org.OpenAPITools.Model /// /// Gets or Sets PetType /// - [DataMember(Name = "pet_type", IsRequired = true, EmitDefaultValue = false)] - public PetTypeEnum PetType { get; set; } + [DataMember(Name = "pet_type", EmitDefaultValue = false)] + public PetTypeEnum? PetType { get; set; } /// /// Initializes a new instance of the class. /// @@ -66,11 +66,11 @@ namespace Org.OpenAPITools.Model /// Initializes a new instance of the class. /// /// name. - /// petType (required) (default to PetTypeEnum.ChildCat). - public ChildCat(string name = default(string), PetTypeEnum petType = PetTypeEnum.ChildCat) : base() + /// petType (default to PetTypeEnum.ChildCat). + public ChildCat(string name = default(string), PetTypeEnum? petType = PetTypeEnum.ChildCat) : base() { - this.PetType = petType; this.Name = name; + this.PetType = petType; this.AdditionalProperties = new Dictionary(); } diff --git a/samples/client/petstore/csharp-netcore/OpenAPIClient-net5.0/docs/ChildCat.md b/samples/client/petstore/csharp-netcore/OpenAPIClient-net5.0/docs/ChildCat.md index 8ce6449e5f2..072ad05b36d 100644 --- a/samples/client/petstore/csharp-netcore/OpenAPIClient-net5.0/docs/ChildCat.md +++ b/samples/client/petstore/csharp-netcore/OpenAPIClient-net5.0/docs/ChildCat.md @@ -5,7 +5,7 @@ Name | Type | Description | Notes ------------ | ------------- | ------------- | ------------- **Name** | **string** | | [optional] -**PetType** | **string** | | [default to PetTypeEnum.ChildCat] +**PetType** | **string** | | [optional] [default to PetTypeEnum.ChildCat] [[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) diff --git a/samples/client/petstore/csharp-netcore/OpenAPIClient-net5.0/src/Org.OpenAPITools/Model/ChildCat.cs b/samples/client/petstore/csharp-netcore/OpenAPIClient-net5.0/src/Org.OpenAPITools/Model/ChildCat.cs index 7a15a5297df..4c60ed776cd 100644 --- a/samples/client/petstore/csharp-netcore/OpenAPIClient-net5.0/src/Org.OpenAPITools/Model/ChildCat.cs +++ b/samples/client/petstore/csharp-netcore/OpenAPIClient-net5.0/src/Org.OpenAPITools/Model/ChildCat.cs @@ -52,8 +52,8 @@ namespace Org.OpenAPITools.Model /// /// Gets or Sets PetType /// - [DataMember(Name = "pet_type", IsRequired = true, EmitDefaultValue = false)] - public PetTypeEnum PetType { get; set; } + [DataMember(Name = "pet_type", EmitDefaultValue = false)] + public PetTypeEnum? PetType { get; set; } /// /// Initializes a new instance of the class. /// @@ -66,11 +66,11 @@ namespace Org.OpenAPITools.Model /// Initializes a new instance of the class. /// /// name. - /// petType (required) (default to PetTypeEnum.ChildCat). - public ChildCat(string name = default(string), PetTypeEnum petType = PetTypeEnum.ChildCat) : base() + /// petType (default to PetTypeEnum.ChildCat). + public ChildCat(string name = default(string), PetTypeEnum? petType = PetTypeEnum.ChildCat) : base() { - this.PetType = petType; this.Name = name; + this.PetType = petType; this.AdditionalProperties = new Dictionary(); } diff --git a/samples/client/petstore/csharp-netcore/OpenAPIClient/docs/ChildCat.md b/samples/client/petstore/csharp-netcore/OpenAPIClient/docs/ChildCat.md index 8ce6449e5f2..072ad05b36d 100644 --- a/samples/client/petstore/csharp-netcore/OpenAPIClient/docs/ChildCat.md +++ b/samples/client/petstore/csharp-netcore/OpenAPIClient/docs/ChildCat.md @@ -5,7 +5,7 @@ Name | Type | Description | Notes ------------ | ------------- | ------------- | ------------- **Name** | **string** | | [optional] -**PetType** | **string** | | [default to PetTypeEnum.ChildCat] +**PetType** | **string** | | [optional] [default to PetTypeEnum.ChildCat] [[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) diff --git a/samples/client/petstore/csharp-netcore/OpenAPIClient/src/Org.OpenAPITools/Model/ChildCat.cs b/samples/client/petstore/csharp-netcore/OpenAPIClient/src/Org.OpenAPITools/Model/ChildCat.cs index 7a15a5297df..4c60ed776cd 100644 --- a/samples/client/petstore/csharp-netcore/OpenAPIClient/src/Org.OpenAPITools/Model/ChildCat.cs +++ b/samples/client/petstore/csharp-netcore/OpenAPIClient/src/Org.OpenAPITools/Model/ChildCat.cs @@ -52,8 +52,8 @@ namespace Org.OpenAPITools.Model /// /// Gets or Sets PetType /// - [DataMember(Name = "pet_type", IsRequired = true, EmitDefaultValue = false)] - public PetTypeEnum PetType { get; set; } + [DataMember(Name = "pet_type", EmitDefaultValue = false)] + public PetTypeEnum? PetType { get; set; } /// /// Initializes a new instance of the class. /// @@ -66,11 +66,11 @@ namespace Org.OpenAPITools.Model /// Initializes a new instance of the class. /// /// name. - /// petType (required) (default to PetTypeEnum.ChildCat). - public ChildCat(string name = default(string), PetTypeEnum petType = PetTypeEnum.ChildCat) : base() + /// petType (default to PetTypeEnum.ChildCat). + public ChildCat(string name = default(string), PetTypeEnum? petType = PetTypeEnum.ChildCat) : base() { - this.PetType = petType; this.Name = name; + this.PetType = petType; this.AdditionalProperties = new Dictionary(); } diff --git a/samples/client/petstore/csharp-netcore/OpenAPIClientCore/docs/ChildCat.md b/samples/client/petstore/csharp-netcore/OpenAPIClientCore/docs/ChildCat.md index 8ce6449e5f2..072ad05b36d 100644 --- a/samples/client/petstore/csharp-netcore/OpenAPIClientCore/docs/ChildCat.md +++ b/samples/client/petstore/csharp-netcore/OpenAPIClientCore/docs/ChildCat.md @@ -5,7 +5,7 @@ Name | Type | Description | Notes ------------ | ------------- | ------------- | ------------- **Name** | **string** | | [optional] -**PetType** | **string** | | [default to PetTypeEnum.ChildCat] +**PetType** | **string** | | [optional] [default to PetTypeEnum.ChildCat] [[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) diff --git a/samples/client/petstore/csharp-netcore/OpenAPIClientCore/src/Org.OpenAPITools/Model/ChildCat.cs b/samples/client/petstore/csharp-netcore/OpenAPIClientCore/src/Org.OpenAPITools/Model/ChildCat.cs index d2b81927885..c6c7222d7a6 100644 --- a/samples/client/petstore/csharp-netcore/OpenAPIClientCore/src/Org.OpenAPITools/Model/ChildCat.cs +++ b/samples/client/petstore/csharp-netcore/OpenAPIClientCore/src/Org.OpenAPITools/Model/ChildCat.cs @@ -52,8 +52,8 @@ namespace Org.OpenAPITools.Model /// /// Gets or Sets PetType /// - [DataMember(Name = "pet_type", IsRequired = true, EmitDefaultValue = false)] - public PetTypeEnum PetType { get; set; } + [DataMember(Name = "pet_type", EmitDefaultValue = false)] + public PetTypeEnum? PetType { get; set; } /// /// Initializes a new instance of the class. /// @@ -63,11 +63,11 @@ namespace Org.OpenAPITools.Model /// Initializes a new instance of the class. /// /// name. - /// petType (required) (default to PetTypeEnum.ChildCat). - public ChildCat(string name = default(string), PetTypeEnum petType = PetTypeEnum.ChildCat) : base() + /// petType (default to PetTypeEnum.ChildCat). + public ChildCat(string name = default(string), PetTypeEnum? petType = PetTypeEnum.ChildCat) : base() { - this.PetType = petType; this.Name = name; + this.PetType = petType; } /// diff --git a/samples/client/petstore/java/jersey3/docs/ChildCat.md b/samples/client/petstore/java/jersey3/docs/ChildCat.md index 6a114cc4ffb..3f39832529b 100644 --- a/samples/client/petstore/java/jersey3/docs/ChildCat.md +++ b/samples/client/petstore/java/jersey3/docs/ChildCat.md @@ -8,7 +8,7 @@ | Name | Type | Description | Notes | |------------ | ------------- | ------------- | -------------| |**name** | **String** | | [optional] | -|**petType** | [**String**](#String) | | | +|**petType** | [**String**](#String) | | [optional] | diff --git a/samples/client/petstore/java/jersey3/src/main/java/org/openapitools/client/model/ChildCat.java b/samples/client/petstore/java/jersey3/src/main/java/org/openapitools/client/model/ChildCat.java index 8e16e6fedd2..e0ce86c3f91 100644 --- a/samples/client/petstore/java/jersey3/src/main/java/org/openapitools/client/model/ChildCat.java +++ b/samples/client/petstore/java/jersey3/src/main/java/org/openapitools/client/model/ChildCat.java @@ -105,10 +105,10 @@ public class ChildCat extends ParentPet { * Get petType * @return petType **/ - @jakarta.annotation.Nonnull - @ApiModelProperty(required = true, value = "") + @jakarta.annotation.Nullable + @ApiModelProperty(value = "") @JsonProperty(JSON_PROPERTY_PET_TYPE) - @JsonInclude(value = JsonInclude.Include.ALWAYS) + @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS) public String getPetType() { return petType; @@ -116,7 +116,7 @@ public class ChildCat extends ParentPet { @JsonProperty(JSON_PROPERTY_PET_TYPE) - @JsonInclude(value = JsonInclude.Include.ALWAYS) + @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS) public void setPetType(String petType) { if (!PET_TYPE_VALUES.contains(petType)) { throw new IllegalArgumentException(petType + " is invalid. Possible values for petType: " + String.join(", ", PET_TYPE_VALUES)); diff --git a/samples/client/petstore/typescript-axios/builds/test-petstore/api.ts b/samples/client/petstore/typescript-axios/builds/test-petstore/api.ts index 572cae52236..0d480e40bc0 100644 --- a/samples/client/petstore/typescript-axios/builds/test-petstore/api.ts +++ b/samples/client/petstore/typescript-axios/builds/test-petstore/api.ts @@ -359,7 +359,7 @@ export interface ChildCat extends ParentPet { * @type {string} * @memberof ChildCat */ - 'pet_type': ChildCatPetTypeEnum; + 'pet_type'?: ChildCatPetTypeEnum; } export const ChildCatPetTypeEnum = { diff --git a/samples/openapi3/client/petstore/java/jersey2-java8/docs/ChildCat.md b/samples/openapi3/client/petstore/java/jersey2-java8/docs/ChildCat.md index 6a114cc4ffb..3f39832529b 100644 --- a/samples/openapi3/client/petstore/java/jersey2-java8/docs/ChildCat.md +++ b/samples/openapi3/client/petstore/java/jersey2-java8/docs/ChildCat.md @@ -8,7 +8,7 @@ | Name | Type | Description | Notes | |------------ | ------------- | ------------- | -------------| |**name** | **String** | | [optional] | -|**petType** | [**String**](#String) | | | +|**petType** | [**String**](#String) | | [optional] | diff --git a/samples/openapi3/client/petstore/java/jersey2-java8/src/main/java/org/openapitools/client/model/ChildCat.java b/samples/openapi3/client/petstore/java/jersey2-java8/src/main/java/org/openapitools/client/model/ChildCat.java index 0e2970ef036..ae123669a7d 100644 --- a/samples/openapi3/client/petstore/java/jersey2-java8/src/main/java/org/openapitools/client/model/ChildCat.java +++ b/samples/openapi3/client/petstore/java/jersey2-java8/src/main/java/org/openapitools/client/model/ChildCat.java @@ -105,10 +105,10 @@ public class ChildCat extends ParentPet { * Get petType * @return petType **/ - @javax.annotation.Nonnull - @ApiModelProperty(required = true, value = "") + @javax.annotation.Nullable + @ApiModelProperty(value = "") @JsonProperty(JSON_PROPERTY_PET_TYPE) - @JsonInclude(value = JsonInclude.Include.ALWAYS) + @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS) public String getPetType() { return petType; @@ -116,7 +116,7 @@ public class ChildCat extends ParentPet { @JsonProperty(JSON_PROPERTY_PET_TYPE) - @JsonInclude(value = JsonInclude.Include.ALWAYS) + @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS) public void setPetType(String petType) { if (!PET_TYPE_VALUES.contains(petType)) { throw new IllegalArgumentException(petType + " is invalid. Possible values for petType: " + String.join(", ", PET_TYPE_VALUES)); diff --git a/samples/openapi3/client/petstore/python-experimental/docs/PetApi.md b/samples/openapi3/client/petstore/python-experimental/docs/PetApi.md index 7b9ab23bc5d..d8ee4cb32fc 100644 --- a/samples/openapi3/client/petstore/python-experimental/docs/PetApi.md +++ b/samples/openapi3/client/petstore/python-experimental/docs/PetApi.md @@ -1315,7 +1315,7 @@ skip_deserialization | bool | default is False | when True, headers and body wil Name | Type | Description | Notes ------------ | ------------- | ------------- | ------------- **additionalMetadata** | **str** | Additional data to pass to server | [optional] -**file** | **file_type** | file to upload | +**file** | **file_type** | file to upload | [optional] **any string name** | **bool, date, datetime, dict, float, int, list, str, none_type** | any string name can be used but the value must be the correct type | [optional] ### path_params diff --git a/samples/openapi3/client/petstore/python-experimental/petstore_api/api/fake_api_endpoints/endpoint_parameters.py b/samples/openapi3/client/petstore/python-experimental/petstore_api/api/fake_api_endpoints/endpoint_parameters.py index 666b832fc7c..d4bfb218fd0 100644 --- a/samples/openapi3/client/petstore/python-experimental/petstore_api/api/fake_api_endpoints/endpoint_parameters.py +++ b/samples/openapi3/client/petstore/python-experimental/petstore_api/api/fake_api_endpoints/endpoint_parameters.py @@ -73,6 +73,10 @@ class SchemaForRequestBodyApplicationXWwwFormUrlencoded( DictSchema ): _required_property_names = set(( + 'number', + 'double', + 'pattern_without_delimiter', + 'byte', )) @@ -171,6 +175,10 @@ class SchemaForRequestBodyApplicationXWwwFormUrlencoded( def __new__( cls, *args: typing.Union[dict, frozendict, ], + number: number, + double: double, + pattern_without_delimiter: pattern_without_delimiter, + byte: byte, integer: typing.Union[integer, Unset] = unset, int32: typing.Union[int32, Unset] = unset, int64: typing.Union[int64, Unset] = unset, @@ -186,6 +194,10 @@ class SchemaForRequestBodyApplicationXWwwFormUrlencoded( return super().__new__( cls, *args, + number=number, + double=double, + pattern_without_delimiter=pattern_without_delimiter, + byte=byte, integer=integer, int32=int32, int64=int64, diff --git a/samples/openapi3/client/petstore/python-experimental/petstore_api/api/fake_api_endpoints/json_form_data.py b/samples/openapi3/client/petstore/python-experimental/petstore_api/api/fake_api_endpoints/json_form_data.py index 34dfe5627ce..ce7e5851c6a 100644 --- a/samples/openapi3/client/petstore/python-experimental/petstore_api/api/fake_api_endpoints/json_form_data.py +++ b/samples/openapi3/client/petstore/python-experimental/petstore_api/api/fake_api_endpoints/json_form_data.py @@ -73,6 +73,8 @@ class SchemaForRequestBodyApplicationXWwwFormUrlencoded( DictSchema ): _required_property_names = set(( + 'param', + 'param2', )) param = StrSchema param2 = StrSchema @@ -81,12 +83,16 @@ class SchemaForRequestBodyApplicationXWwwFormUrlencoded( def __new__( cls, *args: typing.Union[dict, frozendict, ], + param: param, + param2: param2, _configuration: typing.Optional[Configuration] = None, **kwargs: typing.Type[Schema], ) -> 'SchemaForRequestBodyApplicationXWwwFormUrlencoded': return super().__new__( cls, *args, + param=param, + param2=param2, _configuration=_configuration, **kwargs, ) diff --git a/samples/openapi3/client/petstore/python-experimental/petstore_api/api/fake_api_endpoints/upload_file.py b/samples/openapi3/client/petstore/python-experimental/petstore_api/api/fake_api_endpoints/upload_file.py index e308b76b1f2..c8c8a179a53 100644 --- a/samples/openapi3/client/petstore/python-experimental/petstore_api/api/fake_api_endpoints/upload_file.py +++ b/samples/openapi3/client/petstore/python-experimental/petstore_api/api/fake_api_endpoints/upload_file.py @@ -75,6 +75,7 @@ class SchemaForRequestBodyMultipartFormData( DictSchema ): _required_property_names = set(( + 'file', )) additionalMetadata = StrSchema file = BinarySchema @@ -83,6 +84,7 @@ class SchemaForRequestBodyMultipartFormData( def __new__( cls, *args: typing.Union[dict, frozendict, ], + file: file, additionalMetadata: typing.Union[additionalMetadata, Unset] = unset, _configuration: typing.Optional[Configuration] = None, **kwargs: typing.Type[Schema], @@ -90,6 +92,7 @@ class SchemaForRequestBodyMultipartFormData( return super().__new__( cls, *args, + file=file, additionalMetadata=additionalMetadata, _configuration=_configuration, **kwargs, diff --git a/samples/openapi3/client/petstore/python-experimental/petstore_api/api/pet_api_endpoints/upload_file_with_required_file.py b/samples/openapi3/client/petstore/python-experimental/petstore_api/api/pet_api_endpoints/upload_file_with_required_file.py index 689f54addd2..fb1375c1b8a 100644 --- a/samples/openapi3/client/petstore/python-experimental/petstore_api/api/pet_api_endpoints/upload_file_with_required_file.py +++ b/samples/openapi3/client/petstore/python-experimental/petstore_api/api/pet_api_endpoints/upload_file_with_required_file.py @@ -101,6 +101,7 @@ class SchemaForRequestBodyMultipartFormData( DictSchema ): _required_property_names = set(( + 'requiredFile', )) additionalMetadata = StrSchema requiredFile = BinarySchema @@ -109,6 +110,7 @@ class SchemaForRequestBodyMultipartFormData( def __new__( cls, *args: typing.Union[dict, frozendict, ], + requiredFile: requiredFile, additionalMetadata: typing.Union[additionalMetadata, Unset] = unset, _configuration: typing.Optional[Configuration] = None, **kwargs: typing.Type[Schema], @@ -116,6 +118,7 @@ class SchemaForRequestBodyMultipartFormData( return super().__new__( cls, *args, + requiredFile=requiredFile, additionalMetadata=additionalMetadata, _configuration=_configuration, **kwargs, diff --git a/samples/openapi3/client/petstore/python-experimental/petstore_api/api/pet_api_endpoints/upload_image.py b/samples/openapi3/client/petstore/python-experimental/petstore_api/api/pet_api_endpoints/upload_image.py index 70cce044b13..20bb010ae19 100644 --- a/samples/openapi3/client/petstore/python-experimental/petstore_api/api/pet_api_endpoints/upload_image.py +++ b/samples/openapi3/client/petstore/python-experimental/petstore_api/api/pet_api_endpoints/upload_image.py @@ -108,6 +108,7 @@ class SchemaForRequestBodyMultipartFormData( cls, *args: typing.Union[dict, frozendict, ], additionalMetadata: typing.Union[additionalMetadata, Unset] = unset, + file: typing.Union[file, Unset] = unset, _configuration: typing.Optional[Configuration] = None, **kwargs: typing.Type[Schema], ) -> 'SchemaForRequestBodyMultipartFormData': @@ -115,6 +116,7 @@ class SchemaForRequestBodyMultipartFormData( cls, *args, additionalMetadata=additionalMetadata, + file=file, _configuration=_configuration, **kwargs, )