-
-
Notifications
You must be signed in to change notification settings - Fork 6.6k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Better support for inline schemas in parameters #12369
Changes from all commits
eedc6f5
195f1da
95ca392
2b10b64
559409d
33a1b6b
9348b15
ced1d53
5ffc8c8
f531f37
b7aa873
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -34,6 +34,7 @@ | |
import org.openapitools.codegen.api.TemplatingEngineAdapter; | ||
import org.openapitools.codegen.config.GlobalSettings; | ||
import org.openapitools.codegen.examples.ExampleGenerator; | ||
import org.openapitools.codegen.languages.RustServerCodegen; | ||
import org.openapitools.codegen.meta.FeatureSet; | ||
import org.openapitools.codegen.meta.GeneratorMetadata; | ||
import org.openapitools.codegen.meta.Stability; | ||
|
@@ -4575,9 +4576,24 @@ public CodegenParameter fromParameter(Parameter parameter, Set<String> imports) | |
} | ||
|
||
Schema parameterSchema; | ||
|
||
// the parameter model name is obtained from the schema $ref | ||
// e.g. #/components/schemas/list_pageQuery_parameter => toModelName(list_pageQuery_parameter) | ||
String parameterModelName = null; | ||
|
||
if (parameter.getSchema() != null) { | ||
parameterSchema = parameter.getSchema(); | ||
CodegenProperty prop = fromProperty(parameter.getName(), parameterSchema); | ||
parameterModelName = getParameterDataType(parameter, parameterSchema); | ||
CodegenProperty prop; | ||
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); | ||
} else if (getUseInlineModelResolver()) { | ||
prop = fromProperty(parameter.getName(), ModelUtils.getReferencedSchema(openAPI, parameterSchema)); | ||
} else { | ||
prop = fromProperty(parameter.getName(), parameterSchema); | ||
} | ||
codegenParameter.setSchema(prop); | ||
} else if (parameter.getContent() != null) { | ||
Content content = parameter.getContent(); | ||
|
@@ -4587,6 +4603,7 @@ public CodegenParameter fromParameter(Parameter parameter, Set<String> imports) | |
Map.Entry<String, MediaType> entry = content.entrySet().iterator().next(); | ||
codegenParameter.contentType = entry.getKey(); | ||
parameterSchema = entry.getValue().getSchema(); | ||
parameterModelName = getParameterDataType(parameter, parameterSchema); | ||
} else { | ||
parameterSchema = null; | ||
} | ||
|
@@ -4613,11 +4630,17 @@ public CodegenParameter fromParameter(Parameter parameter, Set<String> imports) | |
|
||
parameterSchema = unaliasSchema(parameterSchema, Collections.emptyMap()); | ||
if (parameterSchema == null) { | ||
LOGGER.warn("warning! Schema not found for parameter \" {} \", using String", parameter.getName()); | ||
parameterSchema = new StringSchema().description("//TODO automatically added by openapi-generator due to missing type definition."); | ||
LOGGER.warn("warning! Schema not found for parameter \" {} \"", parameter.getName()); | ||
finishUpdatingParameter(codegenParameter, parameter); | ||
return codegenParameter; | ||
} | ||
|
||
if (getUseInlineModelResolver() && !(this instanceof RustServerCodegen)) { | ||
// for rust server, we cannot run the following as it uses | ||
// $ref (e.g. #components/schemas/Pet) to determine whether it's a model | ||
parameterSchema = ModelUtils.getReferencedSchema(openAPI, parameterSchema); | ||
} | ||
|
||
ModelUtils.syncValidationProperties(parameterSchema, codegenParameter); | ||
codegenParameter.setTypeProperties(parameterSchema); | ||
codegenParameter.setComposedSchemas(getComposedSchemas(parameterSchema)); | ||
|
@@ -4717,9 +4740,8 @@ public CodegenParameter fromParameter(Parameter parameter, Set<String> imports) | |
//} | ||
//codegenProperty.required = true; | ||
|
||
String parameterDataType = this.getParameterDataType(parameter, parameterSchema); | ||
if (parameterDataType != null) { | ||
codegenParameter.dataType = parameterDataType; | ||
if (parameterModelName != null) { | ||
codegenParameter.dataType = parameterModelName; | ||
if (ModelUtils.isObjectSchema(parameterSchema)) { | ||
codegenProperty.complexType = codegenParameter.dataType; | ||
} | ||
|
@@ -4771,13 +4793,17 @@ public CodegenParameter fromParameter(Parameter parameter, Set<String> imports) | |
// https://swagger.io/docs/specification/serialization/ | ||
if (schema != null) { | ||
Map<String, Schema<?>> properties = schema.getProperties(); | ||
codegenParameter.items.vars = | ||
properties.entrySet().stream() | ||
.map(entry -> { | ||
CodegenProperty property = fromProperty(entry.getKey(), entry.getValue()); | ||
property.baseName = codegenParameter.baseName + "[" + entry.getKey() + "]"; | ||
return property; | ||
}).collect(Collectors.toList()); | ||
if (properties != null) { | ||
codegenParameter.items.vars = | ||
properties.entrySet().stream() | ||
.map(entry -> { | ||
CodegenProperty property = fromProperty(entry.getKey(), entry.getValue()); | ||
property.baseName = codegenParameter.baseName + "[" + entry.getKey() + "]"; | ||
return property; | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Why is property.baseName being modified here? |
||
}).collect(Collectors.toList()); | ||
} else { | ||
//LOGGER.error("properties is null: {}", schema); | ||
} | ||
} else { | ||
LOGGER.warn( | ||
"No object schema found for deepObject parameter{} deepObject won't have specific properties", | ||
|
@@ -4790,17 +4816,17 @@ public CodegenParameter fromParameter(Parameter parameter, Set<String> imports) | |
} | ||
|
||
/** | ||
* Returns the data type of a parameter. | ||
* Returns the data type of parameter. | ||
* Returns null by default to use the CodegenProperty.datatype value | ||
* | ||
* @param parameter Parameter | ||
* @param schema Schema | ||
* @return data type | ||
*/ | ||
protected String getParameterDataType(Parameter parameter, Schema schema) { | ||
if (parameter.get$ref() != null) { | ||
String refName = ModelUtils.getSimpleRef(parameter.get$ref()); | ||
return toModelName(refName); | ||
Schema unaliasSchema = ModelUtils.unaliasSchema(openAPI, schema); | ||
if (unaliasSchema.get$ref() != null) { | ||
return toModelName(ModelUtils.getSimpleRef(unaliasSchema.get$ref())); | ||
} | ||
return null; | ||
} | ||
|
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -725,14 +725,33 @@ public static boolean isModel(Schema schema) { | |
} | ||
|
||
// has properties | ||
if (null != schema.getProperties()) { | ||
if (null != schema.getProperties() && !schema.getProperties().isEmpty()) { | ||
return true; | ||
} | ||
|
||
// composed schema is a model, consider very simple ObjectSchema a model | ||
return schema instanceof ComposedSchema || schema instanceof ObjectSchema; | ||
} | ||
|
||
/** | ||
* Check to see if the schema is a model with properties only (non-composed model) | ||
* | ||
* @param schema potentially containing a '$ref' | ||
* @return true if it's a model with at least one properties | ||
*/ | ||
public static boolean isModelWithPropertiesOnly(Schema schema) { | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
How about limiting this to type object and AnyType models only? There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Thanks for the review. I previously didn't check I simply want to set the isModel flag correctly because now isMap is set to true for a simple model. I've not touched the code in There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Let me look into what is happening with python experimental. I think it is changing because the component schema changed There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Root cause investigation is here: https://github.com/OpenAPITools/openapi-generator/pull/12369/files#r876380534 There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Should this be true if the schema also has anyOf or allOf definitions? |
||
if (schema == null) { | ||
return false; | ||
} | ||
|
||
if (null != schema.getProperties() && !schema.getProperties().isEmpty() && // has properties | ||
(schema.getAdditionalProperties() == null || // no additionalProperties is set | ||
(schema.getAdditionalProperties() instanceof Boolean && !(Boolean)schema.getAdditionalProperties()))) { | ||
return true; | ||
} | ||
return false; | ||
} | ||
|
||
public static boolean hasValidation(Schema sc) { | ||
return ( | ||
sc.getMaxItems() != null || | ||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Why should codegenParameters handle dataType and complexType differently than codegenProperty?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The change above simply uses a different (better) name in the code block as
parameterDataType
originally aims to store the model name so no change in code logic if I remember correctly.