From 8bec1fea28ec1cdc3335d518245efe0f6d60e863 Mon Sep 17 00:00:00 2001 From: oabasov Date: Thu, 14 Nov 2019 00:13:05 +0200 Subject: [PATCH 01/12] Add ability to set request / response schema name (cherry picked from commit 9880dd196c3077ed65319fb8cf7c6686d8d23ffd) --- .../apispec/openapi3/OpenApi3Generator.kt | 16 +++++++++++----- .../epages/restdocs/apispec/ResourceSnippet.kt | 4 ++++ .../apispec/ResourceSnippetParameters.kt | 12 ++++++++++++ .../restdocs/apispec/RestDocumentationWrapper.kt | 2 ++ 4 files changed, 29 insertions(+), 5 deletions(-) diff --git a/restdocs-api-spec-openapi3-generator/src/main/kotlin/com/epages/restdocs/apispec/openapi3/OpenApi3Generator.kt b/restdocs-api-spec-openapi3-generator/src/main/kotlin/com/epages/restdocs/apispec/openapi3/OpenApi3Generator.kt index cc9a0714..e80030c0 100644 --- a/restdocs-api-spec-openapi3-generator/src/main/kotlin/com/epages/restdocs/apispec/openapi3/OpenApi3Generator.kt +++ b/restdocs-api-spec-openapi3-generator/src/main/kotlin/com/epages/restdocs/apispec/openapi3/OpenApi3Generator.kt @@ -140,7 +140,7 @@ object OpenApi3Generator { val schemaKey = if (schemasToKeys.containsKey(schema)) { schemasToKeys[schema]!! } else { - val name = schemaNameGenerator(schema) + val name = if (schema.name != null) schema.name else schemaNameGenerator(schema) schemasToKeys[schema] = name name } @@ -263,7 +263,8 @@ object OpenApi3Generator { toMediaType( requestFields = requests.flatMap { it.request.requestFields }, examplesWithOperationId = requests.filter { it.request.example != null }.map { it.operationId to it.request.example!! }.toMap(), - contentType = contentType + contentType = contentType, + schemaName = requests.first().request.schema ) }.toMap() .let { contentTypeToMediaType -> @@ -312,7 +313,8 @@ object OpenApi3Generator { toMediaType( requestFields = requests.flatMap { it.response.responseFields }, examplesWithOperationId = requests.map { it.operationId to it.response.example!! }.toMap(), - contentType = contentType + contentType = contentType, + schemaName = responseModelsSameStatus.first().response.schema ) }.toMap() .let { contentTypeToMediaType -> @@ -328,10 +330,14 @@ object OpenApi3Generator { private fun toMediaType( requestFields: List, examplesWithOperationId: Map, - contentType: String + contentType: String, + schemaName: String? = null ): Pair { - val schema = JsonSchemaFromFieldDescriptorsGenerator().generateSchema(requestFields) + val schema = JsonSchemaFromFieldDescriptorsGenerator().generateSchema(requestFields, schemaName) .let { Json.mapper().readValue>(it) } + + if (schemaName != null) schema.name = schemaName + return contentType to MediaType() .schema(schema) .examples(examplesWithOperationId.map { it.key to Example().apply { value(it.value) } }.toMap().nullIfEmpty()) diff --git a/restdocs-api-spec/src/main/kotlin/com/epages/restdocs/apispec/ResourceSnippet.kt b/restdocs-api-spec/src/main/kotlin/com/epages/restdocs/apispec/ResourceSnippet.kt index e8dbbca3..df4000d8 100755 --- a/restdocs-api-spec/src/main/kotlin/com/epages/restdocs/apispec/ResourceSnippet.kt +++ b/restdocs-api-spec/src/main/kotlin/com/epages/restdocs/apispec/ResourceSnippet.kt @@ -69,6 +69,7 @@ class ResourceSnippet(private val resourceSnippetParameters: ResourceSnippetPara headers = resourceSnippetParameters.requestHeaders.withExampleValues(operation.request.headers), pathParameters = resourceSnippetParameters.pathParameters.filter { !it.isIgnored }, requestParameters = resourceSnippetParameters.requestParameters.filter { !it.isIgnored }, + schema = resourceSnippetParameters.requestSchemaName, requestFields = if (hasRequestBody) resourceSnippetParameters.requestFields.filter { !it.isIgnored } else emptyList(), example = if (hasRequestBody) operation.request.contentAsString else null, securityRequirements = securityRequirements @@ -77,6 +78,7 @@ class ResourceSnippet(private val resourceSnippetParameters: ResourceSnippetPara status = operation.response.status.value(), contentType = if (hasResponseBody) getContentTypeOrDefault(operation.response.headers) else null, headers = resourceSnippetParameters.responseHeaders.withExampleValues(operation.response.headers), + schema = resourceSnippetParameters.responseSchemaName, responseFields = if (hasResponseBody) resourceSnippetParameters.responseFields.filter { !it.isIgnored } else emptyList(), example = if (hasResponseBody) operation.response.contentAsString else null ) @@ -127,6 +129,7 @@ class ResourceSnippet(private val resourceSnippetParameters: ResourceSnippetPara val path: String, val method: String, val contentType: String?, + val schema: String? = null, val headers: List, val pathParameters: List, val requestParameters: List, @@ -138,6 +141,7 @@ class ResourceSnippet(private val resourceSnippetParameters: ResourceSnippetPara private data class ResponseModel( val status: Int, val contentType: String?, + val schema: String? = null, val headers: List, val responseFields: List, val example: String? diff --git a/restdocs-api-spec/src/main/kotlin/com/epages/restdocs/apispec/ResourceSnippetParameters.kt b/restdocs-api-spec/src/main/kotlin/com/epages/restdocs/apispec/ResourceSnippetParameters.kt index 7ab2c2a7..c35e847d 100755 --- a/restdocs-api-spec/src/main/kotlin/com/epages/restdocs/apispec/ResourceSnippetParameters.kt +++ b/restdocs-api-spec/src/main/kotlin/com/epages/restdocs/apispec/ResourceSnippetParameters.kt @@ -19,6 +19,8 @@ data class ResourceSnippetParameters @JvmOverloads constructor( val description: String? = null, val privateResource: Boolean = false, val deprecated: Boolean = false, + val requestSchemaName: String? = null, + val responseSchemaName: String? = null, val requestFields: List = emptyList(), val responseFields: List = emptyList(), val links: List = emptyList(), @@ -141,6 +143,10 @@ abstract class ResourceSnippetDetails { protected set var description: String? = null protected set + var requestSchemaName: String? = null + protected set + var responseSchemaName: String? = null + protected set var privateResource: Boolean = false protected set var deprecated: Boolean = false @@ -150,6 +156,8 @@ abstract class ResourceSnippetDetails { abstract fun summary(summary: String?): ResourceSnippetDetails abstract fun description(description: String?): ResourceSnippetDetails + abstract fun requestSchemaName(requestSchemaName: String?): ResourceSnippetDetails + abstract fun responseSchemaName(responseSchemaName: String?): ResourceSnippetDetails abstract fun privateResource(privateResource: Boolean): ResourceSnippetDetails abstract fun deprecated(deprecated: Boolean): ResourceSnippetDetails abstract fun tag(tag: String): ResourceSnippetDetails @@ -174,6 +182,8 @@ class ResourceSnippetParametersBuilder : ResourceSnippetDetails() { override fun summary(summary: String?) = apply { this.summary = summary } override fun description(description: String?) = apply { this.description = description } + override fun requestSchemaName(requestSchemaName: String?) = apply { this.requestSchemaName = requestSchemaName } + override fun responseSchemaName(responseSchemaName: String?) = apply { this.responseSchemaName = responseSchemaName } override fun privateResource(privateResource: Boolean) = apply { this.privateResource = privateResource } override fun deprecated(deprecated: Boolean) = apply { this.deprecated = deprecated } @@ -220,6 +230,8 @@ class ResourceSnippetParametersBuilder : ResourceSnippetDetails() { description, privateResource, deprecated, + requestSchemaName, + responseSchemaName, requestFields, responseFields, links, diff --git a/restdocs-api-spec/src/main/kotlin/com/epages/restdocs/apispec/RestDocumentationWrapper.kt b/restdocs-api-spec/src/main/kotlin/com/epages/restdocs/apispec/RestDocumentationWrapper.kt index 92fefe58..0e761730 100644 --- a/restdocs-api-spec/src/main/kotlin/com/epages/restdocs/apispec/RestDocumentationWrapper.kt +++ b/restdocs-api-spec/src/main/kotlin/com/epages/restdocs/apispec/RestDocumentationWrapper.kt @@ -96,6 +96,8 @@ abstract class RestDocumentationWrapper { is ResourceSnippetParametersBuilder -> resourceDetails else -> ResourceSnippetParametersBuilder() .description(resourceDetails.description) + .requestSchemaName(resourceDetails.requestSchemaName) + .responseSchemaName(resourceDetails.responseSchemaName) .summary(resourceDetails.summary) .privateResource(resourceDetails.privateResource) .deprecated(resourceDetails.deprecated) From d902eb71d0843efbd2b4bdf03e7c41fa058c66d1 Mon Sep 17 00:00:00 2001 From: Thomas Wimmer Date: Sat, 25 Jan 2020 10:35:12 +0100 Subject: [PATCH 02/12] Validate schemaName in ResourceSnippetTest. --- .../com/epages/restdocs/apispec/ResourceSnippet.kt | 8 ++++---- .../epages/restdocs/apispec/ResourceSnippetTest.kt | 14 ++++++++++++++ 2 files changed, 18 insertions(+), 4 deletions(-) diff --git a/restdocs-api-spec/src/main/kotlin/com/epages/restdocs/apispec/ResourceSnippet.kt b/restdocs-api-spec/src/main/kotlin/com/epages/restdocs/apispec/ResourceSnippet.kt index df4000d8..ba4ae20e 100755 --- a/restdocs-api-spec/src/main/kotlin/com/epages/restdocs/apispec/ResourceSnippet.kt +++ b/restdocs-api-spec/src/main/kotlin/com/epages/restdocs/apispec/ResourceSnippet.kt @@ -69,7 +69,7 @@ class ResourceSnippet(private val resourceSnippetParameters: ResourceSnippetPara headers = resourceSnippetParameters.requestHeaders.withExampleValues(operation.request.headers), pathParameters = resourceSnippetParameters.pathParameters.filter { !it.isIgnored }, requestParameters = resourceSnippetParameters.requestParameters.filter { !it.isIgnored }, - schema = resourceSnippetParameters.requestSchemaName, + schemaName = resourceSnippetParameters.requestSchemaName, requestFields = if (hasRequestBody) resourceSnippetParameters.requestFields.filter { !it.isIgnored } else emptyList(), example = if (hasRequestBody) operation.request.contentAsString else null, securityRequirements = securityRequirements @@ -78,7 +78,7 @@ class ResourceSnippet(private val resourceSnippetParameters: ResourceSnippetPara status = operation.response.status.value(), contentType = if (hasResponseBody) getContentTypeOrDefault(operation.response.headers) else null, headers = resourceSnippetParameters.responseHeaders.withExampleValues(operation.response.headers), - schema = resourceSnippetParameters.responseSchemaName, + schemaName = resourceSnippetParameters.responseSchemaName, responseFields = if (hasResponseBody) resourceSnippetParameters.responseFields.filter { !it.isIgnored } else emptyList(), example = if (hasResponseBody) operation.response.contentAsString else null ) @@ -129,7 +129,7 @@ class ResourceSnippet(private val resourceSnippetParameters: ResourceSnippetPara val path: String, val method: String, val contentType: String?, - val schema: String? = null, + val schemaName: String? = null, val headers: List, val pathParameters: List, val requestParameters: List, @@ -141,7 +141,7 @@ class ResourceSnippet(private val resourceSnippetParameters: ResourceSnippetPara private data class ResponseModel( val status: Int, val contentType: String?, - val schema: String? = null, + val schemaName: String? = null, val headers: List, val responseFields: List, val example: String? diff --git a/restdocs-api-spec/src/test/kotlin/com/epages/restdocs/apispec/ResourceSnippetTest.kt b/restdocs-api-spec/src/test/kotlin/com/epages/restdocs/apispec/ResourceSnippetTest.kt index 69ca8117..58c2cfec 100644 --- a/restdocs-api-spec/src/test/kotlin/com/epages/restdocs/apispec/ResourceSnippetTest.kt +++ b/restdocs-api-spec/src/test/kotlin/com/epages/restdocs/apispec/ResourceSnippetTest.kt @@ -63,7 +63,9 @@ class ResourceSnippetTest { fun should_generate_resourcemodel_for_operation_with_request_and_response_body() { givenOperationWithRequestAndResponseBody() givenRequestFieldDescriptors() + givenRequestSchemaName() givenResponseFieldDescriptors() + givenResponseSchemaName() givenPathParameterDescriptors() givenRequestParameterDescriptors() givenRequestAndResponseHeaderDescriptors() @@ -77,6 +79,8 @@ class ResourceSnippetTest { then(resourceSnippetJson.read>("tags")).hasSize(3) + then(resourceSnippetJson.read("request.schemaName")).isNotEmpty() + then(resourceSnippetJson.read>("request.headers")).hasSize(1) then(resourceSnippetJson.read("request.headers[0].name")).isNotEmpty() then(resourceSnippetJson.read("request.headers[0].description")).isNotEmpty() @@ -106,6 +110,8 @@ class ResourceSnippetTest { then(resourceSnippetJson.read("response.status")).isEqualTo(HttpStatus.CREATED.value()) then(resourceSnippetJson.read("response.example")).isNotEmpty() + then(resourceSnippetJson.read("response.schemaName")).isNotEmpty() + then(resourceSnippetJson.read>("response.headers")).hasSize(1) then(resourceSnippetJson.read("response.headers[0].name")).isNotEmpty() then(resourceSnippetJson.read("response.headers[0].description")).isNotEmpty() @@ -307,10 +313,18 @@ class ResourceSnippetTest { parametersBuilder.requestFields(fieldWithPath("comment").description("description")) } + private fun givenRequestSchemaName() { + parametersBuilder.requestSchemaName("RequestSchema"); + } + private fun givenResponseFieldDescriptors() { parametersBuilder.responseFields(fieldWithPath("comment").description("description")) } + private fun givenResponseSchemaName() { + parametersBuilder.responseSchemaName("ResponseSchema"); + } + private fun givenIgnoredAndNotIgnoredRequestFieldDescriptors() { parametersBuilder.requestFields( fieldWithPath("comment").description("description"), From 840630d92de6719bbfd486cc823d0989bb22c895 Mon Sep 17 00:00:00 2001 From: Thomas Wimmer Date: Sat, 25 Jan 2020 11:10:27 +0100 Subject: [PATCH 03/12] Introduce dedicated data structure for schema properties. --- .../restdocs/apispec/ResourceSnippet.kt | 8 ++++---- .../apispec/ResourceSnippetParameters.kt | 20 +++++++++---------- .../apispec/RestDocumentationWrapper.kt | 4 ++-- .../com/epages/restdocs/apispec/Schema.kt | 11 ++++++++++ .../restdocs/apispec/ResourceSnippetTest.kt | 8 ++++---- 5 files changed, 31 insertions(+), 20 deletions(-) create mode 100644 restdocs-api-spec/src/main/kotlin/com/epages/restdocs/apispec/Schema.kt diff --git a/restdocs-api-spec/src/main/kotlin/com/epages/restdocs/apispec/ResourceSnippet.kt b/restdocs-api-spec/src/main/kotlin/com/epages/restdocs/apispec/ResourceSnippet.kt index ba4ae20e..be4de626 100755 --- a/restdocs-api-spec/src/main/kotlin/com/epages/restdocs/apispec/ResourceSnippet.kt +++ b/restdocs-api-spec/src/main/kotlin/com/epages/restdocs/apispec/ResourceSnippet.kt @@ -69,7 +69,7 @@ class ResourceSnippet(private val resourceSnippetParameters: ResourceSnippetPara headers = resourceSnippetParameters.requestHeaders.withExampleValues(operation.request.headers), pathParameters = resourceSnippetParameters.pathParameters.filter { !it.isIgnored }, requestParameters = resourceSnippetParameters.requestParameters.filter { !it.isIgnored }, - schemaName = resourceSnippetParameters.requestSchemaName, + schema = resourceSnippetParameters.requestSchema, requestFields = if (hasRequestBody) resourceSnippetParameters.requestFields.filter { !it.isIgnored } else emptyList(), example = if (hasRequestBody) operation.request.contentAsString else null, securityRequirements = securityRequirements @@ -78,7 +78,7 @@ class ResourceSnippet(private val resourceSnippetParameters: ResourceSnippetPara status = operation.response.status.value(), contentType = if (hasResponseBody) getContentTypeOrDefault(operation.response.headers) else null, headers = resourceSnippetParameters.responseHeaders.withExampleValues(operation.response.headers), - schemaName = resourceSnippetParameters.responseSchemaName, + schema = resourceSnippetParameters.responseSchema, responseFields = if (hasResponseBody) resourceSnippetParameters.responseFields.filter { !it.isIgnored } else emptyList(), example = if (hasResponseBody) operation.response.contentAsString else null ) @@ -129,7 +129,7 @@ class ResourceSnippet(private val resourceSnippetParameters: ResourceSnippetPara val path: String, val method: String, val contentType: String?, - val schemaName: String? = null, + val schema: Schema? = null, val headers: List, val pathParameters: List, val requestParameters: List, @@ -141,7 +141,7 @@ class ResourceSnippet(private val resourceSnippetParameters: ResourceSnippetPara private data class ResponseModel( val status: Int, val contentType: String?, - val schemaName: String? = null, + val schema: Schema? = null, val headers: List, val responseFields: List, val example: String? diff --git a/restdocs-api-spec/src/main/kotlin/com/epages/restdocs/apispec/ResourceSnippetParameters.kt b/restdocs-api-spec/src/main/kotlin/com/epages/restdocs/apispec/ResourceSnippetParameters.kt index c35e847d..cf7ab6b8 100755 --- a/restdocs-api-spec/src/main/kotlin/com/epages/restdocs/apispec/ResourceSnippetParameters.kt +++ b/restdocs-api-spec/src/main/kotlin/com/epages/restdocs/apispec/ResourceSnippetParameters.kt @@ -19,8 +19,8 @@ data class ResourceSnippetParameters @JvmOverloads constructor( val description: String? = null, val privateResource: Boolean = false, val deprecated: Boolean = false, - val requestSchemaName: String? = null, - val responseSchemaName: String? = null, + val requestSchema: Schema? = null, + val responseSchema: Schema? = null, val requestFields: List = emptyList(), val responseFields: List = emptyList(), val links: List = emptyList(), @@ -143,9 +143,9 @@ abstract class ResourceSnippetDetails { protected set var description: String? = null protected set - var requestSchemaName: String? = null + var requestSchema: Schema? = null protected set - var responseSchemaName: String? = null + var responseSchema: Schema? = null protected set var privateResource: Boolean = false protected set @@ -156,8 +156,8 @@ abstract class ResourceSnippetDetails { abstract fun summary(summary: String?): ResourceSnippetDetails abstract fun description(description: String?): ResourceSnippetDetails - abstract fun requestSchemaName(requestSchemaName: String?): ResourceSnippetDetails - abstract fun responseSchemaName(responseSchemaName: String?): ResourceSnippetDetails + abstract fun requestSchema(requestSchema: Schema?): ResourceSnippetDetails + abstract fun responseSchema(responseSchema: Schema?): ResourceSnippetDetails abstract fun privateResource(privateResource: Boolean): ResourceSnippetDetails abstract fun deprecated(deprecated: Boolean): ResourceSnippetDetails abstract fun tag(tag: String): ResourceSnippetDetails @@ -182,8 +182,8 @@ class ResourceSnippetParametersBuilder : ResourceSnippetDetails() { override fun summary(summary: String?) = apply { this.summary = summary } override fun description(description: String?) = apply { this.description = description } - override fun requestSchemaName(requestSchemaName: String?) = apply { this.requestSchemaName = requestSchemaName } - override fun responseSchemaName(responseSchemaName: String?) = apply { this.responseSchemaName = responseSchemaName } + override fun requestSchema(requestSchema: Schema?) = apply { this.requestSchema = requestSchema } + override fun responseSchema(responseSchema: Schema?) = apply { this.responseSchema = responseSchema } override fun privateResource(privateResource: Boolean) = apply { this.privateResource = privateResource } override fun deprecated(deprecated: Boolean) = apply { this.deprecated = deprecated } @@ -230,8 +230,8 @@ class ResourceSnippetParametersBuilder : ResourceSnippetDetails() { description, privateResource, deprecated, - requestSchemaName, - responseSchemaName, + requestSchema, + responseSchema, requestFields, responseFields, links, diff --git a/restdocs-api-spec/src/main/kotlin/com/epages/restdocs/apispec/RestDocumentationWrapper.kt b/restdocs-api-spec/src/main/kotlin/com/epages/restdocs/apispec/RestDocumentationWrapper.kt index 0e761730..8c05486b 100644 --- a/restdocs-api-spec/src/main/kotlin/com/epages/restdocs/apispec/RestDocumentationWrapper.kt +++ b/restdocs-api-spec/src/main/kotlin/com/epages/restdocs/apispec/RestDocumentationWrapper.kt @@ -96,8 +96,8 @@ abstract class RestDocumentationWrapper { is ResourceSnippetParametersBuilder -> resourceDetails else -> ResourceSnippetParametersBuilder() .description(resourceDetails.description) - .requestSchemaName(resourceDetails.requestSchemaName) - .responseSchemaName(resourceDetails.responseSchemaName) + .requestSchema(resourceDetails.requestSchema) + .responseSchema(resourceDetails.responseSchema) .summary(resourceDetails.summary) .privateResource(resourceDetails.privateResource) .deprecated(resourceDetails.deprecated) diff --git a/restdocs-api-spec/src/main/kotlin/com/epages/restdocs/apispec/Schema.kt b/restdocs-api-spec/src/main/kotlin/com/epages/restdocs/apispec/Schema.kt new file mode 100644 index 00000000..7b6779d9 --- /dev/null +++ b/restdocs-api-spec/src/main/kotlin/com/epages/restdocs/apispec/Schema.kt @@ -0,0 +1,11 @@ +package com.epages.restdocs.apispec + +/** + * Represents a request/response object schema. + */ +data class Schema(val name: String) { + + companion object { + fun schema(name: String): Schema = Schema(name) + } +} \ No newline at end of file diff --git a/restdocs-api-spec/src/test/kotlin/com/epages/restdocs/apispec/ResourceSnippetTest.kt b/restdocs-api-spec/src/test/kotlin/com/epages/restdocs/apispec/ResourceSnippetTest.kt index 58c2cfec..d9754e6d 100644 --- a/restdocs-api-spec/src/test/kotlin/com/epages/restdocs/apispec/ResourceSnippetTest.kt +++ b/restdocs-api-spec/src/test/kotlin/com/epages/restdocs/apispec/ResourceSnippetTest.kt @@ -79,7 +79,7 @@ class ResourceSnippetTest { then(resourceSnippetJson.read>("tags")).hasSize(3) - then(resourceSnippetJson.read("request.schemaName")).isNotEmpty() + then(resourceSnippetJson.read("request.schema.name")).isNotEmpty() then(resourceSnippetJson.read>("request.headers")).hasSize(1) then(resourceSnippetJson.read("request.headers[0].name")).isNotEmpty() @@ -110,7 +110,7 @@ class ResourceSnippetTest { then(resourceSnippetJson.read("response.status")).isEqualTo(HttpStatus.CREATED.value()) then(resourceSnippetJson.read("response.example")).isNotEmpty() - then(resourceSnippetJson.read("response.schemaName")).isNotEmpty() + then(resourceSnippetJson.read("response.schema.name")).isNotEmpty() then(resourceSnippetJson.read>("response.headers")).hasSize(1) then(resourceSnippetJson.read("response.headers[0].name")).isNotEmpty() @@ -314,7 +314,7 @@ class ResourceSnippetTest { } private fun givenRequestSchemaName() { - parametersBuilder.requestSchemaName("RequestSchema"); + parametersBuilder.requestSchema(Schema(name = "RequestSchema")); } private fun givenResponseFieldDescriptors() { @@ -322,7 +322,7 @@ class ResourceSnippetTest { } private fun givenResponseSchemaName() { - parametersBuilder.responseSchemaName("ResponseSchema"); + parametersBuilder.responseSchema(Schema(name = "ResponseSchema")); } private fun givenIgnoredAndNotIgnoredRequestFieldDescriptors() { From 23e76bc0c354d898b499ee954cb325daedeb4ff1 Mon Sep 17 00:00:00 2001 From: Thomas Wimmer Date: Sun, 26 Jan 2020 19:54:57 +0100 Subject: [PATCH 04/12] Add support for custom schema names in OpenApi3Generator --- .../restdocs/apispec/model/ResourceModel.kt | 8 ++- .../apispec/openapi3/OpenApi3Generator.kt | 4 +- .../apispec/openapi3/OpenApi3GeneratorTest.kt | 49 ++++++++++++++----- 3 files changed, 45 insertions(+), 16 deletions(-) diff --git a/restdocs-api-spec-model/src/main/kotlin/com/epages/restdocs/apispec/model/ResourceModel.kt b/restdocs-api-spec-model/src/main/kotlin/com/epages/restdocs/apispec/model/ResourceModel.kt index 885d2c32..2fe6fe2d 100644 --- a/restdocs-api-spec-model/src/main/kotlin/com/epages/restdocs/apispec/model/ResourceModel.kt +++ b/restdocs-api-spec-model/src/main/kotlin/com/epages/restdocs/apispec/model/ResourceModel.kt @@ -24,6 +24,10 @@ fun List.groupByPath(): Map> { .groupBy { it.request.path } } +data class Schema( + val name: String +) + data class RequestModel( val path: String, val method: HTTPMethod, @@ -34,7 +38,7 @@ data class RequestModel( val requestParameters: List, val requestFields: List, val example: String? = null, - val schema: String? = null + val schema: Schema? = null ) data class ResponseModel( @@ -43,7 +47,7 @@ data class ResponseModel( val headers: List, val responseFields: List, val example: String? = null, - val schema: String? = null + val schema: Schema? = null ) enum class SimpleType { diff --git a/restdocs-api-spec-openapi3-generator/src/main/kotlin/com/epages/restdocs/apispec/openapi3/OpenApi3Generator.kt b/restdocs-api-spec-openapi3-generator/src/main/kotlin/com/epages/restdocs/apispec/openapi3/OpenApi3Generator.kt index e80030c0..ac0d1de2 100644 --- a/restdocs-api-spec-openapi3-generator/src/main/kotlin/com/epages/restdocs/apispec/openapi3/OpenApi3Generator.kt +++ b/restdocs-api-spec-openapi3-generator/src/main/kotlin/com/epages/restdocs/apispec/openapi3/OpenApi3Generator.kt @@ -264,7 +264,7 @@ object OpenApi3Generator { requestFields = requests.flatMap { it.request.requestFields }, examplesWithOperationId = requests.filter { it.request.example != null }.map { it.operationId to it.request.example!! }.toMap(), contentType = contentType, - schemaName = requests.first().request.schema + schemaName = requests.first().request.schema?.name ) }.toMap() .let { contentTypeToMediaType -> @@ -314,7 +314,7 @@ object OpenApi3Generator { requestFields = requests.flatMap { it.response.responseFields }, examplesWithOperationId = requests.map { it.operationId to it.response.example!! }.toMap(), contentType = contentType, - schemaName = responseModelsSameStatus.first().response.schema + schemaName = responseModelsSameStatus.first().response.schema?.name ) }.toMap() .let { contentTypeToMediaType -> diff --git a/restdocs-api-spec-openapi3-generator/src/test/kotlin/com/epages/restdocs/apispec/openapi3/OpenApi3GeneratorTest.kt b/restdocs-api-spec-openapi3-generator/src/test/kotlin/com/epages/restdocs/apispec/openapi3/OpenApi3GeneratorTest.kt index d80c6918..dcfd0c85 100644 --- a/restdocs-api-spec-openapi3-generator/src/test/kotlin/com/epages/restdocs/apispec/openapi3/OpenApi3GeneratorTest.kt +++ b/restdocs-api-spec-openapi3-generator/src/test/kotlin/com/epages/restdocs/apispec/openapi3/OpenApi3GeneratorTest.kt @@ -1,15 +1,6 @@ package com.epages.restdocs.apispec.openapi3 -import com.epages.restdocs.apispec.model.FieldDescriptor -import com.epages.restdocs.apispec.model.HTTPMethod -import com.epages.restdocs.apispec.model.HeaderDescriptor -import com.epages.restdocs.apispec.model.Oauth2Configuration -import com.epages.restdocs.apispec.model.ParameterDescriptor -import com.epages.restdocs.apispec.model.RequestModel -import com.epages.restdocs.apispec.model.ResourceModel -import com.epages.restdocs.apispec.model.ResponseModel -import com.epages.restdocs.apispec.model.SecurityRequirements -import com.epages.restdocs.apispec.model.SecurityType +import com.epages.restdocs.apispec.model.* import com.jayway.jsonpath.Configuration import com.jayway.jsonpath.DocumentContext import com.jayway.jsonpath.JsonPath @@ -145,6 +136,16 @@ class OpenApi3GeneratorTest { thenOpenApiSpecIsValid() } + @Test + fun `should use custom schema name from resource model`() { + givenPatchProductResourceModelWithCustomSchemaNames() + + whenOpenApiObjectGenerated() + + thenCustomSchemaNamesAreSet() + thenOpenApiSpecIsValid() + } + fun thenGetProductByIdOperationIsValid() { val productGetByIdPath = "paths./products/{id}.get" then(openApiJsonPathContext.read>("$productGetByIdPath.tags")).isNotNull() @@ -207,6 +208,13 @@ class OpenApi3GeneratorTest { then(openApiJsonPathContext.read("components.securitySchemes.bearerAuthJWT.bearerFormat")).isEqualTo("JWT") } + private fun thenCustomSchemaNamesAreSet() { + val schemas = openApiJsonPathContext.read>("components.schemas") + then(schemas.keys).size().isEqualTo(2) + then(schemas.keys).contains("ProductRequest") + then(schemas.keys).contains("ProductResponse") + } + private fun whenOpenApiObjectGenerated() { openApiSpecJsonString = OpenApi3Generator.generateAndSerialize( resources = resources, @@ -442,6 +450,21 @@ class OpenApi3GeneratorTest { ) } + private fun givenPatchProductResourceModelWithCustomSchemaNames() { + resources = listOf( + ResourceModel( + operationId = "test", + summary = "summary", + description = "description", + privateResource = false, + deprecated = false, + tags = setOf("tag1", "tag2"), + request = getProductPatchRequest(schema = Schema("ProductRequest")), + response = getProductResponse(schema = Schema("ProductResponse")) + ) + ) + } + private fun getProductErrorResponse(): ResponseModel { return ResponseModel( status = 400, @@ -460,10 +483,11 @@ class OpenApi3GeneratorTest { ) } - private fun getProductResponse(): ResponseModel { + private fun getProductResponse(schema: Schema? = null): ResponseModel { return ResponseModel( status = 200, contentType = "application/json", + schema = schema, headers = listOf( HeaderDescriptor( name = "SIGNATURE", @@ -518,13 +542,14 @@ class OpenApi3GeneratorTest { ) } - private fun getProductPatchRequest(): RequestModel { + private fun getProductPatchRequest(schema: Schema? = null): RequestModel { return RequestModel( path = "/products/{id}", method = HTTPMethod.PATCH, headers = listOf(), pathParameters = listOf(), requestParameters = listOf(), + schema = schema, securityRequirements = null, requestFields = listOf( FieldDescriptor( From bd91e42f9af619a0f18d93339b47ea231252a4e2 Mon Sep 17 00:00:00 2001 From: Thomas Wimmer Date: Thu, 30 Jan 2020 17:35:26 +0100 Subject: [PATCH 05/12] Add test which ensures that different schema names result in different schemas in OpenApi3Generator. --- .../apispec/openapi3/OpenApi3GeneratorTest.kt | 52 +++++++++++++++++-- 1 file changed, 48 insertions(+), 4 deletions(-) diff --git a/restdocs-api-spec-openapi3-generator/src/test/kotlin/com/epages/restdocs/apispec/openapi3/OpenApi3GeneratorTest.kt b/restdocs-api-spec-openapi3-generator/src/test/kotlin/com/epages/restdocs/apispec/openapi3/OpenApi3GeneratorTest.kt index dcfd0c85..b493bce4 100644 --- a/restdocs-api-spec-openapi3-generator/src/test/kotlin/com/epages/restdocs/apispec/openapi3/OpenApi3GeneratorTest.kt +++ b/restdocs-api-spec-openapi3-generator/src/test/kotlin/com/epages/restdocs/apispec/openapi3/OpenApi3GeneratorTest.kt @@ -142,7 +142,17 @@ class OpenApi3GeneratorTest { whenOpenApiObjectGenerated() - thenCustomSchemaNamesAreSet() + thenCustomSchemaNameOfSingleOperationAreSet() + thenOpenApiSpecIsValid() + } + + @Test + fun `should not combine same schemas with custom schema name from multiple resource models`() { + givenMultiplePatchProductResourceModelsWithCustomSchemaNames() + + whenOpenApiObjectGenerated() + + thenCustomSchemaNameOfMultipleOperationsAreSet() thenOpenApiSpecIsValid() } @@ -208,13 +218,22 @@ class OpenApi3GeneratorTest { then(openApiJsonPathContext.read("components.securitySchemes.bearerAuthJWT.bearerFormat")).isEqualTo("JWT") } - private fun thenCustomSchemaNamesAreSet() { + private fun thenCustomSchemaNameOfSingleOperationAreSet() { val schemas = openApiJsonPathContext.read>("components.schemas") then(schemas.keys).size().isEqualTo(2) then(schemas.keys).contains("ProductRequest") then(schemas.keys).contains("ProductResponse") } + private fun thenCustomSchemaNameOfMultipleOperationsAreSet() { + val schemas = openApiJsonPathContext.read>("components.schemas") + then(schemas.keys).size().isEqualTo(4) + then(schemas.keys).contains("ProductRequest1") + then(schemas.keys).contains("ProductResponse1") + then(schemas.keys).contains("ProductRequest2") + then(schemas.keys).contains("ProductResponse2") + } + private fun whenOpenApiObjectGenerated() { openApiSpecJsonString = OpenApi3Generator.generateAndSerialize( resources = resources, @@ -465,6 +484,31 @@ class OpenApi3GeneratorTest { ) } + private fun givenMultiplePatchProductResourceModelsWithCustomSchemaNames() { + resources = listOf( + ResourceModel( + operationId = "test1", + summary = "summary1", + description = "description1", + privateResource = false, + deprecated = false, + tags = setOf("tag1", "tag2"), + request = getProductPatchRequest(schema = Schema("ProductRequest1"), path = "/products1/{id}"), + response = getProductResponse(schema = Schema("ProductResponse1")) + ), + ResourceModel( + operationId = "test2", + summary = "summary2", + description = "description2", + privateResource = false, + deprecated = false, + tags = setOf("tag1", "tag2"), + request = getProductPatchRequest(schema = Schema("ProductRequest2"), path = "/products2/{id}"), + response = getProductResponse(schema = Schema("ProductResponse2")) + ) + ) + } + private fun getProductErrorResponse(): ResponseModel { return ResponseModel( status = 400, @@ -542,9 +586,9 @@ class OpenApi3GeneratorTest { ) } - private fun getProductPatchRequest(schema: Schema? = null): RequestModel { + private fun getProductPatchRequest(schema: Schema? = null, path: String = "/products/{id}"): RequestModel { return RequestModel( - path = "/products/{id}", + path = path, method = HTTPMethod.PATCH, headers = listOf(), pathParameters = listOf(), From 0fba2806b428cced554d3470e74663875164a0e3 Mon Sep 17 00:00:00 2001 From: Thomas Wimmer Date: Thu, 30 Jan 2020 20:12:45 +0100 Subject: [PATCH 06/12] Simplified expression for schema generation in OpenApi3Generator. --- .../com/epages/restdocs/apispec/openapi3/OpenApi3Generator.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/restdocs-api-spec-openapi3-generator/src/main/kotlin/com/epages/restdocs/apispec/openapi3/OpenApi3Generator.kt b/restdocs-api-spec-openapi3-generator/src/main/kotlin/com/epages/restdocs/apispec/openapi3/OpenApi3Generator.kt index ac0d1de2..b08fcfbb 100644 --- a/restdocs-api-spec-openapi3-generator/src/main/kotlin/com/epages/restdocs/apispec/openapi3/OpenApi3Generator.kt +++ b/restdocs-api-spec-openapi3-generator/src/main/kotlin/com/epages/restdocs/apispec/openapi3/OpenApi3Generator.kt @@ -140,7 +140,7 @@ object OpenApi3Generator { val schemaKey = if (schemasToKeys.containsKey(schema)) { schemasToKeys[schema]!! } else { - val name = if (schema.name != null) schema.name else schemaNameGenerator(schema) + val name = schema.name ?: schemaNameGenerator(schema) schemasToKeys[schema] = name name } From 8a241e985ed9d05e7db3de3a4f7a398ed105e69c Mon Sep 17 00:00:00 2001 From: Thomas Wimmer Date: Fri, 31 Jan 2020 10:57:11 +0100 Subject: [PATCH 07/12] Add support for custom schema names in OpenApi20Generator. --- .../apispec/openapi2/OpenApi20Generator.kt | 40 +++------ .../openapi2/OpenApi20GeneratorTest.kt | 86 ++++++++++++++++--- 2 files changed, 84 insertions(+), 42 deletions(-) diff --git a/restdocs-api-spec-openapi-generator/src/main/kotlin/com/epages/restdocs/apispec/openapi2/OpenApi20Generator.kt b/restdocs-api-spec-openapi-generator/src/main/kotlin/com/epages/restdocs/apispec/openapi2/OpenApi20Generator.kt index e35b12ad..3fce1aed 100644 --- a/restdocs-api-spec-openapi-generator/src/main/kotlin/com/epages/restdocs/apispec/openapi2/OpenApi20Generator.kt +++ b/restdocs-api-spec-openapi-generator/src/main/kotlin/com/epages/restdocs/apispec/openapi2/OpenApi20Generator.kt @@ -1,34 +1,13 @@ package com.epages.restdocs.apispec.openapi2 import com.epages.restdocs.apispec.jsonschema.JsonSchemaFromFieldDescriptorsGenerator -import com.epages.restdocs.apispec.model.FieldDescriptor -import com.epages.restdocs.apispec.model.HTTPMethod -import com.epages.restdocs.apispec.model.HeaderDescriptor -import com.epages.restdocs.apispec.model.Oauth2Configuration -import com.epages.restdocs.apispec.model.ParameterDescriptor -import com.epages.restdocs.apispec.model.ResourceModel -import com.epages.restdocs.apispec.model.ResponseModel -import com.epages.restdocs.apispec.model.SecurityRequirements -import com.epages.restdocs.apispec.model.SecurityType +import com.epages.restdocs.apispec.model.* import com.fasterxml.jackson.module.kotlin.readValue -import io.swagger.models.Info -import io.swagger.models.Model -import io.swagger.models.ModelImpl -import io.swagger.models.Operation -import io.swagger.models.Path -import io.swagger.models.RefModel -import io.swagger.models.Response -import io.swagger.models.Scheme -import io.swagger.models.Swagger -import io.swagger.models.Tag +import io.swagger.models.* import io.swagger.models.auth.ApiKeyAuthDefinition import io.swagger.models.auth.BasicAuthDefinition import io.swagger.models.auth.OAuth2Definition -import io.swagger.models.parameters.BodyParameter -import io.swagger.models.parameters.HeaderParameter -import io.swagger.models.parameters.Parameter -import io.swagger.models.parameters.PathParameter -import io.swagger.models.parameters.QueryParameter +import io.swagger.models.parameters.* import io.swagger.models.properties.PropertyBuilder import io.swagger.util.Json import java.util.Comparator.comparing @@ -153,7 +132,7 @@ object OpenApi20Generator { val schemaKey = if (schemasToKeys.containsKey(schema)) { schemasToKeys[schema]!! } else { - val name = schemaNameGenerator(schema) + val name = schema.reference ?: schemaNameGenerator(schema) schemasToKeys[schema] = name name } @@ -293,7 +272,8 @@ object OpenApi20Generator { modelsWithSamePathAndMethod .filter { it.request.contentType != null && it.request.example != null } .map { it.request.contentType!! to it.request.example!! } - .toMap()) + .toMap(), + firstModelForPathAndMethod.request.schema) ) ).nullIfEmpty() responses = responsesByStatusCode( @@ -428,11 +408,12 @@ object OpenApi20Generator { } } - private fun requestFieldDescriptor2Parameter(fieldDescriptors: List, examples: Map): BodyParameter? { + private fun requestFieldDescriptor2Parameter(fieldDescriptors: List, examples: Map, requestSchema: Schema?): BodyParameter? { val firstExample = examples.entries.sortedBy { it.key.length }.map { it.value }.firstOrNull() return if (!fieldDescriptors.isEmpty()) { val parsedSchema: Model = Json.mapper().readValue(JsonSchemaFromFieldDescriptorsGenerator().generateSchema(fieldDescriptors = fieldDescriptors)) parsedSchema.example = firstExample // a schema can only have one example + parsedSchema.reference = requestSchema?.name BodyParameter().apply { name = "" schema = parsedSchema @@ -458,8 +439,9 @@ object OpenApi20Generator { .nullIfEmpty() examples = mapOf(responseModel.contentType to responseModel.example).nullIfEmpty() responseSchema = if (!responseModel.responseFields.isEmpty()) { - Json.mapper().readValue( - JsonSchemaFromFieldDescriptorsGenerator().generateSchema(fieldDescriptors = responseModel.responseFields)) + val parsedSchema: Model = Json.mapper().readValue(JsonSchemaFromFieldDescriptorsGenerator().generateSchema(fieldDescriptors = responseModel.responseFields)) + parsedSchema.reference = responseModel.schema?.name + parsedSchema } else { null } diff --git a/restdocs-api-spec-openapi-generator/src/test/kotlin/com/epages/restdocs/apispec/openapi2/OpenApi20GeneratorTest.kt b/restdocs-api-spec-openapi-generator/src/test/kotlin/com/epages/restdocs/apispec/openapi2/OpenApi20GeneratorTest.kt index 30b84ea4..25ac6e41 100644 --- a/restdocs-api-spec-openapi-generator/src/test/kotlin/com/epages/restdocs/apispec/openapi2/OpenApi20GeneratorTest.kt +++ b/restdocs-api-spec-openapi-generator/src/test/kotlin/com/epages/restdocs/apispec/openapi2/OpenApi20GeneratorTest.kt @@ -1,16 +1,7 @@ package com.epages.restdocs.apispec.openapi2 import com.epages.restdocs.apispec.jsonschema.JsonSchemaFromFieldDescriptorsGenerator -import com.epages.restdocs.apispec.model.AbstractParameterDescriptor -import com.epages.restdocs.apispec.model.FieldDescriptor -import com.epages.restdocs.apispec.model.HTTPMethod -import com.epages.restdocs.apispec.model.HeaderDescriptor -import com.epages.restdocs.apispec.model.Oauth2Configuration -import com.epages.restdocs.apispec.model.ParameterDescriptor -import com.epages.restdocs.apispec.model.RequestModel -import com.epages.restdocs.apispec.model.ResourceModel -import com.epages.restdocs.apispec.model.ResponseModel -import com.epages.restdocs.apispec.model.SecurityRequirements +import com.epages.restdocs.apispec.model.* import com.epages.restdocs.apispec.model.SecurityType.BASIC import com.epages.restdocs.apispec.model.SecurityType.OAUTH2 import com.fasterxml.jackson.module.kotlin.readValue @@ -188,6 +179,26 @@ class OpenApi20GeneratorTest { then(schemaNameAndSchemaMap.size).isEqualTo(2) } + @Test + fun `should use custom schema name from resource model`() { + val api = givenPostProductResourceModelWithCustomSchemaNames() + + val openapi = whenOpenApiObjectGenerated(api) + + thenCustomSchemaNameOfSingleOperationAreSet(openapi) + thenValidateOpenApi(openapi) + } + + @Test + fun `should not combine same schemas with custom schema name from multiple resource models`() { + val api = givenMultiplePostProductResourceModelsWithCustomSchemaNames() + + val openapi = whenOpenApiObjectGenerated(api) + + thenCustomSchemaNameOfMultipleOperationsAreSet(openapi) + thenValidateOpenApi(openapi) + } + private fun whenExtractOrFindSchema(schemaNameAndSchemaMap: MutableMap, ordersSchema: Model, shopsSchema: Model) { OpenApi20Generator.extractOrFindSchema(schemaNameAndSchemaMap, ordersSchema, OpenApi20Generator.generateSchemaName("/orders")) OpenApi20Generator.extractOrFindSchema(schemaNameAndSchemaMap, shopsSchema, OpenApi20Generator.generateSchemaName("/shops")) @@ -357,6 +368,20 @@ class OpenApi20GeneratorTest { ).isEqualTo(successfulDeleteProductModel.response.example) } + private fun thenCustomSchemaNameOfSingleOperationAreSet(openapi: Swagger) { + then(openapi.definitions.keys).size().isEqualTo(2) + then(openapi.definitions.keys).contains("ProductRequest") + then(openapi.definitions.keys).contains("ProductResponse") + } + + private fun thenCustomSchemaNameOfMultipleOperationsAreSet(openapi: Swagger) { + then(openapi.definitions.keys).size().isEqualTo(4) + then(openapi.definitions.keys).contains("ProductRequest1") + then(openapi.definitions.keys).contains("ProductResponse1") + then(openapi.definitions.keys).contains("ProductRequest2") + then(openapi.definitions.keys).contains("ProductResponse2") + } + private fun givenGetProductResourceModel(): List { return listOf( ResourceModel( @@ -452,6 +477,38 @@ class OpenApi20GeneratorTest { ) } + private fun givenPostProductResourceModelWithCustomSchemaNames(): List { + return listOf( + ResourceModel( + operationId = "test", + privateResource = false, + deprecated = false, + request = postProductRequest(schema = Schema("ProductRequest")), + response = postProduct200Response(getProductPayloadExample(), schema = Schema("ProductResponse")) + ) + ) + } + + private fun givenMultiplePostProductResourceModelsWithCustomSchemaNames(): List { + return listOf( + ResourceModel( + operationId = "test1", + privateResource = false, + deprecated = false, + request = postProductRequest(schema = Schema("ProductRequest1"), path = "/products1"), + response = postProduct200Response(getProductPayloadExample(), schema = Schema("ProductResponse1")) + ), + ResourceModel( + operationId = "test2", + privateResource = false, + deprecated = false, + request = postProductRequest(schema = Schema("ProductRequest2"), path = "/products2"), + response = postProduct200Response(getProductPayloadExample(), schema = Schema("ProductResponse2")) + ) + ) + } + + private fun givenHeadResourceModel(): List { return listOf( ResourceModel( @@ -521,11 +578,12 @@ class OpenApi20GeneratorTest { ) } - private fun postProduct200Response(example: String): ResponseModel { + private fun postProduct200Response(example: String, schema: Schema? = null): ResponseModel { return ResponseModel( status = 200, contentType = "application/json", headers = listOf(), + schema = schema, responseFields = listOf( FieldDescriptor( path = "_id", @@ -556,6 +614,7 @@ class OpenApi20GeneratorTest { return ResponseModel( status = 200, contentType = "application/json", + schema = Schema("ProductResponse"), headers = listOf( HeaderDescriptor( name = "SIGNATURE", @@ -695,11 +754,12 @@ class OpenApi20GeneratorTest { ) } - private fun postProductRequest(): RequestModel { + private fun postProductRequest(schema: Schema? = null, path: String = "/products"): RequestModel { return RequestModel( - path = "/products", + path = path, method = HTTPMethod.POST, contentType = "application/json", + schema = schema, securityRequirements = SecurityRequirements( type = OAUTH2, requiredScopes = listOf("prod:c") From 35e43e410a8bc1aebfea57f0e619740cf9be924d Mon Sep 17 00:00:00 2001 From: thowimmer Date: Sat, 1 Feb 2020 13:20:42 +0100 Subject: [PATCH 08/12] Moved schema to ResourceSnippetParameters. --- .../restdocs/apispec/ResourceSnippetParameters.kt | 10 ++++++++++ .../main/kotlin/com/epages/restdocs/apispec/Schema.kt | 11 ----------- 2 files changed, 10 insertions(+), 11 deletions(-) delete mode 100644 restdocs-api-spec/src/main/kotlin/com/epages/restdocs/apispec/Schema.kt diff --git a/restdocs-api-spec/src/main/kotlin/com/epages/restdocs/apispec/ResourceSnippetParameters.kt b/restdocs-api-spec/src/main/kotlin/com/epages/restdocs/apispec/ResourceSnippetParameters.kt index cf7ab6b8..af1a4d58 100755 --- a/restdocs-api-spec/src/main/kotlin/com/epages/restdocs/apispec/ResourceSnippetParameters.kt +++ b/restdocs-api-spec/src/main/kotlin/com/epages/restdocs/apispec/ResourceSnippetParameters.kt @@ -138,6 +138,16 @@ class ParameterDescriptorWithType(val name: String) : IgnorableDescriptor Date: Sat, 1 Feb 2020 13:46:17 +0100 Subject: [PATCH 09/12] Add @JvmStatic to Schema companion object. --- .../com/epages/restdocs/apispec/ResourceSnippetParameters.kt | 1 + 1 file changed, 1 insertion(+) diff --git a/restdocs-api-spec/src/main/kotlin/com/epages/restdocs/apispec/ResourceSnippetParameters.kt b/restdocs-api-spec/src/main/kotlin/com/epages/restdocs/apispec/ResourceSnippetParameters.kt index af1a4d58..bf094fa0 100755 --- a/restdocs-api-spec/src/main/kotlin/com/epages/restdocs/apispec/ResourceSnippetParameters.kt +++ b/restdocs-api-spec/src/main/kotlin/com/epages/restdocs/apispec/ResourceSnippetParameters.kt @@ -144,6 +144,7 @@ class ParameterDescriptorWithType(val name: String) : IgnorableDescriptor Date: Sat, 1 Feb 2020 14:20:16 +0100 Subject: [PATCH 10/12] Removed unnecessary semicolons --- .../kotlin/com/epages/restdocs/apispec/ResourceSnippetTest.kt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/restdocs-api-spec/src/test/kotlin/com/epages/restdocs/apispec/ResourceSnippetTest.kt b/restdocs-api-spec/src/test/kotlin/com/epages/restdocs/apispec/ResourceSnippetTest.kt index d9754e6d..4de6824a 100644 --- a/restdocs-api-spec/src/test/kotlin/com/epages/restdocs/apispec/ResourceSnippetTest.kt +++ b/restdocs-api-spec/src/test/kotlin/com/epages/restdocs/apispec/ResourceSnippetTest.kt @@ -314,7 +314,7 @@ class ResourceSnippetTest { } private fun givenRequestSchemaName() { - parametersBuilder.requestSchema(Schema(name = "RequestSchema")); + parametersBuilder.requestSchema(Schema(name = "RequestSchema")) } private fun givenResponseFieldDescriptors() { @@ -322,7 +322,7 @@ class ResourceSnippetTest { } private fun givenResponseSchemaName() { - parametersBuilder.responseSchema(Schema(name = "ResponseSchema")); + parametersBuilder.responseSchema(Schema(name = "ResponseSchema")) } private fun givenIgnoredAndNotIgnoredRequestFieldDescriptors() { From b2a569a50e56244b77dd06365188350b82f7de4a Mon Sep 17 00:00:00 2001 From: Thomas Wimmer Date: Sat, 1 Feb 2020 14:35:10 +0100 Subject: [PATCH 11/12] Fixed wildcard imports --- .../apispec/openapi2/OpenApi20Generator.kt | 28 +++++++++++++++++-- .../openapi2/OpenApi20GeneratorTest.kt | 12 +++++++- .../apispec/openapi3/OpenApi3GeneratorTest.kt | 12 +++++++- 3 files changed, 47 insertions(+), 5 deletions(-) diff --git a/restdocs-api-spec-openapi-generator/src/main/kotlin/com/epages/restdocs/apispec/openapi2/OpenApi20Generator.kt b/restdocs-api-spec-openapi-generator/src/main/kotlin/com/epages/restdocs/apispec/openapi2/OpenApi20Generator.kt index 3fce1aed..429c310b 100644 --- a/restdocs-api-spec-openapi-generator/src/main/kotlin/com/epages/restdocs/apispec/openapi2/OpenApi20Generator.kt +++ b/restdocs-api-spec-openapi-generator/src/main/kotlin/com/epages/restdocs/apispec/openapi2/OpenApi20Generator.kt @@ -1,13 +1,35 @@ package com.epages.restdocs.apispec.openapi2 import com.epages.restdocs.apispec.jsonschema.JsonSchemaFromFieldDescriptorsGenerator -import com.epages.restdocs.apispec.model.* +import com.epages.restdocs.apispec.model.FieldDescriptor +import com.epages.restdocs.apispec.model.HTTPMethod +import com.epages.restdocs.apispec.model.HeaderDescriptor +import com.epages.restdocs.apispec.model.Oauth2Configuration +import com.epages.restdocs.apispec.model.ParameterDescriptor +import com.epages.restdocs.apispec.model.ResourceModel +import com.epages.restdocs.apispec.model.ResponseModel +import com.epages.restdocs.apispec.model.SecurityRequirements +import com.epages.restdocs.apispec.model.SecurityType +import com.epages.restdocs.apispec.model.Schema import com.fasterxml.jackson.module.kotlin.readValue -import io.swagger.models.* +import io.swagger.models.Info +import io.swagger.models.Model +import io.swagger.models.ModelImpl +import io.swagger.models.Operation +import io.swagger.models.Path +import io.swagger.models.RefModel +import io.swagger.models.Response +import io.swagger.models.Scheme +import io.swagger.models.Swagger +import io.swagger.models.Tag import io.swagger.models.auth.ApiKeyAuthDefinition import io.swagger.models.auth.BasicAuthDefinition import io.swagger.models.auth.OAuth2Definition -import io.swagger.models.parameters.* +import io.swagger.models.parameters.BodyParameter +import io.swagger.models.parameters.HeaderParameter +import io.swagger.models.parameters.Parameter +import io.swagger.models.parameters.PathParameter +import io.swagger.models.parameters.QueryParameter import io.swagger.models.properties.PropertyBuilder import io.swagger.util.Json import java.util.Comparator.comparing diff --git a/restdocs-api-spec-openapi-generator/src/test/kotlin/com/epages/restdocs/apispec/openapi2/OpenApi20GeneratorTest.kt b/restdocs-api-spec-openapi-generator/src/test/kotlin/com/epages/restdocs/apispec/openapi2/OpenApi20GeneratorTest.kt index 25ac6e41..7d9b42bb 100644 --- a/restdocs-api-spec-openapi-generator/src/test/kotlin/com/epages/restdocs/apispec/openapi2/OpenApi20GeneratorTest.kt +++ b/restdocs-api-spec-openapi-generator/src/test/kotlin/com/epages/restdocs/apispec/openapi2/OpenApi20GeneratorTest.kt @@ -1,7 +1,17 @@ package com.epages.restdocs.apispec.openapi2 import com.epages.restdocs.apispec.jsonschema.JsonSchemaFromFieldDescriptorsGenerator -import com.epages.restdocs.apispec.model.* +import com.epages.restdocs.apispec.model.AbstractParameterDescriptor +import com.epages.restdocs.apispec.model.FieldDescriptor +import com.epages.restdocs.apispec.model.HTTPMethod +import com.epages.restdocs.apispec.model.HeaderDescriptor +import com.epages.restdocs.apispec.model.Oauth2Configuration +import com.epages.restdocs.apispec.model.ParameterDescriptor +import com.epages.restdocs.apispec.model.RequestModel +import com.epages.restdocs.apispec.model.ResourceModel +import com.epages.restdocs.apispec.model.ResponseModel +import com.epages.restdocs.apispec.model.SecurityRequirements +import com.epages.restdocs.apispec.model.Schema import com.epages.restdocs.apispec.model.SecurityType.BASIC import com.epages.restdocs.apispec.model.SecurityType.OAUTH2 import com.fasterxml.jackson.module.kotlin.readValue diff --git a/restdocs-api-spec-openapi3-generator/src/test/kotlin/com/epages/restdocs/apispec/openapi3/OpenApi3GeneratorTest.kt b/restdocs-api-spec-openapi3-generator/src/test/kotlin/com/epages/restdocs/apispec/openapi3/OpenApi3GeneratorTest.kt index b493bce4..d7433de2 100644 --- a/restdocs-api-spec-openapi3-generator/src/test/kotlin/com/epages/restdocs/apispec/openapi3/OpenApi3GeneratorTest.kt +++ b/restdocs-api-spec-openapi3-generator/src/test/kotlin/com/epages/restdocs/apispec/openapi3/OpenApi3GeneratorTest.kt @@ -1,6 +1,16 @@ package com.epages.restdocs.apispec.openapi3 -import com.epages.restdocs.apispec.model.* +import com.epages.restdocs.apispec.model.FieldDescriptor +import com.epages.restdocs.apispec.model.HTTPMethod +import com.epages.restdocs.apispec.model.HeaderDescriptor +import com.epages.restdocs.apispec.model.Oauth2Configuration +import com.epages.restdocs.apispec.model.ParameterDescriptor +import com.epages.restdocs.apispec.model.RequestModel +import com.epages.restdocs.apispec.model.ResourceModel +import com.epages.restdocs.apispec.model.ResponseModel +import com.epages.restdocs.apispec.model.SecurityRequirements +import com.epages.restdocs.apispec.model.SecurityType +import com.epages.restdocs.apispec.model.Schema import com.jayway.jsonpath.Configuration import com.jayway.jsonpath.DocumentContext import com.jayway.jsonpath.JsonPath From 786ad48168738821520ac60699730848ce6cc2ac Mon Sep 17 00:00:00 2001 From: Thomas Wimmer Date: Sat, 1 Feb 2020 14:40:37 +0100 Subject: [PATCH 12/12] Fixed further lint errors. --- .../epages/restdocs/apispec/openapi2/OpenApi20GeneratorTest.kt | 1 - 1 file changed, 1 deletion(-) diff --git a/restdocs-api-spec-openapi-generator/src/test/kotlin/com/epages/restdocs/apispec/openapi2/OpenApi20GeneratorTest.kt b/restdocs-api-spec-openapi-generator/src/test/kotlin/com/epages/restdocs/apispec/openapi2/OpenApi20GeneratorTest.kt index 7d9b42bb..e611d70d 100644 --- a/restdocs-api-spec-openapi-generator/src/test/kotlin/com/epages/restdocs/apispec/openapi2/OpenApi20GeneratorTest.kt +++ b/restdocs-api-spec-openapi-generator/src/test/kotlin/com/epages/restdocs/apispec/openapi2/OpenApi20GeneratorTest.kt @@ -518,7 +518,6 @@ class OpenApi20GeneratorTest { ) } - private fun givenHeadResourceModel(): List { return listOf( ResourceModel(