diff --git a/src/main/kotlin/com/cjbooms/fabrikt/util/KaizenParserExtensions.kt b/src/main/kotlin/com/cjbooms/fabrikt/util/KaizenParserExtensions.kt index d14ed8da..26d8fb08 100644 --- a/src/main/kotlin/com/cjbooms/fabrikt/util/KaizenParserExtensions.kt +++ b/src/main/kotlin/com/cjbooms/fabrikt/util/KaizenParserExtensions.kt @@ -39,11 +39,14 @@ object KaizenParserExtensions { getDiscriminatorForInLinedObjectUnderAllOf()?.propertyName != null fun Schema.isInlinedObjectDefinition() = - isObjectType() && !isSchemaLess() && ( + (isObjectType() || isAggregatedObject()) && !isSchemaLess() && ( Overlay.of(this).pathFromRoot.contains("properties") || Overlay.of(this).pathFromRoot.contains("items") ) + private fun Schema.isAggregatedObject(): Boolean = + combinedAnyOfAndAllOfSchemas().size > 1 + fun Schema.isInlinedTypedAdditionalProperties() = isObjectType() && !isSchemaLess() && Overlay.of(this).pathFromRoot.contains("additionalProperties") @@ -188,7 +191,7 @@ object KaizenParserExtensions { fun Schema.safeName(): String = when { isOneOfPolymorphicTypes() -> this.oneOfSchemas.first().allOfSchemas.first().safeName() - isPropertyWithAllOfSingleType() -> this.allOfSchemas.first().safeName() + isInlinedAggregationOfExactlyOne() -> combinedAnyOfAndAllOfSchemas().first().safeName() name != null -> name else -> Overlay.of(this).pathFromRoot .splitToSequence("/") @@ -222,8 +225,11 @@ object KaizenParserExtensions { fun Schema.isOneOfSuperInterface() = discriminator != null && discriminator.propertyName != null && oneOfSchemas.isNotEmpty() - private fun Schema.isPropertyWithAllOfSingleType() = - allOfSchemas?.size == 1 && isInlinedPropertySchema() + private fun Schema.isInlinedAggregationOfExactlyOne() = + combinedAnyOfAndAllOfSchemas().size == 1 && isInlinedPropertySchema() + + private fun Schema.combinedAnyOfAndAllOfSchemas(): List = + (allOfSchemas ?: emptyList()) + (anyOfSchemas ?: emptyList()) /** * The `pathFromRoot` of a property schema ends with diff --git a/src/test/kotlin/com/cjbooms/fabrikt/generators/ModelGeneratorTest.kt b/src/test/kotlin/com/cjbooms/fabrikt/generators/ModelGeneratorTest.kt index aee06cfd..f20e3d96 100644 --- a/src/test/kotlin/com/cjbooms/fabrikt/generators/ModelGeneratorTest.kt +++ b/src/test/kotlin/com/cjbooms/fabrikt/generators/ModelGeneratorTest.kt @@ -49,7 +49,7 @@ class ModelGeneratorTest { "validationAnnotations", "wildCardTypes", "singleAllOf", - "singleAllOfProperty", + "inlinedAggregatedObjects", "responsesSchema", "webhook", "instantDateTime", diff --git a/src/test/resources/examples/singleAllOfProperty/api.yaml b/src/test/resources/examples/inlinedAggregatedObjects/api.yaml similarity index 74% rename from src/test/resources/examples/singleAllOfProperty/api.yaml rename to src/test/resources/examples/inlinedAggregatedObjects/api.yaml index f49fe327..7dd6c74c 100644 --- a/src/test/resources/examples/singleAllOfProperty/api.yaml +++ b/src/test/resources/examples/inlinedAggregatedObjects/api.yaml @@ -19,6 +19,7 @@ components: description: "The person walking the dog." allOf: - $ref: "#/components/schemas/Person" + - $ref: "#/components/schemas/Company" Person: type: object @@ -27,3 +28,11 @@ components: properties: name: type: string + + Company: + type: object + required: + - companyName + properties: + companyName: + type: string diff --git a/src/test/resources/examples/inlinedAggregatedObjects/models/Models.kt b/src/test/resources/examples/inlinedAggregatedObjects/models/Models.kt new file mode 100644 index 00000000..deecc15b --- /dev/null +++ b/src/test/resources/examples/inlinedAggregatedObjects/models/Models.kt @@ -0,0 +1,42 @@ +package examples.inlinedAggregatedObjects.models + +import com.fasterxml.jackson.`annotation`.JsonProperty +import javax.validation.Valid +import javax.validation.constraints.NotNull +import kotlin.String + +public data class Company( + @param:JsonProperty("companyName") + @get:JsonProperty("companyName") + @get:NotNull + public val companyName: String, +) + +public data class Dog( + @param:JsonProperty("owner") + @get:JsonProperty("owner") + @get:Valid + public val owner: Person? = null, + @param:JsonProperty("walker") + @get:JsonProperty("walker") + @get:Valid + public val walker: DogWalker? = null, +) + +public data class DogWalker( + @param:JsonProperty("name") + @get:JsonProperty("name") + @get:NotNull + public val name: String, + @param:JsonProperty("companyName") + @get:JsonProperty("companyName") + @get:NotNull + public val companyName: String, +) + +public data class Person( + @param:JsonProperty("name") + @get:JsonProperty("name") + @get:NotNull + public val name: String, +) diff --git a/src/test/resources/examples/singleAllOfProperty/models/Models.kt b/src/test/resources/examples/singleAllOfProperty/models/Models.kt deleted file mode 100644 index e8f17da2..00000000 --- a/src/test/resources/examples/singleAllOfProperty/models/Models.kt +++ /dev/null @@ -1,24 +0,0 @@ -package examples.singleAllOfProperty.models - -import com.fasterxml.jackson.`annotation`.JsonProperty -import javax.validation.Valid -import javax.validation.constraints.NotNull -import kotlin.String - -public data class Dog( - @param:JsonProperty("owner") - @get:JsonProperty("owner") - @get:Valid - public val owner: Person? = null, - @param:JsonProperty("walker") - @get:JsonProperty("walker") - @get:Valid - public val walker: Person? = null, -) - -public data class Person( - @param:JsonProperty("name") - @get:JsonProperty("name") - @get:NotNull - public val name: String, -)