fix ref to allOf wrapper, add tests (#19986)

This commit is contained in:
William Cheng 2024-10-29 10:24:59 +08:00 committed by GitHub
parent 891698784d
commit 48e8375166
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
6 changed files with 117 additions and 2 deletions

View File

@ -3861,8 +3861,29 @@ public class DefaultCodegen implements CodegenConfig {
} }
Schema original = null; Schema original = null;
// process the dereference schema if it's a ref to allOf with a single item
// and certain field(s) (e.g. description, readyOnly, etc) is set
if (p.get$ref() != null) {
Schema derefSchema = ModelUtils.getReferencedSchema(openAPI, p);
if (ModelUtils.isAllOfWithSingleItem(derefSchema) && (
derefSchema.getReadOnly() != null ||
derefSchema.getWriteOnly() != null ||
derefSchema.getDeprecated() != null ||
derefSchema.getDescription() != null ||
derefSchema.getMaxLength() != null ||
derefSchema.getMinLength() != null ||
derefSchema.getMinimum() != null ||
derefSchema.getMaximum() != null ||
derefSchema.getMaximum() != null ||
derefSchema.getMinItems() != null ||
derefSchema.getTitle() != null
)) {
p = ModelUtils.getReferencedSchema(openAPI, p);
}
}
// check if it's allOf (only 1 sub schema) with or without default/nullable/etc set in the top level // check if it's allOf (only 1 sub schema) with or without default/nullable/etc set in the top level
if (ModelUtils.isAllOf(p) && p.getAllOf().size() == 1) { if (ModelUtils.isAllOfWithSingleItem(p)) {
if (p.getAllOf().get(0) instanceof Schema) { if (p.getAllOf().get(0) instanceof Schema) {
original = p; original = p;
p = (Schema) p.getAllOf().get(0); p = (Schema) p.getAllOf().get(0);

View File

@ -2031,6 +2031,18 @@ public class ModelUtils {
return false; return false;
} }
/**
* Returns true if the schema contains allOf with a single item but
* no properties/oneOf/anyOf defined
*
* @param schema the schema
* @return true if the schema contains allOf but no properties/oneOf/anyOf defined.
*/
public static boolean isAllOfWithSingleItem(Schema schema) {
return (isAllOf(schema) && schema.getAllOf().size() == 1);
}
/** /**
* Returns true if the schema contains allOf and may or may not have * Returns true if the schema contains allOf and may or may not have
* properties/oneOf/anyOf defined. * properties/oneOf/anyOf defined.

View File

@ -2610,6 +2610,10 @@ components:
minItems: 1 minItems: 1
items: items:
$ref: '#/components/schemas/Scalar' $ref: '#/components/schemas/Scalar'
AllOfRefToString:
allOf:
- $ref: '#/components/schemas/OuterString'
description: testing allOf with a ref to string
NewPet: NewPet:
type: object type: object
required: required:
@ -2620,6 +2624,12 @@ components:
type: integer type: integer
format: int64 format: int64
x-is-unique: true x-is-unique: true
category_ref_to_inline_allof_string:
$ref: '#/components/schemas/AllOfRefToString'
category_inline_allof_string:
allOf:
- $ref: '#/components/schemas/OuterString'
description: testing allOf with a ref to string
category_inline_allof: category_inline_allof:
allOf: allOf:
- type: object - type: object

View File

@ -2689,12 +2689,22 @@ components:
$ref: '#/components/schemas/Scalar' $ref: '#/components/schemas/Scalar'
minItems: 1 minItems: 1
type: array type: array
AllOfRefToString:
allOf:
- $ref: '#/components/schemas/OuterString'
description: testing allOf with a ref to string
NewPet: NewPet:
properties: properties:
id: id:
format: int64 format: int64
type: integer type: integer
x-is-unique: true x-is-unique: true
category_ref_to_inline_allof_string:
$ref: '#/components/schemas/AllOfRefToString'
category_inline_allof_string:
allOf:
- $ref: '#/components/schemas/OuterString'
description: testing allOf with a ref to string
category_inline_allof: category_inline_allof:
$ref: '#/components/schemas/NewPet_category_inline_allof' $ref: '#/components/schemas/NewPet_category_inline_allof'
category_allOf_ref: category_allOf_ref:

View File

@ -8,6 +8,8 @@
| Name | Type | Description | Notes | | Name | Type | Description | Notes |
|------------ | ------------- | ------------- | -------------| |------------ | ------------- | ------------- | -------------|
|**id** | **Long** | | [optional] | |**id** | **Long** | | [optional] |
|**categoryRefToInlineAllofString** | **String** | testing allOf with a ref to string | [optional] |
|**categoryInlineAllofString** | **String** | testing allOf with a ref to string | [optional] |
|**categoryInlineAllof** | [**NewPetCategoryInlineAllof**](NewPetCategoryInlineAllof.md) | | [optional] | |**categoryInlineAllof** | [**NewPetCategoryInlineAllof**](NewPetCategoryInlineAllof.md) | | [optional] |
|**categoryAllOfRef** | [**Category**](Category.md) | | [optional] | |**categoryAllOfRef** | [**Category**](Category.md) | | [optional] |
|**categoryAllOfRefDescription** | [**Category**](Category.md) | Adding description to property using allOf | [optional] | |**categoryAllOfRefDescription** | [**Category**](Category.md) | Adding description to property using allOf | [optional] |

View File

@ -60,6 +60,16 @@ public class NewPet {
@javax.annotation.Nullable @javax.annotation.Nullable
private Long id; private Long id;
public static final String SERIALIZED_NAME_CATEGORY_REF_TO_INLINE_ALLOF_STRING = "category_ref_to_inline_allof_string";
@SerializedName(SERIALIZED_NAME_CATEGORY_REF_TO_INLINE_ALLOF_STRING)
@javax.annotation.Nullable
private String categoryRefToInlineAllofString;
public static final String SERIALIZED_NAME_CATEGORY_INLINE_ALLOF_STRING = "category_inline_allof_string";
@SerializedName(SERIALIZED_NAME_CATEGORY_INLINE_ALLOF_STRING)
@javax.annotation.Nullable
private String categoryInlineAllofString;
public static final String SERIALIZED_NAME_CATEGORY_INLINE_ALLOF = "category_inline_allof"; public static final String SERIALIZED_NAME_CATEGORY_INLINE_ALLOF = "category_inline_allof";
@SerializedName(SERIALIZED_NAME_CATEGORY_INLINE_ALLOF) @SerializedName(SERIALIZED_NAME_CATEGORY_INLINE_ALLOF)
@javax.annotation.Nullable @javax.annotation.Nullable
@ -183,6 +193,44 @@ public class NewPet {
} }
public NewPet categoryRefToInlineAllofString(@javax.annotation.Nullable String categoryRefToInlineAllofString) {
this.categoryRefToInlineAllofString = categoryRefToInlineAllofString;
return this;
}
/**
* testing allOf with a ref to string
* @return categoryRefToInlineAllofString
*/
@javax.annotation.Nullable
public String getCategoryRefToInlineAllofString() {
return categoryRefToInlineAllofString;
}
public void setCategoryRefToInlineAllofString(@javax.annotation.Nullable String categoryRefToInlineAllofString) {
this.categoryRefToInlineAllofString = categoryRefToInlineAllofString;
}
public NewPet categoryInlineAllofString(@javax.annotation.Nullable String categoryInlineAllofString) {
this.categoryInlineAllofString = categoryInlineAllofString;
return this;
}
/**
* testing allOf with a ref to string
* @return categoryInlineAllofString
*/
@javax.annotation.Nullable
public String getCategoryInlineAllofString() {
return categoryInlineAllofString;
}
public void setCategoryInlineAllofString(@javax.annotation.Nullable String categoryInlineAllofString) {
this.categoryInlineAllofString = categoryInlineAllofString;
}
public NewPet categoryInlineAllof(@javax.annotation.Nullable NewPetCategoryInlineAllof categoryInlineAllof) { public NewPet categoryInlineAllof(@javax.annotation.Nullable NewPetCategoryInlineAllof categoryInlineAllof) {
this.categoryInlineAllof = categoryInlineAllof; this.categoryInlineAllof = categoryInlineAllof;
return this; return this;
@ -398,6 +446,8 @@ public class NewPet {
} }
NewPet newPet = (NewPet) o; NewPet newPet = (NewPet) o;
return Objects.equals(this.id, newPet.id) && return Objects.equals(this.id, newPet.id) &&
Objects.equals(this.categoryRefToInlineAllofString, newPet.categoryRefToInlineAllofString) &&
Objects.equals(this.categoryInlineAllofString, newPet.categoryInlineAllofString) &&
Objects.equals(this.categoryInlineAllof, newPet.categoryInlineAllof) && Objects.equals(this.categoryInlineAllof, newPet.categoryInlineAllof) &&
Objects.equals(this.categoryAllOfRef, newPet.categoryAllOfRef) && Objects.equals(this.categoryAllOfRef, newPet.categoryAllOfRef) &&
Objects.equals(this.categoryAllOfRefDescription, newPet.categoryAllOfRefDescription) && Objects.equals(this.categoryAllOfRefDescription, newPet.categoryAllOfRefDescription) &&
@ -411,7 +461,7 @@ public class NewPet {
@Override @Override
public int hashCode() { public int hashCode() {
return Objects.hash(id, categoryInlineAllof, categoryAllOfRef, categoryAllOfRefDescription, categoryAllOfRefDescriptionReadonly, name, photoUrls, tags, status, additionalProperties); return Objects.hash(id, categoryRefToInlineAllofString, categoryInlineAllofString, categoryInlineAllof, categoryAllOfRef, categoryAllOfRefDescription, categoryAllOfRefDescriptionReadonly, name, photoUrls, tags, status, additionalProperties);
} }
@Override @Override
@ -419,6 +469,8 @@ public class NewPet {
StringBuilder sb = new StringBuilder(); StringBuilder sb = new StringBuilder();
sb.append("class NewPet {\n"); sb.append("class NewPet {\n");
sb.append(" id: ").append(toIndentedString(id)).append("\n"); sb.append(" id: ").append(toIndentedString(id)).append("\n");
sb.append(" categoryRefToInlineAllofString: ").append(toIndentedString(categoryRefToInlineAllofString)).append("\n");
sb.append(" categoryInlineAllofString: ").append(toIndentedString(categoryInlineAllofString)).append("\n");
sb.append(" categoryInlineAllof: ").append(toIndentedString(categoryInlineAllof)).append("\n"); sb.append(" categoryInlineAllof: ").append(toIndentedString(categoryInlineAllof)).append("\n");
sb.append(" categoryAllOfRef: ").append(toIndentedString(categoryAllOfRef)).append("\n"); sb.append(" categoryAllOfRef: ").append(toIndentedString(categoryAllOfRef)).append("\n");
sb.append(" categoryAllOfRefDescription: ").append(toIndentedString(categoryAllOfRefDescription)).append("\n"); sb.append(" categoryAllOfRefDescription: ").append(toIndentedString(categoryAllOfRefDescription)).append("\n");
@ -451,6 +503,8 @@ public class NewPet {
// a set of all properties/fields (JSON key names) // a set of all properties/fields (JSON key names)
openapiFields = new HashSet<String>(); openapiFields = new HashSet<String>();
openapiFields.add("id"); openapiFields.add("id");
openapiFields.add("category_ref_to_inline_allof_string");
openapiFields.add("category_inline_allof_string");
openapiFields.add("category_inline_allof"); openapiFields.add("category_inline_allof");
openapiFields.add("category_allOf_ref"); openapiFields.add("category_allOf_ref");
openapiFields.add("category_allOf_ref_description"); openapiFields.add("category_allOf_ref_description");
@ -486,6 +540,12 @@ public class NewPet {
} }
} }
JsonObject jsonObj = jsonElement.getAsJsonObject(); JsonObject jsonObj = jsonElement.getAsJsonObject();
if ((jsonObj.get("category_ref_to_inline_allof_string") != null && !jsonObj.get("category_ref_to_inline_allof_string").isJsonNull()) && !jsonObj.get("category_ref_to_inline_allof_string").isJsonPrimitive()) {
throw new IllegalArgumentException(String.format("Expected the field `category_ref_to_inline_allof_string` to be a primitive type in the JSON string but got `%s`", jsonObj.get("category_ref_to_inline_allof_string").toString()));
}
if ((jsonObj.get("category_inline_allof_string") != null && !jsonObj.get("category_inline_allof_string").isJsonNull()) && !jsonObj.get("category_inline_allof_string").isJsonPrimitive()) {
throw new IllegalArgumentException(String.format("Expected the field `category_inline_allof_string` to be a primitive type in the JSON string but got `%s`", jsonObj.get("category_inline_allof_string").toString()));
}
// validate the optional field `category_inline_allof` // validate the optional field `category_inline_allof`
if (jsonObj.get("category_inline_allof") != null && !jsonObj.get("category_inline_allof").isJsonNull()) { if (jsonObj.get("category_inline_allof") != null && !jsonObj.get("category_inline_allof").isJsonNull()) {
NewPetCategoryInlineAllof.validateJsonElement(jsonObj.get("category_inline_allof")); NewPetCategoryInlineAllof.validateJsonElement(jsonObj.get("category_inline_allof"));