fix: complex generic breaks introspection (#294)

This commit is contained in:
Ryan Brink
2022-08-13 15:08:54 -07:00
committed by GitHub
parent 7cd0e6154b
commit e89636fa58
5 changed files with 103 additions and 1 deletions

View File

@ -14,6 +14,7 @@ import io.bkbn.kompendium.core.util.TestModules.singleException
import io.bkbn.kompendium.core.util.TestModules.genericException
import io.bkbn.kompendium.core.util.TestModules.genericPolymorphicResponse
import io.bkbn.kompendium.core.util.TestModules.genericPolymorphicResponseMultipleImpls
import io.bkbn.kompendium.core.util.TestModules.gnarlyGenericResponse
import io.bkbn.kompendium.core.util.TestModules.headerParameter
import io.bkbn.kompendium.core.util.TestModules.multipleExceptions
import io.bkbn.kompendium.core.util.TestModules.nestedGenericCollection
@ -167,6 +168,9 @@ class KompendiumTest : DescribeSpec({
it("Can support nested generics with multiple type parameters") {
openApiTestAllSerializers("T0040__nested_generic_multiple_type_params.json") { nestedGenericMultipleParamsCollection() }
}
it("Can handle a really gnarly generic example") {
openApiTestAllSerializers("T0043__gnarly_generic_example.json") { gnarlyGenericResponse() }
}
}
describe("Miscellaneous") {
xit("Can generate the necessary ReDoc home page") {

View File

@ -1,5 +1,6 @@
package io.bkbn.kompendium.core.util
import io.bkbn.kompendium.core.fixtures.Barzo
import io.bkbn.kompendium.core.fixtures.ColumnSchema
import io.bkbn.kompendium.core.fixtures.ComplexRequest
import io.bkbn.kompendium.core.fixtures.DateTimeString
@ -7,6 +8,7 @@ import io.bkbn.kompendium.core.fixtures.DefaultField
import io.bkbn.kompendium.core.fixtures.ExceptionResponse
import io.bkbn.kompendium.core.fixtures.Flibbity
import io.bkbn.kompendium.core.fixtures.FlibbityGibbit
import io.bkbn.kompendium.core.fixtures.Foosy
import io.bkbn.kompendium.core.fixtures.Gibbity
import io.bkbn.kompendium.core.fixtures.ManyThings
import io.bkbn.kompendium.core.fixtures.MultiNestedGenerics
@ -564,6 +566,8 @@ object TestModules {
fun Routing.simpleGenericResponse() = basicGetGenerator<Gibbity<String>>()
fun Routing.gnarlyGenericResponse() = basicGetGenerator<Foosy<Barzo<Int>, String>>()
fun Routing.nestedGenericResponse() = basicGetGenerator<Gibbity<Map<String, String>>>()
fun Routing.genericPolymorphicResponse() = basicGetGenerator<Flibbity<Double>>()

View File

@ -0,0 +1,91 @@
{
"openapi": "3.1.0",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"title": "Test API",
"version": "1.33.7",
"description": "An amazing, fully-ish 😉 generated API spec",
"termsOfService": "https://example.com",
"contact": {
"name": "Homer Simpson",
"url": "https://gph.is/1NPUDiM",
"email": "chunkylover53@aol.com"
},
"license": {
"name": "MIT",
"url": "https://github.com/bkbnio/kompendium/blob/main/LICENSE"
}
},
"servers": [
{
"url": "https://myawesomeapi.com",
"description": "Production instance of my API"
},
{
"url": "https://staging.myawesomeapi.com",
"description": "Where the fun stuff happens"
}
],
"paths": {
"/": {
"get": {
"tags": [],
"summary": "Great Summary!",
"description": "testing more",
"parameters": [],
"responses": {
"200": {
"description": "A Successful Endeavor",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Foosy-Barzo-String"
}
}
}
}
},
"deprecated": false
},
"parameters": []
}
},
"webhooks": {},
"components": {
"schemas": {
"Foosy-Barzo-String": {
"type": "object",
"properties": {
"otherThing": {
"items": {
"type": "string"
},
"type": "array"
},
"test": {
"$ref": "#/components/schemas/Barzo-Int"
}
},
"required": [
"otherThing",
"test"
]
},
"Barzo-Int": {
"type": "object",
"properties": {
"result": {
"type": "number",
"format": "int32"
}
},
"required": [
"result"
]
}
},
"securitySchemes": {}
},
"security": [],
"tags": []
}

View File

@ -138,3 +138,6 @@ data class ManyThings(
val someA: Something,
val someB: Something?
)
data class Foosy<T, K>(val test: T, val otherThing: List<K>)
data class Barzo<G>(val result: G)

View File

@ -96,7 +96,7 @@ object SimpleObjectHandler {
return SchemaGenerator.fromTypeToSchema(type, cache).let {
if (it.isOrContainsObjectDef()) {
cache[type.getSimpleSlug()] = it
ReferenceDefinition(prop.returnType.getReferenceSlug())
ReferenceDefinition(type.getReferenceSlug())
} else {
it
}